@@ -48,39 +48,34 @@ pub fn determine_nex_tag(
4848 }
4949 VersionType :: PreRelease => {
5050 let suffix = next_tag_request. suffix . unwrap ( ) ;
51- let completed_base_tag = format ! ( "{}.*-{}-*" , next_tag_request. base_tag, suffix) ;
52- let mut tags = query_git_tags ( & completed_base_tag, next_tag_request. path . as_str ( ) )
53- . expect ( "Could not list git tags" ) ;
54- let mut found_suffix_tag = false ;
55- // if no tags are found for base tag + suffix, find the latest tag for base tag
56- if tags. is_empty ( ) {
57- let completed_base_tag = format ! ( "{}.*" , next_tag_request. base_tag) ;
58- tags = query_git_tags ( & completed_base_tag, next_tag_request. path . as_str ( ) )
59- . expect ( "Could not list git tags" ) ;
60- if tags. is_empty ( ) {
61- debug ! ( "Could not find tags, returning .0" ) ;
62- return Ok ( format ! ( "{}.0-{}-0" , next_tag_request. base_tag, suffix) ) ;
63- }
51+
52+ // 1. Find the latest stable tag for the base.
53+ let stable_tags_pattern = format ! ( "{}.*" , next_tag_request. base_tag) ;
54+ let stable_tags = query_git_tags ( & stable_tags_pattern, next_tag_request. path . as_str ( ) ) ?
55+ . into_iter ( )
56+ . filter ( |t| !t. contains ( '-' ) )
57+ . collect :: < Vec < String > > ( ) ;
58+
59+ let next_stable_tag = if stable_tags. is_empty ( ) {
60+ format ! ( "{}.0" , next_tag_request. base_tag)
6461 } else {
65- found_suffix_tag = true ;
66- }
62+ increment_tag ( stable_tags . last ( ) . unwrap ( ) ) ?
63+ } ;
6764
68- let last_tag = tags. last ( ) . unwrap ( ) ;
65+ // 2. Find pre-release tags for the *next* stable version.
66+ let pre_release_pattern = format ! ( "{}-{}-*" , next_stable_tag, suffix) ;
67+ let pre_release_tags =
68+ query_git_tags ( & pre_release_pattern, next_tag_request. path . as_str ( ) ) ?;
6969
70- if found_suffix_tag {
71- // If the suffix is found, only increment the suffix
72- // We split the tag at the last hyphen to separate the base from the number.
73- let ( base, number_str) = last_tag. rsplit_once ( '-' ) . unwrap ( ) ;
70+ if pre_release_tags. is_empty ( ) {
71+ // No pre-releases for the next version, start with -0.
72+ Ok ( format ! ( "{}-{}-0" , next_stable_tag, suffix) )
73+ } else {
74+ // Increment the existing pre-release number.
75+ let last_pre_release_tag = pre_release_tags. last ( ) . unwrap ( ) ;
76+ let ( base, number_str) = last_pre_release_tag. rsplit_once ( '-' ) . unwrap ( ) ;
7477 let number = number_str. parse :: < i32 > ( ) . unwrap ( ) ;
7578 Ok ( format ! ( "{}-{}" , base, number + 1 ) )
76- } else {
77- // increment the patch version, and add the suffix with 0
78- let incremented_tag_result = increment_tag ( last_tag) ;
79- if incremented_tag_result. is_err ( ) {
80- return Err ( incremented_tag_result. err ( ) . unwrap ( ) ) ;
81- }
82- let incremented_tag = incremented_tag_result?;
83- Ok ( format ! ( "{}-{}-0" , incremented_tag, suffix) )
8479 }
8580 }
8681 VersionType :: PreReleaseCommit => {
0 commit comments