Skip to content

Commit

Permalink
feat: strip prefix regex
Browse files Browse the repository at this point in the history
Signed-off-by: Nico Braun <rainbowstack@gmail.com>
  • Loading branch information
bluebrown authored and hdevalke committed Jul 6, 2023
1 parent 4b17cb6 commit 3f0d30d
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/cmd/changelog.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ impl<'a> ChangeLogTransformer<'a> {
});
let commit_parser = CommitParser::builder()
.scope_regex(config.scope_regex.clone())
.strip_regex(config.strip_regex.clone())
.references_regex(format!("({})([0-9]+)", config.issue_prefixes.join("|")))
.build();

Expand Down
1 change: 1 addition & 0 deletions src/cmd/check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ impl Command for CheckCommand {

let parser = conventional::CommitParser::builder()
.scope_regex(config.scope_regex)
.strip_regex(config.strip_regex)
.build();
let types: Vec<Type> = config
.types
Expand Down
13 changes: 10 additions & 3 deletions src/cmd/version.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,11 @@ impl VersionCommand {
Ok((last_version.0, label))
}

fn get_version(&self, scope_regex: String) -> Result<(Version, Label), Error> {
fn get_version(
&self,
scope_regex: String,
strip_regex: String,
) -> Result<(Version, Label), Error> {
if let Some(VersionAndTag { tag, mut version }) = self.find_last_version()? {
let v = if self.major {
version.increment_major();
Expand All @@ -136,7 +140,10 @@ impl VersionCommand {
(version.0, Label::Prerelease)
}
} else {
let parser = CommitParser::builder().scope_regex(scope_regex).build();
let parser = CommitParser::builder()
.scope_regex(scope_regex)
.strip_regex(strip_regex)
.build();
self.find_bump_version(tag.as_str(), version, &parser)?
}
} else {
Expand All @@ -157,7 +164,7 @@ impl VersionCommand {

impl Command for VersionCommand {
fn exec(&self, config: Config) -> anyhow::Result<()> {
let (version, label) = self.get_version(config.scope_regex)?;
let (version, label) = self.get_version(config.scope_regex, config.strip_regex)?;
if self.label {
println!("{label}");
} else {
Expand Down
42 changes: 41 additions & 1 deletion src/conventional/commits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,14 +123,16 @@ pub struct CommitParser {
regex_scope: Regex,
regex_footer: Regex,
regex_references: Regex,
regex_strip: Regex,
}

impl CommitParser {
pub fn builder() -> CommitParserBuilder {
CommitParserBuilder::new()
}

pub fn parse(&self, s: &str) -> Result<Commit, ParseError> {
pub fn parse(&self, msg: &str) -> Result<Commit, ParseError> {
let s = self.regex_strip.replace(msg, "");
let mut lines = s.lines();
if let Some(first) = lines.next() {
if let Some(capts) = self.regex_first_line.captures(first) {
Expand Down Expand Up @@ -229,27 +231,39 @@ impl CommitParser {
pub struct CommitParserBuilder {
scope_regex: String,
references_regex: String,
strip_regex: String,
}

impl CommitParserBuilder {
pub fn new() -> Self {
Self {
scope_regex: "[[:alnum:]]+(?:[-_/][[:alnum:]]+)*".into(),
references_regex: "(#)([0-9]+)".into(),
strip_regex: "".into(),
}
}

pub fn scope_regex(self, scope_regex: String) -> Self {
Self {
scope_regex,
references_regex: self.references_regex,
strip_regex: self.strip_regex,
}
}

pub fn references_regex(self, references_regex: String) -> Self {
Self {
references_regex,
scope_regex: self.scope_regex,
strip_regex: self.strip_regex,
}
}

pub fn strip_regex(self, strip_regex: String) -> Self {
Self {
strip_regex,
references_regex: self.references_regex,
scope_regex: self.scope_regex,
}
}

Expand Down Expand Up @@ -277,11 +291,14 @@ impl CommitParserBuilder {
Regex::new(self.scope_regex.as_str()).expect("scope regex should be valid");
let regex_references =
Regex::new(self.references_regex.as_str()).expect("references regex should be valid");
let regex_strip: Regex =
Regex::new(self.strip_regex.as_str()).expect("strip regex should be valid");
CommitParser {
regex_scope,
regex_first_line,
regex_footer,
regex_references,
regex_strip,
}
}
}
Expand Down Expand Up @@ -483,4 +500,27 @@ mod tests {
);
assert!(!commit.is_breaking());
}

#[test]
fn test_with_strip_prefix() {
let msg = "Merge PR 14: docs: correct spelling of CHANGELOG";
let commit: Commit = CommitParser::builder()
.strip_regex("^(?:Merge PR [0-9]+: )?".to_string())
.build()
.parse(msg)
.expect("valid");
assert_eq!(
commit,
Commit {
r#type: Type::Docs,
scope: None,
breaking: false,
description: "correct spelling of CHANGELOG".into(),
body: None,
footers: Vec::new(),
references: Vec::new(),
}
);
assert!(!commit.is_breaking());
}
}
9 changes: 9 additions & 0 deletions src/conventional/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,9 @@ pub(crate) struct Config {
/// Follow only the first parent
#[serde(default)]
pub first_parent: bool,
/// Strip the commit message(s) by the given regex pattern
#[serde(default = "default_strip_regex")]
pub(crate) strip_regex: String,
}

const fn default_true() -> bool {
Expand Down Expand Up @@ -119,6 +122,7 @@ impl Default for Config {
merges: false,
first_parent: false,
wrap_disabled: false,
strip_regex: "".to_string(),
}
}
}
Expand Down Expand Up @@ -214,6 +218,10 @@ fn default_scope_regex() -> String {
"[[:alnum:]]+(?:[-_/][[:alnum:]]+)*".to_string()
}

fn default_strip_regex() -> String {
"".to_string()
}

type HostOwnerRepo = (Option<String>, Option<String>, Option<String>);

/// Get host, owner and repository based on the git remote origin url.
Expand Down Expand Up @@ -428,6 +436,7 @@ mod tests {
merges: false,
first_parent: false,
wrap_disabled: false,
strip_regex: "".to_string(),
}
)
}
Expand Down

0 comments on commit 3f0d30d

Please sign in to comment.