使用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 相关文章推荐
python3 实现的人人影视网站自动签到
Jun 19 Python
python自动化报告的输出用例详解
May 30 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
python随机模块random的22种函数(小结)
May 15 Python
使用K.function()调试keras操作
Jun 17 Python
Opencv python 图片生成视频的方法示例
Nov 18 Python
python代码实现猜拳小游戏
Nov 30 Python
python中sys模块的介绍与实例
Apr 17 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
Apr 11 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下封装较好的数字分页方法
2010/11/23 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
基于jQuery实现表单提交验证
2014/11/24 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
js实现随机点名小功能
2017/08/17 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
python 项目目录结构设置
2020/02/14 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
办公室文秘岗位职责
2013/11/15 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python