使用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获取远程文件大小的函数代码分享
May 13 Python
python基础教程之循环介绍
Aug 29 Python
Python中实现对list做减法操作介绍
Jan 09 Python
Python Django使用forms来实现评论功能
Aug 17 Python
Python 登录网站详解及实例
Apr 11 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
Python通过调用有道翻译api实现翻译功能示例
Jul 19 Python
python 获取url中的参数列表实例
Dec 18 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 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
第六节--访问属性和方法
2006/11/16 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
jquery toolbar与网页浮动工具条具体实现代码
2014/01/12 Javascript
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
2019/02/11 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
python实现探测socket和web服务示例
2014/03/28 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
Python网页解析器使用实例详解
2020/05/30 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
2014年社区学雷锋活动总结
2014/03/09 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书