Adds support for tracking an upstream repos.
Change-Id: I3c92c19cf2c2fd6a911fbdbf4aeeb66e53cf07e0
diff --git a/fetch_remotes.py b/fetch_remotes.py
new file mode 100755
index 0000000..19df462
--- /dev/null
+++ b/fetch_remotes.py
@@ -0,0 +1,79 @@
+#! /usr/bin/env python
+# Copyright (C) 2011 OpenStack, LLC.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+# Ensure that the specified remote exists in the repo and pull revisions
+# from upstream
+
+# [project "UPSTREAM_PROJECT"]
+# remote = https://gerrit.googlesource.com/gerrit
+
+import ConfigParser
+import StringIO
+import logging
+import os
+import re
+import subprocess
+
+
+def run_command(cmd, status=False, env={}):
+ if VERBOSE:
+ print datetime.datetime.now(), "Running:", cmd
+ cmd_list = shlex.split(str(cmd))
+ newenv = os.environ
+ newenv.update(env)
+ p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT, env=newenv)
+ (out, nothing) = p.communicate()
+ if status:
+ return (p.returncode, out.strip())
+ return out.strip()
+
+
+def run_command_status(cmd, env={}):
+ return run_command(cmd, True, env)
+
+
+logging.basicConfig(level=logging.ERROR)
+
+REPO_ROOT = os.environ.get('REPO_ROOT',
+ '/home/gerrit2/git')
+REMOTES_CONFIG = os.environ.get('REMOTES_CONFIG',
+ '/home/gerrit2/remote.config')
+
+PROJECT_RE = re.compile(r'^project\s+"(.*)"$')
+
+config = ConfigParser.ConfigParser()
+config.read(REMOTES_CONFIG)
+
+
+for section in config.sections():
+ # Each section looks like [project "openstack/project"]
+ m = PROJECT_RE.match(section)
+ if not m:
+ continue
+ project = m.group(1)
+ project_git = "%s.git" % project
+ os.chdir(os.path.join(REPO_ROOT, project_git))
+
+ if not (config.has_option(section, "remote")):
+ continue
+
+ # Make sure that the specified remote exists
+ remote_url = config.get(section, "remote")
+ # We could check if it exists first, but we're ignoring output anyway
+ # So just try to make it, and it'll either make a new one or do nothing
+ run_command("git remote add -f upstream %s" % remote_url)
+ # Fetch new revs from it
+ run_command("git remote update upstream")