mirror of
				https://git.launchpad.net/ubuntu-dev-tools
				synced 2025-11-04 07:54:03 +00:00 
			
		
		
		
	pull-uca-source: update to allow using binary pkg names, -pockets, and specific versions
This commit is contained in:
		
							parent
							
								
									86b2c25c16
								
							
						
					
					
						commit
						03fda64eae
					
				
							
								
								
									
										116
									
								
								pull-uca-source
									
									
									
									
									
								
							
							
						
						
									
										116
									
								
								pull-uca-source
									
									
									
									
									
								
							@ -1,11 +1,12 @@
 | 
			
		||||
#!/usr/bin/python
 | 
			
		||||
#
 | 
			
		||||
# pull-uca-source -- pull a source package from Ubuntu Cloud Archive
 | 
			
		||||
# Basic usage: pull-uca-source <source package> <openstack release>
 | 
			
		||||
# Basic usage: pull-uca-source <source package> <openstack release> [version]
 | 
			
		||||
#
 | 
			
		||||
# Copyright (C) 2008,      Iain Lane <iain@orangesquash.org.uk>,
 | 
			
		||||
#               2010-2011, Stefano Rivera <stefanor@ubuntu.com>
 | 
			
		||||
#               2016,      Corey Bryant <corey.bryant@ubuntu.com>
 | 
			
		||||
#               2016,      Dan Streetman <dan.streetman@canonical.com>
 | 
			
		||||
#
 | 
			
		||||
# ##################################################################
 | 
			
		||||
#
 | 
			
		||||
@ -24,56 +25,129 @@
 | 
			
		||||
# ##################################################################
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import re
 | 
			
		||||
import json
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
import urllib2
 | 
			
		||||
from optparse import OptionParser
 | 
			
		||||
 | 
			
		||||
from ubuntutools.archive import SourcePackage, DownloadError
 | 
			
		||||
from ubuntutools.lp.lpapicache import Launchpad
 | 
			
		||||
from distro_info import UbuntuDistroInfo, DistroDataOutdated
 | 
			
		||||
 | 
			
		||||
from ubuntutools.archive import UbuntuCloudArchiveSourcePackage, DownloadError
 | 
			
		||||
from ubuntutools.config import UDTConfig
 | 
			
		||||
from ubuntutools.lp.lpapicache import Distribution, Launchpad
 | 
			
		||||
from ubuntutools.lp.udtexceptions import (SeriesNotFoundException,
 | 
			
		||||
                                          PackageNotFoundException,
 | 
			
		||||
                                          PocketDoesNotExistError)
 | 
			
		||||
from ubuntutools.logger import Logger
 | 
			
		||||
from ubuntutools.misc import split_release_pocket
 | 
			
		||||
 | 
			
		||||
from lazr.restfulclient.errors import NotFound
 | 
			
		||||
 | 
			
		||||
from launchpadlib.launchpad import Launchpad as LP
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def showOpenstackReleases(uca):
 | 
			
		||||
    releases = []
 | 
			
		||||
    for p in uca.ppas:
 | 
			
		||||
        if re.match("\w*-staging", p.name):
 | 
			
		||||
            releases.append(re.sub("-staging", "", p.name))
 | 
			
		||||
    Logger.error("Openstack releases are:\n\t%s", ", ".join(releases))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def getSPPH(lp, archive, package, version=None, series=None, pocket=None, try_binary=True):
 | 
			
		||||
    params = { 'exact_match': True, 'order_by_date': True, }
 | 
			
		||||
    if pocket:
 | 
			
		||||
        params['pocket'] = pocket
 | 
			
		||||
    if series:
 | 
			
		||||
        params['distro_series'] = series()
 | 
			
		||||
    elif version:
 | 
			
		||||
        params['version'] = version
 | 
			
		||||
    Logger.normal("checking %s version %s pocket %s", package, version, pocket)
 | 
			
		||||
    spphs = archive.getPublishedSources(source_name=package, **params)
 | 
			
		||||
    if spphs:
 | 
			
		||||
        return spphs[0]
 | 
			
		||||
    if not try_binary:
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    # Didn't find any, maybe the package is a binary package name
 | 
			
		||||
    if series:
 | 
			
		||||
        del params['distro_series']
 | 
			
		||||
        archs = lp.load(series().architectures_collection_link).entries
 | 
			
		||||
        params['distro_arch_series'] = archs[0]['self_link']
 | 
			
		||||
    bpphs = archive.getPublishedBinaries(binary_name=package, **params)
 | 
			
		||||
    if bpphs:
 | 
			
		||||
        bpph_build = lp.load(bpphs[0].build_link)
 | 
			
		||||
        source_package = bpph_build.source_package_name
 | 
			
		||||
        return getSPPH(lp, archive, source_package, version, series, pocket,
 | 
			
		||||
                       try_binary=False)
 | 
			
		||||
 | 
			
		||||
    return None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    usage = "Usage: %prog <package> <openstack release>"
 | 
			
		||||
    usage = "Usage: %prog <package> <openstack release> [version]"
 | 
			
		||||
    opt_parser = OptionParser(usage)
 | 
			
		||||
    opt_parser.add_option('-d', '--download-only',
 | 
			
		||||
                          dest='download_only', default=False,
 | 
			
		||||
                          action='store_true',
 | 
			
		||||
                          help="Do not extract the source package")
 | 
			
		||||
    opt_parser.add_option('-m', '--mirror', metavar='OPENSTACK_MIRROR',
 | 
			
		||||
                          dest='openstack_mirror',
 | 
			
		||||
                          help='Preferred Openstack mirror (default: Launchpad)')
 | 
			
		||||
    opt_parser.add_option('--no-conf',
 | 
			
		||||
                          dest='no_conf', default=False, action='store_true',
 | 
			
		||||
                          help="Don't read config files or environment "
 | 
			
		||||
                               "variables")
 | 
			
		||||
    (options, args) = opt_parser.parse_args()
 | 
			
		||||
    if len(sys.argv) != 3:
 | 
			
		||||
    if len(args) < 2:
 | 
			
		||||
        opt_parser.error("Must specify package name and openstack release")
 | 
			
		||||
 | 
			
		||||
    config = UDTConfig(options.no_conf)
 | 
			
		||||
    if options.openstack_mirror is None:
 | 
			
		||||
        options.openstack_mirror = config.get_value('OPENSTACK_MIRROR')
 | 
			
		||||
    mirrors = []
 | 
			
		||||
    if options.openstack_mirror:
 | 
			
		||||
        mirrors.append(options.openstack_mirror)
 | 
			
		||||
 | 
			
		||||
    # Login anonymously to LP
 | 
			
		||||
    Launchpad.login_anonymously()
 | 
			
		||||
    lp = LP.login_anonymously("pull-uca-source", "production")
 | 
			
		||||
    uca = lp.people("ubuntu-cloud-archive")
 | 
			
		||||
 | 
			
		||||
    package = str(args[0]).lower()
 | 
			
		||||
    release = str(args[1]).lower()
 | 
			
		||||
    version = None
 | 
			
		||||
    if len(args) > 2:
 | 
			
		||||
        version = str(args[2])
 | 
			
		||||
 | 
			
		||||
    # Downloads are from Ubuntu Cloud Archive staging PPAs
 | 
			
		||||
    uca = Launchpad.distributions["~ubuntu-cloud-archive"]
 | 
			
		||||
    ppa_name = ''.join([release, '-staging'])
 | 
			
		||||
    pocket = None
 | 
			
		||||
    try:
 | 
			
		||||
        ppa = uca.getPPAByName(name=ppa_name)
 | 
			
		||||
        (release, pocket) = split_release_pocket(release, default=None)
 | 
			
		||||
    except PocketDoesNotExistError, e:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        archive = uca.getPPAByName(name="%s-staging" % release)
 | 
			
		||||
    except NotFound, e:
 | 
			
		||||
        Logger.error('Archive does not exist for OpenStack release: %s',
 | 
			
		||||
                     str(release))
 | 
			
		||||
        Logger.error('Archive does not exist for Openstack release: %s',
 | 
			
		||||
                     release)
 | 
			
		||||
        showOpenstackReleases(uca)
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    srcpkg = None
 | 
			
		||||
    for source in ppa.getPublishedSources(status='Published'):
 | 
			
		||||
        if source.source_package_name == package:
 | 
			
		||||
             dsc_file = source.sourceFileUrls()[0]
 | 
			
		||||
             srcpkg = SourcePackage(dscfile=dsc_file)
 | 
			
		||||
             version = srcpkg.dsc['Version']
 | 
			
		||||
 | 
			
		||||
    if not srcpkg:
 | 
			
		||||
        Logger.error('Package not found: %s', str(package))
 | 
			
		||||
    spph = getSPPH(lp, archive, package, version, pocket=pocket)
 | 
			
		||||
    if not spph:
 | 
			
		||||
        Logger.error("Package %s in %s not found.", package, release)
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    Logger.normal('Downloading %s version %s', package, version)
 | 
			
		||||
    package = spph.source_package_name
 | 
			
		||||
    version = spph.source_package_version
 | 
			
		||||
    component = spph.component_name
 | 
			
		||||
    Logger.normal('Downloading %s version %s component %s', package, version, component)
 | 
			
		||||
    srcpkg = UbuntuCloudArchiveSourcePackage(release, package, version, component=component,
 | 
			
		||||
                                             mirrors=mirrors)
 | 
			
		||||
 | 
			
		||||
    try:
 | 
			
		||||
        srcpkg.pull()
 | 
			
		||||
    except DownloadError, e:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								setup.py
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								setup.py
									
									
									
									
									
								
							@ -38,6 +38,7 @@ else:
 | 
			
		||||
           'pull-debian-source',
 | 
			
		||||
           'pull-lp-source',
 | 
			
		||||
           'pull-revu-source',
 | 
			
		||||
           'pull-uca-source',
 | 
			
		||||
           'requestbackport',
 | 
			
		||||
           'requestsync',
 | 
			
		||||
           'reverse-build-depends',
 | 
			
		||||
 | 
			
		||||
@ -538,6 +538,20 @@ class UbuntuSourcePackage(SourcePackage):
 | 
			
		||||
    distribution = 'ubuntu'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UbuntuCloudArchiveSourcePackage(UbuntuSourcePackage):
 | 
			
		||||
    "Download / unpack an Ubuntu Cloud Archive source package"
 | 
			
		||||
    def __init__(self, uca_release, *args, **kwargs):
 | 
			
		||||
        super(UbuntuCloudArchiveSourcePackage, self).__init__(*args, **kwargs)
 | 
			
		||||
        self._uca_release = uca_release
 | 
			
		||||
        self.masters = [ "http://ubuntu-cloud.archive.canonical.com/ubuntu/" ]
 | 
			
		||||
 | 
			
		||||
    def _lp_url(self, filename):
 | 
			
		||||
        "Build a source package URL on Launchpad"
 | 
			
		||||
        return os.path.join('https://launchpad.net', "~ubuntu-cloud-archive",
 | 
			
		||||
                            '+archive', ("%s-staging" % self._uca_release),
 | 
			
		||||
                            '+files', filename)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FakeSPPH(object):
 | 
			
		||||
    """Provide the same interface as
 | 
			
		||||
    ubuntutools.lpapicache.SourcePackagePublishingHistory
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user