使用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的迭代器和生成器使用实例
Jan 14 Python
解决Python requests 报错方法集锦
Mar 19 Python
python的mysqldb安装步骤详解
Aug 14 Python
python字符串替换第一个字符串的方法
Jun 26 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
解决django model修改添加字段报错的问题
Nov 18 Python
Python3搭建http服务器的实现代码
Feb 11 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 Python
Python爬虫实战之爬取携程评论
Jun 02 Python
在Python中如何使用yield
Jun 07 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实现的生成静态HTML速度快类库
2007/03/31 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
PHP中计算字符串相似度的函数代码
2012/12/29 PHP
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
Laravel6.0.4中将添加计划任务事件的方法步骤
2019/10/15 PHP
基于JQuery 的消息提示框效果代码
2011/07/31 Javascript
javascript setTimeout和setInterval计时的区别详解
2013/06/21 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
BootStrap使用file-input插件上传图片的方法
2016/09/05 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
js实现缓动动画
2020/11/25 Javascript
[01:15:16]DOTA2-DPC中国联赛 正赛 Elephant vs Aster BO3 第一场 1月26日
2021/03/11 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
django项目中新增app的2种实现方法
2020/04/01 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
酒店保安员岗位职责
2014/01/31 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
三八妇女节致辞
2015/07/31 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
python 管理系统实现mysql交互的示例代码
2021/12/06 Python
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang
MySQL如何使备份得数据保持一致
2022/05/02 MySQL