unofficial mirror of guix-devel@gnu.org 
 help / color / mirror / code / Atom feed
blob 95f95d8aabcf9dd4e1d64bba487f1789665978c1 3692 bytes (raw)
name: packages/patches/quodlibet-fix-invalid-glob.patch 	 # note: path name is non-authoritative(*)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
 
From 5f55431a28509fd4f4f7b40dc246f3d34fa8549e Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
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


debug log:

solving 95f95d8aabcf9dd4e1d64bba487f1789665978c1 ...
found 95f95d8aabcf9dd4e1d64bba487f1789665978c1 in https://git.savannah.gnu.org/cgit/guix.git

(*) Git path names are given by the tree(s) the blob belongs to.
    Blobs themselves have no identifier aside from the hash of its contents.^

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).