History

feat: Support for no prefixes in version headers (#228)

These are also inherited so once set by a single versioned release section, fully generated sections will inherit their prefix from that one.

Sebastian Thiel committed 5 years ago

Commit 3613a951 parent 86cafe311 files · +100 −31Browse files

Unified · Split

11 files
  1. cargo-smart-release/src/changelog/merge.rs +27 −17
  2. cargo-smart-release/src/changelog/mod.rs +2 −0
  3. cargo-smart-release/src/changelog/parse.rs +17 −6
  4. cargo-smart-release/src/changelog/section/from_history.rs +3 −0
  5. cargo-smart-release/src/changelog/write.rs +16 −5
  6. cargo-smart-release/tests/changelog/merge.rs +22 −0
  7. cargo-smart-release/tests/changelog/parse.rs +5 −0
  8. cargo-smart-release/tests/changelog/write_and_parse/mod.rs +3 −0
  9. cargo-smart-release/tests/changelog/write_and_parse/snapshots/integration__changelog__write_and_parse__all_section_types_round_trips_lossy-2.snap +2 −1
  10. cargo-smart-release/tests/changelog/write_and_parse/snapshots/integration__changelog__write_and_parse__all_section_types_round_trips_lossy-8.snap +1 −1
  11. cargo-smart-release/tests/changelog/write_and_parse/snapshots/integration__changelog__write_and_parse__all_section_types_round_trips_lossy.snap +2 −1
cargo-smart-release/src/changelog/merge.rs+27−17
@@ -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::ReplaceAllOrAppend94 ReplaceMode::ReplaceAllOrAppend
85 } else {95 } else {
86 ReplaceMode::ReplaceAllOrAppendIfPresentInLhs96 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 }
cargo-smart-release/src/changelog/mod.rs+2−0
@@ -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 name28 /// 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 parse32 /// 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.
cargo-smart-release/src/changelog/parse.rs+17−6
@@ -106,7 +106,15 @@ impl ChangeLog { · 105 unmodified lines
106}106}
107 107
108impl Section {108impl 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
444struct Headline {453struct 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 },
cargo-smart-release/src/changelog/section/from_history.rs+3−0
@@ -16,6 +16,8 @@ use crate::{ · 15 unmodified lines
16};16};
17 17
18impl Section {18impl 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(),
cargo-smart-release/src/changelog/write.rs+16−5
@@ -11,11 +11,16 @@ use crate::{ · 10 unmodified lines
11 ChangeLog,11 ChangeLog,
12};12};
13 13
14impl std::fmt::Display for changelog::Version {14struct PrefixedVersion<'a> {
15 version_prefix: &'a str,
16 name: &'a changelog::Version,
17}
18
19impl<'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 }
cargo-smart-release/tests/changelog/merge.rs+22−0
@@ -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 available205 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 },
cargo-smart-release/tests/changelog/parse.rs+5−0
@@ -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 {
cargo-smart-release/tests/changelog/write_and_parse/mod.rs+3−0
@@ -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()?),
cargo-smart-release/tests/changelog/write_and_parse/snapshots/integration__changelog__write_and_parse__all_section_types_round_trips_lossy-2.snap+2−1
@@ -13,7 +13,8 @@ my very own header · 12 unmodified lines
13hello13hello
14world14world
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 world19* hello world
19 this20 this
cargo-smart-release/tests/changelog/write_and_parse/snapshots/integration__changelog__write_and_parse__all_section_types_round_trips_lossy-8.snap+1−1
@@ -3,7 +3,7 @@ source: cargo-smart-release/tests/changelog/write_and_parse/mod.rs · 2 unmodified lines
3expression: buf3expression: 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 world8* hello world
9 this9 this
cargo-smart-release/tests/changelog/write_and_parse/snapshots/integration__changelog__write_and_parse__all_section_types_round_trips_lossy.snap+2−1
@@ -13,7 +13,8 @@ my very own header · 12 unmodified lines
13hello13hello
14world14world
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 world19* hello world
19 this20 this

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t