Skip to content

Commit 775f4a5

Browse files
feat: support premajor, preminor and prepatch inc operations
1 parent ca0d871 commit 775f4a5

File tree

3 files changed

+44
-15
lines changed

3 files changed

+44
-15
lines changed

include/version_weaver.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,12 @@ enum release_type {
9595
MAJOR,
9696
MINOR,
9797
PATCH,
98+
PRE_MAJOR,
99+
PRE_MINOR,
100+
PRE_PATCH,
98101
// TODO: also support
99-
// - PRE_MAJOR
100-
// - PRE_MINOR
101-
// - PRE_PATCH
102-
// - PRE_RELEASE
103102
// - RELEASE
103+
// - PRE_RELEASE
104104
};
105105

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

src/version_weaver.cpp

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,11 @@ std::string minimum(std::string_view range) { return ""; }
3636

3737
std::expected<std::string, parse_error> inc(version input,
3838
release_type release_type) {
39+
version_weaver::version result;
40+
std::string incremented;
3941
switch (release_type) {
40-
case MAJOR: {
42+
case MAJOR:
43+
case PRE_MAJOR: {
4144
int major_int;
4245
auto [ptr, ec] =
4346
std::from_chars(input.major.data(),
@@ -46,11 +49,12 @@ std::expected<std::string, parse_error> inc(version input,
4649
return std::unexpected(parse_error::INVALID_MAJOR);
4750
}
4851
auto incremented_major_int = major_int + 1;
49-
auto major = std::to_string(incremented_major_int);
50-
auto new_version = version_weaver::version{major, "0", "0"};
51-
return new_version;
52+
incremented = std::move(std::to_string(incremented_major_int));
53+
result = version_weaver::version{incremented, "0", "0"};
54+
break;
5255
}
53-
case MINOR: {
56+
case MINOR:
57+
case PRE_MINOR: {
5458
int minor_int;
5559
auto [ptr, ec] =
5660
std::from_chars(input.minor.data(),
@@ -59,11 +63,13 @@ std::expected<std::string, parse_error> inc(version input,
5963
return std::unexpected(parse_error::INVALID_MINOR);
6064
}
6165
auto incremented_minor_int = minor_int + 1;
62-
return version_weaver::version{
63-
input.major, std::to_string(incremented_minor_int), "0"};
66+
incremented = std::move(std::to_string(incremented_minor_int));
67+
result = version_weaver::version{input.major, incremented, "0"};
68+
break;
6469
}
65-
case PATCH: {
66-
if (input.pre_release) {
70+
case PATCH:
71+
case PRE_PATCH: {
72+
if (input.pre_release && release_type != PRE_PATCH) {
6773
return version_weaver::version{input.major, input.minor, input.patch};
6874
}
6975
int patch_int;
@@ -74,12 +80,20 @@ std::expected<std::string, parse_error> inc(version input,
7480
return std::unexpected(parse_error::INVALID_PATCH);
7581
}
7682
auto incremented_patch_int = patch_int + 1;
77-
return version_weaver::version{input.major, input.minor,
78-
std::to_string(incremented_patch_int)};
83+
incremented = std::move(std::to_string(incremented_patch_int));
84+
result = version_weaver::version{input.major, input.minor, incremented};
85+
break;
7986
}
8087
default:
8188
return std::unexpected(parse_error::INVALID_RELEASE_TYPE);
8289
}
90+
91+
if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
92+
release_type == PRE_PATCH) {
93+
result.pre_release = "0";
94+
}
95+
96+
return result;
8397
}
8498

8599
constexpr inline void trim_whitespace(std::string_view* input) noexcept {

tests/basictests.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,21 @@ std::vector<IncTestData> inc_values = {
229229
{version_weaver::version{"1", "2", "3", "alpha.0.beta"},
230230
"1.2.3-alpha.0.beta", version_weaver::release_type::PATCH, "1.2.3",
231231
version_weaver::version{"1", "2", "3"}},
232+
{version_weaver::version{"1", "2", "0"}, "1.2.0",
233+
version_weaver::release_type::PRE_MAJOR, "2.0.0-0",
234+
version_weaver::version{"2", "0", "0", "0"}},
235+
{version_weaver::version{"1", "2", "0"}, "1.2.0",
236+
version_weaver::release_type::PRE_MINOR, "1.3.0-0",
237+
version_weaver::version{"1", "3", "0", "0"}},
238+
{version_weaver::version{"1", "2", "3", "1"}, "1.2.3-1",
239+
version_weaver::release_type::PRE_MINOR, "1.3.0-0",
240+
version_weaver::version{"1", "3", "0", "0"}},
241+
{version_weaver::version{"1", "2", "0"}, "1.2.0",
242+
version_weaver::release_type::PRE_PATCH, "1.2.1-0",
243+
version_weaver::version{"1", "2", "1", "0"}},
244+
{version_weaver::version{"1", "2", "0", "1"}, "1.2.0-1",
245+
version_weaver::release_type::PRE_PATCH, "1.2.1-0",
246+
version_weaver::version{"1", "2", "1", "0"}},
232247
};
233248

234249
TEST(basictests, inc) {

0 commit comments

Comments
 (0)