These are also inherited so once set by a single versioned release section, fully generated sections will inherit their prefix from that one.
Unified · Split
| @@ -24,12 +24,16 @@ impl ChangeLog { · 23 unmodified lines | |||
| 24 | 24 | ||
| 25 | merge_generated_verbatim_section_if_there_is_only_releases_on_lhs(&mut sections_to_merge, sections); | 25 | merge_generated_verbatim_section_if_there_is_only_releases_on_lhs(&mut sections_to_merge, sections); |
| 26 | 26 | ||
| 27 | let (first_release_pos, first_release_indentation) = | 27 | let (first_release_pos, first_release_indentation, first_version_prefix) = |
| 28 | match sections.iter().enumerate().find_map(|(idx, s)| match s { | 28 | match sections.iter().enumerate().find_map(|(idx, s)| match s { |
| 29 | Section::Release { heading_level, .. } => Some((idx, heading_level)), | 29 | Section::Release { |
| 30 | heading_level, | ||
| 31 | version_prefix, | ||
| 32 | .. | ||
| 33 | } => Some((idx, heading_level, version_prefix)), | ||
| 30 | _ => None, | 34 | _ => None, |
| 31 | }) { | 35 | }) { |
| 32 | Some((idx, level)) => (idx, *level), | 36 | Some((idx, level, prefix)) => (idx, *level, prefix.to_owned()), |
| 33 | None => { | 37 | None => { |
| 34 | sections.extend(sections_to_merge); | 38 | sections.extend(sections_to_merge); |
| 35 | return self; | 39 | return self; |
| @@ -44,8 +48,14 @@ impl ChangeLog { · 8 unmodified lines | |||
| 44 | Section::Release { ref name, .. } => match find_target_section(name, sections, first_release_pos) { | 48 | Section::Release { ref name, .. } => match find_target_section(name, sections, first_release_pos) { |
| 45 | Insertion::MergeWith(pos) => sections[pos].merge(section_to_merge), | 49 | Insertion::MergeWith(pos) => sections[pos].merge(section_to_merge), |
| 46 | Insertion::At(pos) => { | 50 | Insertion::At(pos) => { |
| 47 | if let Section::Release { heading_level, .. } = &mut section_to_merge { | 51 | if let Section::Release { |
| 52 | heading_level, | ||
| 53 | version_prefix, | ||
| 54 | .. | ||
| 55 | } = &mut section_to_merge | ||
| 56 | { | ||
| 48 | *heading_level = first_release_indentation; | 57 | *heading_level = first_release_indentation; |
| 58 | *version_prefix = first_version_prefix.clone(); | ||
| 49 | } | 59 | } |
| 50 | sections.insert(pos, section_to_merge); | 60 | sections.insert(pos, section_to_merge); |
| 51 | } | 61 | } |
| @@ -66,26 +76,26 @@ impl Section { · 14 unmodified lines | |||
| 66 | } | 76 | } |
| 67 | ( | 77 | ( |
| 68 | Section::Release { | 78 | Section::Release { |
| 69 | date: lhs_date, | 79 | date: dest_date, |
| 70 | segments: lhs_segments, | 80 | segments: dest_segments, |
| 71 | removed_messages, | 81 | removed_messages, |
| 72 | .. | 82 | .. |
| 73 | }, | 83 | }, |
| 74 | Section::Release { | 84 | Section::Release { |
| 75 | date: rhs_date, | 85 | date: src_date, |
| 76 | segments: rhs_segments, | 86 | segments: src_segments, |
| 77 | unknown: rhs_unknown, | 87 | unknown: src_unknown, |
| 78 | .. | 88 | .. |
| 79 | }, | 89 | }, |
| 80 | ) => { | 90 | ) => { |
| 81 | assert!(rhs_unknown.is_empty(), "shouldn't ever generate 'unknown' portions"); | 91 | assert!(src_unknown.is_empty(), "shouldn't ever generate 'unknown' portions"); |
| 82 | let has_no_read_only_segments = !lhs_segments.iter().any(|s| s.is_read_only()); | 92 | let has_no_read_only_segments = !dest_segments.iter().any(|s| s.is_read_only()); |
| 83 | let mode = if has_no_read_only_segments { | 93 | let mode = if has_no_read_only_segments { |
| 84 | ReplaceMode::ReplaceAllOrAppend | 94 | ReplaceMode::ReplaceAllOrAppend |
| 85 | } else { | 95 | } else { |
| 86 | ReplaceMode::ReplaceAllOrAppendIfPresentInLhs | 96 | ReplaceMode::ReplaceAllOrAppendIfPresentInLhs |
| 87 | }; | 97 | }; |
| 88 | for rhs_segment in rhs_segments { | 98 | for rhs_segment in src_segments { |
| 89 | match rhs_segment { | 99 | match rhs_segment { |
| 90 | Segment::User { .. } => unreachable!("BUG: User segments are never auto-generated"), | 100 | Segment::User { .. } => unreachable!("BUG: User segments are never auto-generated"), |
| 91 | Segment::Details(section::Data::Parsed) | 101 | Segment::Details(section::Data::Parsed) |
| @@ -94,20 +104,20 @@ impl Section { · 2 unmodified lines | |||
| 94 | unreachable!("BUG: Clippy, statistics, and details are set if generated, or not present") | 104 | unreachable!("BUG: Clippy, statistics, and details are set if generated, or not present") |
| 95 | } | 105 | } |
| 96 | Segment::Conventional(conventional) => { | 106 | Segment::Conventional(conventional) => { |
| 97 | merge_conventional(removed_messages, lhs_segments, conventional) | 107 | merge_conventional(removed_messages, dest_segments, conventional) |
| 98 | } | 108 | } |
| 99 | clippy @ Segment::Clippy(_) => { | 109 | clippy @ Segment::Clippy(_) => { |
| 100 | merge_read_only_segment(lhs_segments, |s| matches!(s, Segment::Clippy(_)), clippy, mode) | 110 | merge_read_only_segment(dest_segments, |s| matches!(s, Segment::Clippy(_)), clippy, mode) |
| 101 | } | 111 | } |
| 102 | stats @ Segment::Statistics(_) => { | 112 | stats @ Segment::Statistics(_) => { |
| 103 | merge_read_only_segment(lhs_segments, |s| matches!(s, Segment::Statistics(_)), stats, mode) | 113 | merge_read_only_segment(dest_segments, |s| matches!(s, Segment::Statistics(_)), stats, mode) |
| 104 | } | 114 | } |
| 105 | details @ Segment::Details(_) => { | 115 | details @ Segment::Details(_) => { |
| 106 | merge_read_only_segment(lhs_segments, |s| matches!(s, Segment::Details(_)), details, mode) | 116 | merge_read_only_segment(dest_segments, |s| matches!(s, Segment::Details(_)), details, mode) |
| 107 | } | 117 | } |
| 108 | } | 118 | } |
| 109 | } | 119 | } |
| 110 | *lhs_date = rhs_date; | 120 | *dest_date = src_date; |
| 111 | } | 121 | } |
| 112 | } | 122 | } |
| 113 | } | 123 | } |
| @@ -27,6 +27,8 @@ pub enum Section { · 26 unmodified lines | |||
| 27 | date: Option<time::OffsetDateTime>, | 27 | date: Option<time::OffsetDateTime>, |
| 28 | /// the amount of # in front of the heading denoting the release name | 28 | /// the amount of # in front of the heading denoting the release name |
| 29 | heading_level: usize, | 29 | heading_level: usize, |
| 30 | /// What came right before the version | ||
| 31 | version_prefix: String, | ||
| 30 | /// text of events of everything we couldn't parse | 32 | /// text of events of everything we couldn't parse |
| 31 | unknown: String, | 33 | unknown: String, |
| 32 | /// Removed git conventional messages parsed back from html tags. These may live without a headline, to delete the headline. | 34 | /// Removed git conventional messages parsed back from html tags. These may live without a headline, to delete the headline. |
| @@ -106,7 +106,15 @@ impl ChangeLog { · 105 unmodified lines | |||
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | impl Section { | 108 | impl Section { |
| 109 | fn from_headline_and_body(Headline { level, version, date }: Headline, body: String) -> Self { | 109 | fn from_headline_and_body( |
| 110 | Headline { | ||
| 111 | level, | ||
| 112 | version_prefix, | ||
| 113 | version, | ||
| 114 | date, | ||
| 115 | }: Headline, | ||
| 116 | body: String, | ||
| 117 | ) -> Self { | ||
| 110 | let mut events = pulldown_cmark::Parser::new_ext(&body, pulldown_cmark::Options::all()) | 118 | let mut events = pulldown_cmark::Parser::new_ext(&body, pulldown_cmark::Options::all()) |
| 111 | .into_offset_iter() | 119 | .into_offset_iter() |
| 112 | .peekable(); | 120 | .peekable(); |
| @@ -215,6 +223,7 @@ impl Section { · 102 unmodified lines | |||
| 215 | Some(version) => changelog::Version::Semantic(version), | 223 | Some(version) => changelog::Version::Semantic(version), |
| 216 | None => changelog::Version::Unreleased, | 224 | None => changelog::Version::Unreleased, |
| 217 | }, | 225 | }, |
| 226 | version_prefix, | ||
| 218 | date, | 227 | date, |
| 219 | removed_messages, | 228 | removed_messages, |
| 220 | heading_level: level, | 229 | heading_level: level, |
| @@ -443,6 +452,7 @@ fn skip_to_next_section_title(events: &mut Peekable<OffsetIter<'_>>, level: u32) · 222 unmodified lines | |||
| 443 | 452 | ||
| 444 | struct Headline { | 453 | struct Headline { |
| 445 | level: usize, | 454 | level: usize, |
| 455 | version_prefix: String, | ||
| 446 | version: Option<semver::Version>, | 456 | version: Option<semver::Version>, |
| 447 | date: Option<time::OffsetDateTime>, | 457 | date: Option<time::OffsetDateTime>, |
| 448 | } | 458 | } |
| @@ -470,13 +480,13 @@ fn headline<'a, E: ParseError<&'a str> + FromExternalError<&'a str, ()>>(i: &'a · 21 unmodified lines | |||
| 470 | hashes, | 480 | hashes, |
| 471 | greedy_whitespace, | 481 | greedy_whitespace, |
| 472 | alt(( | 482 | alt(( |
| 473 | preceded( | 483 | tuple(( |
| 474 | tag("v"), | 484 | opt(tag("v")), |
| 475 | map_res(take_till(|c: char| c.is_whitespace()), |v| { | 485 | map_res(take_till(|c: char| c.is_whitespace()), |v| { |
| 476 | semver::Version::parse(v).map_err(|_| ()).map(Some) | 486 | semver::Version::parse(v).map_err(|_| ()).map(Some) |
| 477 | }), | 487 | }), |
| 478 | ), | 488 | )), |
| 479 | map(tag_no_case("unreleased"), |_| None), | 489 | map(tag_no_case("unreleased"), |_| (None, None)), |
| 480 | )), | 490 | )), |
| 481 | ), | 491 | ), |
| 482 | opt(preceded( | 492 | opt(preceded( |
| @@ -499,8 +509,9 @@ fn headline<'a, E: ParseError<&'a str> + FromExternalError<&'a str, ()>>(i: &'a · 16 unmodified lines | |||
| 499 | )), | 509 | )), |
| 500 | greedy_whitespace, | 510 | greedy_whitespace, |
| 501 | ), | 511 | ), |
| 502 | |((hashes, version), date)| Headline { | 512 | |((hashes, (prefix, version)), date)| Headline { |
| 503 | level: hashes.len(), | 513 | level: hashes.len(), |
| 514 | version_prefix: prefix.map(ToOwned::to_owned).unwrap_or_else(String::new), | ||
| 504 | version, | 515 | version, |
| 505 | date, | 516 | date, |
| 506 | }, | 517 | }, |
| @@ -16,6 +16,8 @@ use crate::{ · 15 unmodified lines | |||
| 16 | }; | 16 | }; |
| 17 | 17 | ||
| 18 | impl Section { | 18 | impl Section { |
| 19 | pub const DEFAULT_PREFIX: &'static str = "v"; | ||
| 20 | |||
| 19 | pub fn from_history_segment( | 21 | pub fn from_history_segment( |
| 20 | package: &Package, | 22 | package: &Package, |
| 21 | segment: &commit::history::Segment<'_>, | 23 | segment: &commit::history::Segment<'_>, |
| @@ -153,6 +155,7 @@ impl Section { · 131 unmodified lines | |||
| 153 | name: version, | 155 | name: version, |
| 154 | date, | 156 | date, |
| 155 | heading_level: changelog::DEFAULT_HEADING_LEVEL, | 157 | heading_level: changelog::DEFAULT_HEADING_LEVEL, |
| 158 | version_prefix: Self::DEFAULT_PREFIX.to_owned(), | ||
| 156 | segments, | 159 | segments, |
| 157 | removed_messages: Default::default(), | 160 | removed_messages: Default::default(), |
| 158 | unknown: Default::default(), | 161 | unknown: Default::default(), |
| @@ -11,11 +11,16 @@ use crate::{ · 10 unmodified lines | |||
| 11 | ChangeLog, | 11 | ChangeLog, |
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | impl std::fmt::Display for changelog::Version { | 14 | struct PrefixedVersion<'a> { |
| 15 | version_prefix: &'a str, | ||
| 16 | name: &'a changelog::Version, | ||
| 17 | } | ||
| 18 | |||
| 19 | impl<'a> std::fmt::Display for PrefixedVersion<'a> { | ||
| 15 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | 20 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| 16 | match self { | 21 | match self.name { |
| 17 | changelog::Version::Unreleased => f.write_str("Unreleased"), | 22 | changelog::Version::Unreleased => f.write_str("Unreleased"), |
| 18 | changelog::Version::Semantic(v) => write!(f, "v{}", v), | 23 | changelog::Version::Semantic(v) => write!(f, "{}{}", self.version_prefix, v), |
| 19 | } | 24 | } |
| 20 | } | 25 | } |
| 21 | } | 26 | } |
| @@ -105,12 +110,18 @@ impl Section { · 83 unmodified lines | |||
| 105 | name, | 110 | name, |
| 106 | date, | 111 | date, |
| 107 | heading_level, | 112 | heading_level, |
| 113 | version_prefix, | ||
| 108 | segments, | 114 | segments, |
| 109 | removed_messages, | 115 | removed_messages, |
| 110 | unknown, | 116 | unknown, |
| 111 | } => { | 117 | } => { |
| 112 | if components.contains(Components::SECTION_TITLE) { | 118 | if components.contains(Components::SECTION_TITLE) { |
| 113 | write!(out, "{} {}", heading(*heading_level), name)?; | 119 | write!( |
| 120 | out, | ||
| 121 | "{} {}", | ||
| 122 | heading(*heading_level), | ||
| 123 | PrefixedVersion { version_prefix, name } | ||
| 124 | )?; | ||
| 114 | match date { | 125 | match date { |
| 115 | None => out.write_str("\n\n"), | 126 | None => out.write_str("\n\n"), |
| 116 | Some(date) => writeln!( | 127 | Some(date) => writeln!( |
| @@ -136,7 +147,7 @@ impl Section { · 19 unmodified lines | |||
| 136 | if !unknown.is_empty() && components.contains(Components::HTML_TAGS) { | 147 | if !unknown.is_empty() && components.contains(Components::HTML_TAGS) { |
| 137 | writeln!(out, "{}", Section::UNKNOWN_TAG_START)?; | 148 | writeln!(out, "{}", Section::UNKNOWN_TAG_START)?; |
| 138 | out.write_str(unknown)?; | 149 | out.write_str(unknown)?; |
| 139 | writeln!(out, "{}", Section::UNKNOWN_TAG_END)?; | 150 | writeln!(out, "{}\n", Section::UNKNOWN_TAG_END)?; |
| 140 | } | 151 | } |
| 141 | Ok(()) | 152 | Ok(()) |
| 142 | } | 153 | } |
| @@ -16,6 +16,7 @@ fn sections() { · 15 unmodified lines | |||
| 16 | }, | 16 | }, |
| 17 | Section::Release { | 17 | Section::Release { |
| 18 | heading_level: 3, | 18 | heading_level: 3, |
| 19 | version_prefix: "".into(), | ||
| 19 | removed_messages: vec![], | 20 | removed_messages: vec![], |
| 20 | date: Some( | 21 | date: Some( |
| 21 | time::Date::from_calendar_date(2021, time::Month::September, 14) | 22 | time::Date::from_calendar_date(2021, time::Month::September, 14) |
| @@ -33,6 +34,7 @@ fn sections() { · 11 unmodified lines | |||
| 33 | }, | 34 | }, |
| 34 | Section::Release { | 35 | Section::Release { |
| 35 | heading_level: 3, | 36 | heading_level: 3, |
| 37 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 36 | removed_messages: vec![], | 38 | removed_messages: vec![], |
| 37 | date: None, | 39 | date: None, |
| 38 | name: changelog::Version::Semantic("0.9.0".parse().unwrap()), | 40 | name: changelog::Version::Semantic("0.9.0".parse().unwrap()), |
| @@ -51,6 +53,7 @@ fn sections() { · 12 unmodified lines | |||
| 51 | date: None, | 53 | date: None, |
| 52 | removed_messages: vec![], | 54 | removed_messages: vec![], |
| 53 | name: changelog::Version::Unreleased, | 55 | name: changelog::Version::Unreleased, |
| 56 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 54 | heading_level: 2, | 57 | heading_level: 2, |
| 55 | segments: vec![section::Segment::Clippy(section::Data::Generated( | 58 | segments: vec![section::Segment::Clippy(section::Data::Generated( |
| 56 | section::segment::ThanksClippy { count: 4 }, | 59 | section::segment::ThanksClippy { count: 4 }, |
| @@ -62,6 +65,7 @@ fn sections() { · 5 unmodified lines | |||
| 62 | name: changelog::Version::Semantic("1.0.0".parse().unwrap()), | 65 | name: changelog::Version::Semantic("1.0.0".parse().unwrap()), |
| 63 | removed_messages: vec![], | 66 | removed_messages: vec![], |
| 64 | heading_level: 2, | 67 | heading_level: 2, |
| 68 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 65 | segments: vec![section::Segment::Clippy(section::Data::Generated( | 69 | segments: vec![section::Segment::Clippy(section::Data::Generated( |
| 66 | section::segment::ThanksClippy { count: 3 }, | 70 | section::segment::ThanksClippy { count: 3 }, |
| 67 | ))], | 71 | ))], |
| @@ -73,6 +77,7 @@ fn sections() { · 5 unmodified lines | |||
| 73 | unknown: String::new(), | 77 | unknown: String::new(), |
| 74 | removed_messages: vec![], | 78 | removed_messages: vec![], |
| 75 | heading_level: 2, | 79 | heading_level: 2, |
| 80 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 76 | segments: vec![section::Segment::Clippy(section::Data::Generated( | 81 | segments: vec![section::Segment::Clippy(section::Data::Generated( |
| 77 | section::segment::ThanksClippy { count: 2 }, | 82 | section::segment::ThanksClippy { count: 2 }, |
| 78 | ))], | 83 | ))], |
| @@ -83,6 +88,7 @@ fn sections() { · 4 unmodified lines | |||
| 83 | unknown: "undocumented".into(), | 88 | unknown: "undocumented".into(), |
| 84 | removed_messages: vec![], | 89 | removed_messages: vec![], |
| 85 | heading_level: 2, | 90 | heading_level: 2, |
| 91 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 86 | segments: Vec::new(), | 92 | segments: Vec::new(), |
| 87 | }, | 93 | }, |
| 88 | ], | 94 | ], |
| @@ -101,6 +107,7 @@ fn sections() { · 12 unmodified lines | |||
| 101 | date: None, | 107 | date: None, |
| 102 | name: changelog::Version::Unreleased, | 108 | name: changelog::Version::Unreleased, |
| 103 | heading_level: 3, | 109 | heading_level: 3, |
| 110 | version_prefix: "".into(), | ||
| 104 | removed_messages: vec![], | 111 | removed_messages: vec![], |
| 105 | segments: vec![section::Segment::Clippy(section::Data::Generated( | 112 | segments: vec![section::Segment::Clippy(section::Data::Generated( |
| 106 | section::segment::ThanksClippy { count: 4 } | 113 | section::segment::ThanksClippy { count: 4 } |
| @@ -110,6 +117,7 @@ fn sections() { · 3 unmodified lines | |||
| 110 | Section::Release { | 117 | Section::Release { |
| 111 | heading_level: 3, | 118 | heading_level: 3, |
| 112 | removed_messages: vec![], | 119 | removed_messages: vec![], |
| 120 | version_prefix: "".into(), | ||
| 113 | date: Some( | 121 | date: Some( |
| 114 | time::Date::from_calendar_date(2021, time::Month::September, 15) | 122 | time::Date::from_calendar_date(2021, time::Month::September, 15) |
| 115 | .unwrap() | 123 | .unwrap() |
| @@ -131,6 +139,7 @@ fn sections() { · 15 unmodified lines | |||
| 131 | name: changelog::Version::Semantic("0.9.0".parse().unwrap()), | 139 | name: changelog::Version::Semantic("0.9.0".parse().unwrap()), |
| 132 | unknown: String::new(), | 140 | unknown: String::new(), |
| 133 | heading_level: 3, | 141 | heading_level: 3, |
| 142 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 134 | removed_messages: vec![], | 143 | removed_messages: vec![], |
| 135 | segments: vec![section::Segment::Clippy(section::Data::Generated( | 144 | segments: vec![section::Segment::Clippy(section::Data::Generated( |
| 136 | section::segment::ThanksClippy { count: 2 } | 145 | section::segment::ThanksClippy { count: 2 } |
| @@ -141,6 +150,7 @@ fn sections() { · 4 unmodified lines | |||
| 141 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), | 150 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), |
| 142 | unknown: "undocumented".into(), | 151 | unknown: "undocumented".into(), |
| 143 | heading_level: 3, | 152 | heading_level: 3, |
| 153 | version_prefix: "".into(), | ||
| 144 | removed_messages: vec![], | 154 | removed_messages: vec![], |
| 145 | segments: Vec::new(), | 155 | segments: Vec::new(), |
| 146 | }, | 156 | }, |
| @@ -165,6 +175,7 @@ fn segments() { · 18 unmodified lines | |||
| 165 | name: changelog::Version::Semantic("0.7.0".parse().unwrap()), | 175 | name: changelog::Version::Semantic("0.7.0".parse().unwrap()), |
| 166 | unknown: "".into(), | 176 | unknown: "".into(), |
| 167 | heading_level: 3, | 177 | heading_level: 3, |
| 178 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 168 | removed_messages: vec![], | 179 | removed_messages: vec![], |
| 169 | segments: vec![ | 180 | segments: vec![ |
| 170 | section::Segment::Conventional(section::segment::Conventional { | 181 | section::Segment::Conventional(section::segment::Conventional { |
| @@ -189,12 +200,14 @@ fn segments() { · 18 unmodified lines | |||
| 189 | date: None, | 200 | date: None, |
| 190 | name: changelog::Version::Unreleased, | 201 | name: changelog::Version::Unreleased, |
| 191 | heading_level: 3, | 202 | heading_level: 3, |
| 203 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 192 | removed_messages: vec![], | 204 | removed_messages: vec![], |
| 193 | segments: vec![section::Segment::Clippy(section::Data::Parsed)], // only clippy still available | 205 | segments: vec![section::Segment::Clippy(section::Data::Parsed)], // only clippy still available |
| 194 | unknown: Default::default(), | 206 | unknown: Default::default(), |
| 195 | }, | 207 | }, |
| 196 | Section::Release { | 208 | Section::Release { |
| 197 | heading_level: 3, | 209 | heading_level: 3, |
| 210 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 198 | removed_messages: vec![], | 211 | removed_messages: vec![], |
| 199 | date: Some( | 212 | date: Some( |
| 200 | time::Date::from_calendar_date(2021, time::Month::September, 15) | 213 | time::Date::from_calendar_date(2021, time::Month::September, 15) |
| @@ -213,6 +226,7 @@ fn segments() { · 12 unmodified lines | |||
| 213 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), | 226 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), |
| 214 | unknown: "".into(), | 227 | unknown: "".into(), |
| 215 | heading_level: 3, | 228 | heading_level: 3, |
| 229 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 216 | removed_messages: vec![], | 230 | removed_messages: vec![], |
| 217 | segments: vec![ | 231 | segments: vec![ |
| 218 | section::Segment::Details(section::Data::Parsed), | 232 | section::Segment::Details(section::Data::Parsed), |
| @@ -265,12 +279,14 @@ fn segments() { · 46 unmodified lines | |||
| 265 | date: None, | 279 | date: None, |
| 266 | name: changelog::Version::Unreleased, | 280 | name: changelog::Version::Unreleased, |
| 267 | heading_level: 3, | 281 | heading_level: 3, |
| 282 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 268 | removed_messages: vec![], | 283 | removed_messages: vec![], |
| 269 | segments: segments.clone(), | 284 | segments: segments.clone(), |
| 270 | unknown: Default::default(), | 285 | unknown: Default::default(), |
| 271 | }, | 286 | }, |
| 272 | Section::Release { | 287 | Section::Release { |
| 273 | heading_level: 3, | 288 | heading_level: 3, |
| 289 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 274 | removed_messages: vec![], | 290 | removed_messages: vec![], |
| 275 | date: Some( | 291 | date: Some( |
| 276 | time::Date::from_calendar_date(2021, time::Month::September, 15) | 292 | time::Date::from_calendar_date(2021, time::Month::September, 15) |
| @@ -287,6 +303,7 @@ fn segments() { · 10 unmodified lines | |||
| 287 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), | 303 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), |
| 288 | unknown: "".into(), | 304 | unknown: "".into(), |
| 289 | heading_level: 3, | 305 | heading_level: 3, |
| 306 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 290 | removed_messages: vec![], | 307 | removed_messages: vec![], |
| 291 | segments: segments.clone(), | 308 | segments: segments.clone(), |
| 292 | }, | 309 | }, |
| @@ -295,6 +312,7 @@ fn segments() { · 2 unmodified lines | |||
| 295 | name: changelog::Version::Semantic("0.7.0".parse().unwrap()), | 312 | name: changelog::Version::Semantic("0.7.0".parse().unwrap()), |
| 296 | unknown: "".into(), | 313 | unknown: "".into(), |
| 297 | heading_level: 3, | 314 | heading_level: 3, |
| 315 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 298 | removed_messages: vec![], | 316 | removed_messages: vec![], |
| 299 | segments: { | 317 | segments: { |
| 300 | let mut v = segments.clone(); | 318 | let mut v = segments.clone(); |
| @@ -318,6 +336,7 @@ fn segments() { · 17 unmodified lines | |||
| 318 | name: changelog::Version::Semantic("0.7.0".parse().unwrap()), | 336 | name: changelog::Version::Semantic("0.7.0".parse().unwrap()), |
| 319 | unknown: "".into(), | 337 | unknown: "".into(), |
| 320 | heading_level: 3, | 338 | heading_level: 3, |
| 339 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 321 | removed_messages: vec![], | 340 | removed_messages: vec![], |
| 322 | segments: vec![ | 341 | segments: vec![ |
| 323 | section::Segment::Conventional(section::segment::Conventional { | 342 | section::Segment::Conventional(section::segment::Conventional { |
| @@ -347,12 +366,14 @@ fn segments() { · 23 unmodified lines | |||
| 347 | date: None, | 366 | date: None, |
| 348 | name: changelog::Version::Unreleased, | 367 | name: changelog::Version::Unreleased, |
| 349 | heading_level: 3, | 368 | heading_level: 3, |
| 369 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 350 | removed_messages: vec![], | 370 | removed_messages: vec![], |
| 351 | segments: vec![clippy], | 371 | segments: vec![clippy], |
| 352 | unknown: Default::default(), | 372 | unknown: Default::default(), |
| 353 | }, | 373 | }, |
| 354 | Section::Release { | 374 | Section::Release { |
| 355 | heading_level: 3, | 375 | heading_level: 3, |
| 376 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 356 | removed_messages: vec![], | 377 | removed_messages: vec![], |
| 357 | date: Some( | 378 | date: Some( |
| 358 | time::Date::from_calendar_date(2021, time::Month::September, 15) | 379 | time::Date::from_calendar_date(2021, time::Month::September, 15) |
| @@ -378,6 +399,7 @@ fn segments() { · 19 unmodified lines | |||
| 378 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), | 399 | name: changelog::Version::Semantic("0.8.0".parse().unwrap()), |
| 379 | unknown: "".into(), | 400 | unknown: "".into(), |
| 380 | heading_level: 3, | 401 | heading_level: 3, |
| 402 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 381 | removed_messages: vec![], | 403 | removed_messages: vec![], |
| 382 | segments: vec![details, statistics], | 404 | segments: vec![details, statistics], |
| 383 | }, | 405 | }, |
| @@ -36,6 +36,7 @@ fn all_unknown_in_section() { · 35 unmodified lines | |||
| 36 | removed_messages: vec![], | 36 | removed_messages: vec![], |
| 37 | date: None, | 37 | date: None, |
| 38 | heading_level: 3, | 38 | heading_level: 3, |
| 39 | version_prefix: "".into(), | ||
| 39 | segments: vec![Segment::User { | 40 | segments: vec![Segment::User { |
| 40 | markdown: "- hello ~~this is not understood~~\n* this isn't either\n\n".into() | 41 | markdown: "- hello ~~this is not understood~~\n* this isn't either\n\n".into() |
| 41 | }], | 42 | }], |
| @@ -46,6 +47,7 @@ fn all_unknown_in_section() { · 4 unmodified lines | |||
| 46 | removed_messages: vec![], | 47 | removed_messages: vec![], |
| 47 | date: None, | 48 | date: None, |
| 48 | heading_level: 4, | 49 | heading_level: 4, |
| 50 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 49 | segments: vec![Segment::User { | 51 | segments: vec![Segment::User { |
| 50 | markdown: "Some free text in a paragraph\nthat won't parse.\n".into() | 52 | markdown: "Some free text in a paragraph\nthat won't parse.\n".into() |
| 51 | }], | 53 | }], |
| @@ -66,6 +68,7 @@ fn unknown_link_and_headling() { · 14 unmodified lines | |||
| 66 | removed_messages: vec![], | 68 | removed_messages: vec![], |
| 67 | date: None, | 69 | date: None, |
| 68 | heading_level: 4, | 70 | heading_level: 4, |
| 71 | version_prefix: "".into(), | ||
| 69 | segments: vec![Segment::User { | 72 | segments: vec![Segment::User { |
| 70 | markdown: "##### Special\n\nHello [there][194] period.\n".into() | 73 | markdown: "##### Special\n\nHello [there][194] period.\n".into() |
| 71 | }], | 74 | }], |
| @@ -90,6 +93,7 @@ fn known_and_unknown_sections_are_sorted() { · 18 unmodified lines | |||
| 90 | removed_messages: vec![], | 93 | removed_messages: vec![], |
| 91 | date: None, | 94 | date: None, |
| 92 | heading_level: 3, | 95 | heading_level: 3, |
| 96 | version_prefix: "".into(), | ||
| 93 | unknown: "".into(), | 97 | unknown: "".into(), |
| 94 | segments: vec![Segment::User { | 98 | segments: vec![Segment::User { |
| 95 | markdown: "TBD\n".into() | 99 | markdown: "TBD\n".into() |
| @@ -100,6 +104,7 @@ fn known_and_unknown_sections_are_sorted() { · 4 unmodified lines | |||
| 100 | removed_messages: vec![], | 104 | removed_messages: vec![], |
| 101 | date: None, | 105 | date: None, |
| 102 | heading_level: 3, | 106 | heading_level: 3, |
| 107 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 103 | unknown: "".into(), | 108 | unknown: "".into(), |
| 104 | segments: vec![ | 109 | segments: vec![ |
| 105 | Segment::User { | 110 | Segment::User { |
| @@ -18,6 +18,7 @@ fn conventional_write_empty_messages() -> Result { · 17 unmodified lines | |||
| 18 | let log = ChangeLog { | 18 | let log = ChangeLog { |
| 19 | sections: vec![Section::Release { | 19 | sections: vec![Section::Release { |
| 20 | heading_level: 4, | 20 | heading_level: 4, |
| 21 | version_prefix: Section::DEFAULT_PREFIX.into(), | ||
| 21 | date: Some(time::OffsetDateTime::from_unix_timestamp(0)?), | 22 | date: Some(time::OffsetDateTime::from_unix_timestamp(0)?), |
| 22 | name: changelog::Version::Semantic("1.0.2-beta.2".parse()?), | 23 | name: changelog::Version::Semantic("1.0.2-beta.2".parse()?), |
| 23 | removed_messages: vec![second_message], | 24 | removed_messages: vec![second_message], |
| @@ -92,11 +93,13 @@ fn all_section_types_round_trips_lossy() -> Result { · 68 unmodified lines | |||
| 92 | removed_messages: vec![], | 93 | removed_messages: vec![], |
| 93 | date: None, | 94 | date: None, |
| 94 | name: changelog::Version::Unreleased, | 95 | name: changelog::Version::Unreleased, |
| 96 | version_prefix: "".into(), | ||
| 95 | segments: Vec::new(), | 97 | segments: Vec::new(), |
| 96 | unknown: "hello\nworld\n".into(), | 98 | unknown: "hello\nworld\n".into(), |
| 97 | }, | 99 | }, |
| 98 | Section::Release { | 100 | Section::Release { |
| 99 | heading_level: 4, | 101 | heading_level: 4, |
| 102 | version_prefix: "".into(), | ||
| 100 | removed_messages: vec![], | 103 | removed_messages: vec![], |
| 101 | date: Some(time::OffsetDateTime::from_unix_timestamp(0)?), | 104 | date: Some(time::OffsetDateTime::from_unix_timestamp(0)?), |
| 102 | name: changelog::Version::Semantic("1.0.2-beta.2".parse()?), | 105 | name: changelog::Version::Semantic("1.0.2-beta.2".parse()?), |
| @@ -13,7 +13,8 @@ my very own header · 12 unmodified lines | |||
| 13 | hello | 13 | hello |
| 14 | world | 14 | world |
| 15 | <csr-unknown/> | 15 | <csr-unknown/> |
| 16 | #### v1.0.2-beta.2 (1970-01-01) | 16 | |
| 17 | #### 1.0.2-beta.2 (1970-01-01) | ||
| 17 | 18 | ||
| 18 | * hello world | 19 | * hello world |
| 19 | this | 20 | this |
| @@ -3,7 +3,7 @@ source: cargo-smart-release/tests/changelog/write_and_parse/mod.rs · 2 unmodified lines | |||
| 3 | expression: buf | 3 | expression: buf |
| 4 | 4 | ||
| 5 | --- | 5 | --- |
| 6 | #### v1.0.2-beta.2 (1970-01-01) | 6 | #### 1.0.2-beta.2 (1970-01-01) |
| 7 | 7 | ||
| 8 | * hello world | 8 | * hello world |
| 9 | this | 9 | this |
| @@ -13,7 +13,8 @@ my very own header · 12 unmodified lines | |||
| 13 | hello | 13 | hello |
| 14 | world | 14 | world |
| 15 | <csr-unknown/> | 15 | <csr-unknown/> |
| 16 | #### v1.0.2-beta.2 (1970-01-01) | 16 | |
| 17 | #### 1.0.2-beta.2 (1970-01-01) | ||
| 17 | 18 | ||
| 18 | * hello world | 19 | * hello world |
| 19 | this | 20 | this |