go tool - 快速生成CHANGELOG.md

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代码自行修改。

完整代码:https://github.com/xpunch/changelog