go tool - 快速生成CHANGELOG.md
前言
在git项目中,通过添加CHANGELOG.md可以展示项目的版本更新记录,方便用户查看项目的重大bug修复或不兼容版本信息。
本文介绍一个 changelog 工具,使用git命令获取git repository中的所有tags和commits log,生成CHANGELOG.md。
一、使用方法
安装:
go install github.com/xpunch/changelog
打开项目目录运行
changelog
或者通过命令行指定项目目录
changelog --source ~/gitrepo --output ~/gitrepo/CHANGELOG.md --fetch --verbose
二、代码实现
1、调用git命令
func git(dir string, args ...string) (string, error) { cmd := exec.Command("git", args...) var out bytes.Buffer cmd.Stdout = &out cmd.Dir = dir err := cmd.Run() return out.String(), err }
通过exec调用git命令,并传入参数,需要本地git命令可以运行,并拥有repository的访问权限。
2、拉取最新的repository
git fetch --all
更新本地仓储的tags和commits,保证生成的CHANGELOG.md是基于最新的提交记录。
3、获取tags
git tag -n -l --sort=creatordate --format %(refname:short);%(creatordate:short);%(subject)
通过上面的命令可以获取所有的tag信息。
4、获取tag间提交记录生成
git log --no-merges --format=oneline tagA..tagB
通过上面的命令可以获取两个tag间的提交记录。
5、整合获取的git信息,生成CHANGELOG.md
使用 github.com/hashicorp/go-version 比较版本号大小,并重新排序。
sort.Slice(records, func(i, j int) bool { s, t := records[i].Version, records[j].Version vs, err := version.NewVersion(s) if err != nil { return s < t } vt, err := version.NewVersion(t) if err != nil {
return s < t } return vs.LessThan(vt) })
根据提交信息前缀简单分为Features和Bug Fixes
if strings.HasPrefix(msg, "[fix]") { records[i].BugFixes = append(records[i].BugFixes, strings.TrimSpace(strings.TrimPrefix(msg, "[fix]"))) } else if strings.HasPrefix(msg, "[feat]") { records[i].Features = append(records[i].Features, strings.TrimSpace(strings.TrimPrefix(msg, "[feat]"))) } else if strings.HasPrefix(msg, "[feature]") { records[i].Features = append(records[i].Features, strings.TrimSpace(strings.TrimPrefix(msg, "[feature]"))) } else if strings.Contains(msg, "fix") { records[i].BugFixes = append(records[i].BugFixes, msg) } else { records[i].Features = append(records[i].Features, msg) }
最终效果:
# 1.1.0 (2022/01/17) ### Features - separate features and bug fixes disable fetch by deafult ### Bug Fixes - fixing first tag not have commit logs issue # 1.0.0 (2022/01/14) ### Features - support create changelog.md from git repository - Initial commit
总结
本文介绍了如何使用go调用git命令,利用git相关命令获取历史提交记录,并生成CHANGELOG.md文件。
CHANGELO格式只是我根据自己的理解定义的,如果需要自定义格式,可以fork代码自行修改。