Skip to content

Commit f91ee2c

Browse files
authored
Merge pull request #1657 from ksylvan/0727-automated-release-notes
Add GitHub Release Description Update Feature
2 parents f5fba12 + 98968d9 commit f91ee2c

File tree

7 files changed

+106
-0
lines changed

7 files changed

+106
-0
lines changed

.github/workflows/release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ jobs:
122122
else
123123
echo "Release ${{ env.latest_tag }} already exists."
124124
fi
125+
go run ./cmd/generate_changelog --release ${{ env.latest_tag }}
125126
126127
- name: Upload release artifact
127128
if: matrix.os == 'windows-latest'

cmd/generate_changelog/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ generate_changelog --cache /path/to/cache.db
101101
| `--force-pr-sync` | | Force a full PR sync from GitHub | false |
102102
| `--token` | | GitHub API token | `$GITHUB_TOKEN` |
103103
| `--ai-summarize` | | Generate AI-enhanced summaries using Fabric | false |
104+
| `--release` | | Update GitHub release description with AI summary for version | |
104105

105106
## Output Format
106107

cmd/generate_changelog/changelog.db

0 Bytes
Binary file not shown.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
### PR [#1657](https://github.com/danielmiessler/Fabric/pull/1657) by [ksylvan](https://github.com/ksylvan): Add GitHub Release Description Update Feature
2+
3+
- Add GitHub release description update via `--release` flag
4+
- Implement `ReleaseManager` for managing release descriptions
5+
- Create `release.go` for handling release updates
6+
- Update `release.yml` to run changelog generation
7+
- Enable AI summary updates for GitHub releases

cmd/generate_changelog/internal/config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ type Config struct {
1717
IncomingDir string
1818
Push bool
1919
SyncDB bool
20+
Release string
2021
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package internal
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/danielmiessler/fabric/cmd/generate_changelog/internal/cache"
8+
"github.com/danielmiessler/fabric/cmd/generate_changelog/internal/config"
9+
"github.com/google/go-github/v66/github"
10+
"golang.org/x/oauth2"
11+
)
12+
13+
type ReleaseManager struct {
14+
cache *cache.Cache
15+
githubToken string
16+
owner string
17+
repo string
18+
}
19+
20+
func NewReleaseManager(cfg *config.Config) (*ReleaseManager, error) {
21+
cache, err := cache.New(cfg.CacheFile)
22+
if err != nil {
23+
return nil, fmt.Errorf("failed to create cache: %w", err)
24+
}
25+
26+
return &ReleaseManager{
27+
cache: cache,
28+
githubToken: cfg.GitHubToken,
29+
owner: "danielmiessler",
30+
repo: "fabric",
31+
}, nil
32+
}
33+
34+
func (rm *ReleaseManager) Close() error {
35+
return rm.cache.Close()
36+
}
37+
38+
func (rm *ReleaseManager) UpdateReleaseDescription(version string) error {
39+
versions, err := rm.cache.GetVersions()
40+
if err != nil {
41+
return fmt.Errorf("failed to get versions from cache: %w", err)
42+
}
43+
44+
versionData, exists := versions[version]
45+
if !exists {
46+
return fmt.Errorf("version %s not found in versions table", version)
47+
}
48+
49+
if versionData.AISummary == "" {
50+
return fmt.Errorf("ai_summary is empty for version %s", version)
51+
}
52+
53+
releaseBody := fmt.Sprintf("## Changes\n\n%s", versionData.AISummary)
54+
55+
ctx := context.Background()
56+
var client *github.Client
57+
58+
if rm.githubToken != "" {
59+
ts := oauth2.StaticTokenSource(
60+
&oauth2.Token{AccessToken: rm.githubToken},
61+
)
62+
tc := oauth2.NewClient(ctx, ts)
63+
client = github.NewClient(tc)
64+
} else {
65+
client = github.NewClient(nil)
66+
}
67+
68+
release, _, err := client.Repositories.GetReleaseByTag(ctx, rm.owner, rm.repo, version)
69+
if err != nil {
70+
return fmt.Errorf("failed to get release for version %s: %w", version, err)
71+
}
72+
73+
release.Body = &releaseBody
74+
_, _, err = client.Repositories.EditRelease(ctx, rm.owner, rm.repo, *release.ID, release)
75+
if err != nil {
76+
return fmt.Errorf("failed to update release description for version %s: %w", version, err)
77+
}
78+
79+
fmt.Printf("Successfully updated release description for %s\n", version)
80+
return nil
81+
}

cmd/generate_changelog/main.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os"
66
"path/filepath"
77

8+
internal "github.com/danielmiessler/fabric/cmd/generate_changelog/internal"
89
"github.com/danielmiessler/fabric/cmd/generate_changelog/internal/changelog"
910
"github.com/danielmiessler/fabric/cmd/generate_changelog/internal/config"
1011
"github.com/joho/godotenv"
@@ -42,13 +43,18 @@ func init() {
4243
rootCmd.Flags().StringVar(&cfg.IncomingDir, "incoming-dir", "./cmd/generate_changelog/incoming", "Directory for incoming PR files")
4344
rootCmd.Flags().BoolVar(&cfg.Push, "push", false, "Enable automatic git push after creating an incoming entry")
4445
rootCmd.Flags().BoolVar(&cfg.SyncDB, "sync-db", false, "Synchronize and validate database integrity with git history and GitHub PRs")
46+
rootCmd.Flags().StringVar(&cfg.Release, "release", "", "Update GitHub release description with AI summary for version (e.g., v1.2.3)")
4547
}
4648

4749
func run(cmd *cobra.Command, args []string) error {
4850
if cfg.IncomingPR > 0 && cfg.ProcessPRsVersion != "" {
4951
return fmt.Errorf("--incoming-pr and --process-prs are mutually exclusive flags")
5052
}
5153

54+
if cfg.Release != "" && (cfg.IncomingPR > 0 || cfg.ProcessPRsVersion != "" || cfg.SyncDB) {
55+
return fmt.Errorf("--release cannot be used with other processing flags")
56+
}
57+
5258
if cfg.GitHubToken == "" {
5359
cfg.GitHubToken = os.Getenv("GITHUB_TOKEN")
5460
}
@@ -70,6 +76,15 @@ func run(cmd *cobra.Command, args []string) error {
7076
return generator.SyncDatabase()
7177
}
7278

79+
if cfg.Release != "" {
80+
releaseManager, err := internal.NewReleaseManager(cfg)
81+
if err != nil {
82+
return fmt.Errorf("failed to create release manager: %w", err)
83+
}
84+
defer releaseManager.Close()
85+
return releaseManager.UpdateReleaseDescription(cfg.Release)
86+
}
87+
7388
output, err := generator.Generate()
7489
if err != nil {
7590
return fmt.Errorf("failed to generate changelog: %w", err)

0 commit comments

Comments
 (0)