| @@ -130,14 +130,18 @@ impl Changelog { |
| /// - `## [1.2.0]` (bracketed, no date) |
| /// - `## 1.2.0 - 2024-01-15` (unbracketed with date) |
| /// - `## 1.2.0` (unbracketed, no date) |
| +/// |
| +/// A leading `v` prefix is silently stripped from the version string so that |
| +/// `## [v1.2.0]` produces `"1.2.0"`, matching the convention used by version |
| +/// extractors with `tag_prefix = "v"`. |
| fn parse_version_heading(line: &str) -> Option<String> { |
| let rest = line.strip_prefix("## ")?; |
| let version = if rest.starts_with('[') { |
| let end = rest.find(']')?; |
| - &rest[1..end] |
| + rest[1..end].trim_start_matches('v') |
| } else { |
| // Everything before an optional ` - <date>` suffix. |
| - rest.split(" - ").next()?.trim() |
| + rest.split(" - ").next()?.trim().trim_start_matches('v') |
| }; |
| if version.is_empty() { |
| None |
| @@ -193,4 +197,36 @@ Initial release. |
| let cl = Changelog::parse(SAMPLE); |
| assert!(cl.section("9.9.9").is_none()); |
| } |
| + |
| + const PREFIXED: &str = "\ |
| +# Changelog |
| + |
| +## [v2.0.0] - 2025-06-01 |
| + |
| +### Added |
| +- Major feature |
| + |
| +## v1.5.0 - 2025-01-01 |
| + |
| +### Fixed |
| +- Important fix |
| +"; |
| + |
| + #[test] |
| + fn strips_v_prefix_from_bracketed_heading() { |
| + let cl = Changelog::parse(PREFIXED); |
| + assert!(cl.section("2.0.0").is_some()); |
| + } |
| + |
| + #[test] |
| + fn strips_v_prefix_from_unbracketed_heading() { |
| + let cl = Changelog::parse(PREFIXED); |
| + assert!(cl.section("1.5.0").is_some()); |
| + } |
| + |
| + #[test] |
| + fn v_prefixed_latest_version() { |
| + let cl = Changelog::parse(PREFIXED); |
| + assert_eq!(cl.latest_version(), Some("2.0.0")); |
| + } |
| } |