發布軟體時通常都會寫 Release Note,但每次從頭手打也有點累,可以考慮從 Git 的提交歷史中自動生成,
Git 提交資訊一般是三段式結構,段落之間使用空行隔開:
<subject>
// 空行
<body>
// 空行
<trailers>
subject 和 body 自不必多說,trailers 中一般是一條條鍵 -- 值對構成的資訊,鍵和值由冒號 : 分隔,比如 Git 的 Commiter: 就可以視為一條 trailer,Gerrit 代碼審查通過后,也會在 Git 提交訊息中添加 Reviewed-by: 和 Tested-by: 之類的 trailer,
現假設提交資訊中的 trailers 包含 Type 和 Issue 欄位,分別表示類別(NewFeature, BugFix 之類)和 BUG 編號(GitHub 上的 issue 編號或者內部系統的 BUG 編號):
Fixed a crash
- blahblah
- blahblahblah
Type: BugFix
Issue: issue-120
就可以結合 git log 和 awk 生成 Rlease Note:
git log --format='%(trailers:key=Type,valueonly,separator=%x20)%x1c%s [%(trailers:key=Issue,valueonly,separator=,)]' $FROM..HEAD | awk -F "\034" '
{
gsub(/\[\]$/, "", $2);
if (length($1) == 0) $1="MISC";
if (!($1 in item_count)) item_count[$1]=0;
items[$1, item_count[$1]]=$2;
item_count[$1]++;
}
END {
for (k in item_count) {
print k;
k2=k;
gsub(/./, "-", k2);
print k2
for (i=0; i<item_count[k]; i++) print "* "items[k, i];
print ""
}
}'
輸出:
BugFix
------
* Fixed a typo
* Fixed a crash [issue-120]
NewFeature
----------
* Added some magic
選擇使用
awk處理git log的輸出是因為 linux 跟 macOS 都帶這個軟體,不需要額外安裝依賴,
Git 2.22.0 及以上版本才支持按鍵值篩選trailers,
在 Windows 系統上,可能沒有辦法直接運行 .sh 檔案,但是如果安裝了 Windows 版本的 Git,則會帶一個 Git Bash(也帶了 awk!),這樣就可以在 Git Bash 中運行 .sh 檔案,也可以創建一個 .cmd 檔案包裝一下:
@ECHO off
SETLOCAL
CALL :FIND-PATH GITEXE_PATH git.exe
IF "%GITEXE_PATH%"=="" (
ECHO git.exe is not found on your system
EXIT /B 2
)
CALL :GET-DIR-NAME GITEXE_DIR "%GITEXE_PATH%"
CALL :GET-DIR-NAME GITEXE_DIR "%GITEXE_DIR:~0,-1%"
@"%GITEXE_DIR%bin\bash.exe" release-note.sh %*
:FIND-PATH
SET "%~1=%~f$PATH:2"
EXIT /B
:GET-DIR-NAME
SET "%~1=%~dp2"
EXIT /B
上面的腳本只能把 release note 生成出來,如果可以直接添加到 changelog.md 就好了,可以把腳本做如下改動,
一,添加版本資訊,添加一個變數 PROJ_VER 表示當前專案版本,以 maven 專案為例:
PROJ_VER=`./mvnw help:evaluate -Dexpression='project.version' -q -DforceStdout|tail -n 1`
然后將這個變數暴露給 awk,在 awk 命令后面添加 -v PROJ_VER PROJ_VER 即可,
二,將版本和日期列印出來,在 awk 程式中添加 BEGIN 塊:
BEGIN {
"date +%Y-%m-%d"|getline date;
if (PROJ_VER == "") print "# "date;
else print "# "PROJ_VER" "date;
}
三,在 change.md 頭部追加生成的內容:
# 生成臨時檔案
tempf=`mktemp $TEMP/changelog.md.XXXX`
touch changelog.md
# 將生成的內容與原 changelog.md 中的內容合并,保存到臨時檔案中,然后用臨時檔案替換當前檔案即可
... | cat - changelog.md > $tempf && mv $tempf changelog.md
這樣一頓操作下來,生成的 changelog.md 如下:
# 1.2.3 2023-03-31
BugFix
------
* Fixed a typo
* Fixed a crash [issue-120]
NewFeature
----------
* Added some magic

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/548837.html
標籤:其他
下一篇:最長上升子序列 II
