On 5/31/20 6:17 AM, Mike Gilbert wrote: > Unquote the URL basename when fetching from upstream. > Quote the filename when fetching from mirrors. > > Bug: https://bugs.gentoo.org/719810 > Signed-off-by: Mike Gilbert <[email protected]> > --- > lib/portage/dbapi/porttree.py | 7 ++++++- > lib/portage/package/ebuild/fetch.py | 9 +++++++-- > 2 files changed, 13 insertions(+), 3 deletions(-) > > diff --git a/lib/portage/dbapi/porttree.py b/lib/portage/dbapi/porttree.py > index 08af17bcd..984263039 100644 > --- a/lib/portage/dbapi/porttree.py > +++ b/lib/portage/dbapi/porttree.py > @@ -55,6 +55,11 @@ try: > except ImportError: > from urlparse import urlparse > > +try: > + from urllib.parse import unquote as urlunquote > +except ImportError: > + from urllib import unquote as urlunquote > + > if sys.hexversion >= 0x3000000: > # pylint: disable=W0622 > basestring = str > @@ -1547,7 +1552,7 @@ def _parse_uri_map(cpv, metadata, use=None): > myuris.pop() > distfile = myuris.pop() > else: > - distfile = os.path.basename(uri) > + distfile = urlunquote(os.path.basename(uri)) > if not distfile: > raise portage.exception.InvalidDependString( > ("getFetchMap(): '%s' SRC_URI has no > file " + \ > diff --git a/lib/portage/package/ebuild/fetch.py > b/lib/portage/package/ebuild/fetch.py > index 28e7caf53..47c3ad28f 100644 > --- a/lib/portage/package/ebuild/fetch.py > +++ b/lib/portage/package/ebuild/fetch.py > @@ -26,6 +26,11 @@ try: > except ImportError: > from urlparse import urlparse > > +try: > + from urllib.parse import quote as urlquote > +except ImportError: > + from urllib import quote as urlquote > + > import portage > portage.proxy.lazyimport.lazyimport(globals(), > 'portage.package.ebuild.config:check_config_instance,config', > @@ -351,7 +356,7 @@ _size_suffix_map = { > > class FlatLayout(object): > def get_path(self, filename): > - return filename > + return urlquote(filename) > > def get_filenames(self, distdir): > for dirpath, dirnames, filenames in os.walk(distdir, > @@ -382,7 +387,7 @@ class FilenameHashLayout(object): > c = c // 4 > ret += fnhash[:c] + '/' > fnhash = fnhash[c:] > - return ret + filename > + return ret + urlquote(filename) > > def get_filenames(self, distdir): > pattern = '' >
We've also got these other basename calls in fetch.py:
> diff --git a/lib/portage/package/ebuild/fetch.py
> b/lib/portage/package/ebuild/fetch.py
> index 28e7caf53..56b375d58 100644
> --- a/lib/portage/package/ebuild/fetch.py
> +++ b/lib/portage/package/ebuild/fetch.py
> @@ -730,9 +730,9 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
> else:
> for myuri in myuris:
> if urlparse(myuri).scheme:
> -
> file_uri_tuples.append((os.path.basename(myuri), myuri))
> +
> file_uri_tuples.append((urlunquote(os.path.basename(myuri)), myuri))
> else:
> -
> file_uri_tuples.append((os.path.basename(myuri), None))
> +
> file_uri_tuples.append((urlunquote(os.path.basename(myuri)), None))
The case with no scheme is not a URI, so we need to decide whether
or not to unquote, and we should make _parse_uri_map behavior
consistent for this case.
>
> filedict = OrderedDict()
> primaryuri_dict = {}
> @@ -1229,7 +1229,7 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0,
> "information about how
> to\n!!! correctly specify "
> "FETCHCOMMAND and
> RESUMECOMMAND.\n"),
> level=logging.ERROR,
> noiselevel=-1)
> - if myfile != os.path.basename(loc):
> + if myfile !=
> urlunquote(os.path.basename(loc)):
> return 0
>
> if not can_fetch:
--
Thanks,
Zac
signature.asc
Description: OpenPGP digital signature
