mirror of
https://git.launchpad.net/ubuntu-dev-tools
synced 2025-03-13 08:01:09 +00:00
pull-lp-source, requestbackport: Take the latest version from any
non-backports pocket. Implemented by making lpapicache's getSourcePackage smarter.
This commit is contained in:
parent
7dfb6c3ed7
commit
9ba1790863
@ -24,7 +24,6 @@ import shutil
|
|||||||
import sys
|
import sys
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from launchpadlib.launchpad import Launchpad
|
|
||||||
import lsb_release
|
import lsb_release
|
||||||
|
|
||||||
from debian.debian_support import Version
|
from debian.debian_support import Version
|
||||||
@ -35,6 +34,9 @@ from ubuntutools.archive import (SourcePackage, DebianSourcePackage,
|
|||||||
UbuntuSourcePackage, DownloadError, rmadison)
|
UbuntuSourcePackage, DownloadError, rmadison)
|
||||||
from ubuntutools.config import UDTConfig, ubu_email
|
from ubuntutools.config import UDTConfig, ubu_email
|
||||||
from ubuntutools.builder import get_builder
|
from ubuntutools.builder import get_builder
|
||||||
|
from ubuntutools.lp.lpapicache import (Launchpad, Distribution,
|
||||||
|
SeriesNotFoundException,
|
||||||
|
PackageNotFoundException)
|
||||||
from ubuntutools.misc import (system_distribution, vendor_to_distroinfo,
|
from ubuntutools.misc import (system_distribution, vendor_to_distroinfo,
|
||||||
codename_to_distribution)
|
codename_to_distribution)
|
||||||
from ubuntutools.question import YesNoQuestion
|
from ubuntutools.question import YesNoQuestion
|
||||||
@ -144,29 +146,9 @@ def parse(args):
|
|||||||
|
|
||||||
return opts, args, config
|
return opts, args, config
|
||||||
|
|
||||||
def get_current_version(package, distribution, source_release):
|
|
||||||
info = vendor_to_distroinfo(distribution)
|
|
||||||
source_release = info().codename(source_release, default=source_release)
|
|
||||||
|
|
||||||
latest_version = None
|
def find_release_package(mirror, workdir, package, version, source_release,
|
||||||
|
config):
|
||||||
releases = [source_release]
|
|
||||||
if distribution.lower() == "ubuntu":
|
|
||||||
releases += [source_release + "-updates", source_release + "-security"]
|
|
||||||
|
|
||||||
for release in releases:
|
|
||||||
for record in rmadison(distribution.lower(), package, suite=release):
|
|
||||||
if 'source' not in record:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if (not latest_version or
|
|
||||||
Version(latest_version) < Version(record['version'])):
|
|
||||||
latest_version = record['version']
|
|
||||||
|
|
||||||
return latest_version
|
|
||||||
|
|
||||||
def find_release_package(launchpad, mirror, workdir, package, version,
|
|
||||||
source_release, config):
|
|
||||||
srcpkg = None
|
srcpkg = None
|
||||||
|
|
||||||
if source_release:
|
if source_release:
|
||||||
@ -181,40 +163,37 @@ def find_release_package(launchpad, mirror, workdir, package, version,
|
|||||||
mirrors.append(config.get_value('%s_MIRROR' % distribution.upper()))
|
mirrors.append(config.get_value('%s_MIRROR' % distribution.upper()))
|
||||||
|
|
||||||
if not version:
|
if not version:
|
||||||
version = get_current_version(package, distribution, source_release)
|
archive = Distribution(distribution.lower()).getArchive()
|
||||||
|
try:
|
||||||
if not version:
|
spph = archive.getSourcePackage(package, source_release)
|
||||||
error('Unable to find package %s in release %s.' %
|
except (SeriesNotFoundException, PackageNotFoundException), e:
|
||||||
(package, source_release))
|
error(str(e))
|
||||||
|
version = spph.getVersion()
|
||||||
|
|
||||||
if distribution == 'Debian':
|
if distribution == 'Debian':
|
||||||
srcpkg = DebianSourcePackage(package,
|
srcpkg = DebianSourcePackage(package,
|
||||||
version,
|
version,
|
||||||
workdir=workdir,
|
workdir=workdir,
|
||||||
lp=launchpad,
|
|
||||||
mirrors=mirrors)
|
mirrors=mirrors)
|
||||||
elif distribution == 'Ubuntu':
|
elif distribution == 'Ubuntu':
|
||||||
srcpkg = UbuntuSourcePackage(package,
|
srcpkg = UbuntuSourcePackage(package,
|
||||||
version,
|
version,
|
||||||
workdir=workdir,
|
workdir=workdir,
|
||||||
lp=launchpad,
|
|
||||||
mirrors=mirrors)
|
mirrors=mirrors)
|
||||||
|
|
||||||
return srcpkg
|
return srcpkg
|
||||||
|
|
||||||
def find_package(launchpad, mirror, workdir, package, version, source_release,
|
def find_package(mirror, workdir, package, version, source_release, config):
|
||||||
config):
|
|
||||||
"Returns the SourcePackage"
|
"Returns the SourcePackage"
|
||||||
if package.endswith('.dsc'):
|
if package.endswith('.dsc'):
|
||||||
return SourcePackage(version=version, dscfile=package,
|
return SourcePackage(version=version, dscfile=package,
|
||||||
workdir=workdir, lp=launchpad,
|
workdir=workdir, mirrors=(mirror,))
|
||||||
mirrors=(mirror,))
|
|
||||||
|
|
||||||
if not source_release and not version:
|
if not source_release and not version:
|
||||||
info = vendor_to_distroinfo(system_distribution())
|
info = vendor_to_distroinfo(system_distribution())
|
||||||
source_release = info().devel()
|
source_release = info().devel()
|
||||||
|
|
||||||
srcpkg = find_release_package(launchpad, mirror, workdir, package, version,
|
srcpkg = find_release_package(mirror, workdir, package, version,
|
||||||
source_release, config)
|
source_release, config)
|
||||||
if version and srcpkg.version != version:
|
if version and srcpkg.version != version:
|
||||||
error('Requested backport of version %s but version of %s in %s is %s'
|
error('Requested backport of version %s but version of %s in %s is %s'
|
||||||
@ -298,8 +277,7 @@ def main(args):
|
|||||||
|
|
||||||
opts, (package_or_dsc,), config = parse(args[1:])
|
opts, (package_or_dsc,), config = parse(args[1:])
|
||||||
|
|
||||||
script_name = os.path.basename(sys.argv[0])
|
Launchpad.login_anonymously(service=opts.lpinstance)
|
||||||
launchpad = Launchpad.login_anonymously(script_name, opts.lpinstance)
|
|
||||||
|
|
||||||
if not opts.dest_releases:
|
if not opts.dest_releases:
|
||||||
distinfo = lsb_release.get_distro_information()
|
distinfo = lsb_release.get_distro_information()
|
||||||
@ -317,8 +295,7 @@ def main(args):
|
|||||||
os.makedirs(workdir)
|
os.makedirs(workdir)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
pkg = find_package(launchpad,
|
pkg = find_package(opts.mirror,
|
||||||
opts.mirror,
|
|
||||||
workdir,
|
workdir,
|
||||||
package_or_dsc,
|
package_or_dsc,
|
||||||
opts.version,
|
opts.version,
|
||||||
|
3
debian/changelog
vendored
3
debian/changelog
vendored
@ -5,6 +5,9 @@ ubuntu-dev-tools (0.136ubuntu1) UNRELEASED; urgency=low
|
|||||||
* Use httplib2 everywhere that we do https. The python stdlib doesn't do
|
* Use httplib2 everywhere that we do https. The python stdlib doesn't do
|
||||||
certificate verification.
|
certificate verification.
|
||||||
* requestbackport: Check for existing backport bugs first.
|
* requestbackport: Check for existing backport bugs first.
|
||||||
|
* pull-lp-source, requestbackport: Take the latest version from any
|
||||||
|
non-backports pocket. Implemented by making lpapicache's getSourcePackage
|
||||||
|
smarter.
|
||||||
|
|
||||||
-- Stefano Rivera <stefanor@debian.org> Mon, 21 Nov 2011 09:47:00 +0200
|
-- Stefano Rivera <stefanor@debian.org> Mon, 21 Nov 2011 09:47:00 +0200
|
||||||
|
|
||||||
|
@ -11,6 +11,9 @@ pull\-lp\-source \- download a source package from Launchpad
|
|||||||
\fBpull\-lp\-source\fR downloads and extracts the specified
|
\fBpull\-lp\-source\fR downloads and extracts the specified
|
||||||
\fIversion\fR of <\fBsource package\fR> from Launchpad, or the latest
|
\fIversion\fR of <\fBsource package\fR> from Launchpad, or the latest
|
||||||
version of the specified \fIrelease\fR.
|
version of the specified \fIrelease\fR.
|
||||||
|
To request a version from a particular pocket say
|
||||||
|
\fIrelease\fB\-\fIpocket\fR (with a magic \fB\-release\fR for only the
|
||||||
|
release pocket).
|
||||||
If no \fIversion\fR or \fIrelease\fR is specified, the latest version in
|
If no \fIversion\fR or \fIrelease\fR is specified, the latest version in
|
||||||
the development release will be downloaded.
|
the development release will be downloaded.
|
||||||
|
|
||||||
|
@ -76,10 +76,10 @@ def main():
|
|||||||
release = None
|
release = None
|
||||||
pocket = None
|
pocket = None
|
||||||
try:
|
try:
|
||||||
(release, pocket) = split_release_pocket(version)
|
(release, pocket) = split_release_pocket(version, default=None)
|
||||||
except PocketDoesNotExistError, e:
|
except PocketDoesNotExistError, e:
|
||||||
pass
|
pass
|
||||||
if release in ubuntu_info.all and pocket is not None:
|
if release in ubuntu_info.all:
|
||||||
try:
|
try:
|
||||||
spph = Distribution('ubuntu').getArchive().getSourcePackage(package,
|
spph = Distribution('ubuntu').getArchive().getSourcePackage(package,
|
||||||
release,
|
release,
|
||||||
|
@ -193,7 +193,7 @@ def request_backport(package_spph, source, destinations):
|
|||||||
'package': package_spph.getPackageName(),
|
'package': package_spph.getPackageName(),
|
||||||
'version': package_spph.getVersion(),
|
'version': package_spph.getVersion(),
|
||||||
'component': package_spph.getComponent(),
|
'component': package_spph.getComponent(),
|
||||||
'source': source,
|
'source': package_spph.getSeriesAndPocket(),
|
||||||
'destinations': ', '.join(destinations),
|
'destinations': ', '.join(destinations),
|
||||||
}
|
}
|
||||||
subject = ("Please backport %(package)s %(version)s (%(component)s) "
|
subject = ("Please backport %(package)s %(version)s (%(component)s) "
|
||||||
|
@ -281,7 +281,7 @@ class Archive(BaseWrapper):
|
|||||||
if '_srcpkgs' not in self.__dict__:
|
if '_srcpkgs' not in self.__dict__:
|
||||||
self._srcpkgs = dict()
|
self._srcpkgs = dict()
|
||||||
|
|
||||||
def getSourcePackage(self, name, series=None, pocket='Release'):
|
def getSourcePackage(self, name, series=None, pocket=None):
|
||||||
'''
|
'''
|
||||||
Returns a SourcePackagePublishingHistory object for the most
|
Returns a SourcePackagePublishingHistory object for the most
|
||||||
recent source package in the distribution 'dist', series and
|
recent source package in the distribution 'dist', series and
|
||||||
@ -289,13 +289,23 @@ class Archive(BaseWrapper):
|
|||||||
|
|
||||||
series defaults to the current development series if not specified.
|
series defaults to the current development series if not specified.
|
||||||
|
|
||||||
|
pocket may be a list, if so, the highest version will be returned.
|
||||||
|
It defaults to all pockets except backports.
|
||||||
|
|
||||||
If the requested source package doesn't exist a
|
If the requested source package doesn't exist a
|
||||||
PackageNotFoundException is raised.
|
PackageNotFoundException is raised.
|
||||||
'''
|
'''
|
||||||
# Check if pocket has a valid value
|
if pocket is None:
|
||||||
if pocket not in _POCKETS:
|
pockets = frozenset(('Proposed', 'Updates', 'Security', 'Release'))
|
||||||
raise PocketDoesNotExistError("Pocket '%s' does not exist." %
|
elif isinstance(pocket, basestring):
|
||||||
pocket)
|
pockets = frozenset((pocket,))
|
||||||
|
else:
|
||||||
|
pockets = frozenset(pocket)
|
||||||
|
|
||||||
|
for pocket in pockets:
|
||||||
|
if pocket not in _POCKETS:
|
||||||
|
raise PocketDoesNotExistError("Pocket '%s' does not exist." %
|
||||||
|
pocket)
|
||||||
|
|
||||||
dist = Distribution(self.distribution_link)
|
dist = Distribution(self.distribution_link)
|
||||||
# Check if series is already a DistoSeries object or not
|
# Check if series is already a DistoSeries object or not
|
||||||
@ -305,25 +315,40 @@ class Archive(BaseWrapper):
|
|||||||
else:
|
else:
|
||||||
series = dist.getDevelopmentSeries()
|
series = dist.getDevelopmentSeries()
|
||||||
|
|
||||||
if (name, series.name, pocket) not in self._srcpkgs:
|
index = (name, series.name, pockets)
|
||||||
try:
|
if index not in self._srcpkgs:
|
||||||
srcpkg = self.getPublishedSources(source_name=name,
|
params = {
|
||||||
distro_series=series(),
|
'source_name': name,
|
||||||
pocket=pocket,
|
'distro_series': series(),
|
||||||
status='Published',
|
'status': 'Published',
|
||||||
exact_match=True)[0]
|
'exact_match': True,
|
||||||
index = (name, series.name, pocket)
|
}
|
||||||
self._srcpkgs[index] = SourcePackagePublishingHistory(srcpkg)
|
if len(pockets) == 1:
|
||||||
except IndexError:
|
params['pocket'] = list(pockets)[0]
|
||||||
|
|
||||||
|
records = self.getPublishedSources(**params)
|
||||||
|
|
||||||
|
latest = None
|
||||||
|
for record in records:
|
||||||
|
if record.pocket not in pockets:
|
||||||
|
continue
|
||||||
|
if latest is None or (Version(latest.source_package_version)
|
||||||
|
< Version(record.source_package_version)):
|
||||||
|
latest = record
|
||||||
|
|
||||||
|
if latest is None:
|
||||||
msg = "The package '%s' does not exist in the %s %s archive" % \
|
msg = "The package '%s' does not exist in the %s %s archive" % \
|
||||||
(name, dist.display_name, self.name)
|
(name, dist.display_name, self.name)
|
||||||
if pocket == 'Release':
|
pockets = [series.name if pocket == 'Release'
|
||||||
msg += " in '%s'" % series.name
|
else '%s-%s' % (series.name, pocket.lower())
|
||||||
else:
|
for pocket in pockets]
|
||||||
msg += " in '%s-%s'" % (series.name, pocket.lower())
|
if len(pockets) > 1:
|
||||||
|
pockets[-2:] = [' or '.join(pockets[-2:])]
|
||||||
|
msg += " in " + ', '.join(pockets)
|
||||||
raise PackageNotFoundException(msg)
|
raise PackageNotFoundException(msg)
|
||||||
|
|
||||||
return self._srcpkgs[(name, series.name, pocket)]
|
self._srcpkgs[index] = SourcePackagePublishingHistory(latest)
|
||||||
|
return self._srcpkgs[index]
|
||||||
|
|
||||||
def copyPackage(self, source_name, version, from_archive, to_pocket,
|
def copyPackage(self, source_name, version, from_archive, to_pocket,
|
||||||
to_series=None, include_binaries=False):
|
to_series=None, include_binaries=False):
|
||||||
@ -377,6 +402,16 @@ class SourcePackagePublishingHistory(BaseWrapper):
|
|||||||
'''
|
'''
|
||||||
return self._lpobject.component_name
|
return self._lpobject.component_name
|
||||||
|
|
||||||
|
def getSeriesAndPocket(self):
|
||||||
|
'''
|
||||||
|
Returns a human-readable release-pocket
|
||||||
|
'''
|
||||||
|
series = DistroSeries(self._lpobject.distro_series_link)
|
||||||
|
release = series.name
|
||||||
|
if self._lpobject.pocket != 'Release':
|
||||||
|
release += '-' + self._lpobject.pocket.lower()
|
||||||
|
return release
|
||||||
|
|
||||||
def getChangelog(self, since_version=None):
|
def getChangelog(self, since_version=None):
|
||||||
'''
|
'''
|
||||||
Return the changelog, optionally since a particular version
|
Return the changelog, optionally since a particular version
|
||||||
|
@ -122,7 +122,7 @@ def readlist(filename, uniq=True):
|
|||||||
|
|
||||||
return items
|
return items
|
||||||
|
|
||||||
def split_release_pocket(release):
|
def split_release_pocket(release, default='Release'):
|
||||||
'''Splits the release and pocket name.
|
'''Splits the release and pocket name.
|
||||||
|
|
||||||
If the argument doesn't contain a pocket name then the 'Release' pocket
|
If the argument doesn't contain a pocket name then the 'Release' pocket
|
||||||
@ -130,7 +130,7 @@ def split_release_pocket(release):
|
|||||||
|
|
||||||
Returns the release and pocket name.
|
Returns the release and pocket name.
|
||||||
'''
|
'''
|
||||||
pocket = 'Release'
|
pocket = default
|
||||||
|
|
||||||
if release is None:
|
if release is None:
|
||||||
raise ValueError('No release name specified')
|
raise ValueError('No release name specified')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user