@@ -80,6 +80,9 @@ var nextVersionParam = wf.ParamDef[string]{
80
80
//go:embed template/vscode-go-release-issue.md
81
81
var vscodeGoReleaseIssueTmplStr string
82
82
83
+ //go:embed template/vscode-go-changelog-entry.md
84
+ var vscodeGoChangelogEntryTmplStr string
85
+
83
86
// vscodeGoActiveReleaseBranch returns the current active release branch in
84
87
// vscode-go project.
85
88
func vscodeGoActiveReleaseBranch (ctx * wf.TaskContext , gerrit GerritClient ) (string , error ) {
@@ -565,32 +568,13 @@ func (r *ReleaseVSCodeGoTasks) readChangeLogHeading(ctx context.Context, heading
565
568
}
566
569
567
570
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 )
569
572
if err != nil {
570
573
return "" , err
571
574
}
572
575
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
-
592
576
var data vscodeGoReleaseData
593
- current , previous := versionString (release , prerelease ), versionString (previousRelease , previousPrerelease )
577
+ current , previous := versionString (release , prerelease ), versionString (baseRelease , basePrerelease )
594
578
// Insider version.
595
579
if isVSCodeGoInsiderVersion (release , prerelease ) {
596
580
var body string
@@ -602,7 +586,7 @@ func (r *ReleaseVSCodeGoTasks) vscodeGoGitHubReleaseBody(ctx context.Context, re
602
586
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.
603
587
604
588
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 )
606
590
} else {
607
591
// An insider patch version release (vX.ODD.Z Z > 0) is built from master
608
592
// 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.`
613
597
}
614
598
}
615
599
616
- nextStable := releaseVersion {Major : release .Major , Minor : release .Minor + 1 , Patch : 0 }.String ()
617
600
data = vscodeGoReleaseData {
618
601
Date : time .Now ().Format (time .DateOnly ),
619
602
CurrentTag : current ,
620
603
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 ),
626
607
}
627
608
} else {
628
609
var body string
@@ -773,11 +754,11 @@ func (r *ReleaseVSCodeGoTasks) NewInsiderDefinition() *wf.Definition {
773
754
774
755
reviewers := wf .Param (wd , reviewersParam )
775
756
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 )
778
759
779
760
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 ))
781
762
approved := wf .Action2 (wd , "await release coordinator's approval" , r .approveInsiderRelease , release , revision )
782
763
783
764
verified := wf .Action1 (wd , "verify the determined commit" , r .verifyTestResults , revision , wf .After (approved ))
@@ -786,7 +767,12 @@ func (r *ReleaseVSCodeGoTasks) NewInsiderDefinition() *wf.Definition {
786
767
tagged := wf .Action3 (wd , "tag the insider release" , r .tag , revision , release , wf .Const ("" ), wf .After (build ))
787
768
788
769
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 ))
790
776
791
777
wf .Action4 (wd , "mail announcement" , r .mailAnnouncement , release , wf .Const ("" ), revision , wf .Const (0 ), wf .After (released ), wf .After (published ))
792
778
return wd
@@ -1079,7 +1065,7 @@ func (r *ReleaseVSCodeGoTasks) NewReleaseDefinition() *wf.Definition {
1079
1065
tagged := wf .Action3 (wd , "tag the stable release" , r .tag , commit , release , wf .Const ("" ), wf .After (build ))
1080
1066
released := wf .Action3 (wd , "create release note" , r .createGitHubReleaseDraft , release , wf .Const ("" ), build , wf .After (tagged ))
1081
1067
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 ))
1083
1069
submitted := wf .Task1 (wd , "await config CL submission" , clAwaiter {r .Gerrit }.awaitSubmission , changeID )
1084
1070
// Publish only after the CHANGELOG.md update is merged to ensure the change
1085
1071
// log reflects the latest released version.
@@ -1115,17 +1101,53 @@ func (r *ReleaseVSCodeGoTasks) findVSCodeReleaseCommit(ctx *wf.TaskContext, rele
1115
1101
return info .Revision , nil
1116
1102
}
1117
1103
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
1127
1115
}
1128
1116
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 ) {
1129
1151
clTitle := "CHANGELOG.md: add release heading for " + release .String ()
1130
1152
1131
1153
openCL , err := openCL (ctx , r .Gerrit , "vscode-go" , "master" , clTitle )
@@ -1150,17 +1172,56 @@ func (r *ReleaseVSCodeGoTasks) addChangeLogHeading(ctx *wf.TaskContext, release
1150
1172
lines := bytes .Split (content , []byte ("\n " ))
1151
1173
var output bytes.Buffer
1152
1174
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
+ }
1158
1188
}
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
+ }
1164
1225
}
1165
1226
}
1166
1227
0 commit comments