@@ -37,6 +37,7 @@ std::string minimum(std::string_view range) { return ""; }
37
37
std::expected<std::string, parse_error> inc (version input,
38
38
release_type release_type) {
39
39
version_weaver::version result;
40
+ std::string incremented;
40
41
switch (release_type) {
41
42
case MAJOR:
42
43
case PRE_MAJOR: {
@@ -48,8 +49,8 @@ std::expected<std::string, parse_error> inc(version input,
48
49
return std::unexpected (parse_error::INVALID_MAJOR);
49
50
}
50
51
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" };
53
54
break ;
54
55
}
55
56
case MINOR:
@@ -62,15 +63,34 @@ std::expected<std::string, parse_error> inc(version input,
62
63
return std::unexpected (parse_error::INVALID_MINOR);
63
64
}
64
65
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" };
67
68
break ;
68
69
}
69
70
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) {
72
74
return version_weaver::version{input.major , input.minor , input.patch };
73
75
}
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
+ }
74
94
int patch_int;
75
95
auto [ptr, ec] =
76
96
std::from_chars (input.patch .data (),
@@ -79,8 +99,8 @@ std::expected<std::string, parse_error> inc(version input,
79
99
return std::unexpected (parse_error::INVALID_PATCH);
80
100
}
81
101
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 };
84
104
break ;
85
105
}
86
106
case RELEASE: {
@@ -94,7 +114,7 @@ std::expected<std::string, parse_error> inc(version input,
94
114
}
95
115
96
116
if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
97
- release_type == PRE_PATCH) {
117
+ release_type == PRE_PATCH || release_type == PRE_RELEASE ) {
98
118
result.pre_release = " 0" ;
99
119
}
100
120
0 commit comments