使用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中的高级函数map/reduce使用实例
Apr 13 Python
Python实现建立SSH连接的方法
Jun 03 Python
5种Python单例模式的实现方式
Jan 14 Python
利用Python如何生成随机密码
Apr 20 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
Python日志无延迟实时写入的示例
Jul 11 Python
使用Pytorch搭建模型的步骤
Nov 16 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
使用Python+Appuim 清理微信的方法
Jan 26 Python
python Django框架快速入门教程(后台管理)
Jul 21 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 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 多进程 解决难题
2009/06/22 PHP
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
php简单复制文件的方法
2016/05/09 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
图片自动缩小 点击放大
2008/07/07 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
jquery按回车提交数据的代码示例
2013/11/05 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
JS+CSS简单树形菜单实现方法
2015/09/12 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
Python collections模块使用方法详解
2019/08/28 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
python爬虫调度器用法及实例代码
2020/11/30 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
Farfetch澳大利亚官网:Farfetch Australia
2020/04/26 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
建筑结构施工专业推荐信
2014/02/21 职场文书
聘用意向书范本
2014/04/01 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
刘胡兰观后感
2015/06/16 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript