@@ -108,7 +108,35 @@ function bumpStableBase(version: ParsedVersion, bump: ReleaseBump): ParsedVersio
108108 }
109109}
110110
111- function bumpVersion ( currentVersion : string , args : string [ ] ) : string {
111+ function sameStableBase ( left : ParsedVersion , right : ParsedVersion ) : boolean {
112+ return left . major === right . major && left . minor === right . minor && left . patch === right . patch ;
113+ }
114+
115+ async function getLatestPreviewNumber ( baseVersion : ParsedVersion ) : Promise < number > {
116+ const base = `${ baseVersion . major } .${ baseVersion . minor } .${ baseVersion . patch } ` ;
117+ const result = await $ `git tag --list ${ `v${ base } -preview.*` } ` . quiet ( ) . nothrow ( ) ;
118+
119+ if ( result . exitCode !== 0 ) {
120+ return 0 ;
121+ }
122+
123+ const tags = result . stdout
124+ . toString ( )
125+ . trim ( )
126+ . split ( "\n" )
127+ . filter ( ( line ) => line . length > 0 ) ;
128+
129+ return tags . reduce ( ( latest , tag ) => {
130+ const version = parseVersion ( tag . replace ( / ^ v / , "" ) ) ;
131+ if ( version . prerelease ?. channel !== "preview" || ! sameStableBase ( version , baseVersion ) ) {
132+ return latest ;
133+ }
134+
135+ return Math . max ( latest , version . prerelease . number ) ;
136+ } , 0 ) ;
137+ }
138+
139+ async function bumpVersion ( currentVersion : string , args : string [ ] ) : Promise < string > {
112140 const current = parseVersion ( currentVersion ) ;
113141 const [ channel = "stable" , bump = "patch" ] = args ;
114142
@@ -123,18 +151,19 @@ function bumpVersion(currentVersion: string, args: string[]): string {
123151 }
124152
125153 if ( channel === "preview" ) {
126- const shouldIncrementExisting =
154+ const currentPreviewNumber =
127155 current . prerelease ?. channel === "preview" &&
128156 bump === "patch" &&
129- current . major === baseVersion . major &&
130- current . minor === baseVersion . minor &&
131- current . patch === baseVersion . patch ;
157+ sameStableBase ( current , baseVersion )
158+ ? current . prerelease . number
159+ : 0 ;
160+ const latestPreviewNumber = await getLatestPreviewNumber ( baseVersion ) ;
132161
133162 return formatVersion ( {
134163 ...baseVersion ,
135164 prerelease : {
136165 channel : "preview" ,
137- number : shouldIncrementExisting ? current . prerelease . number + 1 : 1 ,
166+ number : Math . max ( currentPreviewNumber , latestPreviewNumber ) + 1 ,
138167 } ,
139168 } ) ;
140169 }
@@ -238,7 +267,7 @@ async function release() {
238267
239268 info ( `Current version: ${ currentVersion } ` ) ;
240269
241- const newVersion = bumpVersion ( currentVersion , releaseArgs ) ;
270+ const newVersion = await bumpVersion ( currentVersion , releaseArgs ) ;
242271 const parsedNewVersion = parseVersion ( newVersion ) ;
243272 info ( `New version: ${ newVersion } ` ) ;
244273
0 commit comments