commit:     d9855418352398013ae787bb73f70e935ec109ca
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Oct 21 09:51:33 2019 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Oct 21 09:55:36 2019 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=d9855418

fetch: yield unicode from layout get_filenames methods

Reported-by: Michał Górny <mgorny <AT> gentoo.org>
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 lib/portage/package/ebuild/fetch.py    | 18 ++++++++++++++----
 lib/portage/tests/ebuild/test_fetch.py | 26 ++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/lib/portage/package/ebuild/fetch.py 
b/lib/portage/package/ebuild/fetch.py
index cedf12b19..ac25e4326 100644
--- a/lib/portage/package/ebuild/fetch.py
+++ b/lib/portage/package/ebuild/fetch.py
@@ -7,6 +7,7 @@ __all__ = ['fetch']
 
 import errno
 import functools
+import glob
 import io
 import itertools
 import json
@@ -27,7 +28,6 @@ except ImportError:
 
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
-       'glob:glob',
        'portage.package.ebuild.config:check_config_instance,config',
        'portage.package.ebuild.doebuild:doebuild_environment,' + \
                '_doebuild_spawn',
@@ -272,7 +272,13 @@ class FlatLayout(object):
        def get_filenames(self, distdir):
                for dirpath, dirnames, filenames in os.walk(distdir,
                                onerror=_raise_exc):
-                       return iter(filenames)
+                       for filename in filenames:
+                               try:
+                                       yield portage._unicode_decode(filename, 
errors='strict')
+                               except UnicodeDecodeError:
+                                       # Ignore it. Distfiles names must have 
valid UTF8 encoding.
+                                       pass
+                       return
 
        @staticmethod
        def verify_args(args):
@@ -301,8 +307,12 @@ class FilenameHashLayout(object):
                        c = c // 4
                        pattern += c * '[0-9a-f]' + '/'
                pattern += '*'
-               return (x.rsplit('/', 1)[1]
-                               for x in glob(os.path.join(distdir, pattern)))
+               for x in glob.iglob(os.path.join(distdir, pattern)):
+                       try:
+                               yield portage._unicode_decode(x, 
errors='strict').rsplit('/', 1)[1]
+                       except UnicodeDecodeError:
+                               # Ignore it. Distfiles names must have valid 
UTF8 encoding.
+                               pass
 
        @staticmethod
        def verify_args(args):

diff --git a/lib/portage/tests/ebuild/test_fetch.py 
b/lib/portage/tests/ebuild/test_fetch.py
index 538fb1754..9a8a4a544 100644
--- a/lib/portage/tests/ebuild/test_fetch.py
+++ b/lib/portage/tests/ebuild/test_fetch.py
@@ -448,3 +448,29 @@ class EbuildFetchTestCase(TestCase):
 '''
                self.assertRaises(ConfigParserError, mlc.read_from_file,
                                io.StringIO(conf))
+
+       def test_filename_hash_layout_get_filenames(self):
+               layouts = (
+                       FlatLayout(),
+                       FilenameHashLayout('SHA1', '4'),
+                       FilenameHashLayout('SHA1', '8'),
+                       FilenameHashLayout('SHA1', '8:16'),
+                       FilenameHashLayout('SHA1', '8:16:24'),
+               )
+               filename = 'foo-1.tar.gz'
+
+               for layout in layouts:
+                       distdir = tempfile.mkdtemp()
+                       try:
+                               path = os.path.join(distdir, 
layout.get_path(filename))
+                               try:
+                                       os.makedirs(os.path.dirname(path))
+                               except OSError:
+                                       pass
+
+                               with open(path, 'wb') as f:
+                                       pass
+
+                               self.assertEqual([filename], 
list(layout.get_filenames(distdir)))
+                       finally:
+                               shutil.rmtree(distdir)

Reply via email to