Reported in #63205. * gnu/packages/music.scm (quodlibet)[source]: Add two backported patches. [arguments]: Adjust 'check phase to change skipped tests. * gnu/packages/patches/quodlibet-fix-invalid-glob.patch, gnu/packages/patches/quodlibet-fix-mtime-tests.patch: New files. * gnu/local.mk (dist_patch_DATA): Register them. Signed-off-by: Efraim Flashner <efraim@flashner.co.il>
		
			
				
	
	
		
			89 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 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
 | |
| 
 |