Skip to content

Commit 304a0ef

Browse files
feat: support prerelease inc operations (but only on int prerelease values)
1 parent a4c39a0 commit 304a0ef

File tree

3 files changed

+30
-5
lines changed

3 files changed

+30
-5
lines changed

include/version_weaver.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ enum parse_error {
8181
INVALID_MAJOR,
8282
INVALID_MINOR,
8383
INVALID_PATCH,
84+
INVALID_PRERELEASE,
8485
INVALID_RELEASE_TYPE,
8586
};
8687

@@ -99,8 +100,7 @@ enum release_type {
99100
PRE_MINOR,
100101
PRE_PATCH,
101102
RELEASE,
102-
// TODO: also support
103-
// - PRE_RELEASE
103+
PRE_RELEASE,
104104
};
105105

106106
// Increment the version according to the provided release type.

src/version_weaver.cpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,29 @@ std::expected<std::string, parse_error> inc(version input,
6868
break;
6969
}
7070
case PATCH:
71-
case PRE_PATCH: {
72-
if (input.pre_release && release_type != PRE_PATCH) {
71+
case PRE_PATCH:
72+
case PRE_RELEASE: {
73+
if (input.pre_release.has_value() && release_type == PATCH) {
7374
return version_weaver::version{input.major, input.minor, input.patch};
7475
}
76+
if (release_type == PRE_RELEASE && input.pre_release.has_value()) {
77+
// TODO: support non-int pre_releases as well
78+
// (see:
79+
// https://github.com/npm/node-semver/blob/d17aebf8/test/fixtures/increments.js#L22-L36)
80+
auto pre_release_value = input.pre_release.value();
81+
int prerelease_int;
82+
auto [ptr, ec] =
83+
std::from_chars(pre_release_value.data(),
84+
pre_release_value.data() + pre_release_value.size(),
85+
prerelease_int);
86+
if (ec != std::errc()) {
87+
return std::unexpected(parse_error::INVALID_PRERELEASE);
88+
}
89+
auto incremented_prerelease_int = prerelease_int + 1;
90+
incremented = std::move(std::to_string(incremented_prerelease_int));
91+
return version_weaver::version{input.major, input.minor, input.patch,
92+
incremented};
93+
}
7594
int patch_int;
7695
auto [ptr, ec] =
7796
std::from_chars(input.patch.data(),
@@ -95,7 +114,7 @@ std::expected<std::string, parse_error> inc(version input,
95114
}
96115

97116
if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
98-
release_type == PRE_PATCH) {
117+
release_type == PRE_PATCH || release_type == PRE_RELEASE) {
99118
result.pre_release = "0";
100119
}
101120

tests/basictests.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,12 @@ std::vector<IncTestData> inc_values = {
256256
{version_weaver::version{"1", "2", "3"}, "1.2.3",
257257
version_weaver::release_type::RELEASE, "1.2.3",
258258
std::unexpected(version_weaver::parse_error::INVALID_INPUT)},
259+
{version_weaver::version{"1", "2", "4"}, "1.2.4",
260+
version_weaver::release_type::PRE_RELEASE, "1.2.5-0",
261+
version_weaver::version{"1", "2", "5", "0"}},
262+
{version_weaver::version{"1", "2", "3", "0"}, "1.2.3-0",
263+
version_weaver::release_type::PRE_RELEASE, "1.2.3-1",
264+
version_weaver::version{"1", "2", "3", "1"}},
259265
};
260266

261267
TEST(basictests, inc) {

0 commit comments

Comments
 (0)