一、前提:
每次发版后,都是人工去整理git log进行发版说明,结合项目需要,决定写个小工具获取git log,主要实现的功能点有以下几点:
1、获取git commit 时的记录。
2、在commit中有提及修复BUG编号的需加上对应的BUG地址,方便阅读时可以跳转到指定BUG直接查看BUG的提交记录,因为项目有两个提交BUG的平台,所以还有对平台做区分。
3、开放配置项,避免项目地址、BUG平台地址发生改变时还要改代码
4、输出为md文档。
二、解决思路:
1、基于git命令实现,我们在项目内往往会使用git log命令来查看git commit 时的记录
2、然后我们将这份记录保存为txt文件,利用控制台保存文件的命令:git log > 文件名
3、再去python打开这份文件进行解析,摘取我们想要的关键语句和加上我们想要的内容另存为md文件,就OK了(编程的尽头就是处理字符串hhhh)。
三、python代码:
有一段时间没写python,有的地方不严谨,小伙伴们就自己根据自己的项目进行适当修改吧。
点击查看代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Date:2022年12月08日
# Author:七楼萌新
# Mail:
# Function:获取git的conmmit记录,输出changeLog.md文档
# Version:V1.0
import time
import os
global configFileName, mdfileName, fileName, configDict
configFileName = "getChangeLog.config"
mdfileName = "changeLog.md"
fileName = "changeLog.txt"
# 获取配置
def getConfig(list):
global configFileName, mdfileName, fileName, configDict
configDict = {}
for i in list:
if i.find('##') > -1:
pass
else:
configDict[i[0:i.find(":")]] = i[i.find(":")+1:-1]
# 无配置文件时,初始化配置
def setConfig(dict):
global configFileName, mdfileName, fileName, configDict
setConfigStr = ""
for key in dict:
setConfigStr += "%s:%s\n" % (key, dict[key])
return setConfigStr
# 设置md输出格式
def setStr(mdLineList, dictList):
global configFileName, mdfileName, fileName, configDict
if len(dictList['Merge']) == 0:
str = "%s\n* %s([%s](%s%s)) by :**%s**" % (mdLineList, dictList["log"],
dictList["commit"], configDict["gitURL"], dictList["commit"], dictList["Author"])
return str
else:
return mdLineList
# 删除文件
def delFile(fileName):
if os.path.isfile(fileName):
try:
os.remove(fileName)
except BaseException as e:
print("删除旧文件失败,请手动删除"+fileName)
# 主函数
def main():
global configFileName, mdfileName, fileName, configDict
#检测是否有配置文件,有就用配置文件里面的内容,没有就初始化配置文件
if os.path.isfile(configFileName):
configFile = open(configFileName, mode='r', encoding='UTF-8')
configLineList = configFile.readlines()
configFile.close()
getConfig(configLineList)
else:
configFile = open(configFileName, mode='w+', encoding='UTF-8')
configDict = {
"gitCommand": "git log",
"gitURL": "https://xxx/xxx/xxx/commit/", #git项目地址
#BUG平台地址1,提交commit时,在BUG编号前面加上#,例如 BUGFIX 修复问题1#BUG001,就会自动跳转到对应BUG地址,
#这个还需要BUG平台那边对路由跳转做一个处理
"bugURL": "https://xxx/xxx/xxx/?id=",
#BUG平台地址2,提交commit时,在BUG编号前面加上#,例如 BUGFIX 修复问题1#test-BUG001,就会自动跳转到对应BUG地址,
#这个还需要BUG平台那边对路由跳转做一个处理
"testURL": "https://oa-test.starnetiot.net/demandMenu/demand/?id=",
}
configFile.write(setConfig(configDict))
configFile.close()
os.system(configDict["gitCommand"]+" > "+fileName) #在控制台输出git命令获取git log
sum = 0 #简单的等待函数,避免有的时候系统生成git log文件数度太慢,在这期间如果检测到生成了就跳出等待
flag = False
while (sum < 20):
if os.path.isfile(fileName):
flag = True
break
else:
time.sleep(0.5)
sum += 1
if flag == True:
file = open(fileName, mode='r', encoding='UTF-8')
# 读取git-log文本
lineList = file.readlines()
file.close()
# 处理git-log文本,转换成md文件
dictList = {}
mdLineList = "## "+time.strftime('%Y-%m-%d')
for i in lineList: #逐行解析
if (i[0:7] == "commit "): #保存提交记录
if len(dictList) > 0:
mdLineList = setStr(mdLineList, dictList) #把收集和整理好的提交记录储存起来
dictList = {"commit": "", "Author": "", "log": "", "Merge": ""} #循环到commit 就代表到了新的提交记录,重新记录
dictList["commit"] = i[7:15]
elif (i.find('Merge: ') > -1 or i.find('Merge branch') > -1): #跳过合并相关的gitlog
dictList["Merge"] = i[7:22]
elif (i[0:8] == "Author: "): #保存作者
dictList["Author"] = i[8:i.find(" <")]
elif (i.isspace() or i[0:8] == "Date: " or i.rfind('Conflicts') > -1 or i.rfind('frontend') > -1 or i.rfind('backend') > -1):
pass #个别不做处理的gitlog语句,例如空行、提交日期、项目路径等
else:
if (i.rfind('#test-') > -1 and (not configDict["testURL"].isspace())):#检测到#和#test等特殊标识服时加上对应跳转网址
index = i.rfind('#test-')
i = i[0:index]+"["+i[index:-1] + \
"](%s%s)" % (configDict["testURL"], i[index+6:-1])+')'
elif (i.rfind('#') > -1 and (not configDict["bugURL"].isspace())):
index = i.rfind('#')
i = i[0:index]+"["+i[index:-1] + \
"](%s%s)" % (configDict["bugURL"], i[index+1:-1])+')'
dictList["log"] = dictList["log"] + i[3:-1]
mdLineList = setStr(mdLineList, dictList)
mdFile = open(mdfileName, mode='w+', encoding='UTF-8') #新建一个文件
mdFile.write(mdLineList) #把解析好、处理好的字符串写进文件并保存
mdFile.close() #关闭文件
delFile(fileName) #删除解析的源文件
else:
print("生成git文件错误,请检查git环境是否正常")
if __name__ == "__main__":
main()