Python实现一个Git日志统计分析的小工具


Posted in Python onDecember 14, 2017

前言

本文介绍的是利用Python实现的一个小工具,用于分析Git commit log,获得Git Project每个成员的简单行为数据。

Warning:代码量不能代表程序员能力水平!

启动参数

共5个。

  • Repo地址
  • Commit 起始日期
  • Commit 结束日期
  • Git仓库子目录
  • 统计分析结果CSV文件目标路径

exec_git

Git Log命令:

git -C {} log --since={} --until={} --pretty=tformat:%ae --shortstat --no-merges -- {} > {}

填入参数,调用系统命令'os.system()',输出结果至本地临时文件。读取至内存,简单的String Array。

parse

Git Log输出有3种格式,对应3种正则表达式。

REPATTERN_FULL = r"\s(\d+)\D+(\d+)\D+(\d+)\D+\n"
REPATTERN_INSERT_ONLY = r"\s(\d+)\D+(\d+)\sinsertion\D+\n"
REPATTERN_DELETE_ONLY = r"\s(\d+)\D+(\d+)\sdeletion\D+\n"

遍历得到的数据,首先构造一个以Author为Key,分析结果为Value的字典。

分析结果构造一个元祖,包括:

  • Commit 次数
  • 增加代码行数
  • 删除代码行数
  • 变更代码行数

save_csv

简单省略。

示例代码:

#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
'''Analyse git branch commit log, for every version, every person.'''
import os
import sys
import re
import csv
GIT_LOG = r'git -C {} log --since={} --until={} --pretty=tformat:%ae --shortstat --no-merges -- {} > {}'
REPATTERN_FULL = r"\s(\d+)\D+(\d+)\D+(\d+)\D+\n"
REPATTERN_INSERT_ONLY = r"\s(\d+)\D+(\d+)\sinsertion\D+\n"
REPATTERN_DELETE_ONLY = r"\s(\d+)\D+(\d+)\sdeletion\D+\n"
CSV_FILE_HEADER = ["Author", "Commit", "Insert", "Delete", "Loc"]
def exec_git(repo, since, until, subdir):
 '''Execute git log commant, return string array.'''
 logfile = os.path.join(os.getcwd(), 'gitstats.txt')
 git_log_command = GIT_LOG.format(repo, since, until, subdir, logfile)
 os.system(git_log_command)
 lines = None
 with open(logfile, 'r', encoding='utf-8') as logfilehandler:
 lines = logfilehandler.readlines()
 return lines
def save_csv(stats, csvfile):
 '''save stats data to csv file.'''
 with open(csvfile, 'w', encoding='utf-8') as csvfilehandler:
 writer = csv.writer(csvfilehandler)
 writer.writerow(CSV_FILE_HEADER)
 for author, stat in stats.items():
  writer.writerow([author, stat[0], stat[1], stat[2], stat[3]])
def parse(lines):
 '''Analyse git log and sort to csv file.'''
 prog_full = re.compile(REPATTERN_FULL)
 prog_insert_only = re.compile(REPATTERN_INSERT_ONLY)
 prog_delete_only = re.compile(REPATTERN_DELETE_ONLY)
 stats = {}
 for i in range(0, len(lines), 3):
 author = lines[i]
 #empty = lines[i+1]
 info = lines[i+2]
 #change = 0
 insert, delete = int(0), int(0)
 result = prog_full.search(info)
 if result:
  #change = result[0]
  insert = int(result.group(2))
  delete = int(result.group(3))
 else:
  result = prog_insert_only.search(info)
  if result:
  #change = result[0]
  insert = int(result.group(2))
  delete = int(0)
  else:
  result = prog_delete_only.search(info)
  if result:
   #change = result[0]
   insert = int(0)
   delete = int(result.group(2))
  else:
   print('Regular expression fail!')
   return
 loc = insert - delete
 stat = stats.get(author)
 if stat is None:
  stats[author] = [1, insert, delete, loc]
 else:
  stat[0] += 1
  stat[1] += insert
  stat[2] += delete
  stat[3] += loc
 return stats
if __name__ == "__main__":
 print('gitstats begin')
 if len(sys.argv) != 6:
 print('Invalid argv parameters.')
 exit(0)
 REPO = os.path.join(os.getcwd(), sys.argv[1])
 SINCE = sys.argv[2]
 UNTIL = sys.argv[3]
 SUB_DIR = sys.argv[4]
 CSV_FILE = os.path.join(os.getcwd(), sys.argv[5])
 LINES = exec_git(REPO, SINCE, UNTIL, SUB_DIR)
 assert LINES is not None
 STATS = parse(LINES)
 save_csv(STATS, CSV_FILE)
 print('gitstats done')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python学习必备知识汇总
Sep 08 Python
tensorflow更改变量的值实例
Jul 30 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
python如何保证输入键入数字的方法
Aug 23 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
pytorch1.0中torch.nn.Conv2d用法详解
Jan 10 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
PyQt5的相对布局管理的实现
Aug 07 Python
python 获取谷歌浏览器保存的密码
Jan 06 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
用matplotlib画等高线图详解
Dec 14 #Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 #Python
python实现发送邮件功能代码
Dec 14 #Python
python正则实现计算器功能
Dec 14 #Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 #Python
python实现BackPropagation算法
Dec 14 #Python
python实现随机梯度下降(SGD)
Mar 24 #Python
You might like
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
jQuery动态修改超链接地址的方法
2015/02/13 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python实现批量下载图片的方法
2015/07/08 Python
python subprocess 杀掉全部派生的子进程方法
2017/01/16 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
python如何将多个PDF进行合并
2019/08/13 Python
python创建学生成绩管理系统
2019/11/22 Python
Python和Sublime整合过程图示
2019/12/25 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
最新计算机专业自荐信
2013/10/16 职场文书
好军嫂事迹材料
2014/01/15 职场文书
作文评语集锦大全
2014/04/23 职场文书
2014年护士个人工作总结
2014/11/11 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书