@@ -67,10 +67,29 @@ std::expected<std::string, parse_error> inc(version input,
67
67
break ;
68
68
}
69
69
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) {
72
73
return version_weaver::version{input.major , input.minor , input.patch };
73
74
}
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
+ }
74
93
int patch_int;
75
94
auto [ptr, ec] =
76
95
std::from_chars (input.patch .data (),
@@ -94,7 +113,7 @@ std::expected<std::string, parse_error> inc(version input,
94
113
}
95
114
96
115
if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
97
- release_type == PRE_PATCH) {
116
+ release_type == PRE_PATCH || release_type == PRE_RELEASE ) {
98
117
result.pre_release = " 0" ;
99
118
}
100
119
0 commit comments