Skip to content

Commit 402c115

Browse files
h9jianggopherbot
authored andcommitted
internal/task: update the changelog for stable patch and insider release
For golang/vscode-go#3500 Change-Id: I923c5e6b25af2f08a2d55401bba032ebdfa82dd5 Reviewed-on: https://go-review.googlesource.com/c/build/+/618396 Auto-Submit: Hongxiang Jiang <[email protected]> Reviewed-by: Hyang-Ah Hana Kim <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent b650bee commit 402c115

File tree

3 files changed

+194
-58
lines changed

3 files changed

+194
-58
lines changed

internal/task/releasevscodego.go

Lines changed: 113 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ var nextVersionParam = wf.ParamDef[string]{
8080
//go:embed template/vscode-go-release-issue.md
8181
var vscodeGoReleaseIssueTmplStr string
8282

83+
//go:embed template/vscode-go-changelog-entry.md
84+
var vscodeGoChangelogEntryTmplStr string
85+
8386
// vscodeGoActiveReleaseBranch returns the current active release branch in
8487
// vscode-go project.
8588
func vscodeGoActiveReleaseBranch(ctx *wf.TaskContext, gerrit GerritClient) (string, error) {
@@ -565,32 +568,13 @@ func (r *ReleaseVSCodeGoTasks) readChangeLogHeading(ctx context.Context, heading
565568
}
566569

567570
func (r *ReleaseVSCodeGoTasks) vscodeGoGitHubReleaseBody(ctx context.Context, release releaseVersion, prerelease string) (string, error) {
568-
tags, err := r.Gerrit.ListTags(ctx, "vscode-go")
571+
baseRelease, basePrerelease, err := r.diffBaseVersion(ctx, release)
569572
if err != nil {
570573
return "", err
571574
}
572575

573-
// Release notes display the diff between the current release and:
574-
// - Stable minor version(vX.EVEN.0): Latest patch of the last stable minor
575-
// (vX.EVEN-2.LATEST)
576-
// - Stable patch version(vX.Y.Z): Previous patch version (vX.Y.Z-1)
577-
// - Insider version(vX.ODD.Z): Last stable minor (vX.ODD-1.0-rc.1) - branch
578-
// cut.
579-
var previousRelease releaseVersion
580-
var previousPrerelease string
581-
if isVSCodeGoInsiderVersion(release, prerelease) {
582-
previousRelease = releaseVersion{Major: release.Major, Minor: release.Minor - 1, Patch: 0}
583-
previousPrerelease = "rc.1"
584-
} else {
585-
if release.Patch == 0 {
586-
previousRelease, _ = latestVersion(tags, isSameMajorMinor(release.Major, release.Minor-2), isReleaseVersion)
587-
} else {
588-
previousRelease, _ = latestVersion(tags, isSameMajorMinor(release.Major, release.Minor), isReleaseVersion)
589-
}
590-
}
591-
592576
var data vscodeGoReleaseData
593-
current, previous := versionString(release, prerelease), versionString(previousRelease, previousPrerelease)
577+
current, previous := versionString(release, prerelease), versionString(baseRelease, basePrerelease)
594578
// Insider version.
595579
if isVSCodeGoInsiderVersion(release, prerelease) {
596580
var body string
@@ -602,7 +586,7 @@ func (r *ReleaseVSCodeGoTasks) vscodeGoGitHubReleaseBody(ctx context.Context, re
602586
const vscodeGoMinorInsiderFmt = `%s is a pre-release version identical to the official release %s, incorporating all the same bug fixes and improvements. This may include additional, experimental features that are not yet ready for general release. These features are still under development and may be subject to change or removal.
603587
604588
See release https://github.com/golang/vscode-go/releases/tag/%s for details.`
605-
body = fmt.Sprintf(vscodeGoMinorInsiderFmt, current, previousRelease, previousRelease)
589+
body = fmt.Sprintf(vscodeGoMinorInsiderFmt, current, baseRelease, baseRelease)
606590
} else {
607591
// An insider patch version release (vX.ODD.Z Z > 0) is built from master
608592
// branch. The GitHub release body will be copied from the CHANGELOG.md
@@ -613,16 +597,13 @@ See release https://github.com/golang/vscode-go/releases/tag/%s for details.`
613597
}
614598
}
615599

616-
nextStable := releaseVersion{Major: release.Major, Minor: release.Minor + 1, Patch: 0}.String()
617600
data = vscodeGoReleaseData{
618601
Date: time.Now().Format(time.DateOnly),
619602
CurrentTag: current,
620603
PreviousTag: previous,
621-
// For insider version, the milestone will point to the next stable minor.
622-
// If the insider version is vX.ODD.Z, the milestone will be vX.ODD+1.0.
623-
Milestone: nextStable,
624-
NextStable: nextStable,
625-
Body: strings.TrimSpace(body),
604+
Milestone: vscodeGoMilestone(release),
605+
NextStable: releaseVersion{Major: release.Major, Minor: release.Minor + 1, Patch: 0}.String(),
606+
Body: strings.TrimSpace(body),
626607
}
627608
} else {
628609
var body string
@@ -773,11 +754,11 @@ func (r *ReleaseVSCodeGoTasks) NewInsiderDefinition() *wf.Definition {
773754

774755
reviewers := wf.Param(wd, reviewersParam)
775756

776-
changeID := wf.Task1(wd, "update package.json in master branch", r.updatePackageJSONVersionInMasterBranch, reviewers)
777-
submitted := wf.Task1(wd, "await config CL submission", clAwaiter{r.Gerrit}.awaitSubmission, changeID)
757+
packageChangeID := wf.Task1(wd, "update package.json in master branch", r.updatePackageJSONVersionInMasterBranch, reviewers)
758+
packageSubmitted := wf.Task1(wd, "await config CL submission", clAwaiter{r.Gerrit}.awaitSubmission, packageChangeID)
778759

779760
release := wf.Task0(wd, "determine the insider version", r.determineInsiderVersion)
780-
revision := wf.Task2(wd, "read the head of master branch", r.Gerrit.ReadBranchHead, wf.Const("vscode-go"), wf.Const("master"), wf.After(submitted))
761+
revision := wf.Task2(wd, "read the head of master branch", r.Gerrit.ReadBranchHead, wf.Const("vscode-go"), wf.Const("master"), wf.After(packageSubmitted))
781762
approved := wf.Action2(wd, "await release coordinator's approval", r.approveInsiderRelease, release, revision)
782763

783764
verified := wf.Action1(wd, "verify the determined commit", r.verifyTestResults, revision, wf.After(approved))
@@ -786,7 +767,12 @@ func (r *ReleaseVSCodeGoTasks) NewInsiderDefinition() *wf.Definition {
786767
tagged := wf.Action3(wd, "tag the insider release", r.tag, revision, release, wf.Const(""), wf.After(build))
787768

788769
released := wf.Action3(wd, "create release note", r.createGitHubReleaseDraft, release, wf.Const(""), build, wf.After(tagged))
789-
published := wf.Action2(wd, "publish to vscode marketplace", r.publishPackageExtension, release, build, wf.After(tagged))
770+
771+
changelogChangeID := wf.Task2(wd, "update CHANGELOG.md in the master branch", r.addChangeLog, release, reviewers, wf.After(tagged))
772+
changelogSubmitted := wf.Task1(wd, "await config CL submission", clAwaiter{r.Gerrit}.awaitSubmission, changelogChangeID)
773+
// Publish only after the CHANGELOG.md update is merged to ensure the change
774+
// log reflects the latest released version.
775+
published := wf.Action2(wd, "publish to vscode marketplace", r.publishPackageExtension, release, build, wf.After(changelogSubmitted))
790776

791777
wf.Action4(wd, "mail announcement", r.mailAnnouncement, release, wf.Const(""), revision, wf.Const(0), wf.After(released), wf.After(published))
792778
return wd
@@ -1079,7 +1065,7 @@ func (r *ReleaseVSCodeGoTasks) NewReleaseDefinition() *wf.Definition {
10791065
tagged := wf.Action3(wd, "tag the stable release", r.tag, commit, release, wf.Const(""), wf.After(build))
10801066
released := wf.Action3(wd, "create release note", r.createGitHubReleaseDraft, release, wf.Const(""), build, wf.After(tagged))
10811067

1082-
changeID := wf.Task2(wd, "update CHANGELOG.md in the master branch", r.addChangeLogHeading, release, reviewers, wf.After(build))
1068+
changeID := wf.Task2(wd, "update CHANGELOG.md in the master branch", r.addChangeLog, release, reviewers, wf.After(build))
10831069
submitted := wf.Task1(wd, "await config CL submission", clAwaiter{r.Gerrit}.awaitSubmission, changeID)
10841070
// Publish only after the CHANGELOG.md update is merged to ensure the change
10851071
// log reflects the latest released version.
@@ -1115,17 +1101,53 @@ func (r *ReleaseVSCodeGoTasks) findVSCodeReleaseCommit(ctx *wf.TaskContext, rele
11151101
return info.Revision, nil
11161102
}
11171103

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
1104+
// diffBaseVersion determines the appropriate base version for generating a
1105+
// commit diff against the given input version.
1106+
// The base version is selected as follows:
1107+
// - Stable minor version(vX.EVEN.0): Latest patch of the last stable minor
1108+
// (vX.EVEN-2.LATEST).
1109+
// - Stable patch version(vX.Y.Z): Previous patch version (vX.Y.Z-1).
1110+
// - Insider version(vX.ODD.Z): Last stable minor (vX.ODD-1.0-rc.1) - branch cut.
1111+
func (r *ReleaseVSCodeGoTasks) diffBaseVersion(ctx context.Context, release releaseVersion) (releaseVersion, string, error) {
1112+
tags, err := r.Gerrit.ListTags(ctx, "vscode-go")
1113+
if err != nil {
1114+
return releaseVersion{}, "", err
11271115
}
11281116

1117+
var previousRelease releaseVersion
1118+
var previousPrerelease string
1119+
if isVSCodeGoInsiderVersion(release, "") {
1120+
previousRelease = releaseVersion{Major: release.Major, Minor: release.Minor - 1, Patch: 0}
1121+
previousPrerelease = "rc.1"
1122+
} else {
1123+
if release.Patch == 0 {
1124+
previousRelease, _ = latestVersion(tags, isSameMajorMinor(release.Major, release.Minor-2), isReleaseVersion)
1125+
} else {
1126+
previousRelease, _ = latestVersion(tags, isSameMajorMinor(release.Major, release.Minor), isReleaseVersion)
1127+
}
1128+
}
1129+
return previousRelease, previousPrerelease, nil
1130+
}
1131+
1132+
// milestoneForVersion returns the name of the github milestone associated with
1133+
// a given version.
1134+
func vscodeGoMilestone(release releaseVersion) string {
1135+
if isVSCodeGoInsiderVersion(release, "") {
1136+
// For insider version, the milestone will point to the next stable minor.
1137+
// If the insider version is vX.ODD.Z, the milestone will be vX.ODD+1.0.
1138+
return releaseVersion{Major: release.Major, Minor: release.Minor + 1, Patch: 0}.String()
1139+
}
1140+
return release.String()
1141+
}
1142+
1143+
// addChangeLog updates the CHANGELOG.md file in the master branch of the
1144+
// vscode-go repository with a new heading for the released version.
1145+
// For stable minor version, it moves all content from the "Unreleased" section
1146+
// to the new version's section.
1147+
// For stable patch version and insider version, add a new heading with
1148+
// pre-defined content.
1149+
// For more details on changelog format, see: https://keepachangelog.com/en/1.1.0/
1150+
func (r *ReleaseVSCodeGoTasks) addChangeLog(ctx *wf.TaskContext, release releaseVersion, reviewers []string) (string, error) {
11291151
clTitle := "CHANGELOG.md: add release heading for " + release.String()
11301152

11311153
openCL, err := openCL(ctx, r.Gerrit, "vscode-go", "master", clTitle)
@@ -1150,17 +1172,56 @@ func (r *ReleaseVSCodeGoTasks) addChangeLogHeading(ctx *wf.TaskContext, release
11501172
lines := bytes.Split(content, []byte("\n"))
11511173
var output bytes.Buffer
11521174

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")
1175+
if release.Patch == 0 && isVSCodeGoStableVersion(release, "") {
1176+
for i, line := range lines {
1177+
output.Write(line)
1178+
// Only add a newline if it's not the last line
1179+
if i < len(lines)-1 {
1180+
output.WriteString("\n")
1181+
}
1182+
if string(line) == "## Unreleased" {
1183+
output.WriteString("\n")
1184+
output.WriteString("## " + release.String() + "\n")
1185+
output.WriteString("\n")
1186+
output.WriteString("Date: " + time.Now().Format(time.DateOnly) + "\n")
1187+
}
11581188
}
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")
1189+
} else {
1190+
entryAdded := false
1191+
for i, line := range lines {
1192+
if !entryAdded && bytes.HasPrefix(line, []byte("## ")) && string(line) != "## Unreleased" {
1193+
entryAdded = true
1194+
baseRelease, basePrerelease, err := r.diffBaseVersion(ctx, release)
1195+
if err != nil {
1196+
return "", err
1197+
}
1198+
1199+
data := map[string]string{
1200+
"Current": release.String(),
1201+
"Date": time.Now().Format(time.DateOnly),
1202+
"Previous": versionString(baseRelease, basePrerelease),
1203+
"Milestone": vscodeGoMilestone(release),
1204+
}
1205+
1206+
if isVSCodeGoInsiderVersion(release, "") {
1207+
data["NextStable"] = fmt.Sprintf("v%v.%v", release.Major, release.Minor+1)
1208+
data["IsPrerelease"] = "true"
1209+
}
1210+
1211+
tmpl, err := template.New("vscode release").Parse(vscodeGoChangelogEntryTmplStr)
1212+
if err != nil {
1213+
return "", err
1214+
}
1215+
1216+
if err := tmpl.Execute(&output, data); err != nil {
1217+
return "", err
1218+
}
1219+
}
1220+
output.Write(line)
1221+
// Only add a newline if it's not the last line
1222+
if i < len(lines)-1 {
1223+
output.WriteString("\n")
1224+
}
11641225
}
11651226
}
11661227

internal/task/releasevscodego_test.go

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,6 @@ CHANGE FOR v0.42.0 LINE 2
694694
t.Fatal(err)
695695
}
696696

697-
698697
re := regexp.MustCompile(`Date: (.*)\n`)
699698
want := re.ReplaceAllString(testdataFile(t, tc.wantContent), "\n")
700699
got := re.ReplaceAllString(string(gotBody), "\n")
@@ -888,7 +887,7 @@ esac
888887
}
889888
}
890889

891-
func TestAddChangeLogHeading(t *testing.T) {
890+
func TestAddChangeLog(t *testing.T) {
892891
changelog := `# Changelog
893892
894893
All notable changes to this project will be documented in this file.
@@ -950,8 +949,8 @@ CHANGE FOR v0.42.1
950949
`,
951950
},
952951
{
953-
name: "no update for non-minor version",
954-
release: releaseVersion{Major: 0, Minor: 44, Patch: 3},
952+
name: "add v0.46.3 patch entry",
953+
release: releaseVersion{Major: 0, Minor: 46, Patch: 3},
955954
wantChangeLog: `# Changelog
956955
957956
All notable changes to this project will be documented in this file.
@@ -961,6 +960,65 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
961960
962961
CHANGE FOR v0.44.0
963962
963+
## v0.46.3
964+
965+
Date: 2002-01-02
966+
967+
**Full Changelog**: https://github.com/golang/vscode-go/compare/v0.46.2...v0.46.3
968+
**Milestone**: https://github.com/golang/vscode-go/issues?q=milestone%3Av0.46.3
969+
970+
## v0.42.1
971+
972+
CHANGE FOR v0.42.1
973+
`,
974+
},
975+
{
976+
name: "add v0.43.0 insider minor entry",
977+
release: releaseVersion{Major: 0, Minor: 43, Patch: 0},
978+
wantChangeLog: `# Changelog
979+
980+
All notable changes to this project will be documented in this file.
981+
The format is based on [Keep a Changelog](http://keepachangelog.com/).
982+
983+
## Unreleased
984+
985+
CHANGE FOR v0.44.0
986+
987+
## v0.43.0 (prerelease)
988+
989+
Date: 2002-01-02
990+
991+
This is the [pre-release version](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#prerelease-extensions) of v0.44.
992+
993+
**Full Changelog**: https://github.com/golang/vscode-go/compare/v0.42.0-rc.1...v0.43.0
994+
**Milestone**: https://github.com/golang/vscode-go/issues?q=milestone%3Av0.44.0
995+
996+
## v0.42.1
997+
998+
CHANGE FOR v0.42.1
999+
`,
1000+
},
1001+
{
1002+
name: "add v0.45.6 insider patch entry",
1003+
release: releaseVersion{Major: 0, Minor: 45, Patch: 6},
1004+
wantChangeLog: `# Changelog
1005+
1006+
All notable changes to this project will be documented in this file.
1007+
The format is based on [Keep a Changelog](http://keepachangelog.com/).
1008+
1009+
## Unreleased
1010+
1011+
CHANGE FOR v0.44.0
1012+
1013+
## v0.45.6 (prerelease)
1014+
1015+
Date: 2002-01-02
1016+
1017+
This is the [pre-release version](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#prerelease-extensions) of v0.46.
1018+
1019+
**Full Changelog**: https://github.com/golang/vscode-go/compare/v0.44.0-rc.1...v0.45.6
1020+
**Milestone**: https://github.com/golang/vscode-go/issues?q=milestone%3Av0.46.0
1021+
9641022
## v0.42.1
9651023
9661024
CHANGE FOR v0.42.1
@@ -971,9 +1029,13 @@ CHANGE FOR v0.42.1
9711029
for _, tc := range testcases {
9721030
t.Run(tc.name, func(t *testing.T) {
9731031
vscodego := NewFakeRepo(t, "vscode-go")
974-
vscodego.Commit(map[string]string{
1032+
commit := vscodego.Commit(map[string]string{
9751033
"CHANGELOG.md": changelog,
9761034
})
1035+
if tc.release.Patch >= 1 {
1036+
vscodego.Tag(fmt.Sprintf("v%v.%v.%v", tc.release.Major, tc.release.Minor, tc.release.Patch-1), commit)
1037+
}
1038+
vscodego.Tag(fmt.Sprintf("v%v.%v.%v", tc.release.Major, tc.release.Minor-1, 0), commit)
9771039

9781040
gerrit := NewFakeGerrit(t, vscodego)
9791041
ctx := &workflow.TaskContext{
@@ -986,7 +1048,7 @@ CHANGE FOR v0.42.1
9861048
Gerrit: gerrit,
9871049
}
9881050

989-
_, err := tasks.addChangeLogHeading(ctx, tc.release, nil)
1051+
_, err := tasks.addChangeLog(ctx, tc.release, nil)
9901052
if err != nil {
9911053
t.Fatal(err)
9921054
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## {{ .Current }} {{- if .IsPrerelease }} (prerelease) {{- end }}
2+
3+
Date: {{ .Date }}
4+
5+
{{ if .IsPrerelease -}}
6+
7+
This is the [pre-release version](https://code.visualstudio.com/api/working-with-extensions/publishing-extension#prerelease-extensions) of {{ .NextStable }}.
8+
9+
{{ end -}}
10+
11+
**Full Changelog**: https://github.com/golang/vscode-go/compare/{{ .Previous }}...{{ .Current }}
12+
**Milestone**: https://github.com/golang/vscode-go/issues?q=milestone%3A{{ .Milestone }}
13+

0 commit comments

Comments
 (0)