Merge "Savanna client is now using separated LP project"
diff --git a/jeepyb/cmd/manage_projects.py b/jeepyb/cmd/manage_projects.py
index 853dde2..4f360a6 100644
--- a/jeepyb/cmd/manage_projects.py
+++ b/jeepyb/cmd/manage_projects.py
@@ -525,7 +525,7 @@
                         repo_path,
                         "push origin refs/heads/*:refs/heads/*",
                         env=ssh_env)
-                    git_command(repo_path, 'push --tags', env=ssh_env)
+                    git_command(repo_path, 'push origin --tags', env=ssh_env)
                 except Exception:
                     log.exception(
                         "Error pushing %s to Gerrit." % project)
diff --git a/jeepyb/cmd/run_mirror.py b/jeepyb/cmd/run_mirror.py
deleted file mode 100644
index 5e54583..0000000
--- a/jeepyb/cmd/run_mirror.py
+++ /dev/null
@@ -1,373 +0,0 @@
-#! /usr/bin/env python
-# Copyright (C) 2011 OpenStack, LLC.
-# Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
-# Copyright (C) 2013 OpenStack Foundation
-#
-# 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.
-
-# run_mirror reads a YAML config file like:
-#   cache-root: /tmp/cache
-#
-#   mirrors:
-#     - name: openstack
-#       projects:
-#         - https://github.com/openstack/requirements
-#       output: /tmp/mirror/openstack
-#
-#     - name: openstack-infra
-#       projects:
-#         - https://github.com/openstack-infra/config
-#       output: /tmp/mirror/openstack-infra
-#
-# The algorithm it attempts to follow is:
-#
-# for each project:
-#   clone if necessary and fetch origin
-#   for each project-branch:
-#     create new virtualenv
-#     pip install reqs into virtualenv
-#     if installation succeeds:
-#       pip freeze > full-reqs
-#       create new virtualenv
-#       pip install (download only) full-reqs into virtualenv
-#
-# By default only summary information is printed on stdout (see the
-# -d command line option to get more debug info).
-#
-# If "pip install" for a branch's requirements fails to complete
-# (based on parsing of its output), that output will be copied to
-# stderr and the script will skip ahead to the next branch. This
-# makes it suitable for running in a cron job with only stdout
-# redirected to a log, and also avoids one broken project preventing
-# caching of requirements for others.
-from __future__ import print_function
-
-import argparse
-import datetime
-import md5
-import os
-import pkginfo
-import re
-import shlex
-import shutil
-import subprocess
-import sys
-import tempfile
-import urllib
-import yaml
-
-
-class Mirror(object):
-    def __init__(self):
-        parser = argparse.ArgumentParser(
-            description='Build a pypi mirror from requirements')
-        parser.add_argument('-b', dest='branch',
-                            help='restrict run to a specified branch')
-        parser.add_argument('-c', dest='config',
-                            help='specify the config file')
-        parser.add_argument('-n', dest='noop', action='store_true',
-                            help='do not run any commands')
-        parser.add_argument('--no-pip', dest='no_pip', action='store_true',
-                            help='do not run any pip commands')
-        parser.add_argument('--verbose', dest='debug', action='store_true',
-                            help='output verbose debug information')
-        parser.add_argument('--no-download', dest='no_download',
-                            action='store_true',
-                            help='only process the pip cache into a mirror '
-                            '(do not download)')
-        parser.add_argument('--no-process', dest='no_process',
-                            action='store_true',
-                            help='only download into the pip cache '
-                            '(do not process the cache into a mirror)')
-        parser.add_argument('--no-update', dest='no_update',
-                            action='store_true',
-                            help='do not update any git repos')
-        self.args = parser.parse_args()
-        self.config = yaml.load(open(self.args.config))
-
-    def run_command(self, cmd):
-        cmd_list = shlex.split(str(cmd))
-        self.debug("Run: %s" % cmd)
-        if self.args.noop:
-            return ''
-        if self.args.no_pip and cmd_list[0].endswith('pip'):
-            return ''
-        p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE,
-                             stderr=subprocess.STDOUT)
-        (out, nothing) = p.communicate()
-        out = out.strip()
-        self.debug(out)
-        return out
-
-    def run(self):
-        for mirror in self.config['mirrors']:
-            if not self.args.no_download:
-                self.build_mirror(mirror)
-            if not self.args.no_process:
-                self.process_cache(mirror)
-
-    def chdir(self, dest):
-        self.debug("cd %s" % dest)
-        if not self.args.noop:
-            os.chdir(dest)
-
-    def debug(self, msg):
-        if self.args.debug:
-            print(msg)
-
-    def process_http_requirements(self, reqlist, pip_cache_dir, pip):
-        new_reqs = []
-        for reqfile in reqlist:
-            for req in open(reqfile):
-                req = req.strip()
-                # Handle http://, https://, and git+https?://
-                if not re.search('https?://', req):
-                    new_reqs.append(req)
-                    continue
-                target_url = req.split('#', 1)[0]
-                target_file = os.path.join(pip_cache_dir,
-                                           urllib.quote(target_url, ''))
-                if os.path.exists(target_file):
-                    self.debug("Unlink: %s" % target_file)
-                    os.unlink(target_file)
-                if os.path.exists(target_file + '.content-type'):
-                    self.debug("Unlink: %s.content-type" % target_file)
-                    os.unlink(target_file + '.content-type')
-        return new_reqs
-
-    def find_pkg_info(self, path):
-        versions = set()
-        for root, dirs, files in os.walk(path):
-            if not root.endswith('.egg'):
-                continue
-            if not os.path.exists(os.path.join(root, 'EGG-INFO', 'PKG-INFO')):
-                continue
-            package = pkginfo.Develop(root)
-            versions.add('%s==%s' % (package.name, package.version))
-        return versions
-
-    def build_mirror(self, mirror):
-        print("Building mirror: %s" % mirror['name'])
-        pip_format = ("%s install -U %s --exists-action=w "
-                      "--download-cache=%s --build %s -r %s")
-        venv_format = ("virtualenv --clear --extra-search-dir=%s %s")
-        upgrade_format = ("%s install -U --exists-action=w "
-                          "--download-cache=%s --build %s %s")
-
-        workdir = tempfile.mkdtemp()
-        reqs = os.path.join(workdir, "reqs")
-        venv = os.path.join(workdir, "venv")
-        build = os.path.join(workdir, "build")
-        pip = os.path.join(venv, "bin", "pip")
-
-        project_cache_dir = os.path.join(self.config['cache-root'],
-                                         'projects')
-        pip_cache_dir = os.path.join(self.config['cache-root'],
-                                     'pip', mirror['name'])
-        if not self.args.noop:
-            if not os.path.exists(project_cache_dir):
-                os.makedirs(project_cache_dir)
-            if not os.path.exists(pip_cache_dir):
-                os.makedirs(pip_cache_dir)
-
-        for project in mirror['projects']:
-            print("Updating repository: %s" % project)
-            self.chdir(project_cache_dir)
-            short_project = project.split('/')[-1]
-            if short_project.endswith('.git'):
-                short_project = short_project[:-4]
-            if not os.path.isdir(short_project):
-                out = self.run_command("git clone %s %s" %
-                                       (project, short_project))
-            self.chdir(os.path.join(project_cache_dir,
-                                    short_project))
-            out = self.run_command("git fetch -p origin")
-
-            if self.args.branch:
-                branches = [self.args.branch]
-            else:
-                branches = self.run_command("git branch -a").split("\n")
-            for branch in branches:
-                branch = branch.strip()
-                if (not branch.startswith("remotes/origin")
-                        or "origin/HEAD" in branch):
-                    continue
-                print("Fetching pip requires for %s:%s" %
-                      (project, branch))
-                if not self.args.no_update:
-                    out = self.run_command("git reset --hard %s" % branch)
-                    out = self.run_command("git clean -x -f -d -q")
-                reqlist = []
-                if os.path.exists('global-requirements.txt'):
-                    reqlist.append('global-requirements.txt')
-                else:
-                    for requires_file in ("requirements.txt",
-                                          "test-requirements.txt",
-                                          "tools/pip-requires",
-                                          "tools/test-requires"):
-                        if os.path.exists(requires_file):
-                            reqlist.append(requires_file)
-                if reqlist:
-                    out = self.run_command(venv_format %
-                                           (pip_cache_dir, venv))
-                    out = self.run_command(upgrade_format %
-                                           (pip, pip_cache_dir,
-                                            build, "setuptools"))
-                    out = self.run_command(upgrade_format %
-                                           (pip, pip_cache_dir,
-                                            build, "pip"))
-                    out = self.run_command(upgrade_format %
-                                           (pip, pip_cache_dir,
-                                            build, "virtualenv"))
-                    if os.path.exists(build):
-                        shutil.rmtree(build)
-                    new_reqs = self.process_http_requirements(reqlist,
-                                                              pip_cache_dir,
-                                                              pip)
-                    (reqfp, reqfn) = tempfile.mkstemp()
-                    os.write(reqfp, '\n'.join(new_reqs))
-                    os.close(reqfp)
-                    out = self.run_command(pip_format %
-                                           (pip, "", pip_cache_dir,
-                                            build, reqfn))
-                    if "\nSuccessfully installed " not in out:
-                        sys.stderr.write("Installing pip requires for %s:%s "
-                                         "failed.\n%s\n" %
-                                         (project, branch, out))
-                        print("pip install did not indicate success")
-                    else:
-                        freeze = self.run_command("%s freeze -l" % pip)
-                        requires = self.find_pkg_info(build)
-                        reqfd = open(reqs, "w")
-                        for line in freeze.split("\n"):
-                            if line.startswith("-e ") or (
-                                    "==" in line and " " not in line):
-                                requires.add(line)
-                        for r in requires:
-                            reqfd.write(r + "\n")
-                        reqfd.close()
-                        out = self.run_command(venv_format %
-                                               (pip_cache_dir, venv))
-                        if os.path.exists(build):
-                            shutil.rmtree(build)
-                        out = self.run_command(pip_format %
-                                               (pip, "--no-install",
-                                                pip_cache_dir, build, reqs))
-                        if "\nSuccessfully downloaded " not in out:
-                            sys.stderr.write("Downloading pip requires for "
-                                             "%s:%s failed.\n%s\n" %
-                                             (project, branch, out))
-                            print("pip install did not indicate success")
-                        print("cached:\n%s" % freeze)
-                else:
-                    print("no requirements")
-        shutil.rmtree(workdir)
-
-    def process_cache(self, mirror):
-        if self.args.noop:
-            return
-
-        pip_cache_dir = os.path.join(self.config['cache-root'],
-                                     'pip', mirror['name'])
-        destination_mirror = mirror['output']
-
-        PACKAGE_VERSION_RE = re.compile(r'(.*)-[0-9]')
-        full_html_line = "<a href='{dir}/{name}'>{name}</a><br />\n"
-
-        packages = {}
-        package_count = 0
-
-        if not os.path.exists(destination_mirror):
-            os.makedirs(destination_mirror)
-
-        for filename in os.listdir(pip_cache_dir):
-            if filename.endswith('content-type'):
-                continue
-
-            realname = urllib.unquote(filename)
-            # The ? accounts for sourceforge downloads
-            tarball = os.path.basename(realname).split("?")[0]
-            name_match = PACKAGE_VERSION_RE.search(tarball)
-
-            if name_match is None:
-                continue
-            package_name = name_match.group(1)
-
-            version_list = packages.get(package_name, {})
-            version_list[tarball] = filename
-            packages[package_name] = version_list
-            package_count = package_count + 1
-
-        full_html = open(os.path.join(destination_mirror, ".full.html"), 'w')
-        simple_html = open(os.path.join(destination_mirror, ".index.html"),
-                           'w')
-
-        header = ("<html><head><title>PyPI Mirror</title></head>"
-                  "<body><h1>PyPI Mirror</h1><h2>Last update: %s</h2>\n\n"
-                  % datetime.datetime.utcnow().strftime("%c UTC"))
-        full_html.write(header)
-        simple_html.write(header)
-
-        for package_name, versions in packages.items():
-            destination_dir = os.path.join(destination_mirror, package_name)
-            if not os.path.isdir(destination_dir):
-                os.makedirs(destination_dir)
-            safe_dir = urllib.quote(package_name)
-            simple_html.write("<a href='%s'>%s</a><br />\n" %
-                              (safe_dir, safe_dir))
-            with open(os.path.join(destination_dir, ".index.html"),
-                      'w') as index:
-                index.write("""<html><head>
-          <title>%s &ndash; PyPI Mirror</title>
-        </head><body>\n""" % package_name)
-                for tarball, filename in versions.items():
-                    source_path = os.path.join(pip_cache_dir, filename)
-                    destination_path = os.path.join(destination_dir,
-                                                    tarball)
-                    dot_destination_path = os.path.join(destination_dir,
-                                                        '.' + tarball)
-                    with open(dot_destination_path, 'w') as dest:
-                        src = open(source_path, 'r').read()
-                        md5sum = md5.md5(src).hexdigest()
-                        dest.write(src)
-
-                        safe_name = urllib.quote(tarball)
-
-                        full_html.write(full_html_line.format(dir=safe_dir,
-                                                              name=safe_name))
-                        index.write("<a href='%s#md5=%s'>%s</a>\n" %
-                                    (safe_name, md5sum, safe_name))
-                    os.rename(dot_destination_path, destination_path)
-                index.write("</body></html>\n")
-            os.rename(os.path.join(destination_dir, ".index.html"),
-                      os.path.join(destination_dir, "index.html"))
-        footer = """<p class='footer'>Generated by process_cache.py; %d
-        packages mirrored. </p>
-        </body></html>\n""" % package_count
-        full_html.write(footer)
-        full_html.close()
-        os.rename(os.path.join(destination_mirror, ".full.html"),
-                  os.path.join(destination_mirror, "full.html"))
-        simple_html.write(footer)
-        simple_html.close()
-        os.rename(os.path.join(destination_mirror, ".index.html"),
-                  os.path.join(destination_mirror, "index.html"))
-
-
-def main():
-    mb = Mirror()
-    mb.run()
-
-
-if __name__ == "__main__":
-    main()
diff --git a/setup.cfg b/setup.cfg
index a257d7e..d71104c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -25,7 +25,6 @@
     notify-impact = jeepyb.cmd.notify_impact:main
     openstackwatch = jeepyb.cmd.openstackwatch:main
     process-cache = jeepyb.cmd.process_cache:main
-    run-mirror = jeepyb.cmd.run_mirror:main
     trivial-rebase = jeepyb.cmd.trivial_rebase:main
     update-blueprint = jeepyb.cmd.update_blueprint:main
     update-bug = jeepyb.cmd.update_bug:main