Skip to content

Commit

Permalink
feat: add {{package}} to hook version dsl
Browse files Browse the repository at this point in the history
Closes #257
  • Loading branch information
oknozor committed Feb 18, 2023
1 parent 9eaee5a commit af08a7e
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 4 deletions.
61 changes: 59 additions & 2 deletions src/hook/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,20 @@ impl VersionSpan {
.ok_or_else(|| anyhow!("No previous tag found to replace {{{{latest}}}} version")),
Some(Token::LatestVersionTag) => latest
.map(|version| version.prefixed_tag.clone())
.ok_or_else(|| anyhow!("No previous tag found to replace {{{{latest_tag}}}} version")),
.ok_or_else(|| {
anyhow!("No previous tag found to replace {{{{latest_tag}}}} version")
}),
Some(Token::VersionTag) => version
.map(|version| version.prefixed_tag.clone())
.ok_or_else(|| anyhow!("No previous tag found to replace {{{{version_tag}}}} version")),
.ok_or_else(|| {
anyhow!("No previous tag found to replace {{{{version_tag}}}} version")
}),
Some(Token::Package) => {
return version
.and_then(|version| version.prefixed_tag.package.clone())
.ok_or_else(|| anyhow!("Current tag as no {{{{package}}}} info"))
}

_ => unreachable!("Unexpected parsing error"),
}?;

Expand Down Expand Up @@ -460,4 +470,51 @@ mod test {

Ok(())
}

#[sealed_test]
fn replace_package_name_and_version_tag_with_expression() -> Result<()> {
let mut packages = HashMap::new();
packages.insert("cog".to_string(), MonoRepoPackage::default());
let settings = Settings {
packages,
..Default::default()
};

let settings = toml::to_string(&settings)?;

run_cmd!(
git init;
echo $settings > cog.toml;
git add .;
git commit -m "first commit";
)?;

let mut hook = Hook::from_str(
r#"echo "{{package}}, version: {{version}}, tag: {{version_tag}}, current: {{latest}}, current_tag: {{latest_tag}}""#,
)?;

let current = Tag {
package: Some("cog".to_string()),
prefix: Some("v".to_string()),
version: Version::new(1, 0, 0),
oid: None,
};

let tag = Tag {
package: Some("cog".to_string()),
prefix: Some("v".to_string()),
version: Version::new(1, 1, 0),
oid: None,
};

hook.insert_versions(
Some(&HookVersion::new(current)),
Some(&HookVersion::new(tag)),
)
.unwrap();

assert_that!(hook.0.as_str())
.is_equal_to(r#"echo "cog, version: 1.1.0, tag: cog-v1.1.0, current: 1.0.0, current_tag: cog-v1.0.0""#);
Ok(())
}
}
14 changes: 14 additions & 0 deletions src/hook/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ pub enum Token {
VersionTag,
LatestVersion,
LatestVersionTag,
Package,
Amount(u64),
Add,
Major,
Expand Down Expand Up @@ -60,6 +61,7 @@ fn parse_version(pair: Pair<Rule>) -> Result<VersionSpan, HookParseError> {
Rule::current_tag => tokens.push_back(Token::VersionTag),
Rule::latest_version => tokens.push_back(Token::LatestVersion),
Rule::latest_tag => tokens.push_back(Token::LatestVersionTag),
Rule::package => tokens.push_back(Token::Package),
Rule::ops => parse_operator(&mut tokens, pair.into_inner())?,
Rule::pre_release => {
let identifiers = pair.into_inner().next().unwrap();
Expand Down Expand Up @@ -166,6 +168,18 @@ mod test {
});
}

#[test]
fn parse_package() {
let result = parser::parse("version package: {{package}}");
assert_that!(result)
.is_ok()
.map(|span| &span.version_spans)
.contains(&VersionSpan {
range: 17..28,
tokens: VecDeque::from(vec![Token::Package]),
});
}

#[test]
fn invalid_dsl_is_err() {
let result = parser::parse("the greatest {{+patch-pre.alpha0}}");
Expand Down
8 changes: 6 additions & 2 deletions src/hook/version_dsl.pest
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,9 @@ pre_release = { pre_release_separator ~ identifiers }
build_metadata = { build_metadata_separator ~ identifiers }


version = { delimiter_start ~ (current_tag | current_version | latest_tag | latest_version) ~ ops* ~ pre_release? ~ build_metadata? ~ delimiter_end}
version_dsl = { SOI ~ (version | (!delimiter_start ~ ANY) )* ~ EOI }
package = { "package" }
version = { delimiter_start ~ (
((current_tag | current_version | latest_tag | latest_version) ~ ops* ~ pre_release? ~ build_metadata?)
| package
) ~ delimiter_end}
version_dsl = { SOI ~ ( version | (!delimiter_start ~ ANY) )* ~ EOI }

0 comments on commit af08a7e

Please sign in to comment.