@@ -150,6 +150,31 @@ const resolveGitCommitHash = Effect.fn("resolveGitCommitHash")(function* (repoRo
150150 return hash . toLowerCase ( ) ;
151151} ) ;
152152
153+ const resolveGitHeadTags = Effect . fn ( "resolveGitHeadTags" ) ( function * ( repoRoot : string ) {
154+ const result = yield * spawnAndCollectOutput (
155+ ChildProcess . make ( "git" , [ "tag" , "--points-at" , "HEAD" ] , {
156+ cwd : repoRoot ,
157+ } ) ,
158+ ) . pipe (
159+ Effect . catch ( ( ) =>
160+ Effect . succeed ( {
161+ stdout : "" ,
162+ stderr : "" ,
163+ exitCode : 1 ,
164+ } ) ,
165+ ) ,
166+ ) ;
167+
168+ if ( result . exitCode !== 0 ) {
169+ return [ ] ;
170+ }
171+
172+ return result . stdout
173+ . split ( / \r ? \n / )
174+ . map ( ( tag ) => tag . trim ( ) )
175+ . filter ( ( tag ) => tag . length > 0 ) ;
176+ } ) ;
177+
153178const resolvePythonForNodeGyp = Effect . fn ( "resolvePythonForNodeGyp" ) ( function * ( ) {
154179 const fs = yield * FileSystem . FileSystem ;
155180 const path = yield * Path . Path ;
@@ -532,6 +557,26 @@ export function resolveDesktopUpdateChannel(version: string): "latest" | "nightl
532557 return / - nightly \.\d{ 8 } \.\d+ $ / . test ( version ) ? "nightly" : "latest" ;
533558}
534559
560+ const ExactSemverTagPattern =
561+ / ^ v ? ( 0 | [ 1 - 9 ] \d * ) \. ( 0 | [ 1 - 9 ] \d * ) \. ( 0 | [ 1 - 9 ] \d * ) (?: - [ 0 - 9 A - Z a - z - ] + (?: \. [ 0 - 9 A - Z a - z - ] + ) * ) ? (?: \+ [ 0 - 9 A - Z a - z - ] + (?: \. [ 0 - 9 A - Z a - z - ] + ) * ) ? $ / ;
562+
563+ export function resolveDesktopArtifactVersion (
564+ explicitVersion : string | undefined ,
565+ headTags : ReadonlyArray < string > ,
566+ fallbackVersion : string ,
567+ ) : string {
568+ if ( explicitVersion ) {
569+ return explicitVersion ;
570+ }
571+
572+ const headSemverVersions = headTags
573+ . filter ( ( tag ) => ExactSemverTagPattern . test ( tag ) )
574+ . map ( ( tag ) => tag . replace ( / ^ v / , "" ) )
575+ . toSorted ( ( a , b ) => a . localeCompare ( b , "en" ) ) ;
576+
577+ return headSemverVersions . at ( - 1 ) ?? fallbackVersion ;
578+ }
579+
535580export function resolveDesktopBuildIconAssets ( version : string ) : DesktopBuildIconAssets {
536581 if ( resolveDesktopUpdateChannel ( version ) === "nightly" ) {
537582 return {
@@ -710,7 +755,11 @@ const buildDesktopArtifact = Effect.fn("buildDesktopArtifact")(function* (
710755 } ) ,
711756 } ) ;
712757
713- const appVersion = options . version ?? serverPackageJson . version ;
758+ const appVersion = resolveDesktopArtifactVersion (
759+ options . version ,
760+ yield * resolveGitHeadTags ( repoRoot ) ,
761+ serverPackageJson . version ,
762+ ) ;
714763 const iconAssets = resolveDesktopBuildIconAssets ( appVersion ) ;
715764 const commitHash = yield * resolveGitCommitHash ( repoRoot ) ;
716765 const mkdir = options . keepStage ? fs . makeTempDirectory : fs . makeTempDirectoryScoped ;
0 commit comments