使用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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
Python中pygame安装方法图文详解
Nov 11 Python
Python做文本按行去重的实现方法
Oct 19 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
通过python顺序修改文件名字的方法
Jul 11 Python
使用Python进行目录的对比方法
Nov 01 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
Mar 30 Python
简单了解python PEP的一些知识
Jul 13 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
Python matplotlib画曲线例题解析
Feb 07 Python
python关于变量名的基础知识点
Mar 03 Python
用Python selenium实现淘宝抢单机器人
Jun 18 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
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
不同Jquery版本引发的问题解决
2013/10/14 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
详解Vuejs2.0之异步跨域请求
2017/04/20 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
详解vue2.6插槽更新v-slot用法总结
2019/03/09 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
python读写二进制文件的方法
2015/05/09 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
python命令行工具Click快速掌握
2019/07/04 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
python和JavaScript哪个容易上手
2020/06/23 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
html5 worker 实例(一) 为什么测试不到效果
2013/06/24 HTML / CSS
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
农行实习自我鉴定
2013/09/22 职场文书
工程地质勘察专业大学生求职信
2013/10/13 职场文书
英语硕士生求职简历的自我评价
2013/10/15 职场文书
英语教师自荐信
2014/05/26 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
如何获取numpy array前N个最大值
2021/05/14 Python