Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(clog): update changelog logic. #78

Merged
merged 2 commits into from
Oct 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions tools/change.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## [v0.0.33](https://github.com/openimsdk/actions-test/releases/tag/v0.0.33) 2024-10-21T07:47:31Z

### Others
* rm by @mo3et in https://github.com/openimsdk/actions-test/pull/51
* 21321 by @mo3et in https://github.com/openimsdk/actions-test/pull/53
* 1x by @mo3et in https://github.com/openimsdk/actions-test/pull/54
**Full Changelog**: https://github.com/openimsdk/actions-test/compare/v3.3.3...v0.0.33


9 changes: 9 additions & 0 deletions tools/change2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## [v0.0.33](https://github.com/openimsdk/actions-test/releases/tag/v0.0.33) 2024-10-21

### Others
* rm [#51](https://github.com/openimsdk/actions-test/pull/51)
* 21321 [#53](https://github.com/openimsdk/actions-test/pull/53)
* 1x [#54](https://github.com/openimsdk/actions-test/pull/54)

**Full Changelog**: https://github.com/openimsdk/actions-test/compare/v3.3.3...v0.0.33

9 changes: 9 additions & 0 deletions tools/change3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## [v0.0.33](https://github.com/openimsdk/actions-test/releases/tag/v0.0.33) 2024-10-21

### Others
* rm [#51](https://github.com/openimsdk/actions-test/pull/51)
* 21321 [#53](https://github.com/openimsdk/actions-test/pull/53)
* 1x [#54](https://github.com/openimsdk/actions-test/pull/54)

**Full Changelog**: https://github.com/openimsdk/actions-test/compare/v3.3.3...v0.0.33

20 changes: 20 additions & 0 deletions tools/change4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
## [v0.0.41](https://github.com/openimsdk/actions-test/releases/tag/v0.0.41) 2024-10-21

### New Features
* feat: Update version to v0.0.19 [#30](https://github.com/openimsdk/actions-test/pull/30)

### Bug Fixes
* fix: swm [#34](https://github.com/openimsdk/actions-test/pull/34)

### Others
* Update version to v0.0.21 [#32](https://github.com/openimsdk/actions-test/pull/32)
* T1 [#35](https://github.com/openimsdk/actions-test/pull/35)
* update teset [#36](https://github.com/openimsdk/actions-test/pull/36)
* hello [#39](https://github.com/openimsdk/actions-test/pull/39)
* rm [#51](https://github.com/openimsdk/actions-test/pull/51)
* 21321 [#53](https://github.com/openimsdk/actions-test/pull/53)
* 1x [#54](https://github.com/openimsdk/actions-test/pull/54)
* Update CHANGELOG for release v0.0.34 [#74](https://github.com/openimsdk/actions-test/pull/74)

**Full Changelog**: [vv0.0.30...v0.0.41](https://github.com/openimsdk/actions-test/compare/v0.0.30...v0.0.41)

9 changes: 9 additions & 0 deletions tools/change5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## [v0.0.33](https://github.com/openimsdk/actions-test/releases/tag/v0.0.33) 2024-10-21

### Others
* rm [#51](https://github.com/openimsdk/actions-test/pull/51)
* 21321 [#53](https://github.com/openimsdk/actions-test/pull/53)
* 1x [#54](https://github.com/openimsdk/actions-test/pull/54)

**Full Changelog**: [vv3.3.3...v0.0.33](https://github.com/openimsdk/actions-test/compare/v3.3.3...v0.0.33)

190 changes: 190 additions & 0 deletions tools/changelog.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
package main

import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"regexp"
"strings"
)

// You can specify a tag as a command line argument to generate the changelog for a specific version.
// Example: go run tools/changelog.go v0.0.33
// If no tag is provided, the latest release will be used.

// Setting repo owner and repo name by generate changelog
const (
repoOwner = "openimsdk"
repoName = "actions-test"
)

// GitHubRepo struct represents the repo details.
type GitHubRepo struct {
Owner string
Repo string
FullChangelog string
}

// ReleaseData represents the JSON structure for release data.
type ReleaseData struct {
TagName string `json:"tag_name"`
Body string `json:"body"`
HtmlUrl string `json:"html_url"`
Published string `json:"published_at"`
}

// Method to classify and format release notes.
func (g *GitHubRepo) classifyReleaseNotes(body string) map[string][]string {
result := map[string][]string{
"feat": {},
"fix": {},
"chore": {},
"refactor": {},
"build": {},
"other": {},
}

// Regular expression to extract PR number and URL
rePR := regexp.MustCompile(`in (https://github\.com/[^\s]+/pull/(\d+))`)

// Split the body into individual lines.
lines := strings.Split(body, "\n")

for _, line := range lines {
// Use a regular expression to extract Full Changelog link and its title.
if strings.Contains(line, "**Full Changelog**") {
matches := regexp.MustCompile(`\*\*Full Changelog\*\*: (https://github\.com/[^\s]+/compare/([^\s]+))`).FindStringSubmatch(line)
if len(matches) > 2 {
// Format the Full Changelog link with title
g.FullChangelog = fmt.Sprintf("[v%s](%s)", matches[2], matches[1])
}
continue // Skip further processing for this line.
}

if strings.HasPrefix(line, "*") {
var category string

// Determine the category based on the prefix.
if strings.HasPrefix(line, "* feat") {
category = "feat"
} else if strings.HasPrefix(line, "* fix") {
category = "fix"
} else if strings.HasPrefix(line, "* chore") {
category = "chore"
} else if strings.HasPrefix(line, "* refactor") {
category = "refactor"
} else if strings.HasPrefix(line, "* build") {
category = "build"
} else {
category = "other"
}

// Extract PR number and URL
matches := rePR.FindStringSubmatch(line)
if len(matches) == 3 {
prURL := matches[1]
prNumber := matches[2]
// Format the line with the PR link
formattedLine := fmt.Sprintf("* %s [#%s](%s)", strings.Split(line, " by ")[0][2:], prNumber, prURL)
result[category] = append(result[category], formattedLine)
} else {
// If no PR link is found, just add the line as is
result[category] = append(result[category], line)
}
}
}

return result
}

// Method to generate the final changelog.
func (g *GitHubRepo) generateChangelog(tag, date, htmlURL, body string) string {
sections := g.classifyReleaseNotes(body)

// Convert ISO 8601 date to simpler format (YYYY-MM-DD)
formattedDate := date[:10]

// Changelog header with tag, date, and links.
changelog := fmt.Sprintf("## [%s](%s) %s\n\n", tag, htmlURL, formattedDate)

if len(sections["feat"]) > 0 {
changelog += "### New Features\n" + strings.Join(sections["feat"], "\n") + "\n\n"
}
if len(sections["fix"]) > 0 {
changelog += "### Bug Fixes\n" + strings.Join(sections["fix"], "\n") + "\n\n"
}
if len(sections["chore"]) > 0 {
changelog += "### Chores\n" + strings.Join(sections["chore"], "\n") + "\n\n"
}
if len(sections["refactor"]) > 0 {
changelog += "### Refactors\n" + strings.Join(sections["refactor"], "\n") + "\n\n"
}
if len(sections["build"]) > 0 {
changelog += "### Builds\n" + strings.Join(sections["build"], "\n") + "\n\n"
}
if len(sections["other"]) > 0 {
changelog += "### Others\n" + strings.Join(sections["other"], "\n") + "\n\n"
}

if g.FullChangelog != "" {
changelog += fmt.Sprintf("**Full Changelog**: %s\n", g.FullChangelog)
}

return changelog
}

// Method to fetch release data from GitHub API.
func (g *GitHubRepo) fetchReleaseData(version string) (*ReleaseData, error) {
var apiURL string

if version == "" {
// Fetch the latest release.
apiURL = fmt.Sprintf("https://api.github.com/repos/%s/%s/releases/latest", g.Owner, g.Repo)
} else {
// Fetch a specific version.
apiURL = fmt.Sprintf("https://api.github.com/repos/%s/%s/releases/tags/%s", g.Owner, g.Repo, version)
}

resp, err := http.Get(apiURL)
if err != nil {
return nil, err
}
defer resp.Body.Close()

body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}

var releaseData ReleaseData
err = json.Unmarshal(body, &releaseData)
if err != nil {
return nil, err
}

return &releaseData, nil
}

func main() {
repo := &GitHubRepo{Owner: repoOwner, Repo: repoName}

// Get the version from command line arguments, if provided
var version string // Default is use latest

if len(os.Args) > 1 {
version = os.Args[1] // Use the provided version
}

// Fetch release data (either for latest or specific version)
releaseData, err := repo.fetchReleaseData(version)
if err != nil {
fmt.Println("Error fetching release data:", err)
return
}

// Generate and print the formatted changelog
changelog := repo.generateChangelog(releaseData.TagName, releaseData.Published, releaseData.HtmlUrl, releaseData.Body)
fmt.Println(changelog)
}
109 changes: 24 additions & 85 deletions tools/main.go
Original file line number Diff line number Diff line change
@@ -1,85 +1,24 @@
package main

import (
"fmt"
"regexp"
"strings"
)

// Function to classify and format release notes
func classifyReleaseNotes(body string) map[string][]string {
result := map[string][]string{
"feat": {},
"fix": {},
"chore": {},
"other": {},
}

// Regular expression to extract PR number and URL
rePR := regexp.MustCompile(`https://github\.com/[^\s]+/pull/(\d+)`)

// Split the body into individual lines
lines := strings.Split(body, "\n")

for _, line := range lines {
if strings.HasPrefix(line, "*") {
var category string

// Determine the category based on the prefix
if strings.HasPrefix(line, "* feat") {
category = "feat"
} else if strings.HasPrefix(line, "* fix") {
category = "fix"
} else if strings.HasPrefix(line, "* chore") {
category = "chore"
} else {
category = "other"
}

// Extract PR number and URL
matches := rePR.FindStringSubmatch(line)
if len(matches) == 2 {
prURL := matches[0]
prNumber := matches[1]
// Format the line with the PR link
formattedLine := fmt.Sprintf("* %s [#%s](%s)", strings.Split(line, " by ")[0][2:], prNumber, prURL)
result[category] = append(result[category], formattedLine)
} else {
// If no PR link is found, just add the line as is
result[category] = append(result[category], line)
}
}
}

return result
}

// Function to generate the final changelog
func generateChangelog(body string) string {
sections := classifyReleaseNotes(body)

changelog := "# Changelogs\n\n"
if len(sections["feat"]) > 0 {
changelog += "### New Features\n" + strings.Join(sections["feat"], "\n") + "\n\n"
}
if len(sections["fix"]) > 0 {
changelog += "### Bug Fixes\n" + strings.Join(sections["fix"], "\n") + "\n\n"
}
if len(sections["chore"]) > 0 {
changelog += "### Chores\n" + strings.Join(sections["chore"], "\n") + "\n\n"
}
if len(sections["other"]) > 0 {
changelog += "### Others\n" + strings.Join(sections["other"], "\n") + "\n\n"
}

return changelog
}

func main() {
// Example release notes content
body := "## What's Changed\r\n* feat(test): Update version to v0.0.19 by @github-actions in https://github.com/openimsdk/actions-test/pull/30\r\n* Update version to v0.0.21 by @github-actions in https://github.com/openimsdk/actions-test/pull/32\r\n* fix: swm by @mo3et in https://github.com/openimsdk/actions-test/pull/34\r\n* feat: Update 66666 by @github-actions in https://github.com/openimsdk/actions-test/pull/66\r\n* T1 by @mo3et in https://github.com/openimsdk/actions-test/pull/35\r\n* update teset by @mo3et in https://github.com/openimsdk/actions-test/pull/36\r\n* hello by @mo3et in https://github.com/openimsdk/actions-test/pull/39\r\n* chore: rm by @mo3et in https://github.com/openimsdk/actions-test/pull/51\r\n* 21321 by @mo3et in https://github.com/openimsdk/actions-test/pull/53\r\n* 1x by @mo3et in https://github.com/openimsdk/actions-test/pull/54\r\n* Update CHANGELOG for release v0.0.34 by @github-actions in https://github.com/openimsdk/actions-test/pull/74"

// Generate and print the formatted changelog
changelog := generateChangelog(body)
fmt.Println(changelog)
}
// package main

// import (
// "fmt"
// )

// func main() {
// // Create a new GitHubRepo instance
// repoOwner := "openimsdk"
// repoName := "actions-test"
// repo := &GitHubRepo{Owner: repoOwner, Repo: repoName}

// // Fetch release data (you can pass a version or leave it empty for latest)
// version := "v0.0.33" // Example version
// releaseData, err := repo.fetchReleaseData(version)
// if err != nil {
// fmt.Println("Error fetching release data:", err)
// return
// }

// // Generate and print the formatted changelog
// changelog := repo.generateChangelog(releaseData.TagName, releaseData.Published, releaseData.HtmlUrl, releaseData.Body)
// fmt.Println(changelog)
// }
Loading