使用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处理字符串之isspace()方法的使用
May 19 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
pandas 使用均值填充缺失值列的小技巧分享
Jul 04 Python
Python3 JSON编码解码方法详解
Sep 06 Python
Python计算IV值的示例讲解
Feb 28 Python
通过实例解析Python return运行原理
Mar 04 Python
Pycharm连接远程服务器过程图解
Apr 30 Python
Python正则表达式高级使用方法汇总
Jun 18 Python
浅谈django不使用restframework自定义接口与使用的区别
Jul 15 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
ParseInt函数参数设置介绍
2014/01/02 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
深入学习TypeScript 、React、 Redux和Ant-Design的最佳实践
2019/06/17 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
Python用input输入列表的实例代码
2020/02/07 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
学历公证书范本
2014/04/09 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
教师个人事迹材料
2014/12/17 职场文书
母亲节寄语大全
2015/02/27 职场文书
校园新闻稿范文
2015/07/18 职场文书
终止合同协议书范本
2016/03/22 职场文书
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android