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中让MySQL查询结果返回字典类型的方法
Aug 22 Python
django实现分页的方法
May 26 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
Dec 15 Python
Python实现字符串格式化的方法小结
Feb 20 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
python用post访问restful服务接口的方法
Dec 07 Python
深入解析Python小白学习【操作列表】
Mar 23 Python
python面向对象 反射原理解析
Aug 12 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
Python标准库itertools的使用方法
Jan 17 Python
使用Python-OpenCV消除图像中孤立的小区域操作
Jul 05 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生成rss类用法实例
2015/04/14 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
jQuery入门问答 整理的几个常见的初学者问题
2010/02/22 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
2013/10/17 Javascript
Javascript中的apply()方法浅析
2015/03/15 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
深入理解javascript作用域第二篇之词法作用域和动态作用域
2016/07/24 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
Python2.x版本中cmp()方法的使用教程
2015/05/14 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
python绘制封闭多边形教程
2020/02/18 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
黄色火烈鸟:De Gele Flamingo
2019/03/18 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
2014年社区庆元旦活动方案
2014/03/08 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
2015年团支部年度工作总结
2015/05/27 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
Python基本知识点总结
2022/04/07 Python
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android