-
Notifications
You must be signed in to change notification settings - Fork 0
/
gen-changelog.py
executable file
·101 lines (89 loc) · 2.91 KB
/
gen-changelog.py
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
#!/usr/bin/env python
# Downloaded from git://anongit.freedesktop.org/gstreamer/common
# Copyright (C) 2009 Jan Schmidt
# Licensed under LGPL
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('* ') and ':' in l:
fileincommit = True
break
top_line = lines[0]
print top_line.strip()
print
if not fileincommit:
for f in files:
print '\t* %s:' % f
for l in lines[1:]:
print '\t ', l
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)
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]
print "=== release %d.%d.%d ===\n" % (int(rel[0]), int(rel[1]), int(rel[2]))
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\/RELEASE-([0-9]+)[-_.]([0-9]+)[-_.]([0-9]+)")
cmd = ['git', 'show-ref', '--tags', '--dereference']
p = subprocess.Popen(args=cmd, shell=False, stdout=subprocess.PIPE)
for lin in p.stdout.readlines():
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)
for lin in p.stdout.readlines():
match = starttagre.search (lin)
if match:
return match.group(1)
return None
if __name__ == "__main__":
get_rel_tags()
output_commits()