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列, 左对齐 %>, %>|, %>>, % ...
随机推荐
- hdu 1551 Cable master (二分法)
Cable master Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- Password [分块]
题面 $n,m,x \leq 10^5$ 思路 首先$n=2$做法很多,不讲了 $n=3$的时候,分块维护两个东西:每一个数出现次数的前缀和,和出现次数的出现次数的前缀和(说的有点绕,但是应该挺好理解 ...
- babelrc配置
{ "presets": [ ["env", { // webapck2/3必须配置,放弃使用babel的模块化,使用webpack的模块化,webpack1不 ...
- Leetcode 4. Median of Two Sorted Arrays(二分)
4. Median of Two Sorted Arrays 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ Descr ...
- Python之多线程:线程互斥与线程同步
一.锁在多线程中的使用:线程互斥 lock = threading.Lock()#创建一个锁对象 1.with lock: pass 和进程使用的方式相同 2.控制线程结束的时间 通过一个全局变量 ...
- SD卡给MCU升级
目 录1. 前言2. 初识BootLoader2.1 百度百科的BootLoader2.2 BootLoader的简单理解2.3 BootLoader的作用3. BootLoader预备知识3.1 复 ...
- windows7下检测耳机麦克拔插(转)
原文转自 https://blog.csdn.net/rankun1/article/details/50972990 #include "stdafx.h" #define SA ...
- UVALIVE 3571 Visible Lattice Points
就欧拉函数然后地推一下. #include <map> #include <set> #include <list> #include <cmath> ...
- PDF工具
PDF打印工具 pdfcreator 可以将所有文件都打印为pdf PDF 阅读-编辑-打印工具 Adobe Acrobat DC 可以将所有文件都打印为pdf,并且支持编辑PDF与阅读,可以将PDF ...
- log4j2配置文件动态指定日志文件名称
按照习惯性思维,log4j2中xml中取系统属性应该和log4j一样,但是结果却并不是我们想的这样,存在一定的差别,log4j中的配置可参考 log4j配置文件动态指定日志文件名称 . 现在就来看看到 ...