使用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的keyword模块用法实例分析
Jun 30 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
Python 文件处理注意事项总结
Apr 10 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
Python并发:多线程与多进程的详解
Jan 24 Python
python定时检测无响应进程并重启的实例代码
Apr 22 Python
了解不常见但是实用的Python技巧
May 23 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
如何使用python实现模拟鼠标点击
Jan 06 Python
Pytorch实现神经网络的分类方式
Jan 08 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
python flask开发的简单基金查询工具
Jun 02 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
js页面跳转常用的几种方式
2010/11/25 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
vuecli项目构建SSR服务端渲染的实现
2020/10/30 Javascript
K-近邻算法的python实现代码分享
2017/12/09 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
python虚拟环境迁移方法
2019/01/03 Python
Python datetime包函数简单介绍
2019/08/28 Python
资料员的岗位职责
2013/11/20 职场文书
设计总监岗位职责
2013/12/07 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
领导班子民主生活会整改措施(工商局)
2014/09/21 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
群众路线教育实践活动民主生活会个人检查对照思想汇报
2014/10/04 职场文书
军训个人总结
2015/03/03 职场文书
爱心捐助活动总结
2015/05/09 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
初中英语教学反思范文
2016/02/15 职场文书
JS 基本概念详细介绍
2021/10/16 Javascript
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js