使用python分析gitlog日志示例

用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 reimport osimport 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 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 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 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_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)

Posted in 未分类

发表评论