@@ -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
0 commit comments