使用python分析git log日志示例


Posted in Python onFebruary 27, 2014

用git来管理工程的开发,git log是非常有用的‘历史'资料,需求就是来自这里,我们希望能对git log有一个定制性强的过滤。此段脚本就是在完成这种类型的任务。对于一个repo所有branch中的commit,脚本将会把message中存在BUG ID的一类commits给提取整理出来,并提供了额外的search_key, 用于定制过滤。

# -*- coding: utf-8 -*-
# created by vince67 Feb.2014
# nuovince@gmail.com
import re
import os
import subprocess

def run(project_dir, date_from, date_to, search_key, filename):
    bug_dic = {}
    bug_branch_dic = {}
    try:
        os.chdir(project_dir)
    except Exception, e:
        raise e
    branches_list = []
    branches_list = get_branches()
    for branch in branches_list:
        bug_branch_dic = deal_branch(date_from,
                                     date_to,
                                     branch,
                                     search_key)
        for item in bug_branch_dic:
            if item not in bug_dic:
                bug_dic[item] = bug_branch_dic[item]
            else:
                bug_dic[item] += bug_branch_dic[item]
    log_output(filename, bug_dic)

# abstract log of one branch
def deal_branch(date_from, date_to, branch, search_key):
    try:
        os.system('git checkout ' + branch)
        os.system('git pull ')
    except Exception, error:
        print error
    cmd_git_log = ["git",
                   "log",
                   "--stat",
                   "--no-merges", 
                   "-m",
                   "--after="+date_from,
                   "--before="+date_to]
    proc = subprocess.Popen(cmd_git_log,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    bug_branch_dic = deal_lines(date_from,
                                date_to,
                                search_key,
                                stdout)
    return bug_branch_dic
# write commits log to file
def log_output(filename, bug_dic):
    fi = open(filename, 'w')
    for item in bug_dic:
        m1 = '--'*5 + 'BUG:' + item + '--'*20 + '\n'
        fi.write(m1)
        for commit in bug_dic[item]:
            fi.write(commit)
    fi.close()

# analyze log 
def deal_lines(date_from, date_to, search_key, stdout):
    bug_dic = {}
    for line in stdout.split('commit '):
        if re.search('Bug: \d+', line) is not None and re.search(search_key, line) is not None:
            bug_id = line.split('Bug: ')[1].split('\n')[0]
            if bug_id not in bug_dic:
                bug_dic[bug_id] = [line]
            else:
                bug_dic[bug_id] += [line]
    return bug_dic

# get all branches of a project
def get_branches():
    branch_list = []
    branches = []
    tmp_str = ''
    try:
        cmd_git_remote = 'git remote show origin'
        proc = subprocess.Popen(cmd_git_remote.split(),
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
        stdout, stderr = proc.communicate()
        tmp_str = stdout.split('Local branches configured')[0]
        try:
            tmp_str = tmp_str.split('Remote branches:\n')[1]
        except:
            tmp_str = tmp_str.split('Remote branch:\n')[1]
        branches = tmp_str.split('\n')
        for branch in branches[0:-1]:
            if re.search(' tracked', branch) is not None:
                branch = branch.replace('tracked', '').strip(' ')
                branch_list.append(branch)
    except Exception, error:
        if branch_list == []:
            print "Can not get any branch!"
    return branch_list

if __name__ == '__main__':
    # path of the .git project. example: "/home/username/projects/jekyll_vincent"
    project_dir = ""
    date_from = "2014-01-25"
    date_to = "2014-02-26"
    # only search 'Bug: \d+' for default
    search_key = ""
    # name of output file. example:"/home/username/jekyll_0125_0226.log"
    filename = ""
    run(project_dir, date_from, date_to, search_key, filename)
Python 相关文章推荐
跟老齐学Python之玩转字符串(2)更新篇
Sep 28 Python
Python MySQL数据库连接池组件pymysqlpool详解
Jul 07 Python
django 将model转换为字典的方法示例
Oct 16 Python
对Python实现简单的API接口实例讲解
Dec 10 Python
python实现简单flappy bird
Dec 24 Python
Python3 修改默认环境的方法
Feb 16 Python
Django 用户认证组件使用详解
Jul 23 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
Python实现汇率转换操作
May 03 Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
详解scrapy内置中间件的顺序
Sep 28 Python
python去掉字符串中重复字符的方法
Feb 27 #Python
tornado捕获和处理404错误的方法
Feb 26 #Python
python为tornado添加recaptcha验证码功能
Feb 26 #Python
python实现博客文章爬虫示例
Feb 26 #Python
python处理中文编码和判断编码示例
Feb 26 #Python
python实现网页链接提取的方法分享
Feb 25 #Python
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 #Python
You might like
服务器端解压缩zip的脚本
2006/12/22 PHP
img onload事件绑定各浏览器均可执行
2012/12/19 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
Node.js实用代码段之正确拼接Buffer
2016/03/17 Javascript
js 判断数据类型的几种方法
2017/01/13 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
python转换摩斯密码示例
2014/02/16 Python
Python中max函数用法实例分析
2015/07/17 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
Django Rest framework频率原理与限制
2019/07/26 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
python的Jenkins接口调用方式
2020/05/12 Python
为你的html5网页添加音效示例
2014/04/03 HTML / CSS
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
给女朋友的道歉信
2014/01/10 职场文书
终止劳动合同协议书
2014/04/14 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
医院合作意向书范本
2015/05/08 职场文书
护士心得体会范文
2016/01/25 职场文书
创业计划书之水果店
2019/07/18 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
Python学习之异常中的finally使用详解
2022/03/16 Python