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
This commit is contained in:
Colin Watson 2020-01-21 15:09:29 +00:00
parent f8fa865ab2
commit 1e1702e676
2 changed files with 29 additions and 14 deletions

View File

@ -25,6 +25,7 @@ import shutil
import subprocess import subprocess
import sys import sys
import tempfile import tempfile
from urllib.parse import quote
import lsb_release import lsb_release
from httplib2 import Http, HttpLib2Error from httplib2 import Http, HttpLib2Error
@ -296,8 +297,10 @@ def orig_needed(upload, workdir, pkg):
h = Http() h = Http()
for filename in glob.glob(os.path.join(workdir, '%s_%s.orig*' % (pkg.source, version))): for filename in glob.glob(os.path.join(workdir, '%s_%s.orig*' % (pkg.source, version))):
url = ('https://launchpad.net/~%s/+archive/%s/+files/%s' url = ('https://launchpad.net/~%s/+archive/%s/+sourcefiles/%s/%s/%s'
% (user, ppa, filename)) % (quote(user), quote(ppa), quote(pkg.source),
quote(pkg.version.full_version),
quote(os.path.basename(filename))))
try: try:
headers, body = h.request(url, 'HEAD') headers, body = h.request(url, 'HEAD')
if (headers.status != 200 or if (headers.status != 200 or

View File

@ -28,7 +28,7 @@ Approach:
""" """
from urllib.error import (URLError, HTTPError) from urllib.error import (URLError, HTTPError)
from urllib.parse import urlparse from urllib.parse import (quote, urlparse)
from urllib.request import urlopen from urllib.request import urlopen
import codecs import codecs
import hashlib import hashlib
@ -298,10 +298,16 @@ class SourcePackage(object):
return os.path.join(mirror, 'pool', self.component, group, return os.path.join(mirror, 'pool', self.component, group,
self.source, filename) self.source, filename)
def _lp_url(self, filename): def _lp_url(self, filename, source=False):
"Build a source package URL on Launchpad" "Build an archive file URL on Launchpad"
return os.path.join('https://launchpad.net', self.distribution, if source:
'+archive', 'primary', '+files', filename) 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): def _source_urls(self, name):
"Generator of sources for name" "Generator of sources for name"
@ -312,7 +318,7 @@ class SourcePackage(object):
for mirror in self.masters: for mirror in self.masters:
if mirror not in self.mirrors: if mirror not in self.mirrors:
yield self._mirror_url(mirror, name) 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): def _binary_urls(self, name, default_urls):
"Generator of URLs for name" "Generator of URLs for name"
@ -339,7 +345,7 @@ class SourcePackage(object):
parsed = urlparse(self._dsc_source) parsed = urlparse(self._dsc_source)
url = self._dsc_source url = self._dsc_source
else: else:
url = self._lp_url(self.dsc_name) url = self._lp_url(self.dsc_name, source=True)
self._download_dsc(url) self._download_dsc(url)
self._check_dsc() self._check_dsc()
@ -755,11 +761,17 @@ class PersonalPackageArchiveSourcePackage(UbuntuSourcePackage):
self._team = None self._team = None
self._ppa = None self._ppa = None
def _lp_url(self, filename): def _lp_url(self, filename, source=False):
"Build a source package URL on Launchpad" "Build an archive file URL on Launchpad"
return os.path.join('https://launchpad.net', '~' + self._ppateam, if source:
'+archive', self.distribution, self._ppaname, suffix = '+sourcefiles/%s/%s/%s' % (
'+files', filename) 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): class UbuntuCloudArchiveSourcePackage(PersonalPackageArchiveSourcePackage):