使用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的绘图工具matplotlib使用实例
Jul 03 Python
python实现每次处理一个字符的三种方法
Oct 09 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
Python时间的精准正则匹配方法分析
Aug 17 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
使用WingPro 7 设置Python路径的方法
Jul 24 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
Python 如何实现数据库表结构同步
Sep 29 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 Python
方法汇总:Python 安装第三方库常用
Apr 26 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 fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
vuex实现购物车功能
2020/06/28 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python实现的单向循环链表功能示例
2017/11/10 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
python爬虫可以爬什么
2020/06/16 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
抽象类和接口的区别
2012/09/19 面试题
日语专业推荐信
2013/11/12 职场文书
银行门卫岗位职责
2013/12/29 职场文书
cf搞笑广告词
2014/03/14 职场文书
党员2014两会学习心得体会
2014/03/17 职场文书
服务标语大全
2014/06/18 职场文书
淘宝客服工作职责
2014/07/11 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
vue里使用create, mounted调用方法
2022/04/26 Vue.js