Skip to content

Commit bd87b3a

Browse files
committed
extension/tools/release: uncomment vsce package and fix README handling
This CL also adds a trivial test that checks -n output to see if the release command calls expected commands. And fix nightly release's README handling again. I hoped the new --readme-path flag can help us package README.md file in the repo root https://go-review.git.corp.google.com/c/vscode-go/+/556535 but it doesn't seem to work yet. Instead, we copy the README.md file to the extension directory. Also, fixes the image and content base uris. Update #3122 Change-Id: I6c79d34653346ef2e2b596f0ca4db1de16b79853 Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/556536 Commit-Queue: Hyang-Ah Hana Kim <[email protected]> Reviewed-by: Robert Findley <[email protected]> TryBot-Result: kokoro <[email protected]>
1 parent 15be937 commit bd87b3a

File tree

7 files changed

+139
-30
lines changed

7 files changed

+139
-30
lines changed

build/all.bash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ prepare_nightly() {
9696
') > /tmp/package.json && cp /tmp/package.json extension/package.json
9797

9898
# Replace CHANGELOG.md with CHANGELOG.md + Release commit info.
99-
printf "**Release ${VER} @ ${COMMIT}** \n\n" | cat - CHANGELOG.md > /tmp/CHANGELOG.md.new && mv /tmp/CHANGELOG.md.new extension/CHANGELOG.md
99+
printf "**Release ${VER} @ ${COMMIT}** \n\n" | cat - extension/CHANGELOG.md > /tmp/CHANGELOG.md.new && mv /tmp/CHANGELOG.md.new extension/CHANGELOG.md
100100
# Replace the heading of README.md with the heading for Go Nightly.
101101
sed '/^# Go for Visual Studio Code$/d' README.md | cat build/nightly/README.md - > /tmp/README.md.new && mv /tmp/README.md.new README.md
102102
# Replace src/const.ts with build/nightly/const.ts.

build/release-nightly.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ artifacts:
7777
objects:
7878
location: 'gs://$PROJECT_ID/nightly'
7979
paths:
80-
- vscode-go/*.vsix
80+
- vscode-go/extension/*.vsix
8181
availableSecrets:
8282
secretManager:
8383
- versionName: projects/$PROJECT_ID/secrets/$_VSCE_TOKEN/versions/latest

extension/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
],
3838
"scripts": {
3939
"clean": "rm -rf ./dist/* && rm -rf ./out/* && rm -rf ./bin/* && rm *.vsix",
40-
"package": "npx vsce package --readme-path ../README.md",
40+
"package": "cp ../README.md ./README.md && npx vsce package --baseContentUrl https://github.com/golang/vscode-go/raw/HEAD --baseImagesUrl https://github.com/golang/vscode-go/raw/HEAD",
4141
"vscode:prepublish": "npm run compile",
4242
"bundle": "esbuild src/goMain.ts debugAdapter=src/debugAdapter/goDebug.ts --bundle --outdir=dist --external:vscode --format=cjs --platform=node",
4343
"bundle-dev": "npm run bundle -- --sourcemap",

extension/tools/release/release.go

Lines changed: 66 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,24 @@ package main
2626

2727
import (
2828
"bytes"
29+
"flag"
2930
"fmt"
3031
"os"
3132
"os/exec"
33+
"path/filepath"
3234
"regexp"
3335
"strings"
3436
)
3537

38+
var flagN = flag.Bool("n", false, "print the underlying commands but do not run them")
39+
3640
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)
3945
}
40-
cmd := os.Args[1]
46+
cmd := flag.Arg(0)
4147

4248
checkWD()
4349
requireTools("jq", "npx", "gh", "git")
@@ -48,15 +54,22 @@ func main() {
4854

4955
switch cmd {
5056
case "package":
51-
buildPackage(version, vsix)
57+
buildPackage(version, tagName, vsix)
5258
case "publish":
5359
requireEnvVars("VSCE_PAT", "GITHUB_TOKEN")
5460
publish(tagName, vsix, isRC)
5561
default:
56-
fatalf("usage: %s [package|publish]", os.Args[0])
62+
usage()
63+
os.Exit(1)
5764
}
5865
}
5966

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+
6073
func fatalf(format string, args ...any) {
6174
fmt.Fprintf(os.Stderr, format, args...)
6275
fmt.Fprintf(os.Stderr, "\n")
@@ -119,44 +132,73 @@ func releaseVersionInfo() (tagName, version string, isPrerelease bool) {
119132

120133
cmd := exec.Command("jq", "-r", ".version", "package.json")
121134
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 {
124138
fatalf("failed to read package.json version")
125139
}
140+
versionInPackageJSON := buf.Bytes()
141+
if *flagN {
142+
return tagName, mmp + label, isPrerelease
143+
}
126144
if got := string(bytes.TrimSpace(versionInPackageJSON)); got != mmp {
127145
fatalf("package.json version %q does not match TAG_NAME %q", got, tagName)
128146
}
129-
130147
return tagName, mmp + label, isPrerelease
131148
}
132149

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+
133173
// 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.
135179
cmd := exec.Command("npx", "vsce", "package",
136180
"-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,
139183
"--no-update-package-json",
140184
"--no-git-tag-version",
141185
version)
142186

143187
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)
152190
}
153191
}
154192

155193
// publish publishes the extension to the VS Code Marketplace and GitHub, using npx vsce and gh release create.
156194
func publish(tagName, packageFile string, isPrerelease bool) {
157195
// 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+
}
160202
}
161203

162204
// 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) {
170212
ghArgs = append(ghArgs, tagName, packageFile)
171213
cmd := exec.Command("gh", ghArgs...)
172214
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)
175217
}
176218

177219
if isPrerelease {
178220
return // TODO: release with the -pre-release flag if isPrerelease is set.
179221
}
180222

181-
/* TODO(hyangah): uncomment this to finalize the release workflow migration.
182223
npxVsceArgs := []string{"vsce", "publish", "-i", packageFile}
183-
184224
cmd2 := exec.Command("npx", npxVsceArgs...)
185225
cmd2.Stderr = os.Stderr
186-
if err := cmd2.Run(); err != nil {
226+
if err := commandRun(cmd2); err != nil {
187227
fatalf("failed to publish release")
188228
}
189-
*/
190229
}
191230

192231
// commitSHA returns COMMIT_SHA environment variable, or the commit SHA of the current branch.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright 2024 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package main_test
6+
7+
import (
8+
"bytes"
9+
"flag"
10+
"os"
11+
"os/exec"
12+
"path/filepath"
13+
"testing"
14+
15+
"github.com/google/go-cmp/cmp"
16+
)
17+
18+
var flagUpdate = flag.Bool("update", false, "update golden files")
19+
20+
func TestRelease(t *testing.T) {
21+
cmd := exec.Command("go", "list", "-m", "-f", "{{.Dir}}")
22+
cmd.Env = append(os.Environ(), "GOWORK=off")
23+
out, err := cmd.Output()
24+
if err != nil {
25+
t.Fatal("failed to get module root:", err)
26+
}
27+
moduleRoot := string(bytes.TrimSpace(out))
28+
29+
for _, command := range []string{"package", "publish"} {
30+
t.Run(command, func(t *testing.T) {
31+
testRelease(t, moduleRoot, command)
32+
})
33+
}
34+
}
35+
36+
func testRelease(t *testing.T, moduleRoot, command string) {
37+
cmd := exec.Command("go", "run", "-C", moduleRoot, "tools/release/release.go", "-n", command)
38+
cmd.Env = append(os.Environ(),
39+
// Provide dummy environment variables required to run release.go commands.
40+
"TAG_NAME=v0.0.0", // release tag
41+
"GITHUB_TOKEN=dummy", // github token needed to post release notes
42+
"VSCE_PAT=dummy", // vsce token needed to publish the extension
43+
"COMMIT_SHA=4893cd984d190bdf2cd65e11c425b42819ae6f57", // bogus commit SHA used to post release notes
44+
)
45+
output, err := cmd.CombinedOutput()
46+
if err != nil {
47+
t.Fatalf("failed to run release package: %v", err)
48+
}
49+
if *flagUpdate {
50+
if err := os.WriteFile(filepath.Join("testdata", command+".golden"), output, 0644); err != nil {
51+
t.Fatal("failed to write golden file:", err)
52+
}
53+
return
54+
}
55+
golden, err := os.ReadFile(filepath.Join("testdata", command+".golden"))
56+
if err != nil {
57+
t.Fatal("failed to read golden file:", err)
58+
}
59+
if diff := cmp.Diff(golden, output); diff != "" {
60+
t.Error("release package output mismatch (-want +got):\n", diff)
61+
}
62+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
jq -r .version package.json
2+
cp ../README.md README.md
3+
npx vsce package -o go-0.0.0.vsix --baseContentUrl https://github.com/golang/vscode-go/raw/v0.0.0 --baseImagesUrl https://github.com/golang/vscode-go/raw/v0.0.0 --no-update-package-json --no-git-tag-version 0.0.0
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
jq -r .version package.json
2+
stat go-0.0.0.vsix
3+
release create --generate-notes --target 4893cd984d190bdf2cd65e11c425b42819ae6f57 --title Release v0.0.0 --draft
4+
gh release create --generate-notes --target 4893cd984d190bdf2cd65e11c425b42819ae6f57 --title Release v0.0.0 --draft -R github.com/golang/vscode-go v0.0.0 go-0.0.0.vsix
5+
npx vsce publish -i go-0.0.0.vsix

0 commit comments

Comments
 (0)