From 5f55431a28509fd4f4f7b40dc246f3d34fa8549e Mon Sep 17 00:00:00 2001 From: Christoph Reiter Date: Sun, 26 Jun 2022 23:14:28 +0200 Subject: [PATCH] builtin cover: fix handling of invalid glob ranges with Python 3.10.5+ (#4027) Previously Python would raise if an invalid range was given to glob, but with 3.10.5 they fixed it to not match anything. https://github.com/python/cpython/issues/89973 Our tests depended on the previous logic and treating the glob pattern as a literal file name in that case. One could argue that this is wrong since a range that doesn't contain anything should also not match anything, so wrap glob() to make it not match for all Python versions in that case and adjust the tests accordingly. This should fix the Windows CI, which is currently the only job using 3.10.5 --- quodlibet/util/cover/built_in.py | 22 +++++++++++----------- tests/test_util_cover.py | 12 +++--------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/quodlibet/util/cover/built_in.py b/quodlibet/util/cover/built_in.py index f2a8791a2..01474c9b6 100644 --- a/quodlibet/util/cover/built_in.py +++ b/quodlibet/util/cover/built_in.py @@ -100,6 +100,15 @@ class FilesystemCover(CoverSourcePlugin): base = self.song('~dirname') images = [] + def safe_glob(*args, **kwargs): + try: + return glob.glob(*args, **kwargs) + except sre_constants.error: + # https://github.com/python/cpython/issues/89973 + # old glob would fail with invalid ranges, newer one + # handles it correctly. + return [] + if config.getboolean("albumart", "force_filename"): score = 100 for filename in config.get("albumart", "filename").split(","): @@ -107,17 +116,8 @@ class FilesystemCover(CoverSourcePlugin): filename = filename.strip() escaped_path = os.path.join(glob.escape(base), filename) - try: - for path in glob.glob(escaped_path): - images.append((score, path)) - except sre_constants.error: - # Use literal filename if globbing causes errors - path = os.path.join(base, filename) - - # We check this here, so we can search for alternative - # files in case no preferred file was found. - if os.path.isfile(path): - images.append((score, path)) + for path in safe_glob(escaped_path): + images.append((score, path)) # So names and patterns at the start are preferred score -= 1 diff --git a/tests/test_util_cover.py b/tests/test_util_cover.py index db81e4d1f..71a48ad9a 100644 --- a/tests/test_util_cover.py +++ b/tests/test_util_cover.py @@ -105,15 +105,9 @@ class TCoverManager(TestCase): config.set("albumart", "force_filename", str(True)) config.set("albumart", "filename", "[a-2].jpg") - # Should match - f = self.add_file("[a-2].jpg") - assert path_equal( - os.path.abspath(self._find_cover(self.song).name), f) - - # Should not crash - f = self.add_file("test.jpg") - assert not path_equal( - os.path.abspath(self._find_cover(self.song).name), f) + # Invalid glob range, should not match anything + self.add_file("a.jpg") + assert self._find_cover(self.song) is None def test_invalid_glob_path(self): config.set("albumart", "force_filename", str(True)) -- 2.39.2 ckages/admin.scm, gnu/packages/i2p.scm, gnu/packages/music.scm, gnu/packages/web.scm, gnu/tests/reconfigure.scm, guix/scripts/deploy.scm, guix/scripts/system/reconfigure.scm: Update their e-mail address. Tobias Geerinckx-Rice 2019-12-08machine: Remove unnecessary record self-referencing bindings....'this-machine' and 'this-machine-ssh-configuration' were useless given that there are no thunked fields. * gnu/machine.scm (<machine>)[this-machine]: Remove. * gnu/machine/ssh.scm (<machine-ssh-configuration>) [this-machine-ssh-configuration]: Remove. Ludovic Courtès 2019-12-07machine: Add provenance tracking to each machine operating system....* gnu/machine.scm (<machine>): Rename accessor to '%machine-operating-system'. (machine-operating-system): New procedure. * doc/guix.texi (Service Reference): Mention it. Ludovic Courtès 2019-08-15machine: Implement 'roll-back-machine'....* gnu/machine.scm (roll-back-machine, &deploy-error, deploy-error?) (deploy-error-should-roll-back) (deploy-error-captured-args): New variable. * gnu/machine/ssh.scm (roll-back-managed-host): New variable. * guix/scripts/deploy.scm (guix-deploy): Roll-back systems when a deployment fails. Jakob L. Kreuze 2019-08-06machine: Rename 'system' field....* gnu/machine.scm (machine-system): Delete variable. (machine-operating-system): New variable. All callers changed. * doc/guix.texi (Invoking guix deploy): Use the 'machine-operating-system' accessor rather than 'machine-system'. Jakob L. Kreuze 2019-07-06gnu: Add machine type for deployment specifications....* gnu/machine.scm: New file. * gnu/machine/ssh.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. Jakob L. Kreuze