summaryrefslogtreecommitdiffstats
path: root/debian/bin/stable-update
blob: 0ce6112bb5c3de520cc6aa9c479c774aed634466 (plain)
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:])