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)