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扫描proxy并获取可用代理ip的实例
Aug 07 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
Oct 21 Python
python内置数据类型之列表操作
Nov 12 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
Python3如何判断三角形的类型
Apr 12 Python
python使用多线程查询数据库的实现示例
Aug 17 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
Python简易开发之制作计算器
Apr 28 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 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
基于javascript 闭包基础分享
2013/07/10 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
详解Angularjs中的依赖注入
2016/03/11 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
Python中的ctime()方法使用教程
2015/05/22 Python
利用Python爬取微博数据生成词云图片实例代码
2017/08/31 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
python的等深分箱实例
2019/11/22 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
你所在的项目是如何确定版本号的
2015/12/28 面试题
房地产项目合作意向书
2015/05/08 职场文书
张丽莉事迹观后感
2015/06/16 职场文书
老干部座谈会主持词
2015/07/03 职场文书
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库