@@ -68,10 +68,29 @@ std::expected<std::string, parse_error> inc(version input,
6868 break ;
6969 }
7070 case PATCH:
71- case PRE_PATCH: {
72- 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) {
7374 return version_weaver::version{input.major , input.minor , input.patch };
7475 }
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::move (std::to_string (incremented_prerelease_int));
91+ return version_weaver::version{input.major , input.minor , input.patch ,
92+ incremented};
93+ }
7594 int patch_int;
7695 auto [ptr, ec] =
7796 std::from_chars (input.patch .data (),
@@ -95,7 +114,7 @@ std::expected<std::string, parse_error> inc(version input,
95114 }
96115
97116 if (release_type == PRE_MAJOR || release_type == PRE_MINOR ||
98- release_type == PRE_PATCH) {
117+ release_type == PRE_PATCH || release_type == PRE_RELEASE ) {
99118 result.pre_release = " 0" ;
100119 }
101120
0 commit comments