From 48de25fab7a0d88c1acf0a2a93ff1e98662c8ad1 Mon Sep 17 00:00:00 2001 From: Richard Ipsum Date: Mon, 12 Jan 2015 15:40:08 +0000 Subject: Fix python.to_lorry to use version passed on cmdline --- baserockimport/exts/python.to_lorry | 64 ++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 33 deletions(-) diff --git a/baserockimport/exts/python.to_lorry b/baserockimport/exts/python.to_lorry index cb4e4ec..db33e5f 100755 --- a/baserockimport/exts/python.to_lorry +++ b/baserockimport/exts/python.to_lorry @@ -135,36 +135,35 @@ def filter_urls(urls): return filter(allowed_extension, urls) -def get_releases(client, requirement): +def get_releases(client, package_name): try: - releases = client.package_releases(requirement.project_name) + releases = client.package_releases(package_name) except Exception as e: error("Couldn't fetch release data:", e) return releases -def generate_tarball_lorry(lorry_prefix, client, requirement): - releases = get_releases(client, requirement) +def generate_tarball_lorry(lorry_prefix, client, package_name, version=None): + releases = get_releases(client, package_name) if len(releases) == 0: - error("Couldn't find any releases for package %s" - % requirement.project_name) + error("Couldn't find any releases for package %s" % package_name) - releases = [v for v in releases if specs_satisfied(v, requirement.specs)] + logging.debug('Found releases: %s', str(releases)) - if len(releases) == 0: - error("Couldn't find any releases of %s" - " that satisfy version constraints: %s" - % (requirement.project_name, requirement.specs)) + # Use latest release if no version specified + version = version or releases[0] - release_version = releases[0] + if version not in releases: + error("Couldn't find any releases of %s with version: %s" + % (package_name, version)) - logging.debug('Fetching urls for package %s with version %s' - % (requirement.project_name, release_version)) + logging.debug('Fetching urls for package %s with version %s', + package_name, version) try: # Get a list of dicts, the dicts contain the urls. - urls = client.release_urls(requirement.project_name, release_version) + urls = client.release_urls(package_name, version) except Exception as e: error("Couldn't fetch release urls:", e) @@ -178,12 +177,11 @@ def generate_tarball_lorry(lorry_prefix, client, requirement): warn("\t%s" % url['url']) error("Cannot proceed") else: - error("Couldn't find any download urls for package %s" - % requirement.project_name) + error("Couldn't find any download urls for package %s" % package_name) url = urls[0]['url'] - return make_tarball_lorry(lorry_prefix, requirement.project_name, url) + return make_tarball_lorry(lorry_prefix, package_name, url) def str_repo_lorry(lorry_prefix, package_name, repo_type, url): name = '%s/%s' % (lorry_prefix, package_name) @@ -201,41 +199,41 @@ class PythonLorryExtension(ImportExtension): super(PythonLorryExtension, self).__init__() def run(self): - if len(sys.argv) != 2: - # TODO explain the format of python requirements - # warn the user that they probably want to quote their arg - # > < will be interpreted as redirection by the shell - print('usage: %s requirement' % sys.argv[0], file=sys.stderr) + if len(sys.argv) not in [2, 3]: + print('usage: %s NAME [VERSION]' % sys.argv[0], file=sys.stderr) sys.exit(1) client = xmlrpclib.ServerProxy(PYPI_URL) - req = pkg_resources.parse_requirements(sys.argv[1]).next() + package_name = sys.argv[1] + version = sys.argv[2] if len(sys.argv) == 3 else None + + logging.debug('Looking for package: %s with version %s', + package_name, version) with open(self.local_data_path('python.yaml')) as f: lorry_prefix = yaml.load(f)['lorry-prefix'] - new_proj_name = name_or_closest(client, req.project_name) + new_proj_name = name_or_closest(client, package_name) if new_proj_name == None: - error("Couldn't find any project with name '%s'" % req.project_name) - - logging.debug('Treating %s as %s' % (req.project_name, new_proj_name)) - req.project_name = new_proj_name + error("Couldn't find any project with name '%s'" % package_name) - logging.debug('Looking for requirement: %s', req) + logging.debug('Treating %s as %s' % (package_name, new_proj_name)) + package_name = new_proj_name - metadata = fetch_package_metadata(req.project_name) + metadata = fetch_package_metadata(package_name) info = metadata['info'] repo_type = (find_repo_type(info['home_page']) if 'home_page' in info else None) if repo_type: - print(str_repo_lorry(lorry_prefix, req.project_name, + print(str_repo_lorry(lorry_prefix, package_name, repo_type, info['home_page'])) else: - print(generate_tarball_lorry(lorry_prefix, client, req)) + print(generate_tarball_lorry(lorry_prefix, client, + package_name, version)) if __name__ == '__main__': PythonLorryExtension().run() -- cgit v1.2.1