From 5b2092637af3d75dc6d3766352cb2e6ffb01c619 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Tue, 2 Sep 2025 16:14:44 +0200 Subject: [PATCH 1/3] Parse change headers with "Version " pattern too. --- app/lib/shared/changelog.dart | 5 +++++ app/test/shared/changelog_test.dart | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/lib/shared/changelog.dart b/app/lib/shared/changelog.dart index db602ed7f3..bcc40a02df 100644 --- a/app/lib/shared/changelog.dart +++ b/app/lib/shared/changelog.dart @@ -401,6 +401,11 @@ class ChangelogParser { } } + // remove leading 'Version' label + if (inputLowerCase.startsWith('version ')) { + input = input.trim().substring(7).trim(); + } + // extract version final versionPart = input.split(' ').firstWhereOrNull((e) => e.isNotEmpty); if (versionPart == null) { diff --git a/app/test/shared/changelog_test.dart b/app/test/shared/changelog_test.dart index f9703758fd..a9dbc7f3d5 100644 --- a/app/test/shared/changelog_test.dart +++ b/app/test/shared/changelog_test.dart @@ -118,11 +118,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - Pre-release version + +## Version 0.9.0 (Bugfix release) + +- Fixing a bug. + '''; final changelog = _parse(markdown); - expect(changelog.releases, hasLength(3)); + expect(changelog.releases, hasLength(4)); expect(changelog.releases[0].version, equals('2.0.0')); expect(changelog.releases[0].date, equals(DateTime(2025, 8, 1))); @@ -132,6 +137,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). expect(changelog.releases[2].version, equals('1.0.0-beta.1')); expect(changelog.releases[2].date, equals(DateTime(2025, 1, 15))); + + expect(changelog.releases[3].version, equals('0.9.0')); + expect(changelog.releases[3].note, '(Bugfix release)'); }); test('handles different date formats', () { @@ -234,6 +242,21 @@ void main() { expect(changelog.releases[1].version, equals('1.0.0')); }); + test('handles mixed header levels #2', () { + const markdown = '''## Changelog + +#### v2.0.0 + +#### v1.0.0 + +'''; + final changelog = _parse(markdown); + expect( + changelog.releases.map((e) => e.version).toList(), + ['2.0.0', '1.0.0'], + ); + }); + test('handles embedded header levels', () { const markdown = ''' # Changelog From c25f4557ef53ab8c58d60c646ed2a738b6935a3d Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Tue, 2 Sep 2025 16:24:39 +0200 Subject: [PATCH 2/3] updated trim --- app/lib/shared/changelog.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/lib/shared/changelog.dart b/app/lib/shared/changelog.dart index bcc40a02df..99723e8398 100644 --- a/app/lib/shared/changelog.dart +++ b/app/lib/shared/changelog.dart @@ -382,11 +382,12 @@ class ChangelogParser { /// - `unreleased` /// - `next release (...)` _ParsedHeader? _tryParseAsHeader(html.Element elem, String input) { + assert(input == input.trim()); final level = _acceptedHeaderTags.indexOf(elem.localName!); final anchor = elem.attributes['id']; // special case: unreleased - final inputLowerCase = input.toLowerCase().trim(); + final inputLowerCase = input.toLowerCase(); final unreleasedTexts = ['unreleased', 'next release']; for (final unreleasedText in unreleasedTexts) { if (inputLowerCase == unreleasedText) { @@ -403,7 +404,7 @@ class ChangelogParser { // remove leading 'Version' label if (inputLowerCase.startsWith('version ')) { - input = input.trim().substring(7).trim(); + input = input.substring(7).trim(); } // extract version From c8222ce1d654784f86878cf1a80e85972bd2a084 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Tue, 2 Sep 2025 16:26:01 +0200 Subject: [PATCH 3/3] formal versionLabelPrefix --- app/lib/shared/changelog.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/lib/shared/changelog.dart b/app/lib/shared/changelog.dart index 99723e8398..c23ff11fe7 100644 --- a/app/lib/shared/changelog.dart +++ b/app/lib/shared/changelog.dart @@ -403,8 +403,9 @@ class ChangelogParser { } // remove leading 'Version' label - if (inputLowerCase.startsWith('version ')) { - input = input.substring(7).trim(); + const versionLabelPrefix = 'version '; + if (inputLowerCase.startsWith(versionLabelPrefix)) { + input = input.substring(versionLabelPrefix.length).trim(); } // extract version