使用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翻译软件实现代码(使用google api完成)
Nov 26 Python
零基础写python爬虫之爬虫编写全记录
Nov 06 Python
用Python代码来绘制彭罗斯点阵的教程
Apr 03 Python
Python的Flask开发框架简单上手笔记
Nov 16 Python
pandas 数据实现行间计算的方法
Jun 08 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
python全栈知识点总结
Jul 01 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
django 文件上传功能的相关实例代码(简单易懂)
Jan 22 Python
pytorch中使用cuda扩展的实现示例
Feb 12 Python
Python利用命名空间解析XML文档
Aug 10 Python
使用Python爬虫爬取小红书完完整整的全过程
Jan 19 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
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
nodejs实用示例 缩址还原
2010/12/28 NodeJs
javascript 拖动表格行实现代码
2011/05/05 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
tsconfig.json配置详解
2019/05/17 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
Python实现二维曲线拟合的方法
2018/12/29 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
Pycharm远程调试原理及具体配置详解
2019/08/08 Python
Django项目主urls导入应用中views的红线问题解决
2019/08/10 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
安装python及pycharm的教程图解
2019/10/10 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
python如何快速拼接字符串
2020/10/28 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
草莓网英国官网:Strawberrynet UK
2017/02/12 全球购物
ProForm英国站点:健身房和健身器材网上商店
2019/06/05 全球购物
AOP的定义以及作用
2013/09/08 面试题
大四自我鉴定范文
2013/10/06 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
居委会四风问题个人对照检查材料
2014/09/25 职场文书
房屋授权委托书范本
2014/10/07 职场文书
学校隐患排查制度
2015/08/05 职场文书
Python Socket编程详解
2021/04/25 Python