123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #!/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
- import string, re, os
- from textwrap import TextWrapper
- import sys
- rev_range = ''
- if len(sys.argv) > 1:
- base = sys.argv[1]
- rev_range = '%s..HEAD' % base
- # 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')
- # 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 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
- # (Don't use startswith to allow Author override inside commit message.)
- elif 'Author:' in line:
- authorList = re.split(': ', line, 1)
- try:
- author = authorList[1]
- author = author[0:len(author)-1]
- authorFound = True
- except:
- print ("Could not parse authorList = '%s'" % (line))
- # Match the date line
- elif line.startswith('Date:'):
- dateList = re.split(': ', line, 1)
- try:
- date = dateList[1]
- date = date[0:len(date)-1]
- dateFound = True
- except:
- print ("Could not parse dateList = '%s'" % (line))
- # 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:
- 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):
- 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()
- 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")
- # 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")
- #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()
|