diff --git a/doc/howto_release.txt b/doc/howto_release.txt index ec7c37424de..c36ca1b4281 100644 --- a/doc/howto_release.txt +++ b/doc/howto_release.txt @@ -110,8 +110,7 @@ svn ci -m"GRASS GIS $VERSION" include/VERSION svn up # Create Changelog file on release branch: -# https://arthurdejong.org/svn2cl/ -svn2cl +python tools/gitlog2changelog.py mv ChangeLog ChangeLog_$VERSION head ChangeLog_$VERSION gzip ChangeLog_$VERSION diff --git a/include/Make/Docs.make b/include/Make/Docs.make index 139e68593e5..adea0c22825 100644 --- a/include/Make/Docs.make +++ b/include/Make/Docs.make @@ -91,13 +91,9 @@ html2pdfdoccomplete: $(call html_pdf vector,v.*.html) changelog: - @ echo "creating ChangeLog file (following 'trunk' only)..." - @ # svn2cl creates a GNU style ChangeLog file: - @ # http://ch.tudelft.nl/~arthur/svn2cl/ - @if [ ! -x "`which svn2cl`" ] ; then \ - echo "\"svn2cl\" is required, please install first from http://ch.tudelft.nl/~arthur/svn2cl/" ; exit 1 ; \ - fi - sh svn2cl ./ChangeLog + @ echo "creating ChangeLog file (following 'master' only)..." + @ # tools/gitlog2changelog.py creates a GNU style ChangeLog file: + python tools/gitlog2changelog.py .PHONY: htmldocs-single htmldocs packagehtmldocs pdfdocs cleandocs html2pdfdoc .PHONY: html2pdfdoccomplete changelog diff --git a/tools/gitlog2changelog.py b/tools/gitlog2changelog.py new file mode 100755 index 00000000000..88b139a574d --- /dev/null +++ b/tools/gitlog2changelog.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python +# Copyright 2008 Marcus D. Hanwell +# 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()