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爬虫之urllib2使用指南
Nov 05 Python
Python解决鸡兔同笼问题的方法
Dec 20 Python
Zabbix实现微信报警功能
Oct 09 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
对Python中for复合语句的使用示例讲解
Nov 01 Python
python ChainMap的使用和说明详解
Jun 11 Python
python列表每个元素同增同减和列表元素去空格的实例
Jul 20 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
为什么相对PHP黑python的更少
Jun 21 Python
Python实现信息管理系统
Jun 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
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
Python中的推导式使用详解
2015/06/03 Python
在Python中使用正则表达式的方法
2015/08/13 Python
Python找出最小的K个数实例代码
2018/01/04 Python
python生成圆形图片的方法
2020/03/25 Python
Python遍历pandas数据方法总结
2018/02/09 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
python命令行工具Click快速掌握
2019/07/04 Python
如何基于python实现不邻接植花
2020/05/01 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
如何查找网页漏洞
2016/06/22 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
个人简历中的自我评价怎么写
2014/01/26 职场文书
读书月活动方案
2014/05/22 职场文书
十佳家长事迹材料
2014/08/26 职场文书
体育专业大学生职业生涯规划范文:打造自己的运动帝国
2014/09/12 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
教师个人年度总结
2015/02/11 职场文书
开业典礼致辞
2015/07/29 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
实现一个简单得数据响应系统
2021/11/11 Javascript