Skip to content

Commit 478ae74

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

File tree

3 files changed

+37
-11
lines changed

3 files changed

+37
-11
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: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ std::string minimum(std::string_view range) { return ""; }
3737
std::expected<std::string, parse_error> inc(version input,
3838
release_type release_type) {
3939
version_weaver::version result;
40+
std::string incremented;
4041
switch (release_type) {
4142
case MAJOR:
4243
case PRE_MAJOR: {
@@ -48,8 +49,8 @@ std::expected<std::string, parse_error> inc(version input,
4849
return std::unexpected(parse_error::INVALID_MAJOR);
4950
}
5051
auto incremented_major_int = major_int + 1;
51-
auto major = std::to_string(incremented_major_int);
52-
result = version_weaver::version{major, "0", "0"};
52+
incremented = std::to_string(incremented_major_int);
53+
result = version_weaver::version{incremented, "0", "0"};
5354
break;
5455
}
5556
case MINOR:
@@ -62,15 +63,34 @@ std::expected<std::string, parse_error> inc(version input,
6263
return std::unexpected(parse_error::INVALID_MINOR);
6364
}
6465
auto incremented_minor_int = minor_int + 1;
65-
result = version_weaver::version{
66-
input.major, std::to_string(incremented_minor_int), "0"};
66+
incremented = std::to_string(incremented_minor_int);
67+
result = version_weaver::version{input.major, incremented, "0"};
6768
break;
6869
}
6970
case PATCH:
70-
case PRE_PATCH: {
71-
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) {
7274
return version_weaver::version{input.major, input.minor, input.patch};
7375
}
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::to_string(incremented_prerelease_int);
91+
return version_weaver::version{input.major, input.minor, input.patch,
92+
incremented};
93+
}
7494
int patch_int;
7595
auto [ptr, ec] =
7696
std::from_chars(input.patch.data(),
@@ -79,8 +99,8 @@ std::expected<std::string, parse_error> inc(version input,
7999
return std::unexpected(parse_error::INVALID_PATCH);
80100
}
81101
auto incremented_patch_int = patch_int + 1;
82-
result = version_weaver::version{input.major, input.minor,
83-
std::to_string(incremented_patch_int)};
102+
incremented = std::to_string(incremented_patch_int);
103+
result = version_weaver::version{input.major, input.minor, incremented};
84104
break;
85105
}
86106
case RELEASE: {
@@ -94,7 +114,7 @@ std::expected<std::string, parse_error> inc(version input,
94114
}
95115

96116
if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
97-
release_type == PRE_PATCH) {
117+
release_type == PRE_PATCH || release_type == PRE_RELEASE) {
98118
result.pre_release = "0";
99119
}
100120

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)