使用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的id()函数解密过程
Dec 25 Python
简介Django中内置的一些中间件
Jul 24 Python
Python实现控制台进度条功能
Jan 04 Python
Python实现带百分比的进度条
Jun 28 Python
python递归打印某个目录的内容(实例讲解)
Aug 30 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
Python对接支付宝支付自实现功能
Oct 10 Python
如何提高python 中for循环的效率
Apr 15 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
区分python中的进程与线程
Aug 13 Python
python运行脚本文件的三种方法实例
Jun 25 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
简单的cookie计数器实现源码
2013/06/07 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
浅析JavaScript中作用域和作用域链
2016/12/06 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
JS中的函数与对象的创建方式
2019/05/12 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
vue项目添加多页面配置的步骤详解
2019/05/22 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
4行Python代码生成图像验证码(2种)
2020/04/07 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
Python configparser模块操作代码实例
2020/06/08 Python
用python对excel查重
2020/12/07 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
如何提高JDBC的性能
2013/04/30 面试题
浙大网新C/C++面试解惑
2015/05/27 面试题
领导干部培训感言
2014/01/23 职场文书
装修五一活动策划案
2014/01/23 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
博士导师推荐信
2015/03/25 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
孙振耀退休感言
2015/08/01 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js
python开发人人对战的五子棋小游戏
2022/05/02 Python