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的Tornado框架实现数据可视化的教程
May 02 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
Python星号*与**用法分析
Feb 02 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
Python实现 PS 图像调整中的亮度调整
Jun 28 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
Python面向对象之继承原理与用法案例分析
Dec 31 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
virtualenv介绍及简明教程
Jun 23 Python
从python读取sql的实例方法
Jul 21 Python
Python selenium如何打包静态网页并下载
Aug 12 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开发框架Laravel数据库操作方法总结
2014/09/03 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
babel基本使用详解
2017/02/17 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
jquery+ajax实现上传图片并显示上传进度功能【附php后台接收】
2019/06/06 jQuery
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
Python多线程编程(一):threading模块综述
2015/04/05 Python
python实现批量修改文件名代码
2017/09/10 Python
你真的了解Python的random模块吗?
2017/12/12 Python
python绘制漏斗图步骤详解
2019/03/04 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
Python如何将函数值赋给变量
2020/04/28 Python
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
如何清空Session
2015/02/23 面试题
大学生求职简历的自我评价
2013/10/14 职场文书
工程招投标邀请书
2014/01/26 职场文书
大学生安全责任书
2014/07/25 职场文书
科学发展观活动总结
2014/08/28 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python