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 相关文章推荐
简单的通用表达式求10乘阶示例
Mar 03 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
Python实现翻转数组功能示例
Jan 12 Python
Python pymongo模块用法示例
Mar 31 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
python之mock模块基本使用方法详解
Jun 27 Python
python3.7 的新特性详解
Jul 25 Python
python字典的常用方法总结
Jul 31 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
python面向对象版学生信息管理系统
Jun 24 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
模仿OSO的论坛(二)
2006/10/09 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
理解 javascript 中的函数表达式与函数声明
2017/07/07 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
Node.js API详解之 net模块实例分析
2020/05/18 Javascript
node.js爬虫框架node-crawler初体验
2020/10/29 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
Python必须了解的35个关键词
2020/07/16 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
2020/11/05 Python
师范教师大学生职业生涯规划范文
2014/01/05 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
酒店开业主持词
2015/07/02 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
python用tkinter开发的扫雷游戏
2021/06/01 Python
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang