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 – 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