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 相关文章推荐
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
Python实现控制台进度条功能
Jan 04 Python
python3 实现的人人影视网站自动签到
Jun 19 Python
对python3 urllib包与http包的使用详解
May 10 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
python 爬取疫情数据的源码
Feb 09 Python
Python sep参数使用方法详解
Feb 12 Python
Python实现屏幕录制功能的代码
Mar 02 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
python 实现IP子网计算
Feb 18 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生成图形(Libchart)实例
2013/11/06 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
纯js实现动态时间显示
2020/09/07 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
Django框架封装外部函数示例
2019/05/28 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
Python request post上传文件常见要点
2020/11/20 Python
英国最受欢迎的手表网站:Watch Shop
2016/10/21 全球购物
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
索桥的故事教学反思
2014/02/06 职场文书
太太口服液广告词
2014/03/20 职场文书
授权委托书格式范文
2014/08/02 职场文书
明星员工获奖感言
2014/08/14 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
创业计划书之花店
2019/09/20 职场文书
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers