go tool - 快速生成CHANGELOG.md

前言

在git项目中,通过添加CHANGELOG.md可以展示项目的版本更新记录,方便用户查看项目的重大bug修复或不兼容版本信息。

本文介绍一个 changelog 工具,使用git命令获取git repository中的所有tags和commits log,生成CHANGELOG.md。

一、使用方法

安装:

1
go install github.com/xpunch/changelog

打开项目目录运行

1
changelog

或者通过命令行指定项目目录

1
changelog --source ~/gitrepo --output ~/gitrepo/CHANGELOG.md --fetch --verbose

二、代码实现

1、调用git命令

1
2
3
4
5
6
7
8
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

1
git fetch --all

更新本地仓储的tags和commits,保证生成的CHANGELOG.md是基于最新的提交记录。

3、获取tags

1
git tag -n -l --sort=creatordate --format %(refname:short);%(creatordate:short);%(subject)

通过上面的命令可以获取所有的tag信息。

4、获取tag间提交记录生成

1
git log --no-merges --format=oneline tagA..tagB

通过上面的命令可以获取两个tag间的提交记录。

5、整合获取的git信息,生成CHANGELOG.md

使用 github.com/hashicorp/go-version 比较版本号大小,并重新排序。

1
2
3
4
5
6
7
8
9
10
11
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 {<br>                return s < t
    }
    return vs.LessThan(vt)
})

根据提交信息前缀简单分为Features和Bug Fixes

1
2
3
4
5
6
7
8
9
10
11
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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

posted @   xpunch  阅读(805)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示