@@ -26,18 +26,24 @@ package main
26
26
27
27
import (
28
28
"bytes"
29
+ "flag"
29
30
"fmt"
30
31
"os"
31
32
"os/exec"
33
+ "path/filepath"
32
34
"regexp"
33
35
"strings"
34
36
)
35
37
38
+ var flagN = flag .Bool ("n" , false , "print the underlying commands but do not run them" )
39
+
36
40
func main () {
37
- if len (os .Args ) != 2 {
38
- fatalf ("usage: %s [package|publish]" , os .Args [0 ])
41
+ flag .Parse ()
42
+ if flag .NArg () != 1 {
43
+ usage ()
44
+ os .Exit (1 )
39
45
}
40
- cmd := os . Args [ 1 ]
46
+ cmd := flag . Arg ( 0 )
41
47
42
48
checkWD ()
43
49
requireTools ("jq" , "npx" , "gh" , "git" )
@@ -48,15 +54,22 @@ func main() {
48
54
49
55
switch cmd {
50
56
case "package" :
51
- buildPackage (version , vsix )
57
+ buildPackage (version , tagName , vsix )
52
58
case "publish" :
53
59
requireEnvVars ("VSCE_PAT" , "GITHUB_TOKEN" )
54
60
publish (tagName , vsix , isRC )
55
61
default :
56
- fatalf ("usage: %s [package|publish]" , os .Args [0 ])
62
+ usage ()
63
+ os .Exit (1 )
57
64
}
58
65
}
59
66
67
+ func usage () {
68
+ fmt .Fprintf (os .Stderr , "Usage: %s <flags> [package|publish]\n \n " , os .Args [0 ])
69
+ fmt .Fprintln (os .Stderr , "Flags:" )
70
+ flag .PrintDefaults ()
71
+ }
72
+
60
73
func fatalf (format string , args ... any ) {
61
74
fmt .Fprintf (os .Stderr , format , args ... )
62
75
fmt .Fprintf (os .Stderr , "\n " )
@@ -119,44 +132,73 @@ func releaseVersionInfo() (tagName, version string, isPrerelease bool) {
119
132
120
133
cmd := exec .Command ("jq" , "-r" , ".version" , "package.json" )
121
134
cmd .Stderr = os .Stderr
122
- versionInPackageJSON , err := cmd .Output ()
123
- if err != nil {
135
+ var buf bytes.Buffer
136
+ cmd .Stdout = & buf
137
+ if err := commandRun (cmd ); err != nil {
124
138
fatalf ("failed to read package.json version" )
125
139
}
140
+ versionInPackageJSON := buf .Bytes ()
141
+ if * flagN {
142
+ return tagName , mmp + label , isPrerelease
143
+ }
126
144
if got := string (bytes .TrimSpace (versionInPackageJSON )); got != mmp {
127
145
fatalf ("package.json version %q does not match TAG_NAME %q" , got , tagName )
128
146
}
129
-
130
147
return tagName , mmp + label , isPrerelease
131
148
}
132
149
150
+ func commandRun (cmd * exec.Cmd ) error {
151
+ if * flagN {
152
+ if cmd .Dir != "" {
153
+ fmt .Fprintf (os .Stderr , "cd %v\n " , cmd .Dir )
154
+ }
155
+ fmt .Fprintf (os .Stderr , "%v\n " , strings .Join (cmd .Args , " " ))
156
+ return nil
157
+ }
158
+ return cmd .Run ()
159
+ }
160
+
161
+ func copy (dst , src string ) error {
162
+ if * flagN {
163
+ fmt .Fprintf (os .Stderr , "cp %s %s\n " , src , dst )
164
+ return nil
165
+ }
166
+ data , err := os .ReadFile (src )
167
+ if err != nil {
168
+ return err
169
+ }
170
+ return os .WriteFile (dst , data , 0644 )
171
+ }
172
+
133
173
// buildPackage builds the extension of the given version, using npx vsce package.
134
- func buildPackage (version , output string ) {
174
+ func buildPackage (version , tagName , output string ) {
175
+ if err := copy ("README.md" , filepath .Join (".." , "README.md" )); err != nil {
176
+ fatalf ("failed to copy README.md: %v" , err )
177
+ }
178
+ // build the package.
135
179
cmd := exec .Command ("npx" , "vsce" , "package" ,
136
180
"-o" , output ,
137
- "--baseContentUrl" , "https://github.com/golang/vscode-go" ,
138
- "--baseImagesUrl" , "https://github.com/golang/vscode-go" ,
181
+ "--baseContentUrl" , "https://github.com/golang/vscode-go/raw/" + tagName ,
182
+ "--baseImagesUrl" , "https://github.com/golang/vscode-go/raw/" + tagName ,
139
183
"--no-update-package-json" ,
140
184
"--no-git-tag-version" ,
141
185
version )
142
186
143
187
cmd .Stderr = os .Stderr
144
- if err := cmd .Run (); err != nil {
145
- fatalf ("failed to build package" )
146
- }
147
-
148
- cmd = exec .Command ("git" , "add" , output )
149
- cmd .Stderr = os .Stderr
150
- if err := cmd .Run (); err != nil {
151
- fatalf ("failed to build package" )
188
+ if err := commandRun (cmd ); err != nil {
189
+ fatalf ("failed to build package: %v" , err )
152
190
}
153
191
}
154
192
155
193
// publish publishes the extension to the VS Code Marketplace and GitHub, using npx vsce and gh release create.
156
194
func publish (tagName , packageFile string , isPrerelease bool ) {
157
195
// check if the package file exists.
158
- if _ , err := os .Stat (packageFile ); os .IsNotExist (err ) {
159
- fatalf ("package file %q does not exist. Did you run 'go run build/release.go package'?" , packageFile )
196
+ if * flagN {
197
+ fmt .Fprintf (os .Stderr , "stat %s\n " , packageFile )
198
+ } else {
199
+ if _ , err := os .Stat (packageFile ); os .IsNotExist (err ) {
200
+ fatalf ("package file %q does not exist. Did you run 'go run build/release.go package'?" , packageFile )
201
+ }
160
202
}
161
203
162
204
// publish release to GitHub. This will create a draft release - manually publish it after reviewing the draft.
@@ -170,23 +212,20 @@ func publish(tagName, packageFile string, isPrerelease bool) {
170
212
ghArgs = append (ghArgs , tagName , packageFile )
171
213
cmd := exec .Command ("gh" , ghArgs ... )
172
214
cmd .Stderr = os .Stderr
173
- if err := cmd . Run ( ); err != nil {
174
- fatalf ("failed to publish release" )
215
+ if err := commandRun ( cmd ); err != nil {
216
+ fatalf ("failed to publish release: %v" , err )
175
217
}
176
218
177
219
if isPrerelease {
178
220
return // TODO: release with the -pre-release flag if isPrerelease is set.
179
221
}
180
222
181
- /* TODO(hyangah): uncomment this to finalize the release workflow migration.
182
223
npxVsceArgs := []string {"vsce" , "publish" , "-i" , packageFile }
183
-
184
224
cmd2 := exec .Command ("npx" , npxVsceArgs ... )
185
225
cmd2 .Stderr = os .Stderr
186
- if err := cmd2.Run( ); err != nil {
226
+ if err := commandRun ( cmd2 ); err != nil {
187
227
fatalf ("failed to publish release" )
188
228
}
189
- */
190
229
}
191
230
192
231
// commitSHA returns COMMIT_SHA environment variable, or the commit SHA of the current branch.
0 commit comments