diff -Nru picard-2.8.4/debian/changelog picard-2.8.5/debian/changelog --- picard-2.8.4/debian/changelog 2022-11-22 16:31:53.000000000 +0000 +++ picard-2.8.5/debian/changelog 2022-12-06 08:17:42.000000000 +0000 @@ -1,8 +1,8 @@ -picard (2.8.4-0~ppa25~ubuntu22.10.1) kinetic; urgency=low +picard (2.8.5-0~ppa25~ubuntu22.10.1) kinetic; urgency=low * Auto build. - -- Philipp Wolfer Tue, 22 Nov 2022 16:31:53 +0000 + -- Philipp Wolfer Tue, 06 Dec 2022 08:17:42 +0000 picard (2.0.4-0) disco; urgency=low diff -Nru picard-2.8.4/debian/git-build-recipe.manifest picard-2.8.5/debian/git-build-recipe.manifest --- picard-2.8.4/debian/git-build-recipe.manifest 2022-11-22 16:31:53.000000000 +0000 +++ picard-2.8.5/debian/git-build-recipe.manifest 2022-12-06 08:17:42.000000000 +0000 @@ -1,3 +1,3 @@ -# git-build-recipe format 0.4 deb-version 2.8.4-0~ppa25 -lp:picard git-commit:3b79dcc9b34e73a80431fb43325a863a986ba44c +# git-build-recipe format 0.4 deb-version 2.8.5-0~ppa25 +lp:picard git-commit:24620a3b89333c4e4f91c2291de479fcacb0d50a nest-part packaging lp:~musicbrainz-developers/picard/+git/picard-debian-packaging debian debian git-commit:9ce60ecf3b18c931549ef6fbf398dfc7ad13ed54 diff -Nru picard-2.8.4/.github/workflows/pypi-release.yml picard-2.8.5/.github/workflows/pypi-release.yml --- picard-2.8.4/.github/workflows/pypi-release.yml 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/.github/workflows/pypi-release.yml 2022-12-06 08:17:16.000000000 +0000 @@ -74,11 +74,7 @@ fail-fast: false matrix: os: [macos-10.15, windows-2019] - python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] - exclude: - # pyobjc is not yet compatible with Python 3.10 - - os: macos-10.15 - python-version: '3.10' + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} diff -Nru picard-2.8.4/.github/workflows/run-tests.yml picard-2.8.5/.github/workflows/run-tests.yml --- picard-2.8.4/.github/workflows/run-tests.yml 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/.github/workflows/run-tests.yml 2022-12-06 08:17:16.000000000 +0000 @@ -8,13 +8,10 @@ strategy: matrix: os: [macos-latest, ubuntu-latest, windows-2019] - python-version: ['3.6', '3.7', '3.8', '3.9', '3.10'] - exclude: - - os: macos-latest - python-version: '3.6' + python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] include: - os: macos-10.15 - python-version: '3.6' + python-version: '3.7' env: CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }} @@ -92,7 +89,7 @@ strategy: matrix: os: [macos-latest, ubuntu-latest, windows-latest] - python-version: ['3.8'] + python-version: ['3.8', '3.11'] steps: - uses: actions/checkout@v3 diff -Nru picard-2.8.4/NEWS.md picard-2.8.5/NEWS.md --- picard-2.8.4/NEWS.md 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/NEWS.md 2022-12-06 08:17:16.000000000 +0000 @@ -1,3 +1,12 @@ +# Version 2.8.5 - 2022-12-06 + +## Bugfixes + +- [PICARD-2590](https://tickets.metabrainz.org/browse/PICARD-2590) - Relative paths for cover art file names no longer work +- [PICARD-2593](https://tickets.metabrainz.org/browse/PICARD-2593) - Toolbar icon text disappears when saving options +- [PICARD-2596](https://tickets.metabrainz.org/browse/PICARD-2596) - "Show icons in menus" option is applied without saving options + + # Version 2.8.4 - 2022-11-22 ## Bugfixes diff -Nru picard-2.8.4/picard/coverart/image.py picard-2.8.5/picard/coverart/image.py --- picard-2.8.4/picard/coverart/image.py 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/picard/coverart/image.py 2022-12-06 08:17:16.000000000 +0000 @@ -324,11 +324,17 @@ filename = script_to_filename(filename, metadata) if not filename: filename = DEFAULT_COVER_IMAGE_FILENAME - if is_absolute_path(filename): - dirname = os.path.dirname(filename) - filename = make_short_filename( - dirname, os.path.basename(filename), win_shorten_path=win_shorten_path) - filename = os.path.join(dirname, filename) + dirname = os.path.normpath(dirname) + if not is_absolute_path(filename): + filename = os.path.normpath(os.path.join(dirname, filename)) + try: + basedir = os.path.commonpath((dirname, os.path.dirname(filename))) + relpath = os.path.relpath(filename, start=basedir) + except ValueError: + basedir = os.path.dirname(filename) + relpath = os.path.basename(filename) + relpath = make_short_filename(basedir, relpath, win_shorten_path=win_shorten_path) + filename = os.path.join(basedir, relpath) filename = make_save_path(filename, win_compat=win_compat, mac_compat=IS_MACOS) return encode_filename(filename) diff -Nru picard-2.8.4/picard/__init__.py picard-2.8.5/picard/__init__.py --- picard-2.8.4/picard/__init__.py 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/picard/__init__.py 2022-12-06 08:17:16.000000000 +0000 @@ -42,7 +42,7 @@ PICARD_DISPLAY_NAME = "MusicBrainz Picard" PICARD_APP_ID = "org.musicbrainz.Picard" PICARD_DESKTOP_NAME = PICARD_APP_ID + ".desktop" -PICARD_VERSION = Version(2, 8, 4, 'final', 0) +PICARD_VERSION = Version(2, 8, 5, 'final', 0) # optional build version diff -Nru picard-2.8.4/picard/ui/__init__.py picard-2.8.5/picard/ui/__init__.py --- picard-2.8.4/picard/ui/__init__.py 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/picard/ui/__init__.py 2022-12-06 08:17:16.000000000 +0000 @@ -40,6 +40,7 @@ ) from picard.const import DOCS_BASE_URL from picard.const.sys import ( + IS_HAIKU, IS_MACOS, IS_WIN, ) @@ -53,6 +54,8 @@ FONT_FAMILY_MONOSPACE = 'Menlo' elif IS_WIN: FONT_FAMILY_MONOSPACE = 'Consolas' +elif IS_HAIKU: + FONT_FAMILY_MONOSPACE = 'Noto Sans Mono' else: FONT_FAMILY_MONOSPACE = 'Monospace' diff -Nru picard-2.8.4/picard/ui/options/interface.py picard-2.8.5/picard/ui/options/interface.py --- picard-2.8.4/picard/ui/options/interface.py 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/picard/ui/options/interface.py 2022-12-06 08:17:16.000000000 +0000 @@ -223,7 +223,6 @@ self.ui.add_button.clicked.connect(self.add_to_toolbar) self.ui.insert_separator_button.clicked.connect(self.insert_separator) self.ui.remove_button.clicked.connect(self.remove_action) - self.ui.show_menu_icons.toggled.connect(self.tagger.enable_menu_icons) self.move_view = MoveableListView(self.ui.toolbar_layout_list, self.ui.up_button, self.ui.down_button, self.update_action_buttons) self.update_buttons = self.move_view.update_buttons @@ -255,6 +254,7 @@ config.setting["toolbar_show_labels"] = self.ui.toolbar_show_labels.isChecked() config.setting["toolbar_multiselect"] = self.ui.toolbar_multiselect.isChecked() config.setting["show_menu_icons"] = self.ui.show_menu_icons.isChecked() + self.tagger.enable_menu_icons(config.setting["show_menu_icons"]) config.setting["builtin_search"] = self.ui.builtin_search.isChecked() config.setting["use_adv_search_syntax"] = self.ui.use_adv_search_syntax.isChecked() config.setting["quit_confirmation"] = self.ui.quit_confirmation.isChecked() @@ -364,6 +364,7 @@ widget = widget.parent() # Call the main window's create toolbar method widget.create_action_toolbar() + widget.update_toolbar_style() widget.set_tab_order() diff -Nru picard-2.8.4/test/test_coverart_image.py picard-2.8.5/test/test_coverart_image.py --- picard-2.8.4/test/test_coverart_image.py 2022-11-22 16:31:00.000000000 +0000 +++ picard-2.8.5/test/test_coverart_image.py 2022-12-06 08:17:16.000000000 +0000 @@ -38,6 +38,7 @@ from picard.coverart.utils import Id3ImageType from picard.metadata import Metadata from picard.util import encode_filename +from picard.util.filenaming import WinPathTooLong def create_image(extra_data, types=None, support_types=False, @@ -53,6 +54,7 @@ class CoverArtImageTest(PicardTestCase): + def test_is_front_image_no_types(self): image = create_image(b'a') self.assertTrue(image.is_front_image()) @@ -186,6 +188,68 @@ self.assertEqual(2, counters[counter_filename]) +class CoverArtImageMakeFilenameTest(PicardTestCase): + def setUp(self): + super().setUp() + self.image = create_image(b'a', types=['back'], support_types=True) + self.metadata = Metadata() + self.set_config_values({ + 'windows_compatibility': False, + 'enabled_plugins': [], + 'ascii_filenames': False, + }) + + def compare_paths(self, path1, path2): + self.assertEqual( + encode_filename(os.path.normpath(path1)), + encode_filename(os.path.normpath(path2)), + ) + + def test_make_image_filename(self): + filename = self.image._make_image_filename("cover", "/music/albumart", + self.metadata, win_compat=False, win_shorten_path=False) + self.compare_paths('/music/albumart/cover', filename) + + def test_make_image_filename_absolute_path(self): + filename = self.image._make_image_filename("/foo/bar/cover", "/music/albumart", + self.metadata, win_compat=False, win_shorten_path=False) + self.compare_paths('/foo/bar/cover', filename) + + @unittest.skipUnless(IS_WIN, "windows test") + def test_make_image_filename_absolute_path_no_common_base(self): + filename = self.image._make_image_filename("D:/foo/cover", "C:/music", + self.metadata, win_compat=False, win_shorten_path=False) + self.compare_paths('D:\\foo\\cover', filename) + + def test_make_image_filename_script(self): + cover_script = '%album%-$if($eq(%coverart_maintype%,front),cover,%coverart_maintype%)' + self.metadata['album'] = 'TheAlbum' + filename = self.image._make_image_filename(cover_script, "/music/", + self.metadata, win_compat=False, win_shorten_path=False) + self.compare_paths('/music/TheAlbum-back', filename) + + def test_make_image_filename_save_path(self): + self.set_config_values({ + 'windows_compatibility': True, + }) + filename = self.image._make_image_filename(".co:ver", "/music/albumart", + self.metadata, win_compat=True, win_shorten_path=False) + self.compare_paths('/music/albumart/_co_ver', filename) + + def test_make_image_filename_win_shorten_path(self): + requested_path = "/" + 300 * "a" + "/cover" + expected_path = "/" + 226 * "a" + "/cover" + filename = self.image._make_image_filename(requested_path, "/music/albumart", + self.metadata, win_compat=False, win_shorten_path=True) + self.compare_paths(expected_path, filename) + + def test_make_image_filename_win_shorten_path_too_long_base_path(self): + base_path = '/' + 244*'a' + with self.assertRaises(WinPathTooLong): + self.image._make_image_filename("cover", base_path, + self.metadata, win_compat=False, win_shorten_path=True) + + class LocalFileCoverArtImageTest(PicardTestCase): def test_set_file_url(self): path = '/some/path/image.jpeg'