diff --git a/ubuntutools/archive.py b/ubuntutools/archive.py index 06b0247..7aa9f19 100644 --- a/ubuntutools/archive.py +++ b/ubuntutools/archive.py @@ -45,7 +45,7 @@ import httplib2 from contextlib import closing from ubuntutools.config import UDTConfig -from ubuntutools.lp.lpapicache import (Launchpad, Distribution, +from ubuntutools.lp.lpapicache import (Launchpad, Distribution, PersonTeam, SourcePackagePublishingHistory, BinaryPackagePublishingHistory) from ubuntutools.lp.udtexceptions import (PackageNotFoundException, @@ -146,6 +146,7 @@ class SourcePackage(object): self.workdir = workdir self.quiet = quiet self._series = series + self._use_series = True self._pocket = pocket self._dsc_source = dscfile @@ -185,7 +186,7 @@ class SourcePackage(object): if self._version: # if version was specified, use that params['version'] = self._version.full_version - else: + elif self._use_series: if self._series: # if version not specified, get the latest from this series series = distro.getSeries(self._series) @@ -709,15 +710,54 @@ class UbuntuSourcePackage(SourcePackage): class UbuntuCloudArchiveSourcePackage(UbuntuSourcePackage): "Download / unpack an Ubuntu Cloud Archive source package" - def __init__(self, uca_release, *args, **kwargs): + _ppas = None + _ppa_names = None + + def __init__(self, *args, **kwargs): super(UbuntuCloudArchiveSourcePackage, self).__init__(*args, **kwargs) - self._uca_release = uca_release + self._use_series = False # UCA doesn't really use distro series + self._uca_release = self._series + self._series = None self.masters = ["http://ubuntu-cloud.archive.canonical.com/ubuntu/"] + @classmethod + def getArchives(cls): + if not cls._ppas: + ppas = filter(lambda p: p.name.endswith('-staging'), + PersonTeam.fetch('ubuntu-cloud-archive').getPPAs()) + cls._ppas = sorted(ppas, key=lambda p: p.name, reverse=True) + return cls._ppas + + @classmethod + def getReleaseNames(cls): + if not cls._ppa_names: + cls._ppa_names = [p.name.split('-', 1)[0] for p in cls.getArchives()] + return cls._ppa_names + + @classmethod + def getDevelopmentRelease(cls): + return cls.getReleaseNames()[0] + + @property + def uca_release(self): + if not self._uca_release: + self._uca_release = self.getDevelopmentRelease() + Logger.normal('Using UCA release %s', self._uca_release) + return self._uca_release + + def getArchive(self): + ppas = {p.name: p for p in self.getArchives()} + release = '{}-staging'.format(self.uca_release) + if release in ppas: + Logger.debug('UCA release {} at {}'.format(self.uca_release, + ppas[release]())) + return ppas[release] + raise SeriesNotFoundException('UCA release {} not found.'.format(self.uca_release)) + 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), + '+archive', ("%s-staging" % self.uca_release), '+files', filename) diff --git a/ubuntutools/lp/lpapicache.py b/ubuntutools/lp/lpapicache.py index b5ca2af..3b4c736 100644 --- a/ubuntutools/lp/lpapicache.py +++ b/ubuntutools/lp/lpapicache.py @@ -846,6 +846,7 @@ class PersonTeam(BaseWrapper, metaclass=MetaPersonTeam): def __init__(self, *args): # Don't share _upload between different PersonTeams + self._ppas = None if '_upload' not in self.__dict__: self._upload = dict() @@ -923,6 +924,12 @@ class PersonTeam(BaseWrapper, metaclass=MetaPersonTeam): return canUpload + def getPPAs(self): + if not self._ppas: + ppas = Launchpad.load(self._lpobject.ppas_collection_link).entries + self._ppas = [Archive(a['self_link']) for a in ppas] + return self._ppas + class Build(BaseWrapper): '''