Add --issues and --issue_numbers to gitlog2asciidoc.py

The --issues option can be used to only output the
commits with issues associated with them.

The --issue_numbers only outputs the actual issue
numbers of the commits with issues associated with them.

Change-Id: Icf1c03461fa8054c6ae75e66ef80d403cc7052bc
This commit is contained in:
Deen Sethanandha
2012-03-23 15:34:01 -07:00
parent 87181822dc
commit 52fc1e2165

View File

@@ -1,12 +1,18 @@
#!/usr/bin/python #!/usr/bin/python
import sys from optparse import OptionParser
import re import re
import subprocess import subprocess
import sys
""" """
This script generates a release note from the output of git log This script generates a release note from the output of git log
between the specified tags. between the specified tags.
Options:
--issues Show output the commits with issues associated with them.
--issue-numbers Show outputs issue numbers of the commits with issues
associated with them
Arguments: Arguments:
since -- tag name since -- tag name
until -- tag name until -- tag name
@@ -28,9 +34,26 @@ Expected Output:
<commit message> <commit message>
""" """
if len(sys.argv) != 3: parser = OptionParser(usage='usage: %prog [options] <since> <until>')
sys.exit('Usage: ' + sys.argv[0] + ' <since> <until>')
since_until = sys.argv[1] + '..' + sys.argv[2] parser.add_option('-i', '--issues', action='store_true',
dest='issues_only', default=False,
help='only output the commits with issues association')
parser.add_option('-n', '--issue-numbers', action='store_true',
dest='issue_numbers_only', default=False,
help='only outputs issue numbers of the commits with \
issues association')
(options, args) = parser.parse_args()
if len(args) != 2:
parser.error("wrong number of arguments")
issues_only = options.issues_only
issue_numbers_only = options.issue_numbers_only
since_until = args[0] + '..' + args[1]
proc = subprocess.Popen(['git', 'log', '--reverse', '--no-merges', proc = subprocess.Popen(['git', 'log', '--reverse', '--no-merges',
since_until, "--format=* %s%n+%n%b"], since_until, "--format=* %s%n+%n%b"],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
@@ -40,45 +63,45 @@ stdout_value = proc.communicate()[0]
subject = "" subject = ""
message = [] message = []
is_issue = False
# regex pattern to match following cases such as Bug: 123, Issue Bug: 123, Bug: GERRIT-123, # regex pattern to match following cases such as Bug: 123, Issue Bug: 123,
# Bug: issue 123, Bug issue: 123, issue: 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)?:? ', p = re.compile('bug: GERRIT-|bug(:? issue)?:? |issue(:? bug)?:? ',
re.IGNORECASE) re.IGNORECASE)
for line in stdout_value.splitlines(True): if issue_numbers_only:
for line in stdout_value.splitlines(True):
# Move issue number to subject line if p.match(line):
if p.match(line): sys.stdout.write(p.sub('', line))
line = p.sub('issue ', line).replace('\n',' ') else:
subject = subject[:2] + line + subject[2:] for line in stdout_value.splitlines(True):
# Move issue number to subject line
elif re.match('\* ', line) >= 0: if p.match(line):
# Write change log for a commit line = p.sub('issue ', line).replace('\n',' ')
if subject != "": subject = subject[:2] + line + subject[2:]
# Write subject is_issue = True
sys.stdout.write(subject) elif line.startswith('* '):
# Write change log for a commit
# Write message lines if subject != "":
if message != []: if (not issues_only or is_issue):
# Clear + from last line in commit message # Write subject
message[-1] = '\n' sys.stdout.write(subject)
for m in message: # Write message lines
sys.stdout.write(m) if message != []:
# Clear + from last line in commit message
# Start new commit block message[-1] = '\n'
message = [] for m in message:
subject = line sys.stdout.write(m)
continue # Start new commit block
message = []
# Remove commit footers subject = line
elif re.match(r'((\w+-)+\w+:)', line) is not None: is_issue = False
continue # Remove commit footers
elif re.match(r'((\w+-)+\w+:)', line):
else: continue
if line == '\n': # Don't add extra blank line if last one is already blank
# Don't add extra blank line if last one is already blank elif line == '\n' and message and message[-1] != '+\n':
if message != [] and message[-1] != '+\n':
message.append('+\n') message.append('+\n')
else: elif line != '\n':
message.append(line) message.append(line)