Skip to content

Commit 22d6738

Browse files
committed
fix preRelease basing release on the next release version
1 parent f1a7beb commit 22d6738

File tree

2 files changed

+28
-33
lines changed

2 files changed

+28
-33
lines changed

src/lib.rs

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -48,39 +48,34 @@ pub fn determine_nex_tag(
4848
}
4949
VersionType::PreRelease => {
5050
let suffix = next_tag_request.suffix.unwrap();
51-
let completed_base_tag = format!("{}.*-{}-*", next_tag_request.base_tag, suffix);
52-
let mut tags = query_git_tags(&completed_base_tag, next_tag_request.path.as_str())
53-
.expect("Could not list git tags");
54-
let mut found_suffix_tag = false;
55-
// if no tags are found for base tag + suffix, find the latest tag for base tag
56-
if tags.is_empty() {
57-
let completed_base_tag = format!("{}.*", next_tag_request.base_tag);
58-
tags = query_git_tags(&completed_base_tag, next_tag_request.path.as_str())
59-
.expect("Could not list git tags");
60-
if tags.is_empty() {
61-
debug!("Could not find tags, returning .0");
62-
return Ok(format!("{}.0-{}-0", next_tag_request.base_tag, suffix));
63-
}
51+
52+
// 1. Find the latest stable tag for the base.
53+
let stable_tags_pattern = format!("{}.*", next_tag_request.base_tag);
54+
let stable_tags = query_git_tags(&stable_tags_pattern, next_tag_request.path.as_str())?
55+
.into_iter()
56+
.filter(|t| !t.contains('-'))
57+
.collect::<Vec<String>>();
58+
59+
let next_stable_tag = if stable_tags.is_empty() {
60+
format!("{}.0", next_tag_request.base_tag)
6461
} else {
65-
found_suffix_tag = true;
66-
}
62+
increment_tag(stable_tags.last().unwrap())?
63+
};
6764

68-
let last_tag = tags.last().unwrap();
65+
// 2. Find pre-release tags for the *next* stable version.
66+
let pre_release_pattern = format!("{}-{}-*", next_stable_tag, suffix);
67+
let pre_release_tags =
68+
query_git_tags(&pre_release_pattern, next_tag_request.path.as_str())?;
6969

70-
if found_suffix_tag {
71-
// If the suffix is found, only increment the suffix
72-
// We split the tag at the last hyphen to separate the base from the number.
73-
let (base, number_str) = last_tag.rsplit_once('-').unwrap();
70+
if pre_release_tags.is_empty() {
71+
// No pre-releases for the next version, start with -0.
72+
Ok(format!("{}-{}-0", next_stable_tag, suffix))
73+
} else {
74+
// Increment the existing pre-release number.
75+
let last_pre_release_tag = pre_release_tags.last().unwrap();
76+
let (base, number_str) = last_pre_release_tag.rsplit_once('-').unwrap();
7477
let number = number_str.parse::<i32>().unwrap();
7578
Ok(format!("{}-{}", base, number + 1))
76-
} else {
77-
// increment the patch version, and add the suffix with 0
78-
let incremented_tag_result = increment_tag(last_tag);
79-
if incremented_tag_result.is_err() {
80-
return Err(incremented_tag_result.err().unwrap());
81-
}
82-
let incremented_tag = incremented_tag_result?;
83-
Ok(format!("{}-{}-0", incremented_tag, suffix))
8479
}
8580
}
8681
VersionType::PreReleaseCommit => {

src/tests/integration_test.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ fn verify_prerelease_rc_suffix_scenarios() -> Result<(), Box<dyn std::error::Err
111111
// Scenario 1: New base tag, should get .0-rc-0
112112
let mut cmd = Command::cargo_bin("git-next-tag")?;
113113
cmd.arg("--baseTag")
114-
.arg("v0.3") // v0.1.0, and various v0.2.*-rc-* exist, but no v0.3.*-rc-* exists
114+
.arg("v0.100") // v0.1.0, and various v0.2.*-rc-* exist, but no v0.3.*-rc-* exists
115115
.arg("--path")
116116
.arg(&project_root_dir)
117117
.arg("--preRelease")
@@ -121,7 +121,7 @@ fn verify_prerelease_rc_suffix_scenarios() -> Result<(), Box<dyn std::error::Err
121121

122122
cmd.assert()
123123
.success()
124-
.stdout(predicate::str::contains("v0.3.0-rc-0"));
124+
.stdout(predicate::str::contains("v0.100.0-rc-0"));
125125

126126
// Scenario 2: Existing base tag without rc, should get .z+1-rc-0
127127
let mut cmd = Command::cargo_bin("git-next-tag")?;
@@ -136,12 +136,12 @@ fn verify_prerelease_rc_suffix_scenarios() -> Result<(), Box<dyn std::error::Err
136136

137137
cmd.assert()
138138
.success()
139-
.stdout(predicate::str::contains("v0.1.1-rc-0"));
139+
.stdout(predicate::str::contains("v0.1.1-rc-1"));
140140

141141
// Scenario 3: Existing tag with rc, should increment rc number
142142
let mut cmd = Command::cargo_bin("git-next-tag")?;
143143
cmd.arg("--baseTag")
144-
.arg("v0.2") // v0.2.0-rc-0, v0.2.0-rc-1, v0.2.1-rc-0 exist
144+
.arg("v0.2") // v0.2.3, v0.2.3 v0.2.0-rc-0, v0.2.0-rc-1, v0.2.1-rc-0 exist
145145
.arg("--path")
146146
.arg(&project_root_dir)
147147
.arg("--preRelease")
@@ -151,7 +151,7 @@ fn verify_prerelease_rc_suffix_scenarios() -> Result<(), Box<dyn std::error::Err
151151

152152
cmd.assert()
153153
.success()
154-
.stdout(predicate::str::contains("v0.2.1-rc-1")); // Should increment only the rc number
154+
.stdout(predicate::str::contains("v0.2.5-rc-0")); // Should increment only the rc number
155155

156156
Ok(())
157157
}

0 commit comments

Comments
 (0)