#!/usr/bin/env python

import sys
import subprocess

# Makes a GNU-Style ChangeLog from a git repository
# Handles git-svn repositories also

# Arguments : same as for git log

def process_commit(lines, files):
    # DATE NAME
    # BLANK LINE
    # Subject
    # BLANK LINE
    # ...
    # FILES
    fileincommit = False
    lines = [x.strip() for x in lines if x.strip() and not x.startswith('git-svn-id')]
    files = [x.strip() for x in files if x.strip()]
    for l in lines:
        if l.startswith('* ') and ':' in l:
            fileincommit = True
            break
    top_line = lines[0]
    print top_line.strip()
    print
    if not fileincommit:
        for f in files:
            print '\t* %s:' % f
    for l in lines[1:]:
        print '\t ', l
    print

if __name__ == "__main__":
    cmd = ['git', 'log', '--pretty=format:--START-COMMIT--%n%ad  %an <%ae>%n%n%s%n%b%n--END-COMMIT--',
           '--date=short', '--name-only']
    cmd.extend(sys.argv[1:])
    p = subprocess.Popen(args=cmd, shell=False, stdout=subprocess.PIPE)
    buf = []
    files = []
    filemode = False
    for lin in p.stdout.readlines():
        if lin.startswith("--START-COMMIT--"):
            if buf != []:
                process_commit(buf, files)
                buf = []
                files = []
                filemode = False
        elif lin.startswith("--END-COMMIT--"):
            filemode = True
        elif filemode == True:
            files.append(lin)
        else:
            buf.append(lin)
    if buf != []:
        process_commit(buf, files)
