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 相关文章推荐
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
Python Web框架Flask中使用百度云存储BCS实例
Feb 08 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
python 获取list特定元素下标的实例讲解
Apr 09 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
Python3.7 dataclass使用指南小结
Feb 22 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
Python 实现的 Google 批量翻译功能
Aug 26 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 Python
python中数字是否为可变类型
Jul 08 Python
聊一聊python常用的编程模块
May 14 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 checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
[36:41]完美世界DOTA2联赛循环赛FTD vs Magma第一场 10月30日
2020/10/31 DOTA
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python批量查询域名是否被注册过
2017/06/21 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
安装python及pycharm的教程图解
2019/10/10 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
python 利用Pyinstaller打包Web项目
2020/10/23 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
经典优秀个人求职自荐信格式
2013/09/25 职场文书
小学评语大全
2014/04/22 职场文书
感恩之星事迹材料
2014/05/03 职场文书
自主招生推荐信范文
2014/05/10 职场文书
大学自主招生推荐信
2014/05/10 职场文书
运动会拉拉队口号
2014/06/09 职场文书
销售目标责任书
2014/07/23 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
信用卡工资证明范本
2014/10/17 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
Golang并发工具Singleflight
2022/05/06 Golang