Skip to content

Commit

Permalink
Updating gitlog2changelog.py to add command line arguments and updati…
Browse files Browse the repository at this point in the history
…ng the text in release_procedures.txt.
  • Loading branch information
Treece Burgess committed Nov 11, 2024
1 parent 09fee01 commit da5a207
Show file tree
Hide file tree
Showing 2 changed files with 444 additions and 361 deletions.
238 changes: 132 additions & 106 deletions gitlog2changelog.py
Original file line number Diff line number Diff line change
@@ -1,125 +1,151 @@
#!/usr/bin/env python
#!/usr/bin/env python3
# Copyright 2008 Marcus D. Hanwell <marcus@cryos.org>
# Minor changes for NUT by Charles Lepple
# Distributed under the terms of the GNU General Public License v2 or later
#
# Updates by Treece Burgess in October of 2024:
# Add --start_commit and --fout command line arguments
# Update the re.search conditional check to actually check against a valid return value
# Correctly account for the final entry of the git log summary

import string, re, os
from textwrap import TextWrapper
import sys
import sys, argparse

rev_range = ''
def cmd_line_interface():
"""Setup for the command line interface..
if len(sys.argv) > 1:
base = sys.argv[1]
rev_range = '%s..HEAD' % base
:return: The argparse.Namespace object.
"""
parser = argparse.ArgumentParser()
parser.add_argument("--starting_commit", required = True,
help = "Commit hash for the starting point of the desired range (non-inclusive).")
parser.add_argument("--fout", required = True,
help = "Name to give output file. E.g. ChangeLogP800.txt")

# Execute git log with the desired command line options.
fin = os.popen('git log --summary --stat --no-merges --date=short %s' % rev_range, 'r')
# Create a ChangeLog file in the current directory.
fout = open('ChangeLog', 'w')
return parser.parse_args()

# Set up the loop variables in order to locate the blocks we want
authorFound = False
dateFound = False
messageFound = False
filesFound = False
message = ""
messageNL = False
files = ""
prevAuthorLine = ""
if __name__ == "__main__":
# Collect the command line arguments
args = cmd_line_interface()

wrapper = TextWrapper(initial_indent="\t", subsequent_indent="\t ")
# Range of specific commits that we want to create a change log for
rev_range = '%s..HEAD' % args.starting_commit

# The main part of the loop
for line in fin:
# The commit line marks the start of a new commit object.
if line.startswith('commit'):
# Start all over again...
authorFound = False
dateFound = False
messageFound = False
messageNL = False
message = ""
filesFound = False
files = ""
continue
# Match the author line and extract the part we want
elif 'Author:' in line:
authorList = re.split(': ', line, 1)
author = authorList[1]
author = author[0:len(author)-1]
authorFound = True
# Match the date line
elif 'Date:' in line:
dateList = re.split(': ', line, 1)
date = dateList[1]
date = date[0:len(date)-1]
dateFound = True
# The Fossil-IDs are ignored:
elif line.startswith(' Fossil-ID:') or line.startswith(' [[SVN:'):
continue
# The svn-id lines are ignored
elif ' git-svn-id:' in line:
continue
# The sign off line is ignored too
elif 'Signed-off-by' in line:
continue
# Extract the actual commit message for this commit
elif authorFound & dateFound & messageFound == False:
# Find the commit message if we can
if len(line) == 1:
if messageNL:
# Execute git log with the desired command line options.
# This is implemented using subprocess.Popen
fin = os.popen('git log --summary --stat --no-merges --date=short %s' % rev_range, 'r', buffering = -1)
# Needed to properly parse final entry
lines = fin.readlines()
last_line = lines[-1]
# Create a ChangeLog file in the current directory.
fout = open(args.fout, 'w')

# Set up the loop variables in order to locate the blocks we want
authorFound = False
dateFound = False
messageFound = False
filesFound = False
message = ""
messageNL = False
files = ""
prevAuthorLine = ""

wrapper = TextWrapper(initial_indent="\t", subsequent_indent="\t ")

# The main part of the loop
for line in lines:
# The commit line marks the start of a new commit object.
if line.startswith('commit'):
# Start all over again...
authorFound = False
dateFound = False
messageFound = False
messageNL = False
message = ""
filesFound = False
files = ""
continue
# Match the author line and extract the part we want
elif 'Author:' in line:
authorList = re.split(': ', line, 1)
author = authorList[1]
author = author[0:len(author)-1]
authorFound = True
# Match the date line
elif 'Date:' in line:
dateList = re.split(': ', line, 1)
date = dateList[1]
date = date[0:len(date)-1]
dateFound = True
# The Fossil-IDs are ignored:
elif line.startswith(' Fossil-ID:') or line.startswith(' [[SVN:'):
continue
# The svn-id lines are ignored
elif ' git-svn-id:' in line:
continue
# The sign off line is ignored too
elif 'Signed-off-by' in line:
continue
# Extract the actual commit message for this commit
elif authorFound & dateFound & messageFound == False:
# Find the commit message if we can
if len(line) == 1:
if messageNL:
messageFound = True
else:
messageNL = True
elif len(line) == 4:
messageFound = True
else:
messageNL = True
elif len(line) == 4:
messageFound = True
else:
if len(message) == 0:
message = message + line.strip()
else:
message = message + " " + line.strip()
# If this line is hit all of the files have been stored for this commit
elif re.search('files? changed', line) >= 0:
filesFound = True
continue
# Collect the files for this commit. FIXME: Still need to add +/- to files
elif authorFound & dateFound & messageFound:
fileList = re.split(' \| ', line, 2)
if len(fileList) > 1:
if len(files) > 0:
files = files + ", " + fileList[0].strip()
if len(message) == 0:
message = message + line.strip()
else:
message = message + " " + line.strip()
# If this line is hit all of the files have been stored for this commit
elif re.search('files? changed', line) != None:
filesFound = True
# We only want to continue if it is not the last line;
# continuing on the last line would skip the final entry
if line is not last_line:
continue
# Collect the files for this commit. FIXME: Still need to add +/- to files
elif authorFound & dateFound & messageFound:
fileList = re.split(' \| ', line, 2)
if len(fileList) > 1:
if len(files) > 0:
files = files + ", " + fileList[0].strip()
else:
files = fileList[0].strip()
# All of the parts of the commit have been found - write out the entry
if authorFound & dateFound & messageFound & filesFound:
# First the author line, only outputted if it is the first for that
# author on this day
authorLine = date + " " + author
if len(prevAuthorLine) == 0:
fout.write(authorLine + "\n\n")
elif authorLine == prevAuthorLine:
pass
else:
files = fileList[0].strip()
# All of the parts of the commit have been found - write out the entry
if authorFound & dateFound & messageFound & filesFound:
# First the author line, only outputted if it is the first for that
# author on this day
authorLine = date + " " + author
if len(prevAuthorLine) == 0:
fout.write(authorLine + "\n\n")
elif authorLine == prevAuthorLine:
pass
else:
fout.write("\n" + authorLine + "\n\n")
fout.write("\n" + authorLine + "\n\n")

# Assemble the actual commit message line(s) and limit the line length
# to 80 characters.
commitLine = "* " + files + ": " + message
# Assemble the actual commit message line(s) and limit the line length
# to 80 characters.
commitLine = "* " + files + ": " + message

# Write out the commit line
fout.write(wrapper.fill(commitLine) + "\n")
# Write out the commit line
fout.write(wrapper.fill(commitLine) + "\n")

#Now reset all the variables ready for a new commit block.
authorFound = False
dateFound = False
messageFound = False
messageNL = False
message = ""
filesFound = False
files = ""
prevAuthorLine = authorLine
#Now reset all the variables ready for a new commit block.
authorFound = False
dateFound = False
messageFound = False
messageNL = False
message = ""
filesFound = False
files = ""
prevAuthorLine = authorLine

# Close the input and output lines now that we are finished.
fin.close()
fout.close()
# Close the input and output lines now that we are finished.
fin.close()
fout.close()
Loading

0 comments on commit da5a207

Please sign in to comment.