From 1e1702e676d410d7c05a56788ca4fe2c13e44c26 Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Tue, 21 Jan 2020 15:09:29 +0000 Subject: [PATCH] Use +sourcefiles URLs where possible In https://code.launchpad.net/~cjwatson/launchpad/archive-unambiguous-files-traversals/+merge/345118, I added support for downloading source package files from Launchpad that can cope with the situation where different versions of a source package have the same file name with different contents (normally impossible, but it can happen with imported archives and due to some old bugs). Use this where possible. LP: #1860456 --- backportpackage | 7 +++++-- ubuntutools/archive.py | 36 ++++++++++++++++++++++++------------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/backportpackage b/backportpackage index 1df7129..ff5975a 100755 --- a/backportpackage +++ b/backportpackage @@ -25,6 +25,7 @@ import shutil import subprocess import sys import tempfile +from urllib.parse import quote import lsb_release from httplib2 import Http, HttpLib2Error @@ -296,8 +297,10 @@ def orig_needed(upload, workdir, pkg): h = Http() for filename in glob.glob(os.path.join(workdir, '%s_%s.orig*' % (pkg.source, version))): - url = ('https://launchpad.net/~%s/+archive/%s/+files/%s' - % (user, ppa, filename)) + url = ('https://launchpad.net/~%s/+archive/%s/+sourcefiles/%s/%s/%s' + % (quote(user), quote(ppa), quote(pkg.source), + quote(pkg.version.full_version), + quote(os.path.basename(filename)))) try: headers, body = h.request(url, 'HEAD') if (headers.status != 200 or diff --git a/ubuntutools/archive.py b/ubuntutools/archive.py index ac8a2d2..9375d17 100644 --- a/ubuntutools/archive.py +++ b/ubuntutools/archive.py @@ -28,7 +28,7 @@ Approach: """ from urllib.error import (URLError, HTTPError) -from urllib.parse import urlparse +from urllib.parse import (quote, urlparse) from urllib.request import urlopen import codecs import hashlib @@ -298,10 +298,16 @@ class SourcePackage(object): return os.path.join(mirror, 'pool', self.component, group, self.source, filename) - def _lp_url(self, filename): - "Build a source package URL on Launchpad" - return os.path.join('https://launchpad.net', self.distribution, - '+archive', 'primary', '+files', filename) + def _lp_url(self, filename, source=False): + "Build an archive file URL on Launchpad" + if source: + suffix = '+sourcefiles/%s/%s/%s' % ( + quote(self.source), quote(self.version.full_version), + quote(filename)) + else: + suffix = '+files/%s' % quote(filename) + return 'https://launchpad.net/%s/+archive/primary/%s' % ( + quote(self.distribution), suffix) def _source_urls(self, name): "Generator of sources for name" @@ -312,7 +318,7 @@ class SourcePackage(object): for mirror in self.masters: if mirror not in self.mirrors: yield self._mirror_url(mirror, name) - yield self._lp_url(name) + yield self._lp_url(name, source=True) def _binary_urls(self, name, default_urls): "Generator of URLs for name" @@ -339,7 +345,7 @@ class SourcePackage(object): parsed = urlparse(self._dsc_source) url = self._dsc_source else: - url = self._lp_url(self.dsc_name) + url = self._lp_url(self.dsc_name, source=True) self._download_dsc(url) self._check_dsc() @@ -755,11 +761,17 @@ class PersonalPackageArchiveSourcePackage(UbuntuSourcePackage): self._team = None self._ppa = None - def _lp_url(self, filename): - "Build a source package URL on Launchpad" - return os.path.join('https://launchpad.net', '~' + self._ppateam, - '+archive', self.distribution, self._ppaname, - '+files', filename) + def _lp_url(self, filename, source=False): + "Build an archive file URL on Launchpad" + if source: + suffix = '+sourcefiles/%s/%s/%s' % ( + quote(self.source), quote(self.version.full_version), + quote(filename)) + else: + suffix = '+files/%s' % quote(filename) + return 'https://launchpad.net/~%s/+archive/%s/%s/%s' % ( + quote(self._ppateam), quote(self.distribution), + quote(self._ppaname), suffix) class UbuntuCloudArchiveSourcePackage(PersonalPackageArchiveSourcePackage):