Skip to content

Commit c105b7e

Browse files
feat: support prerelease inc operations (but only on int prerelease values)
1 parent 4a08ee8 commit c105b7e

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
@@ -67,10 +67,29 @@ std::expected<std::string, parse_error> inc(version input,
6767
break;
6868
}
6969
case PATCH:
70-
case PRE_PATCH: {
71-
if (input.pre_release && release_type != PRE_PATCH) {
70+
case PRE_PATCH:
71+
case PRE_RELEASE: {
72+
if (input.pre_release.has_value() && release_type == PATCH) {
7273
return version_weaver::version{input.major, input.minor, input.patch};
7374
}
75+
if (release_type == PRE_RELEASE && input.pre_release.has_value()) {
76+
// TODO: support non-int pre_releases as well
77+
// (see:
78+
// https://github.com/npm/node-semver/blob/d17aebf8/test/fixtures/increments.js#L22-L36)
79+
auto pre_release_value = input.pre_release.value();
80+
int prerelease_int;
81+
auto [ptr, ec] =
82+
std::from_chars(pre_release_value.data(),
83+
pre_release_value.data() + pre_release_value.size(),
84+
prerelease_int);
85+
if (ec != std::errc()) {
86+
return std::unexpected(parse_error::INVALID_PRERELEASE);
87+
}
88+
auto incremented_prerelease_int = prerelease_int + 1;
89+
return version_weaver::version{
90+
input.major, input.minor, input.patch,
91+
std::to_string(incremented_prerelease_int)};
92+
}
7493
int patch_int;
7594
auto [ptr, ec] =
7695
std::from_chars(input.patch.data(),
@@ -94,7 +113,7 @@ std::expected<std::string, parse_error> inc(version input,
94113
}
95114

96115
if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
97-
release_type == PRE_PATCH) {
116+
release_type == PRE_PATCH || release_type == PRE_RELEASE) {
98117
result.pre_release = "0";
99118
}
100119

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)