aboutsummaryrefslogtreecommitdiffstats
path: root/debian/bin/stable-update
blob: f17afdd91c12472a9b2d9109822d28f9aac3fa8e (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
#!/usr/bin/python3

import sys
sys.path.append(sys.path[0] + "/../lib/python")

import os, re, 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:])