编写一个python脚本,用于为每一条git记录增加行号

之所以有这个想法是,每一次发提测邮件时,都要附上提交记录,git log 在输出时,本身可以做到格式化的输出,但是没有序号不知道多少条,整体显得比较凌乱,尤其是 git 提交时,不仅有subject还有body时,邮件显得就更乱了,为了自动化加工git日志,想着编写一个python脚本来处理,将结果直接输出到剪切版

  1. 本脚本在设计时,希望可以灵活使用,既可以直接使用命令行获取,也可以作为模块导入到其他模块中,比如导入到自动化打包机中
  2. 本脚本在设计时,希望可以提供灵活的使用,定义了很多自定义参数,为了方便使用,每个参数都有默认值,需要哪个参数就传递哪个参数
  3. 尽可能可以在Mac、Linux、Windows平台都能使用

算法原理什么的就不说了,注释写的很详细,直接上干货

#!/usr/bin/python3
# -*- coding: utf-8 -*-

'为git日志输出增加序号'

__author__ = 'Huang Jiashu'

import os
import sys
import getopt # 用于获取命令行输入
import pathlib as plb # 用于跨平台路径
import pyperclip as cboard # 用于剪切板 pip3 install pyperclip


# 用途:通过对git log 的处理 ,为每一个commit 添加 序号 1、2、3、 等
# 说明:本脚本使用python3编写,使用此脚步您需要pyhton3的环境,并且需要安装clipboard模块用于将处理后的结果copy到剪切板
# 提供默认参数,默认工作路径workspace,默认 git log 命令
# 需要通过python3运行 python3 xxx 如果python3的路径在/usr/bin/python3 可直接运行xxx

short_opt = "h:w:s:e:a:n:f:g:b:d:"
long_opt = ["help"
        "workspace=",
        "start_date=",
        "end_date=",
        "author=",
        "number=",
        "format=",
        "dateformat=",
        "git_log_cmd=",
        "branch="]
workspace = "/Users/ugreen/Developer/UGREEN-WORKSPACE/ugreen-main"#默认的工作目录,即git仓库目录,您可以在此修改一次永久使用,也可以通过参数传入
git_log_cmd = ''#可以传入整个git 命令,其他参数失效
start_date = ''#开始时间
end_date = ''#结束时间 可以不传
author = ''#作者 可以不传
number = '1000' #获取个数 默认最多输出1000个可以不传
format = "%ad %an%s%n%b"#可以不传
dateformat = "%m-%d %H:%M:%S"#可以不传
branch = ''#分支名

def handleArgInCmd():
      #0 获取命令行输入
    argv = sys.argv[1:]
    opts = []
    # print(f"命令行输入内容为:{argv}")
    global workspace,start_date,end_date,author,number,format,git_log_cmd,branch,dateformat;
    try:
        opts, args = getopt.getopt(argv,short_opt,long_opt)
        print(f"opts:{opts},args:{args}")

        for opt, arg in opts:
            if opt in ['-w','--workaspce']:
                workspace = arg
            elif opt in ['-s','--start_date']:
                start_date = arg
            elif opt in ['-e','--end_date']:
                end_date = arg
            elif opt in ['-a','--author']:
                author = arg
            elif opt in ['-n','--number']:
                number = arg
            elif opt in ['-f','--format']:
                format = arg
            elif opt in ['-d','--dateformat']:
                dateformat = arg
            elif opt in ['-g','--git_log_cmd']:
                git_log_cmd = arg
            elif opt in ['-b','--branch']:
                branch = arg
            # print(f'opt:{opt},arg:{arg}')
    except Exception as e:
        print(f"Error:{e.args}")

def handleLog(workspace=workspace,branch=branch,start_date=start_date,end_date=end_date,author=author,number=number,format=format,git_log_cmd=git_log_cmd,dateformat=dateformat):
    print(f'worksapce:{workspace},branch:{branch},start_date:{start_date},end_date:{end_date},author:{author},number:{number},format:{format},cmd:{git_log_cmd},dateformat:{dateformat}')
    if not plb.Path(workspace).exists():
        print("工作路径不存在,请确认")
        sys.exit()
        
    # 1. 切换工作路径 到 git仓库所在位置
    log_path = plb.PurePath(plb.Path.home(),'commit-log.txt') # 适配 Linux系统 和 Windows系统 在不同平台表示不同,中间过度使用,不作为最终输出
    os.chdir(workspace)
    print("1. 搜集日志,已切换到工作目录")
    # 如果使用自己git-log-cmd命令,则直接使用,将结果导入我们预备好的文件
    if len(git_log_cmd) <= 0:
        # 使用自定义
        git_log_cmd = f'git log --no-merges'
        if len(branch):
            git_log_cmd += f' {branch}'
        if len(author):
            git_log_cmd += f' --author={author}'
        if len(start_date):
            git_log_cmd += f' --after={start_date}'
        if len(end_date):
            git_log_cmd += f' --until={end_date}'
        git_log_cmd += f' -n {number}'
        git_log_cmd += f' --date=format:"{dateformat}"'
        git_log_cmd += f' --format="###{format}###"'# 增加开始结束标记
        git_log_cmd += f' > {log_path}'
    # 执行git命令,将结果写入临时文件
    print(f'执行命令为:{git_log_cmd}')
    os.system(git_log_cmd)
    # 2. 获取日志 格式您可以自定义 这里是 名字提交信息头换行提交信息体 前后添加了每一条到开始和结束标记 用于后续拎出来每一次的提交
    print("2. 已获取日志文件,正在处理...")
    # 3. 处理日志,添加 序号
    logContent = ""
    index = 1
    with open(log_path,'r') as f:
        for line in f.readlines():
            # 结束标记
            if line == os.linesep or line == f"###{os.linesep}":
                continue
            handledLine = line
            # 获取###是每一条日志的开始
            if handledLine.startswith("###"):
                #   添加序号,删除 前缀标记
                handledLine = f"{index}、" + line[3:]
                index += 1
            logContent += handledLine


            
    f.close()

    # 4. 复制到剪贴板
    cboard.copy(logContent)
    print("3. 日志处理完毕,已copy到粘贴板")
#    print("3. 日志处理完毕")
    print(logContent)
    return logContent


def main():
    try:
        argv = sys.argv[1:]
        print(f"命令行输入内容为:{argv}")
        opts, args = getopt.getopt(argv, short_opt, long_opt)
    except getopt.GetoptError as err:
        # print help information and exit:
        print(err)  # will print something like "option -a not recognized"
        usage()
        sys.exit(2)

    for o, a in opts:
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        else:
            handleArgInCmd()
            handleLog(
                workspace,
                branch,
                start_date,
                end_date,
                author,
                number,
                format,
                git_log_cmd,
                dateformat,

            )
            return

def usage():
    usage = """
    使用说明:几乎所有的选项都是可选的
    0. -h 或者 --help 帮助
    1. -w 或者 --workspace= 表示工作路径
    2. -s 或者 --start_date= 表示日志开始时间
    3. -e 或者 --end_date= 表示日志结束时间
    4. -a 或者 --author= 表示作者
    5. -n 或者 --number= 表示日志最大个数
    6. -f 或者 --format= 表示 自定义的fomart 格式
    7. -b 或者 --branch= 表示获取哪个分支的日志
    8. -g 或者 --git_log_cmd= 表示使用自定义的git_log_cmd命令,使用此命令不会添加序号
    9. -d 使用 --dateformat= 表示指定日期格式
    """
    print(usage);

# handleLog()

if __name__ == "__main__":
    main()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容