首页 > 编程语言 >用python写一个获取git log也就是changeLog的小工具

用python写一个获取git log也就是changeLog的小工具

时间:2022-12-22 15:22:24浏览次数:50  
标签:git log python configDict fileName dictList BUG

一、前提:
每次发版后,都是人工去整理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()

标签:git,log,python,configDict,fileName,dictList,BUG
From: https://www.cnblogs.com/loveniko/p/16998801.html

相关文章

  • Python 列表(List)
    目录列表列表简介列表的创建基本语法[]创建list()创建range()创建整数列表推导式生成列表列表元素的增加和删除append()方法+运算符操作extend()方法append与extend的区别:i......
  • Zeppelin-0.9.0安装并集成Hive、Spark、MySQL、Python
    1、下载安装包http://archive.apache.org/dist/zeppelin/zeppelin-0.9.0/2、上传zeppelin-0.9.0-bin-all.tgz至/opt/soft3、解压tar-zxvf/opt/soft/zeppelin-0.......
  • Python通过Jwt创建Token
    importtimeimportjwt#pipinstallPyJWTimporthashlibimportjsonimportbase64frompyDesimportdes,PAD_PKCS5,CBCSECRET_KEY='django-insecure-fr&......
  • ArcGIS Python 修改面的左上角为第一个点
    面的节点夹角大于30并且小于150,距离外界矩形左上角最近的点为第一个点,对于多部件每一个都修改,修改面的开始点位置,运行界面如图14-10所示。  #coding=utf8impor......
  • 教你用Python实现BMI计算器
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!<br/>我们来用Python相关知识,做一个BMI计算器的案例。你可以通过控制台的提示信息,输入身高和体重,注意单......
  • Git使用教程
    目录​​Git和SVN的区别​​​​Git的安装​​​​Git结构​​​​Git和代码托管中心​​​​本地库和远程库的交互​​​​Git的命令行操作​​​​本地库初始化​​​​Gi......
  • QFileDialog取消按钮显示英文的问题?
    1.问题描述设置了语言为中文,但是打开之后,可是QFileDialog打开之后还是取消按钮始终是cancel,不会变,打开按钮初始状态也是open,点击选中某个文件夹时,才会时打开;MultiFileDi......
  • python 虚拟环境搭建全流程
    首先,建立python虚拟环境test_env:python3-mvenvtest_env#激活虚拟环境source./test_env/bin/activate#linuxvenv/Scripts/activate#windows#停止虚拟环......
  • 37python的创建虚拟环境和项目
    如需打包所运行的第三方库版本命令如下:pipfreeze>requirements.txt构建虚拟环境个人习惯加点(表示隐藏)安装其它库出现此错误解决方法一:管理员的方式打开......
  • Python__10--函数结构之循环结构与嵌套结构
    1循环结构循环结构有一个循环体,循环体是一段代码。对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次。range函数range函数一般配合for循环使用range......