Skip to content

Commit baf515d

Browse files
authored
fix(internal/librariangen): fix CHANGES.md headers (#12849)
* Change ### to ## and #### to ###. * Add link to GitHub Release. * Preserve date. fixes: googleapis/librarian#2045
1 parent e822ef6 commit baf515d

2 files changed

Lines changed: 22 additions & 8 deletions

File tree

internal/librariangen/release/release.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import (
3232
"cloud.google.com/go/internal/postprocessor/librarian/librariangen/module"
3333
)
3434

35+
var now = time.Now
36+
3537
// Config holds the configuration for the release-init command.
3638
type Config struct {
3739
LibrarianDir string
@@ -66,7 +68,7 @@ func Init(ctx context.Context, cfg *Config) error {
6668

6769
moduleDir := filepath.Join(cfg.OutputDir, lib.ID)
6870
slog.Info("librariangen: processing library for release", "id", lib.ID, "version", lib.Version)
69-
if err := updateChangelog(cfg, lib, time.Now().UTC()); err != nil {
71+
if err := updateChangelog(cfg, lib, now().UTC()); err != nil {
7072
return writeErrorResponse(cfg.LibrarianDir, fmt.Errorf("librariangen: failed to update changelog for %s: %w", lib.ID, err))
7173
}
7274
if err := module.GenerateInternalVersionFile(moduleDir, lib.Version); err != nil {
@@ -101,16 +103,19 @@ func updateChangelog(cfg *Config, lib *Library, t time.Time) error {
101103
return fmt.Errorf("librariangen: reading changelog: %w", err)
102104
}
103105

104-
versionString := fmt.Sprintf("### %s", lib.Version)
106+
versionString := fmt.Sprintf("## [%s]", lib.Version)
105107
if bytes.Contains(oldContent, []byte(versionString)) {
106108
slog.Info("librariangen: changelog already up-to-date", "path", relativeChangelogPath, "version", lib.Version)
107109
return nil
108110
}
109111

110112
var newEntry bytes.Buffer
111113

114+
tag := fmt.Sprintf("%s/v%s", lib.ID, lib.Version)
115+
encodedTag := strings.ReplaceAll(tag, "/", "%2F")
116+
releaseURL := "https://github.com/googleapis/google-cloud-go/releases/tag/" + encodedTag
112117
date := t.Format("2006-01-02")
113-
fmt.Fprintf(&newEntry, "%s (%s)\n\n", versionString, date)
118+
fmt.Fprintf(&newEntry, "## [%s](%s) (%s)\n\n", lib.Version, releaseURL, date)
114119

115120
changesByType := make(map[string]map[string]bool)
116121
for _, change := range lib.Changes {
@@ -125,7 +130,7 @@ func updateChangelog(cfg *Config, lib *Library, t time.Time) error {
125130
if len(subjects) == 0 {
126131
continue
127132
}
128-
fmt.Fprintf(&newEntry, "#### %s\n\n", section.Section)
133+
fmt.Fprintf(&newEntry, "### %s\n\n", section.Section)
129134
for subj := range subjects {
130135
fmt.Fprintf(&newEntry, "* %s\n", subj)
131136
}

internal/librariangen/release/release_test.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"path/filepath"
2424
"strings"
2525
"testing"
26+
"time"
2627

2728
"cloud.google.com/go/internal/postprocessor/librarian/librariangen/config"
2829
)
@@ -102,6 +103,11 @@ func assertVersion(t *testing.T, versionGoPath, wantVersion string) {
102103
}
103104

104105
func TestInit(t *testing.T) {
106+
oldNow := now
107+
defer func() { now = oldNow }()
108+
now = func() time.Time {
109+
return time.Date(2025, 9, 11, 0, 0, 0, 0, time.UTC)
110+
}
105111
tests := []struct {
106112
name string
107113
requestJSON string
@@ -130,9 +136,12 @@ func TestInit(t *testing.T) {
130136
"secretmanager/internal/version.go": `package internal; const Version = "1.15.0"`,
131137
"internal/generated/snippets/secretmanager/apiv1/snippet_metadata.google.cloud.secretmanager.v1.json": `{"version": "1.15.0"}`,
132138
},
133-
wantChangelogSubstr: "### 1.16.0",
134-
wantVersion: "1.16.0",
135-
wantSnippetVersion: `"version": "1.16.0"`,
139+
// This wantChangelogSubstr expectation intentionally includes two newline literals.
140+
wantChangelogSubstr: `## [1.16.0](https://github.com/googleapis/google-cloud-go/releases/tag/secretmanager%2Fv1.16.0) (2025-09-11)
141+
142+
`,
143+
wantVersion: "1.16.0",
144+
wantSnippetVersion: `"version": "1.16.0"`,
136145
},
137146
{
138147
name: "release not triggered",
@@ -143,7 +152,7 @@ func TestInit(t *testing.T) {
143152
name: "changelog already up-to-date",
144153
requestJSON: `{ "libraries": [ { "id": "secretmanager", "version": "1.16.0", "release_triggered": true, "apis": [{"path": "google/cloud/secretmanager/v1"}], "changes": [{"type": "feat", "subject": "add new GetSecret API"}] } ] }`,
145154
initialRepoContent: map[string]string{
146-
"secretmanager/CHANGES.md": "# Changes\n\n### 1.16.0\n- Already there.",
155+
"secretmanager/CHANGES.md": "# Changes\n\n## [1.16.0](https://github.com/googleapis/google-cloud-go/releases/tag/secretmanager%2Fv1.16.0)\n- Already there.",
147156
"internal/generated/snippets/secretmanager/apiv1/snippet_metadata.google.cloud.secretmanager.v1.json": `{"version": "1.15.0"}`,
148157
},
149158
changelogAlreadyUpToDate: true,

0 commit comments

Comments
 (0)