Skip to content

Commit b650bee

Browse files
committed
internal/task: add new heading for stable minor release in change log
- Add a new heading for stable minor release (vX.EVEN.0). - Move the content under "## Unreleased" to the new heading "## vX.EVEN.0". - Insert release dates in form of YYYY-MM-DD. A local relui screenshot is at golang/vscode-go#3500 (comment) For golang/vscode-go#3500 Change-Id: Id26caff28ecbab9db483fe21412f0ea3af0f6445 Reviewed-on: https://go-review.googlesource.com/c/build/+/617276 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Hyang-Ah Hana Kim <[email protected]>
1 parent dca1b92 commit b650bee

File tree

2 files changed

+195
-2
lines changed

2 files changed

+195
-2
lines changed

internal/task/releasevscodego.go

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"strconv"
1616
"strings"
1717
"text/template"
18+
"time"
1819

1920
"cloud.google.com/go/cloudbuild/apiv1/v2/cloudbuildpb"
2021
"github.com/google/go-github/v48/github"
@@ -1063,6 +1064,8 @@ func (r *ReleaseVSCodeGoTasks) NewReleaseDefinition() *wf.Definition {
10631064
wd := wf.New(wf.ACL{Groups: []string{groups.ToolsTeam}})
10641065

10651066
versionBumpStrategy := wf.Param(wd, nextVersionParam)
1067+
reviewers := wf.Param(wd, reviewersParam)
1068+
10661069
release := wf.Task1(wd, "determine the release version", r.determineReleaseVersion, versionBumpStrategy)
10671070
prerelease := wf.Task1(wd, "find the latest pre-release version", r.latestPrereleaseVersion, release)
10681071

@@ -1074,9 +1077,13 @@ func (r *ReleaseVSCodeGoTasks) NewReleaseDefinition() *wf.Definition {
10741077
build := wf.Task3(wd, "generate package extension (.vsix) from release candidate tag", r.generatePackageExtension, release, wf.Const(""), commit)
10751078

10761079
tagged := wf.Action3(wd, "tag the stable release", r.tag, commit, release, wf.Const(""), wf.After(build))
1077-
10781080
released := wf.Action3(wd, "create release note", r.createGitHubReleaseDraft, release, wf.Const(""), build, wf.After(tagged))
1079-
published := wf.Action2(wd, "publish to vscode marketplace", r.publishPackageExtension, release, build)
1081+
1082+
changeID := wf.Task2(wd, "update CHANGELOG.md in the master branch", r.addChangeLogHeading, release, reviewers, wf.After(build))
1083+
submitted := wf.Task1(wd, "await config CL submission", clAwaiter{r.Gerrit}.awaitSubmission, changeID)
1084+
// Publish only after the CHANGELOG.md update is merged to ensure the change
1085+
// log reflects the latest released version.
1086+
published := wf.Action2(wd, "publish to vscode marketplace", r.publishPackageExtension, release, build, wf.After(submitted))
10801087

10811088
wf.Action4(wd, "mail announcement", r.mailAnnouncement, release, wf.Const(""), wf.Const(""), wf.Const(0), wf.After(released), wf.After(published))
10821089
return wd
@@ -1107,3 +1114,65 @@ func (r *ReleaseVSCodeGoTasks) findVSCodeReleaseCommit(ctx *wf.TaskContext, rele
11071114

11081115
return info.Revision, nil
11091116
}
1117+
1118+
// addChangeLogHeading updates the CHANGELOG.md file in the master branch of the
1119+
// vscode-go repository with a new heading for the released version.
1120+
// It moves all content from the "Unreleased" section to the new version's
1121+
// section, but only for minor releases.
1122+
// For more details on changelog format, see: https://keepachangelog.com/en/1.1.0/
1123+
func (r *ReleaseVSCodeGoTasks) addChangeLogHeading(ctx *wf.TaskContext, release releaseVersion, reviewers []string) (string, error) {
1124+
if release.Patch != 0 {
1125+
ctx.Printf("not creating CL: %s is not a minor release", release)
1126+
return "", nil
1127+
}
1128+
1129+
clTitle := "CHANGELOG.md: add release heading for " + release.String()
1130+
1131+
openCL, err := openCL(ctx, r.Gerrit, "vscode-go", "master", clTitle)
1132+
if err != nil {
1133+
return "", err
1134+
}
1135+
if openCL != "" {
1136+
ctx.Printf("not creating CL: found existing CL %s", openCL)
1137+
return openCL, nil
1138+
}
1139+
1140+
head, err := r.Gerrit.ReadBranchHead(ctx, "vscode-go", "master")
1141+
if err != nil {
1142+
return "", err
1143+
}
1144+
1145+
content, err := r.Gerrit.ReadFile(ctx, "vscode-go", head, "CHANGELOG.md")
1146+
if err != nil {
1147+
return "", err
1148+
}
1149+
1150+
lines := bytes.Split(content, []byte("\n"))
1151+
var output bytes.Buffer
1152+
1153+
for i, line := range lines {
1154+
output.Write(line)
1155+
// Only add a newline if it's not the last line
1156+
if i < len(lines)-1 {
1157+
output.WriteString("\n")
1158+
}
1159+
if string(line) == "## Unreleased" {
1160+
output.WriteString("\n")
1161+
output.WriteString("## " + release.String() + "\n")
1162+
output.WriteString("\n")
1163+
output.WriteString("Date: " + time.Now().Format(time.DateOnly) + "\n")
1164+
}
1165+
}
1166+
1167+
cl, err := r.Gerrit.CreateAutoSubmitChange(ctx, gerrit.ChangeInput{
1168+
Project: "vscode-go",
1169+
Branch: "master",
1170+
Subject: fmt.Sprintf("%s\n\nThis is an automated CL which updates the CHANGELOG.md.\n", clTitle),
1171+
}, reviewers, map[string]string{"CHANGELOG.md": output.String()})
1172+
if err != nil {
1173+
return "", err
1174+
}
1175+
1176+
ctx.Printf("created auto-submit change %s under branch master in vscode-go repo.", cl)
1177+
return cl, nil
1178+
}

internal/task/releasevscodego_test.go

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"fmt"
1010
"io"
11+
"regexp"
1112
"testing"
1213

1314
"github.com/google/go-cmp/cmp"
@@ -886,3 +887,126 @@ esac
886887
})
887888
}
888889
}
890+
891+
func TestAddChangeLogHeading(t *testing.T) {
892+
changelog := `# Changelog
893+
894+
All notable changes to this project will be documented in this file.
895+
The format is based on [Keep a Changelog](http://keepachangelog.com/).
896+
897+
## Unreleased
898+
899+
CHANGE FOR v0.44.0
900+
901+
## v0.42.1
902+
903+
CHANGE FOR v0.42.1
904+
`
905+
testcases := []struct {
906+
name string
907+
release releaseVersion
908+
wantChangeLog string
909+
}{
910+
{
911+
name: "add v0.44.0 heading",
912+
release: releaseVersion{Major: 0, Minor: 44, Patch: 0},
913+
wantChangeLog: `# Changelog
914+
915+
All notable changes to this project will be documented in this file.
916+
The format is based on [Keep a Changelog](http://keepachangelog.com/).
917+
918+
## Unreleased
919+
920+
## v0.44.0
921+
922+
Date: 2002-01-02
923+
924+
CHANGE FOR v0.44.0
925+
926+
## v0.42.1
927+
928+
CHANGE FOR v0.42.1
929+
`,
930+
},
931+
{
932+
name: "add v0.46.0 heading",
933+
release: releaseVersion{Major: 0, Minor: 46, Patch: 0},
934+
wantChangeLog: `# Changelog
935+
936+
All notable changes to this project will be documented in this file.
937+
The format is based on [Keep a Changelog](http://keepachangelog.com/).
938+
939+
## Unreleased
940+
941+
## v0.46.0
942+
943+
Date: 2002-01-02
944+
945+
CHANGE FOR v0.44.0
946+
947+
## v0.42.1
948+
949+
CHANGE FOR v0.42.1
950+
`,
951+
},
952+
{
953+
name: "no update for non-minor version",
954+
release: releaseVersion{Major: 0, Minor: 44, Patch: 3},
955+
wantChangeLog: `# Changelog
956+
957+
All notable changes to this project will be documented in this file.
958+
The format is based on [Keep a Changelog](http://keepachangelog.com/).
959+
960+
## Unreleased
961+
962+
CHANGE FOR v0.44.0
963+
964+
## v0.42.1
965+
966+
CHANGE FOR v0.42.1
967+
`,
968+
},
969+
}
970+
971+
for _, tc := range testcases {
972+
t.Run(tc.name, func(t *testing.T) {
973+
vscodego := NewFakeRepo(t, "vscode-go")
974+
vscodego.Commit(map[string]string{
975+
"CHANGELOG.md": changelog,
976+
})
977+
978+
gerrit := NewFakeGerrit(t, vscodego)
979+
ctx := &workflow.TaskContext{
980+
Context: context.Background(),
981+
Logger: &testLogger{t, ""},
982+
}
983+
984+
tasks := &ReleaseVSCodeGoTasks{
985+
CloudBuild: NewFakeCloudBuild(t, gerrit, "", nil),
986+
Gerrit: gerrit,
987+
}
988+
989+
_, err := tasks.addChangeLogHeading(ctx, tc.release, nil)
990+
if err != nil {
991+
t.Fatal(err)
992+
}
993+
994+
head, err := gerrit.ReadBranchHead(ctx, "vscode-go", "master")
995+
if err != nil {
996+
t.Fatal(err)
997+
}
998+
999+
gotFile, err := gerrit.ReadFile(ctx, "vscode-go", head, "CHANGELOG.md")
1000+
if err != nil {
1001+
t.Fatal(err)
1002+
}
1003+
1004+
re := regexp.MustCompile(`Date: (.*)\n`)
1005+
want := re.ReplaceAllString(tc.wantChangeLog, "\n")
1006+
got := re.ReplaceAllString(string(gotFile), "\n")
1007+
if diff := cmp.Diff(want, got); diff != "" {
1008+
t.Errorf("change log content mismatch (-want +got):\n%s", diff)
1009+
}
1010+
})
1011+
}
1012+
}

0 commit comments

Comments
 (0)