@@ -6,43 +6,58 @@ import { fileURLToPath } from "url"
66
77console . log ( "=== publishing ===\n" )
88
9+ const tag = `v${ Script . version } `
10+
911const pkgjsons = await Array . fromAsync (
1012 new Bun . Glob ( "**/package.json" ) . scan ( {
1113 absolute : true ,
1214 } ) ,
1315) . then ( ( arr ) => arr . filter ( ( x ) => ! x . includes ( "node_modules" ) && ! x . includes ( "dist" ) ) )
1416
15- for ( const file of pkgjsons ) {
16- let pkg = await Bun . file ( file ) . text ( )
17- pkg = pkg . replaceAll ( / " v e r s i o n " : " [ ^ " ] + " / g, `"version": "${ Script . version } "` )
18- console . log ( "updated:" , file )
19- await Bun . file ( file ) . write ( pkg )
20- }
21-
2217const extensionToml = fileURLToPath ( new URL ( "../packages/extensions/zed/extension.toml" , import . meta. url ) )
23- let toml = await Bun . file ( extensionToml ) . text ( )
24- toml = toml . replace ( / ^ v e r s i o n = " [ ^ " ] + " / m, `version = "${ Script . version } "` )
25- toml = toml . replaceAll ( / r e l e a s e s \/ d o w n l o a d \/ v [ ^ / ] + \/ / g, `releases/download/v${ Script . version } /` )
26- console . log ( "updated:" , extensionToml )
27- await Bun . file ( extensionToml ) . write ( toml )
2818
29- await $ `bun install`
30- await import ( `../packages/sdk/js/script/build.ts` )
19+ async function hasChanges ( ) {
20+ return ( await $ `git diff --quiet && git diff --cached --quiet` . nothrow ( ) ) . exitCode !== 0
21+ }
3122
32- if ( Script . release ) {
33- if ( ! Script . preview ) {
34- await $ `git commit -am "release: v${ Script . version } "`
35- await $ `git tag v${ Script . version } `
36- await $ `git fetch origin`
37- await $ `git cherry-pick HEAD..origin/dev` . nothrow ( )
38- await $ `git push origin HEAD --tags --no-verify --force-with-lease`
39- await new Promise ( ( resolve ) => setTimeout ( resolve , 5_000 ) )
23+ async function releaseTagExists ( ) {
24+ return ( await $ `git rev-parse -q --verify refs/tags/${ tag } ` . nothrow ( ) ) . exitCode === 0
25+ }
26+
27+ async function prepareReleaseFiles ( ) {
28+ for ( const file of pkgjsons ) {
29+ let pkg = await Bun . file ( file ) . text ( )
30+ pkg = pkg . replaceAll ( / " v e r s i o n " : " [ ^ " ] + " / g, `"version": "${ Script . version } "` )
31+ console . log ( "updated:" , file )
32+ await Bun . file ( file ) . write ( pkg )
4033 }
4134
42- await import ( `../packages/desktop/scripts/finalize-latest-json.ts` )
43- await import ( `../packages/desktop-electron/scripts/finalize-latest-yml.ts` )
35+ let toml = await Bun . file ( extensionToml ) . text ( )
36+ toml = toml . replace ( / ^ v e r s i o n = " [ ^ " ] + " / m, `version = "${ Script . version } "` )
37+ toml = toml . replaceAll ( / r e l e a s e s \/ d o w n l o a d \/ v [ ^ / ] + \/ / g, `releases/download/v${ Script . version } /` )
38+ console . log ( "updated:" , extensionToml )
39+ await Bun . file ( extensionToml ) . write ( toml )
40+
41+ await $ `bun install`
42+ await $ `./packages/sdk/js/script/build.ts`
43+ }
44+
45+ if ( Script . release && ! Script . preview ) {
46+ await $ `git fetch origin --tags`
47+ await $ `git switch --detach`
48+ }
4449
45- await $ `gh release edit v${ Script . version } --draft=false --repo ${ process . env . GH_REPO } `
50+ await prepareReleaseFiles ( )
51+
52+ if ( Script . release && ! Script . preview ) {
53+ if ( await releaseTagExists ( ) ) {
54+ console . log ( `release tag ${ tag } already exists, skipping tag creation` )
55+ } else {
56+ await $ `git commit -am "release: ${ tag } "`
57+ await $ `git tag ${ tag } `
58+ await $ `git push origin refs/tags/${ tag } --no-verify`
59+ await new Promise ( ( resolve ) => setTimeout ( resolve , 5_000 ) )
60+ }
4661}
4762
4863console . log ( "\n=== cli ===\n" )
@@ -54,5 +69,26 @@ await import(`../packages/sdk/js/script/publish.ts`)
5469console . log ( "\n=== plugin ===\n" )
5570await import ( `../packages/plugin/script/publish.ts` )
5671
72+ if ( Script . release ) {
73+ await import ( `../packages/desktop/scripts/finalize-latest-json.ts` )
74+ await import ( `../packages/desktop-electron/scripts/finalize-latest-yml.ts` )
75+ }
76+
77+ if ( Script . release && ! Script . preview ) {
78+ await $ `git fetch origin`
79+ await $ `git checkout -B dev origin/dev`
80+ await prepareReleaseFiles ( )
81+ if ( await hasChanges ( ) ) {
82+ await $ `git commit -am "sync release versions for v${ Script . version } "`
83+ await $ `git push origin HEAD:dev --no-verify`
84+ } else {
85+ console . log ( `dev already synced for ${ tag } ` )
86+ }
87+ }
88+
89+ if ( Script . release ) {
90+ await $ `gh release edit ${ tag } --draft=false --repo ${ process . env . GH_REPO } `
91+ }
92+
5793const dir = fileURLToPath ( new URL ( ".." , import . meta. url ) )
5894process . chdir ( dir )
0 commit comments