| #!/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 = [] |
| |
| for line in stdout_value.splitlines(True): |
| |
| if 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 |
| |
| # Move issue number to subject line |
| elif re.match('Bug: ', line) is not None: |
| line = line.replace('Bug: ', '').replace('\n',' ') |
| subject = subject[:2] + line + subject[2:] |
| # Move issue number to subject line |
| elif re.match('Issue: ', line) is not None: |
| line = line.replace('Issue: ', 'issue ').replace('\n',' ') |
| subject = subject[:2] + line + subject[2:] |
| |
| # 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) |