summaryrefslogtreecommitdiff
path: root/scripts/dev/change_release.py
blob: 9a61d8b0fc41b01d528ec5800622581bc2a4c0fd (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
#!/usr/bin/env python3

# Copyright 2021 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later

"""Change a description of a GitHub release."""

import sys
import argparse
import os.path

import github3
import github3.exceptions


class Error(Exception):

    """Raised for errors in this script."""


def read_github_token():
    """Read the GitHub API token from disk."""
    token_file = os.path.join(os.path.expanduser('~'), '.gh_token')
    with open(token_file, encoding='ascii') as f:
        token = f.read().strip()
    return token


def find_release(repo, tag):
    """Find the release for the given repo/tag."""
    release = None  # to satisfy pylint
    for release in repo.releases():
        if release.tag_name == tag:
            break
    else:
        raise Error("No release found for {!r}!".format(tag))
    return release


def change_release_description(release, filename, description):
    """Change a release description to the given new one."""
    assets = [asset for asset in release.assets() if asset.name == filename]
    if not assets:
        raise Error(f"No assets found for {filename}")
    if len(assets) > 1:
        raise Error(f"Multiple assets found for {filename}: {assets}")

    asset = assets[0]
    asset.edit(filename, description)


def parse_args():
    """Parse command-line arguments."""
    parser = argparse.ArgumentParser()
    parser.add_argument('tag')
    parser.add_argument('filename')
    parser.add_argument('description')
    return parser.parse_args()


def main():
    args = parse_args()

    token = read_github_token()
    gh = github3.login(token=token)
    repo = gh.repository('qutebrowser', 'qutebrowser')

    try:
        release = find_release(repo, args.tag)
        change_release_description(release, args.filename, args.description)
    except Error as e:
        sys.exit(str(e))


if __name__ == '__main__':
    main()