internal/task: upgrade dependencies after vscode-go insider minor Context: vscode-go create insider version v0.57.0 immediately from master branch after stable version v0.56.0 released. This CL is similar to gopls, bump dependencies in gopls mater branch after gopls minor release. (e.g. v0.23.0). But vscode-go bump should happen after the insider minor version not stable minor version. This will help avoid needing to create changes like CL 807780 manually. Change-Id: Ic32596422dc26aa734cb9b7ec18d5cfc7f40923c Reviewed-on: https://go-review.googlesource.com/c/build/+/807740 Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org> Auto-Submit: Hongxiang Jiang <hxjiang@golang.org> LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
diff --git a/internal/task/releasevscodego.go b/internal/task/releasevscodego.go index 515fe9f..794ddeb 100644 --- a/internal/task/releasevscodego.go +++ b/internal/task/releasevscodego.go
@@ -778,6 +778,10 @@ changelogChangeID := wf.Task2(wd, "update CHANGELOG.md in the master branch", r.addChangeLog, release, reviewers, wf.After(tagged)) changelogSubmitted := wf.Task1(wd, "await CHANGELOG.md CL submission", clAwaiter{r.Gerrit}.awaitSubmission, changelogChangeID) + + depsChangeID := wf.Task2(wd, "update dependencies in master branch", r.updateDependenciesIfMinor, release, reviewers, wf.After(changelogSubmitted)) + _ = wf.Task1(wd, "await dependencies CL submission", clAwaiter{r.Gerrit}.awaitSubmission, depsChangeID) + // Publish only after the CHANGELOG.md update is merged to ensure the change // log reflects the latest released version. published := wf.Action2(wd, "publish to vscode marketplace", r.publishPackageExtension, release, build, wf.After(changelogSubmitted)) @@ -1227,3 +1231,43 @@ ctx.Printf("created auto-submit change %s under branch master in vscode-go repo.", cl) return cl, nil } + +// updateDependenciesIfMinor updates Go module dependencies in the master branch +// of vscode-go following a minor insider version release. +func (r *ReleaseVSCodeGoTasks) updateDependenciesIfMinor(ctx *wf.TaskContext, release releaseVersion, reviewers []string) (string, error) { + if minor := release.Patch == 0; !minor || !isVSCodeGoInsiderVersion(release, "") { + return "", nil + } + + const script = `go get -u work && go mod tidy +(cd docs && go get -u work && go mod tidy) +(cd extension && go get -u work && go mod tidy) +(cd survey && go get -u work && go mod tidy) +` + watchFiles := []string{ + "go.mod", "go.sum", + "docs/go.mod", "docs/go.sum", + "extension/go.mod", "extension/go.sum", + "survey/go.mod", "survey/go.sum", + } + + changed, err := executeAndMonitorChange(ctx, r.CloudBuild, "vscode-go", "master", script, watchFiles) + if err != nil { + return "", err + } + + if len(changed) == 0 { + ctx.Printf("No dependencies needed updating.") + return "", nil + } + + clTitle := fmt.Sprintf("go.mod: update dependencies following the %s release", release) + changeInput := gerrit.ChangeInput{ + Project: "vscode-go", + Branch: "master", + Subject: fmt.Sprintf("%s\n\nThis is an automated CL which updates the go.mod and go.sum.\n", clTitle), + } + + ctx.Printf("creating auto-submit change under master branch in vscode-go repo.") + return r.Gerrit.CreateAutoSubmitChange(ctx, changeInput, reviewers, changed) +}
diff --git a/internal/task/releasevscodego_test.go b/internal/task/releasevscodego_test.go index a41d34b..00b218e 100644 --- a/internal/task/releasevscodego_test.go +++ b/internal/task/releasevscodego_test.go
@@ -1072,3 +1072,87 @@ }) } } + +func TestUpdateDependenciesIfMinor(t *testing.T) { + mustHaveShell(t) + + testcases := []struct { + name string + release releaseVersion + modified bool + wantCL bool + }{ + { + name: "insider patch version skips update", + release: releaseVersion{Major: 0, Minor: 57, Patch: 1}, + modified: true, + wantCL: false, + }, + { + name: "stable minor version skips update", + release: releaseVersion{Major: 0, Minor: 56, Patch: 0}, + modified: true, + wantCL: false, + }, + { + name: "insider minor version creates CL when dependencies changed", + release: releaseVersion{Major: 0, Minor: 57, Patch: 0}, + modified: true, + wantCL: true, + }, + { + name: "insider minor version creates no CL when no files changed", + release: releaseVersion{Major: 0, Minor: 57, Patch: 0}, + modified: false, + wantCL: false, + }, + } + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + vscodego := NewFakeRepo(t, "vscode-go") + vscodego.Commit(map[string]string{ + "go.mod": "module github.com/golang/vscode-go\n\ngo 1.23\n", + "go.sum": "\n", + "docs/go.mod": "module github.com/golang/vscode-go/docs\n\ngo 1.21\n", + "docs/go.sum": "\n", + "extension/go.mod": "module github.com/golang/vscode-go/extension\n\ngo 1.23\n", + "extension/go.sum": "\n", + "survey/go.mod": "module github.com/golang/vscode-go/survey\n\ngo 1.23\n", + "survey/go.sum": "\n", + }) + + gerrit := NewFakeGerrit(t, vscodego) + ctx := &workflow.TaskContext{ + Context: context.Background(), + Logger: &testLogger{t, ""}, + } + + var fakeBinaries []FakeBinary + if tc.modified { + fakeGo := `#!/bin/bash -exu +if [ "$1" = "get" ]; then + echo "// updated" >> go.mod +fi +` + fakeBinaries = append(fakeBinaries, FakeBinary{Name: "go", Implementation: fakeGo}) + } + + tasks := &ReleaseVSCodeGoTasks{ + CloudBuild: NewFakeCloudBuild(t, gerrit, "vscode-go", nil, fakeBinaries...), + Gerrit: gerrit, + } + + cl, err := tasks.updateDependenciesIfMinor(ctx, tc.release, []string{"reviewer@example.com"}) + if err != nil { + t.Fatal(err) + } + + if tc.wantCL && cl == "" { + t.Errorf("updateDependenciesIfMinor() returned empty CL, want non-empty CL") + } else if !tc.wantCL && cl != "" { + t.Errorf("updateDependenciesIfMinor() returned CL %q, want empty CL", cl) + } + }) + } +}