1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
#!/usr/bin/env python
# SPDX-License-Identifier: LGPL-2.0-or-later
#
# -*- mode: python -*-
#
# This python program has been copied from
# https://github.com/GNOME/gnet/blob/master/gen-changelog.py
#
# It has been authored by Edward Hervey, of GStreamer fame. I have
# asked his permission to copy it and re-use it here, as part of the
# Libabigail project. He granted me the permission to distribute the
# program under the terms of the GNU Lesser Public License as
# published by the Free Software Foundaion; either version 2, or (at
# your option) any later version.
#
import sys
import subprocess
import re
# Makes a GNU-Style ChangeLog from a git repository
# Handles git-svn repositories also
# Arguments : same as for git log
release_refs={}
def process_commit(lines, files):
# DATE NAME
# BLANK LINE
# Subject
# BLANK LINE
# ...
# FILES
fileincommit = False
lines = [x.strip() for x in lines if x.strip() and not x.startswith('git-svn-id')]
files = [x.strip() for x in files if x.strip()]
for l in lines:
if l.startswith('* '):
fileincommit = True
break
top_line = lines[0]
subject_line_index = 0 if lines[1].startswith('*') else 1;
first_cl_body_line_index = 0;
for i in range(1, len(lines)):
if lines[i].startswith('*'):
first_cl_body_line_index = i
break;
# Clean up top line of ChangeLog entry:
fields = top_line.split(' ')
# 1. remove the time and timezone stuff in "2008-05-13 07:10:28 +0000 name"
if fields[2].startswith('+') or fields[2].startswith('-'):
del fields[2]
if fields[1][2] == ':' and fields[1][5] == ':':
del fields[1]
# 2. munge at least my @src.gnome.org e-mail address...
if fields[-1] == '<tpm@src.gnome.org>':
fields[-1] = '<tim@centricular.net>'
top_line = ' '.join(fields)
print(top_line.strip())
print()
if subject_line_index > 0:
print('\t%s' % lines[subject_line_index].strip())
if not fileincommit:
for f in files:
print('\t* %s:' % f.strip())
print()
if first_cl_body_line_index > 0:
for l in lines[first_cl_body_line_index:]:
if l.startswith('Signed-off-by:'):
continue
print('\t%s' % l.strip())
print()
def output_commits():
cmd = ['git', 'log', '--pretty=format:--START-COMMIT--%H%n%ai %an <%ae>%n%n%s%n%b%n--END-COMMIT--',
'--date=short', '--name-only']
start_tag = find_start_tag()
if start_tag is None:
cmd.extend(sys.argv[1:])
else:
cmd.extend(["%s..HEAD" % (start_tag)])
p = subprocess.Popen(args=cmd, shell=False,
stdout=subprocess.PIPE,
text=True)
buf = []
files = []
filemode = False
for lin in p.stdout.readlines():
if lin.startswith("--START-COMMIT--"):
if buf != []:
process_commit(buf, files)
hash = lin[16:].strip()
try:
rel = release_refs[hash]
except:
pass
buf = []
files = []
filemode = False
elif lin.startswith("--END-COMMIT--"):
filemode = True
elif filemode == True:
files.append(lin)
else:
buf.append(lin)
if buf != []:
process_commit(buf, files)
def get_rel_tags():
# Populate the release_refs dict with the tags for previous releases
reltagre = re.compile("^([a-z0-9]{40}) refs/tags/libabigail-([0-9]+)[-_.]([0-9]+)[-_.]([0-9]+)")
cmd = ['git', 'show-ref', '--tags', '--dereference']
p = subprocess.Popen(args=cmd, shell=False,
stdout=subprocess.PIPE,
text=True)
for lin in p.stdout:
match = reltagre.search(lin)
if match:
(sha, maj, min, nano) = match.groups()
release_refs[sha] = (maj, min, nano)
def find_start_tag():
starttagre = re.compile("^([a-z0-9]{40}) refs/tags/CHANGELOG_START")
cmd = ['git', 'show-ref', '--tags']
p = subprocess.Popen(args=cmd, shell=False,
stdout=subprocess.PIPE,
text=True)
for lin in p.stdout:
match = starttagre.search(lin)
if match:
return match.group(1)
return None
if __name__ == "__main__":
get_rel_tags()
output_commits()
|