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中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
python让列表倒序输出的实例
Jun 25 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
python 函数的缺省参数使用注意事项分析
Sep 17 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
PyCharm如何导入python项目的方法
Feb 06 Python
Python中断多重循环的几种方式详解
Feb 10 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
这样写python注释让代码更加的优雅
Jun 02 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支持页面回退的两种方法[转]
2007/02/14 PHP
PHP 学习路线与时间表
2010/02/21 PHP
php URL验证正则表达式
2011/07/19 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
JQuery 文本框使用小结
2010/05/22 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
使用Node.js搭建静态资源服务详细教程
2017/08/02 Javascript
vue 挂载路由到头部导航的方法
2017/11/13 Javascript
JS事件流与事件处理程序实例分析
2019/08/16 Javascript
使用vant的地域控件追加全部选项
2020/11/03 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python压缩和解压缩zip文件
2015/02/14 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
Python如何访问字符串中的值
2020/02/09 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
python如何爬取网页中的文字
2020/07/28 Python
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
财产公证书样本
2014/04/04 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
python 单机五子棋对战游戏
2022/04/28 Python