From 10d8e5fc043c4b1f1cf17cd3582ebf03aa7f5f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0ar=C5=ABnas=20Nejus?= Date: Mon, 2 Feb 2026 03:24:23 +0000 Subject: [PATCH] Sort changelog bullet points case-insensitively MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a case-insensitive sort key when ordering Markdown changelog bullet points to produce stable ordering regardless of capitalization. Diff for the last release: diff --git a/before b/after index 51303c65f..d88eda894 100644 --- a/before +++ b/after @@ -4,3 +4,2 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee -- Added support for Python 3.13. - [Convert Plugin](https://beets.readthedocs.io/en/stable/plugins/convert.html): `force` can be passed to override checks like no_convert, never_convert_lossy_files, same format, and max_bitrate @@ -23,2 +22,3 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee - [Titlecase Plugin](https://beets.readthedocs.io/en/stable/plugins/titlecase.html): Add the [Titlecase Plugin](https://beets.readthedocs.io/en/stable/plugins/titlecase.html) plugin to allow users to resolve differences in metadata source styles. +- Added support for Python 3.13. @@ -26,9 +26,2 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee -- Errors in metadata plugins during autotage process will now be logged but won't crash beets anymore. If you want to raise exceptions instead, set the new configuration option `raise_on_error` to `yes` :bug: (#5903), :bug: (#4789). -- Fix a bug introduced in release 2.4.0 where import from any valid import-log-file always threw a "none of the paths are importable" error. -- Handle potential OSError when unlinking temporary files in ArtResizer. :bug: (#5615) -- Running beet --config \ config -e now edits \ rather than the default config path. :bug: (#5652) -- Sanitize log messages by removing control characters preventing terminal rendering issues. -- When hardlinking from a symlink (e.g. importing a symlink with hardlinking enabled), dereference the symlink then hardlink, rather than creating a new (potentially broken) symlink :bug: (#5676) -- When using [FromFilename Plugin](https://beets.readthedocs.io/en/stable/plugins/fromfilename.html) together with [Edit Plugin](https://beets.readthedocs.io/en/stable/plugins/edit.html), temporary tags extracted from filenames are no longer lost when discarding or cancelling an edit session during import. :bug: (#6104) - [Command-Line Interface](https://beets.readthedocs.io/en/stable/reference/cli.html): Fix 'from_scratch' option for singleton imports: delete all (old) metadata when new metadata is applied. :bug: (#3706) @@ -44,4 +37,11 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee - [Spotify Plugin](https://beets.readthedocs.io/en/stable/plugins/spotify.html): Updated Spotify API credentials. :bug: (#6270) -- [Web Plugin](https://beets.readthedocs.io/en/stable/plugins/web.html): repair broken /item/values/… and /albums/values/… endpoints. Previously, due to single-quotes (ie. string literal) in the SQL query, the query eg. GET /item/values/albumartist would return the literal "albumartist" instead of a list of unique album artists. - [update](https://beets.readthedocs.io/en/stable/reference/cli.html#update-cmd) [Edit Plugin](https://beets.readthedocs.io/en/stable/plugins/edit.html) fix display formatting of field changes to clearly show added and removed flexible fields. +- [Web Plugin](https://beets.readthedocs.io/en/stable/plugins/web.html): repair broken /item/values/… and /albums/values/… endpoints. Previously, due to single-quotes (ie. string literal) in the SQL query, the query eg. GET /item/values/albumartist would return the literal "albumartist" instead of a list of unique album artists. +- Errors in metadata plugins during autotage process will now be logged but won't crash beets anymore. If you want to raise exceptions instead, set the new configuration option `raise_on_error` to `yes` :bug: (#5903), :bug: (#4789). +- Fix a bug introduced in release 2.4.0 where import from any valid import-log-file always threw a "none of the paths are importable" error. +- Handle potential OSError when unlinking temporary files in ArtResizer. :bug: (#5615) +- Running beet --config \ config -e now edits \ rather than the default config path. :bug: (#5652) +- Sanitize log messages by removing control characters preventing terminal rendering issues. +- When hardlinking from a symlink (e.g. importing a symlink with hardlinking enabled), dereference the symlink then hardlink, rather than creating a new (potentially broken) symlink :bug: (#5676) +- When using [FromFilename Plugin](https://beets.readthedocs.io/en/stable/plugins/fromfilename.html) together with [Edit Plugin](https://beets.readthedocs.io/en/stable/plugins/edit.html), temporary tags extracted from filenames are no longer lost when discarding or cancelling an edit session during import. :bug: (#6104) @@ -71,2 +71,4 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee +- [BPD Plugin](https://beets.readthedocs.io/en/stable/plugins/bpd.html): Raise ImportError instead of ValueError when GStreamer is unavailable, enabling `importorskip` usage in pytest setup. +- dbcore: Allow models to declare SQL indices; add an `items.album_id` index to speed up `album.items()` queries. :bug: (#5809) - Finally removed gmusic plugin and all related code/docs as the Google Play Music service was shut down in 2020. @@ -76,3 +78 @@ Beets now requires Python 3.10 or later since support for EOL Python 3.9 has bee - Updated color documentation with `bright_*` and `bg_bright_*` entries. -- [BPD Plugin](https://beets.readthedocs.io/en/stable/plugins/bpd.html): Raise ImportError instead of ValueError when GStreamer is unavailable, enabling `importorskip` usage in pytest setup. -- dbcore: Allow models to declare SQL indices; add an `items.album_id` index to speed up `album.items()` queries. :bug: (#5809) --- extra/release.py | 2 +- test/test_release.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/extra/release.py b/extra/release.py index 61b4a3a31..2bafa90c2 100755 --- a/extra/release.py +++ b/extra/release.py @@ -146,7 +146,7 @@ MD_REPLACEMENTS: list[Replacement] = [ ] order_bullet_points = partial( re.compile(r"(\n- .*?(?=\n(?! *(-|\d\.) )|$))", flags=re.DOTALL).sub, - lambda m: "\n- ".join(sorted(m.group().split("\n- "))), + lambda m: "\n- ".join(sorted(m.group().split("\n- "), key=str.lower)), ) diff --git a/test/test_release.py b/test/test_release.py index 693aab82a..0951a5735 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -79,10 +79,10 @@ Bug fixes: def md_changelog(): return r"""### New features -- See [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) for documentation. -- [Substitute Plugin](https://beets.readthedocs.io/en/stable/plugins/substitute.html): Some substitute multi-line change. :bug: (#5467) - [beets.plugins.BeetsPlugin](https://beets.readthedocs.io/en/stable/api/generated/beets.plugins.BeetsPlugin.html#beets.plugins.BeetsPlugin) Some plugin change. - [list](https://beets.readthedocs.io/en/stable/reference/cli.html#list-cmd) Update. +- [Substitute Plugin](https://beets.readthedocs.io/en/stable/plugins/substitute.html): Some substitute multi-line change. :bug: (#5467) +- See [beetsplug.\_utils.musicbrainz.MusicBrainzAPI](https://beets.readthedocs.io/en/stable/api/generated/beetsplug._utils.musicbrainz.MusicBrainzAPI.html#beetsplug._utils.musicbrainz.MusicBrainzAPI) for documentation. You can do something with this command: