Skip to content

Commit

Permalink
refactor(clog): update changelog logic. (#78)
Browse files Browse the repository at this point in the history
* refactor(clog): update changelog logic.

* add logic.
  • Loading branch information
mo3et authored Oct 22, 2024
1 parent e59942b commit 429eb81
Show file tree
Hide file tree
Showing 7 changed files with 270 additions and 85 deletions.
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)
// }

0 comments on commit 429eb81

Please sign in to comment.