python git log
# -*- coding: utf-8 -*-# created by vince67 Feb.2014# nuovince@gmail.comimport reimport osimport subprocessdef 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 branchdef 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 filedef 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 logdef 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: match = re.search('Bug:? \d+ ', line).group() try: bug_id = match.split('Bug: ')[1].split('\n')[0] except Exception, e: bug_id = match.split('Bug ')[1].split(' ')[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 projectdef 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_listif __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 git log的更多相关文章
- python解析git log后生成页面显示git更新日志信息
使用git log可以查到git上项目的更新日志. 如下两个git项目,我想把git的日志信息解析成一个便于在浏览器上查看的页面. https://github.com/gityf/lua https ...
- git log命令全解析,打log还能这么随心所欲!
git log命令非常强大而好用,在复杂系统的版本管理中扮演着重要的角色,但默认的git log命令显示出的东西实在太丑,不好好打扮一下根本没法见人,打扮好了用alias命令拍个照片,就正式出道了! ...
- [译]git log进阶
格式化log输出 oneline --oneline标记将每个commit压缩成一行. 默认情况下显示一个commit ID和commit描述的第一行. 输出如下: 0e25143 Merge bra ...
- [git]Git log 输出格式化(转载)
转载于:https://havee.me/linux/2015-05/git-pretty-output.html 美化完的格式: git log --graph --pretty=format:'% ...
- git log 格式化输出
Git log --graph --pretty=format: '%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)& ...
- git log 常用命令及技巧
git log常用命令以及技巧 1.git log 如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者.提交日期.和提交说明.如果记录过多,则按Page Up.Pag ...
- git log --stat常用命令
1,显示被修改文件的修改统计信息,添加或删除了多少行. git log --stat 2,显示最近两条的修改 git log --stat -2 3,显示具体的修改 git log -p -2 4, ...
- [译]git log
git log git log命令用来显示提交的快照. 能列出来你项目的历史, 能过滤和搜索你指定的一些修改. git status能让你检查工作目录和stage区的状态, git log只提供被co ...
- git log控制输出宽度
%<(N, trunc) 下一个单元的输出宽度限制为N列, 左对齐 %<|(N, trunc) 下一个单元输出至全局第N列, 左对齐 %>, %>|, %>>, % ...
随机推荐
- POJ3345 Bribing FIPA 【背包类树形dp】
题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...
- 牛客~~扫雷~~~DFS+模拟
链接:https://www.nowcoder.com/acm/contest/118/F来源:牛客网 题目描述 <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间 ...
- 从日升的mecha anime看mecha genre的衰退
注:矢立肇是日升企画部集体笔名,如勇者系列便是公司企画 这里列出一些我看过认为有意思的动画,大抵同系列的就合并了,除非后续作品(剧场版,OVA,etc)并非直接剧情承接且有趣 注意我对长篇TV动画评价 ...
- 使用org.jsoup.Jsoup下载网络中的图片
package com.enation.newtest; import java.io.BufferedOutputStream; import java.io.File; import java.i ...
- JAVA中GC时finalize()方法是不是一定会被执行?
在回答上面问题之前,我们一定要了解JVM在进行垃圾回收时的机制,首先: 一.可达性算法 要知道对象什么时候死亡,我们需要先知道JVM的GC是如何判断对象是可以回收的.JAVA是通过可达性算法来来判断 ...
- IaaS, PaaS和SaaS
原文链接:http://www.leiphone.com/news/201406/iaas-paas-and-saas.html 云服务”现在已经快成了一个家喻户晓的词了.如果你不知道PaaS, Ia ...
- 限制MYSQL从服务器为只读状态
修改全局变量的方法有两种,第一种是修改配置文件,第二种是SQL语句设置全局变量的值.(可以参考:http://www.cnblogs.com/qlqwjy/p/8046592.html) 0.简介: ...
- 推送通知iOS客户端编写实现及推送服务器端编写
http://blog.csdn.net/tonny_guan/article/details/8963262 1.iOS客户端编程 推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主 ...
- Vue全局异常捕获
之前没注意过这么个小技巧 , 可能在Vue文档里也有 暂时先记下了 方便摘要 Vue全局配置 errorHandler可以进行全局错误收集,我们可以根据这个特性对前端异常做这样的处理:业务错误直接写 ...
- 7.添加OpenStack计算服务
添加计算服务 安装和配置控制器节点 创建数据库 mysql -uroot -ptoyo123 CREATE DATABASE nova; GRANT ALL PRIVILEGES ON nova.* ...