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
|
#!/usr/bin/python3
import sys
import os
import re
import subprocess
from debian_linux.debian import Changelog, VersionLinux
def base_version(ver):
# Assume base version is at least 3.0, thus only 2 components wanted
match = re.match(r'^(\d+\.\d+)', ver)
assert match
return match.group(1)
def add_update(ver, inc):
base = base_version(ver)
if base == ver:
update = 0
else:
update = int(ver[len(base)+1:])
update += inc
if update == 0:
return base
else:
return '{}.{}'.format(base, update)
def next_update(ver):
return add_update(ver, 1)
def print_stable_log(log, cur_ver, new_ver):
major_ver = re.sub(r'^(\d+)\..*', r'\1', cur_ver)
while cur_ver != new_ver:
next_ver = next_update(cur_ver)
print(' https://www.kernel.org/pub/linux/kernel/v{}.x/ChangeLog-{}'
.format(major_ver, next_ver),
file=log)
log.flush() # serialise our output with git's
subprocess.check_call(['git', 'log', '--reverse',
'--pretty= - %s',
'v{}..v{}^'.format(cur_ver, next_ver)],
stdout=log)
cur_ver = next_ver
def main(repo, new_ver):
if os.path.exists(os.path.join(repo, '.git')):
os.environ['GIT_DIR'] = os.path.join(repo, '.git')
else:
os.environ['GIT_DIR'] = repo
changelog = Changelog(version=VersionLinux)
cur_pkg_ver = changelog[0].version
cur_ver = cur_pkg_ver.linux_upstream_full
if base_version(new_ver) != base_version(cur_ver):
print('{} is not on the same stable series as {}'
.format(new_ver, cur_ver),
file=sys.stderr)
sys.exit(2)
new_pkg_ver = new_ver + '-1'
if cur_pkg_ver.linux_revision_experimental:
new_pkg_ver += '~exp1'
# Three possible cases:
# 1. The current version has been released so we need to add a new
# version to the changelog.
# 2. The current version has not been released so we're changing its
# version string.
# (a) There are no stable updates included in the current version,
# so we need to insert an introductory line, the URL(s) and
# git log(s) and a blank line at the top.
# (b) One or more stable updates are already included in the current
# version, so we need to insert the URL(s) and git log(s) after
# them.
changelog_intro = 'New upstream stable update:'
# Case 1
if changelog[0].distribution != 'UNRELEASED':
subprocess.check_call(['dch', '-v', new_pkg_ver, '-D', 'UNRELEASED',
changelog_intro])
with open('debian/changelog', 'r') as old_log:
with open('debian/changelog.new', 'w') as new_log:
line_no = 0
inserted = False
intro_line = ' * {}\n'.format(changelog_intro)
for line in old_log:
line_no += 1
# Case 2
if changelog[0].distribution == 'UNRELEASED' and line_no == 1:
print('{} ({}) UNRELEASED; urgency={}'
.format(changelog[0].source, new_pkg_ver,
changelog[0].urgency),
file=new_log)
continue
if not inserted:
# Case 2(a)
if line_no == 3 and line != intro_line:
new_log.write(intro_line)
print_stable_log(new_log, cur_ver, new_ver)
new_log.write('\n')
inserted = True
# Case 1 or 2(b)
elif line_no > 3 and line == '\n':
print_stable_log(new_log, cur_ver, new_ver)
inserted = True
# Check that we inserted before hitting the end of the
# first version entry
assert not (line.startswith(' -- ') and not inserted)
new_log.write(line)
os.rename('debian/changelog.new', 'debian/changelog')
if __name__ == '__main__':
if len(sys.argv) != 3:
print('''\
Usage: {} REPO VERSION"
REPO is the git repository to generate a changelog from
VERSION is the stable version (without leading v)'''.format(sys.argv[0]),
file=sys.stderr)
sys.exit(2)
main(*sys.argv[1:])
|