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中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
Unicode和Python的中文处理
Mar 19 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
python print出共轭复数的方法详解
Jun 25 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
QML使用Python的函数过程解析
Sep 26 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
Django Form设置文本框为readonly操作
Jul 03 Python
Python实现仓库管理系统
May 30 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字符串的编码问题的详细介绍
2013/04/27 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
jQuery 全选效果实现代码
2009/03/23 Javascript
js 异步处理进度条
2010/04/01 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
用js实现放大镜的效果的简单实例
2016/05/23 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
vant(ZanUi)结合async-validator实现表单验证的方法
2018/12/06 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
使用Python写个小监控
2016/01/27 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
pyqt5中QThread在使用时出现重复emit的实例
2019/06/21 Python
python同步两个文件夹下的内容
2019/08/29 Python
python 多进程和协程配合使用写入数据
2020/10/30 Python
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
简历里的自我评价范文
2014/02/24 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
Sql Server之数据类型详解
2022/02/28 SQL Server
vue 给数组添加新对象并赋值
2022/04/20 Vue.js
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python