zoukankan      html  css  js  c++  java
  • python git log

    # -*- 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 + ' '
            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(' ')[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: ')[1]
            except:
                tmp_str = tmp_str.split('Remote branch: ')[1]
            branches = tmp_str.split(' ')
            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)
  • 相关阅读:
    封装Socket.BeginReceive/EndReceive以支持Timeout
    使用反射动态创建类型实例
    泛型List<T>排序(利用反射)
    复旦版最佳医院排行 沪21家医院入选全国百佳
    C#格式化字符串
    一些很酷的.Net技巧
    系列文章--SQLite文章
    C#垃圾回收机制
    C#中Cache的使用
    ASP.NET Cache缓存的使用
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/5064759.html
Copyright © 2011-2022 走看看