mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-16 09:31:08 +00:00
pullpkg: add support for pulling from upload queue
This commit is contained in:
parent
8f42fb976f
commit
8aa2d602c5
@ -45,6 +45,8 @@ POCKETS = DEFAULT_POCKETS + ('Backports',)
|
|||||||
DEFAULT_STATUSES = ('Pending', 'Published')
|
DEFAULT_STATUSES = ('Pending', 'Published')
|
||||||
STATUSES = DEFAULT_STATUSES + ('Superseded', 'Deleted', 'Obsolete')
|
STATUSES = DEFAULT_STATUSES + ('Superseded', 'Deleted', 'Obsolete')
|
||||||
|
|
||||||
|
UPLOAD_QUEUE_STATUSES = ('New', 'Unapproved', 'Accepted', 'Done', 'Rejected')
|
||||||
|
|
||||||
_system_distribution_chain = []
|
_system_distribution_chain = []
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
# ##################################################################
|
# ##################################################################
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
import errno
|
import errno
|
||||||
@ -30,6 +31,8 @@ from argparse import ArgumentParser
|
|||||||
|
|
||||||
from distro_info import DebianDistroInfo
|
from distro_info import DebianDistroInfo
|
||||||
|
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from ubuntutools.archive import (UbuntuSourcePackage, DebianSourcePackage,
|
from ubuntutools.archive import (UbuntuSourcePackage, DebianSourcePackage,
|
||||||
UbuntuCloudArchiveSourcePackage,
|
UbuntuCloudArchiveSourcePackage,
|
||||||
PersonalPackageArchiveSourcePackage)
|
PersonalPackageArchiveSourcePackage)
|
||||||
@ -39,7 +42,11 @@ from ubuntutools.lp.udtexceptions import (SeriesNotFoundException,
|
|||||||
PackageNotFoundException,
|
PackageNotFoundException,
|
||||||
PocketDoesNotExistError,
|
PocketDoesNotExistError,
|
||||||
InvalidDistroValueError)
|
InvalidDistroValueError)
|
||||||
from ubuntutools.misc import (split_release_pocket, host_architecture, STATUSES)
|
from ubuntutools.misc import (split_release_pocket,
|
||||||
|
host_architecture,
|
||||||
|
download,
|
||||||
|
UPLOAD_QUEUE_STATUSES,
|
||||||
|
STATUSES)
|
||||||
|
|
||||||
from ubuntutools import _loggingBasicConfig
|
from ubuntutools import _loggingBasicConfig
|
||||||
|
|
||||||
@ -150,7 +157,9 @@ class PullPkg(object):
|
|||||||
|
|
||||||
if distro == DISTRO_UBUNTU:
|
if distro == DISTRO_UBUNTU:
|
||||||
parser.add_argument('--security', action='store_true',
|
parser.add_argument('--security', action='store_true',
|
||||||
help='Check the Ubuntu Security Team PPA')
|
help='Pull from the Ubuntu Security Team (proposed) PPA')
|
||||||
|
parser.add_argument('--upload-queue', action='store_true',
|
||||||
|
help='Pull from the Ubuntu upload queue')
|
||||||
if distro == DISTRO_PPA:
|
if distro == DISTRO_PPA:
|
||||||
parser.add_argument('--ppa', help='PPA to pull from')
|
parser.add_argument('--ppa', help='PPA to pull from')
|
||||||
if parser.parse_known_args(args)[0].ppa is None:
|
if parser.parse_known_args(args)[0].ppa is None:
|
||||||
@ -295,6 +304,7 @@ class PullPkg(object):
|
|||||||
# ensure these are always included so we can just check for None/False later
|
# ensure these are always included so we can just check for None/False later
|
||||||
options['ppa'] = options.get('ppa', None)
|
options['ppa'] = options.get('ppa', None)
|
||||||
options['security'] = options.get('security', False)
|
options['security'] = options.get('security', False)
|
||||||
|
options['upload_queue'] = options.get('upload_queue', False)
|
||||||
|
|
||||||
return options
|
return options
|
||||||
|
|
||||||
@ -347,6 +357,22 @@ class PullPkg(object):
|
|||||||
|
|
||||||
params['status'] = STATUSES if 'all' in options['status'] else options['status']
|
params['status'] = STATUSES if 'all' in options['status'] else options['status']
|
||||||
|
|
||||||
|
# special handling for upload queue
|
||||||
|
if options['upload_queue']:
|
||||||
|
if len(options['status']) > 1:
|
||||||
|
raise ValueError("Too many --status provided, "
|
||||||
|
"can only search for a single status or 'all'")
|
||||||
|
if not options['status']:
|
||||||
|
params['status'] = None
|
||||||
|
elif options['status'][0].lower() == 'all':
|
||||||
|
params['status'] = 'all'
|
||||||
|
elif options['status'][0].capitalize() in UPLOAD_QUEUE_STATUSES:
|
||||||
|
params['status'] = options['status'][0].capitalize()
|
||||||
|
else:
|
||||||
|
msg = ("Invalid upload queue status '%s': valid values are %s" %
|
||||||
|
(options['status'][0], ', '.join(UPLOAD_QUEUE_STATUSES)))
|
||||||
|
raise ValueError(msg)
|
||||||
|
|
||||||
return params
|
return params
|
||||||
|
|
||||||
def pull(self, args=sys.argv[1:]):
|
def pull(self, args=sys.argv[1:]):
|
||||||
@ -369,6 +395,11 @@ class PullPkg(object):
|
|||||||
params = self._get_params(options)
|
params = self._get_params(options)
|
||||||
package = params['package']
|
package = params['package']
|
||||||
|
|
||||||
|
if options['upload_queue']:
|
||||||
|
# upload queue API is different/simpler
|
||||||
|
self.pull_upload_queue(pull, arch=options['arch'], **params)
|
||||||
|
return
|
||||||
|
|
||||||
# call implementation, and allow exceptions to flow up to caller
|
# call implementation, and allow exceptions to flow up to caller
|
||||||
srcpkg = DISTRO_PKG_CLASS[distro](**params)
|
srcpkg = DISTRO_PKG_CLASS[distro](**params)
|
||||||
spph = srcpkg.lp_spph
|
spph = srcpkg.lp_spph
|
||||||
@ -422,3 +453,125 @@ class PullPkg(object):
|
|||||||
else:
|
else:
|
||||||
Logger.error("Internal error: invalid pull value after parse_pull()")
|
Logger.error("Internal error: invalid pull value after parse_pull()")
|
||||||
raise InvalidPullValueError("Invalid pull value '%s'" % pull)
|
raise InvalidPullValueError("Invalid pull value '%s'" % pull)
|
||||||
|
|
||||||
|
def pull_upload_queue(self, pull, **params):
|
||||||
|
package = params['package']
|
||||||
|
version = params['version']
|
||||||
|
arch = params['arch']
|
||||||
|
|
||||||
|
if not params['series']:
|
||||||
|
Logger.error("Using --upload-queue requires specifying series")
|
||||||
|
return
|
||||||
|
|
||||||
|
series = Distribution('ubuntu').getSeries(params['series'])
|
||||||
|
|
||||||
|
queueparams = {'name': package}
|
||||||
|
if params['pocket']:
|
||||||
|
queueparams['pocket'] = params['pocket']
|
||||||
|
|
||||||
|
if params['status'] == 'all':
|
||||||
|
queueparams['status'] = None
|
||||||
|
queuetype = 'any'
|
||||||
|
elif params['status']:
|
||||||
|
queueparams['status'] = params['status']
|
||||||
|
queuetype = params['status']
|
||||||
|
else:
|
||||||
|
queuetype = 'Unapproved'
|
||||||
|
|
||||||
|
packages = [p for p in series.getPackageUploads(**queueparams) if
|
||||||
|
p.package_version == version or
|
||||||
|
str(p.id) == version or
|
||||||
|
not version]
|
||||||
|
|
||||||
|
if pull == PULL_SOURCE:
|
||||||
|
packages = [p for p in packages if p.contains_source]
|
||||||
|
elif pull in VALID_BINARY_PULLS:
|
||||||
|
packages = [p for p in packages if
|
||||||
|
p.contains_build and
|
||||||
|
(arch in ['all', 'any'] or
|
||||||
|
arch in p.display_arches.replace(',', '').split())]
|
||||||
|
|
||||||
|
if not packages:
|
||||||
|
msg = ("Package %s not found in %s upload queue for %s" %
|
||||||
|
(package, queuetype, series.name))
|
||||||
|
if version:
|
||||||
|
msg += " with version/id %s" % version
|
||||||
|
if pull in VALID_BINARY_PULLS:
|
||||||
|
msg += " for arch %s" % arch
|
||||||
|
raise PackageNotFoundException(msg)
|
||||||
|
|
||||||
|
if pull == PULL_LIST:
|
||||||
|
for p in packages:
|
||||||
|
msg = "Found %s %s (ID %s)" % (p.package_name, p.package_version, p.id)
|
||||||
|
if p.display_arches:
|
||||||
|
msg += " arch %s" % p.display_arches
|
||||||
|
Logger.info(msg)
|
||||||
|
url = p.changesFileUrl()
|
||||||
|
if url:
|
||||||
|
Logger.info("Changes file:")
|
||||||
|
Logger.info(" %s", url)
|
||||||
|
else:
|
||||||
|
Logger.info("No changes file")
|
||||||
|
urls = p.sourceFileUrls()
|
||||||
|
if urls:
|
||||||
|
Logger.info("Source files:")
|
||||||
|
for url in urls:
|
||||||
|
Logger.info(" %s", url)
|
||||||
|
else:
|
||||||
|
Logger.info("No source files")
|
||||||
|
urls = p.binaryFileUrls()
|
||||||
|
if urls:
|
||||||
|
Logger.info("Binary files:")
|
||||||
|
for url in urls:
|
||||||
|
Logger.info(" %s", url)
|
||||||
|
Logger.info(" { %s }" % p.binaryFileProperties(url))
|
||||||
|
else:
|
||||||
|
Logger.info("No binary files")
|
||||||
|
urls = p.customFileUrls()
|
||||||
|
if urls:
|
||||||
|
Logger.info("Custom files:")
|
||||||
|
for url in urls:
|
||||||
|
Logger.info(" %s", url)
|
||||||
|
return
|
||||||
|
|
||||||
|
if len(packages) > 1:
|
||||||
|
msg = "Found multiple packages"
|
||||||
|
if version:
|
||||||
|
msg += " with version %s, please specify the ID instead" % version
|
||||||
|
else:
|
||||||
|
msg += ", please specify the version"
|
||||||
|
Logger.error("Available package versions/ids are:")
|
||||||
|
for p in packages:
|
||||||
|
Logger.error("%s %s (id %s)" % (p.package_name, p.package_version, p.id))
|
||||||
|
raise PackageNotFoundException(msg)
|
||||||
|
|
||||||
|
p = packages[0]
|
||||||
|
|
||||||
|
urls = set(p.customFileUrls())
|
||||||
|
if p.changesFileUrl():
|
||||||
|
urls.add(p.changesFileUrl())
|
||||||
|
|
||||||
|
if pull == PULL_SOURCE:
|
||||||
|
urls |= set(p.sourceFileUrls())
|
||||||
|
if not urls:
|
||||||
|
Logger.error("No source files to download")
|
||||||
|
for url in urls:
|
||||||
|
download(url)
|
||||||
|
else:
|
||||||
|
name = '.*'
|
||||||
|
if pull == PULL_DEBS:
|
||||||
|
name = r'{}(?<!-di)(?<!-dbgsym)$'.format(name)
|
||||||
|
elif pull == PULL_DDEBS:
|
||||||
|
name += '-dbgsym$'
|
||||||
|
elif pull == PULL_UDEBS:
|
||||||
|
name += '-di$'
|
||||||
|
else:
|
||||||
|
raise InvalidPullValueError("Invalid pull value %s" % pull)
|
||||||
|
|
||||||
|
urls |= set(p.binaryFileUrls())
|
||||||
|
if not urls:
|
||||||
|
Logger.error("No binary files to download")
|
||||||
|
for url in urls:
|
||||||
|
filename = os.path.basename(urlparse(url).path)
|
||||||
|
if re.match(name, filename):
|
||||||
|
download(url)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user