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对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
使用python实现接口的方法
Jul 07 Python
Python实现excel转sqlite的方法
Jul 17 Python
深入理解Django中内置的用户认证
Oct 06 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
python3.6使用SMTP协议发送邮件
May 20 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
Python关于OS文件目录处理的实例分享
May 23 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创建多级目录代码
2008/06/05 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
php入门教程之Zend Studio设置与开发实例
2016/09/09 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
js获取指定时间的前几秒
2017/04/05 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
在Django框架中编写Context处理器的方法
2015/07/20 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
Python跑循环时内存泄露的解决方法
2020/01/13 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
解释下面关于J2EE的名词
2013/11/15 面试题
创业计划书的主要内容有哪些
2014/01/29 职场文书
幼儿园评语大全
2014/04/17 职场文书
交通事故委托书范本精选
2014/10/04 职场文书
2014年保密工作总结
2014/11/22 职场文书
个人租房协议书
2014/11/28 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫