#!/usr/bin/python
import sys
import re
import subprocess

"""
This script generates a release note from the output of git log
between the specified tags.

Arguments:
since -- tag name
until -- tag name

Example Input:

   * <commit subject>
   +
   <commit message>

   Bug: issue 123
   Change-Id: <change id>
   Signed-off-by: <name>

Expected Output:

   * issue 123 <commit subject>
   +
   <commit message>
"""

if len(sys.argv) != 3:
    sys.exit('Usage: ' + sys.argv[0] + ' <since> <until>')
since_until = sys.argv[1] + '..' + sys.argv[2]
proc = subprocess.Popen(['git', 'log', '--reverse', '--no-merges',
                         since_until, "--format=* %s%n+%n%b"],
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT,)

stdout_value = proc.communicate()[0]

subject = ""
message = []

# regex pattern to match following cases such as Bug: 123, Issue Bug: 123, Bug: GERRIT-123,
# Bug: issue 123, Bug issue: 123, issue: 123, issue: bug 123
p = re.compile('bug: GERRIT-|bug(:? issue)?:? |issue(:? bug)?:? ',
               re.IGNORECASE)

for line in stdout_value.splitlines(True):

    # Move issue number to subject line
    if p.match(line):
        line = p.sub('issue ', line).replace('\n',' ')
        subject = subject[:2] + line + subject[2:]

    elif re.match('\* ', line) >= 0:
        # Write change log for a commit
        if subject != "":
            # Write subject
            sys.stdout.write(subject)

            # Write message lines
            if message != []:
                # Clear + from last line in commit message
                message[-1] = '\n'
            for m in message:
                sys.stdout.write(m)

        # Start new commit block
        message = []
        subject = line
        continue

    # Remove commit footers
    elif re.match(r'((\w+-)+\w+:)', line) is not None:
        continue

    else:
        if line == '\n':
            # Don't add extra blank line if last one is already blank
            if message != [] and message[-1] != '+\n':
                message.append('+\n')
        else:
            message.append(line)