Skip to content

Commit 1b1a6e7

Browse files
authored
Parse change headers with "Version <v>" pattern too. (#8939)
1 parent 4bb8883 commit 1b1a6e7

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

app/lib/shared/changelog.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,11 +382,12 @@ class ChangelogParser {
382382
/// - `unreleased`
383383
/// - `next release (...)`
384384
_ParsedHeader? _tryParseAsHeader(html.Element elem, String input) {
385+
assert(input == input.trim());
385386
final level = _acceptedHeaderTags.indexOf(elem.localName!);
386387

387388
final anchor = elem.attributes['id'];
388389
// special case: unreleased
389-
final inputLowerCase = input.toLowerCase().trim();
390+
final inputLowerCase = input.toLowerCase();
390391
final unreleasedTexts = ['unreleased', 'next release'];
391392
for (final unreleasedText in unreleasedTexts) {
392393
if (inputLowerCase == unreleasedText) {
@@ -401,6 +402,12 @@ class ChangelogParser {
401402
}
402403
}
403404

405+
// remove leading 'Version' label
406+
const versionLabelPrefix = 'version ';
407+
if (inputLowerCase.startsWith(versionLabelPrefix)) {
408+
input = input.substring(versionLabelPrefix.length).trim();
409+
}
410+
404411
// extract version
405412
final versionPart = input.split(' ').firstWhereOrNull((e) => e.isNotEmpty);
406413
if (versionPart == null) {

app/test/shared/changelog_test.dart

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
118118
119119
### Added
120120
- Pre-release version
121+
122+
## Version 0.9.0 (Bugfix release)
123+
124+
- Fixing a bug.
125+
121126
''';
122127

123128
final changelog = _parse(markdown);
124129

125-
expect(changelog.releases, hasLength(3));
130+
expect(changelog.releases, hasLength(4));
126131

127132
expect(changelog.releases[0].version, equals('2.0.0'));
128133
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/).
132137

133138
expect(changelog.releases[2].version, equals('1.0.0-beta.1'));
134139
expect(changelog.releases[2].date, equals(DateTime(2025, 1, 15)));
140+
141+
expect(changelog.releases[3].version, equals('0.9.0'));
142+
expect(changelog.releases[3].note, '(Bugfix release)');
135143
});
136144

137145
test('handles different date formats', () {
@@ -234,6 +242,21 @@ void main() {
234242
expect(changelog.releases[1].version, equals('1.0.0'));
235243
});
236244

245+
test('handles mixed header levels #2', () {
246+
const markdown = '''## Changelog
247+
248+
#### v2.0.0
249+
250+
#### v1.0.0
251+
252+
''';
253+
final changelog = _parse(markdown);
254+
expect(
255+
changelog.releases.map((e) => e.version).toList(),
256+
['2.0.0', '1.0.0'],
257+
);
258+
});
259+
237260
test('handles embedded header levels', () {
238261
const markdown = '''
239262
# Changelog

0 commit comments

Comments
 (0)