python git log

# -*- coding: utf-8 -*-
# created by vince67 Feb.2014
 
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 :
             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 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 git log)