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用fork来创建子进程注意事项
Jul 03 Python
python计算一个序列的平均值的方法
Jul 11 Python
在Python的Django框架中包装视图函数
Jul 20 Python
如何在python中使用selenium的示例
Dec 26 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
Pycharm中import torch报错的快速解决方法
Mar 05 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
python3访问字典里的值实例方法
Nov 18 Python
Python的collections模块真的很好用
Mar 01 Python
Python基础之元组与文件知识总结
May 19 Python
python在package下继续嵌套一个package
Apr 14 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
第八节 访问方式 [8]
2006/10/09 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
浅析PHP文件下载原理
2014/12/25 PHP
thinkphp框架实现数据添加和显示功能
2016/06/29 PHP
使用JS 清空File控件的路径值
2013/07/08 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
JS自调用匿名函数具体实现
2014/02/11 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
js表单验证实例讲解
2016/03/31 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
int在python中的含义以及用法
2019/06/27 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
a标签下载链接的简单实现
2016/09/13 HTML / CSS
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
Shopee印度尼西亚:东南亚与台湾市场最大电商平台
2018/06/17 全球购物
政府四风问题整改措施
2014/10/04 职场文书
客户答谢会致辞
2015/01/20 职场文书
财务会计岗位职责
2015/02/03 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python