git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-11.0.2/support/manage.py

normal view · raw

47fd5c32 Poul Sander 2024-10-05 08:44 1
#!/usr/bin/env python3
47fd5c32 Poul Sander 2024-10-05 08:44 2
47fd5c32 Poul Sander 2024-10-05 08:44 3
"""Manage site and releases.
47fd5c32 Poul Sander 2024-10-05 08:44 4
47fd5c32 Poul Sander 2024-10-05 08:44 5
Usage:
47fd5c32 Poul Sander 2024-10-05 08:44 6
  manage.py release [<branch>]
47fd5c32 Poul Sander 2024-10-05 08:44 7
  manage.py site
47fd5c32 Poul Sander 2024-10-05 08:44 8
47fd5c32 Poul Sander 2024-10-05 08:44 9
For the release command $FMT_TOKEN should contain a GitHub personal access token
47fd5c32 Poul Sander 2024-10-05 08:44 10
obtained from https://github.com/settings/tokens.
47fd5c32 Poul Sander 2024-10-05 08:44 11
"""
47fd5c32 Poul Sander 2024-10-05 08:44 12
47fd5c32 Poul Sander 2024-10-05 08:44 13
from __future__ import print_function
47fd5c32 Poul Sander 2024-10-05 08:44 14
import datetime, docopt, errno, fileinput, json, os
47fd5c32 Poul Sander 2024-10-05 08:44 15
import re, requests, shutil, sys
47fd5c32 Poul Sander 2024-10-05 08:44 16
from contextlib import contextmanager
47fd5c32 Poul Sander 2024-10-05 08:44 17
from subprocess import check_call
47fd5c32 Poul Sander 2024-10-05 08:44 18
47fd5c32 Poul Sander 2024-10-05 08:44 19
47fd5c32 Poul Sander 2024-10-05 08:44 20
class Git:
47fd5c32 Poul Sander 2024-10-05 08:44 21
    def __init__(self, dir):
47fd5c32 Poul Sander 2024-10-05 08:44 22
        self.dir = dir
47fd5c32 Poul Sander 2024-10-05 08:44 23
47fd5c32 Poul Sander 2024-10-05 08:44 24
    def call(self, method, args, **kwargs):
47fd5c32 Poul Sander 2024-10-05 08:44 25
        return check_call(['git', method] + list(args), **kwargs)
47fd5c32 Poul Sander 2024-10-05 08:44 26
47fd5c32 Poul Sander 2024-10-05 08:44 27
    def add(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 28
        return self.call('add', args, cwd=self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 29
47fd5c32 Poul Sander 2024-10-05 08:44 30
    def checkout(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 31
        return self.call('checkout', args, cwd=self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 32
47fd5c32 Poul Sander 2024-10-05 08:44 33
    def clean(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 34
        return self.call('clean', args, cwd=self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 35
47fd5c32 Poul Sander 2024-10-05 08:44 36
    def clone(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 37
        return self.call('clone', list(args) + [self.dir])
47fd5c32 Poul Sander 2024-10-05 08:44 38
47fd5c32 Poul Sander 2024-10-05 08:44 39
    def commit(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 40
        return self.call('commit', args, cwd=self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 41
47fd5c32 Poul Sander 2024-10-05 08:44 42
    def pull(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 43
        return self.call('pull', args, cwd=self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 44
47fd5c32 Poul Sander 2024-10-05 08:44 45
    def push(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 46
        return self.call('push', args, cwd=self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 47
47fd5c32 Poul Sander 2024-10-05 08:44 48
    def reset(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 49
        return self.call('reset', args, cwd=self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 50
47fd5c32 Poul Sander 2024-10-05 08:44 51
    def update(self, *args):
47fd5c32 Poul Sander 2024-10-05 08:44 52
        clone = not os.path.exists(self.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 53
        if clone:
47fd5c32 Poul Sander 2024-10-05 08:44 54
            self.clone(*args)
47fd5c32 Poul Sander 2024-10-05 08:44 55
        return clone
47fd5c32 Poul Sander 2024-10-05 08:44 56
47fd5c32 Poul Sander 2024-10-05 08:44 57
47fd5c32 Poul Sander 2024-10-05 08:44 58
def clean_checkout(repo, branch):
47fd5c32 Poul Sander 2024-10-05 08:44 59
    repo.clean('-f', '-d')
47fd5c32 Poul Sander 2024-10-05 08:44 60
    repo.reset('--hard')
47fd5c32 Poul Sander 2024-10-05 08:44 61
    repo.checkout(branch)
47fd5c32 Poul Sander 2024-10-05 08:44 62
47fd5c32 Poul Sander 2024-10-05 08:44 63
47fd5c32 Poul Sander 2024-10-05 08:44 64
class Runner:
47fd5c32 Poul Sander 2024-10-05 08:44 65
    def __init__(self, cwd):
47fd5c32 Poul Sander 2024-10-05 08:44 66
        self.cwd = cwd
47fd5c32 Poul Sander 2024-10-05 08:44 67
47fd5c32 Poul Sander 2024-10-05 08:44 68
    def __call__(self, *args, **kwargs):
47fd5c32 Poul Sander 2024-10-05 08:44 69
        kwargs['cwd'] = kwargs.get('cwd', self.cwd)
47fd5c32 Poul Sander 2024-10-05 08:44 70
        check_call(args, **kwargs)
47fd5c32 Poul Sander 2024-10-05 08:44 71
47fd5c32 Poul Sander 2024-10-05 08:44 72
47fd5c32 Poul Sander 2024-10-05 08:44 73
def create_build_env():
47fd5c32 Poul Sander 2024-10-05 08:44 74
    """Create a build environment."""
47fd5c32 Poul Sander 2024-10-05 08:44 75
    class Env:
47fd5c32 Poul Sander 2024-10-05 08:44 76
        pass
47fd5c32 Poul Sander 2024-10-05 08:44 77
    env = Env()
47fd5c32 Poul Sander 2024-10-05 08:44 78
    env.fmt_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
47fd5c32 Poul Sander 2024-10-05 08:44 79
    env.build_dir = 'build'
47fd5c32 Poul Sander 2024-10-05 08:44 80
    env.fmt_repo = Git(os.path.join(env.build_dir, 'fmt'))
47fd5c32 Poul Sander 2024-10-05 08:44 81
    return env
47fd5c32 Poul Sander 2024-10-05 08:44 82
47fd5c32 Poul Sander 2024-10-05 08:44 83
47fd5c32 Poul Sander 2024-10-05 08:44 84
fmt_repo_url = 'git@github.com:fmtlib/fmt'
47fd5c32 Poul Sander 2024-10-05 08:44 85
47fd5c32 Poul Sander 2024-10-05 08:44 86
47fd5c32 Poul Sander 2024-10-05 08:44 87
def update_site(env):
47fd5c32 Poul Sander 2024-10-05 08:44 88
    env.fmt_repo.update(fmt_repo_url)
47fd5c32 Poul Sander 2024-10-05 08:44 89
47fd5c32 Poul Sander 2024-10-05 08:44 90
    doc_repo = Git(os.path.join(env.build_dir, 'fmt.dev'))
47fd5c32 Poul Sander 2024-10-05 08:44 91
    doc_repo.update('git@github.com:fmtlib/fmt.dev')
47fd5c32 Poul Sander 2024-10-05 08:44 92
47fd5c32 Poul Sander 2024-10-05 08:44 93
    version = '11.0.0'
47fd5c32 Poul Sander 2024-10-05 08:44 94
    clean_checkout(env.fmt_repo, version)
47fd5c32 Poul Sander 2024-10-05 08:44 95
    target_doc_dir = os.path.join(env.fmt_repo.dir, 'doc')
47fd5c32 Poul Sander 2024-10-05 08:44 96
47fd5c32 Poul Sander 2024-10-05 08:44 97
    # Build the docs.
47fd5c32 Poul Sander 2024-10-05 08:44 98
    html_dir = os.path.join(env.build_dir, 'html')
47fd5c32 Poul Sander 2024-10-05 08:44 99
    if os.path.exists(html_dir):
47fd5c32 Poul Sander 2024-10-05 08:44 100
        shutil.rmtree(html_dir)
47fd5c32 Poul Sander 2024-10-05 08:44 101
    include_dir = env.fmt_repo.dir
47fd5c32 Poul Sander 2024-10-05 08:44 102
    import build
47fd5c32 Poul Sander 2024-10-05 08:44 103
    build.build_docs(version, doc_dir=target_doc_dir,
47fd5c32 Poul Sander 2024-10-05 08:44 104
                        include_dir=include_dir, work_dir=env.build_dir)
47fd5c32 Poul Sander 2024-10-05 08:44 105
    shutil.rmtree(os.path.join(html_dir, '.doctrees'))
47fd5c32 Poul Sander 2024-10-05 08:44 106
    # Copy docs to the website.
47fd5c32 Poul Sander 2024-10-05 08:44 107
    version_doc_dir = os.path.join(doc_repo.dir, version)
47fd5c32 Poul Sander 2024-10-05 08:44 108
    try:
47fd5c32 Poul Sander 2024-10-05 08:44 109
        shutil.rmtree(version_doc_dir)
47fd5c32 Poul Sander 2024-10-05 08:44 110
    except OSError as e:
47fd5c32 Poul Sander 2024-10-05 08:44 111
        if e.errno != errno.ENOENT:
47fd5c32 Poul Sander 2024-10-05 08:44 112
            raise
47fd5c32 Poul Sander 2024-10-05 08:44 113
    shutil.move(html_dir, version_doc_dir)
47fd5c32 Poul Sander 2024-10-05 08:44 114
47fd5c32 Poul Sander 2024-10-05 08:44 115
47fd5c32 Poul Sander 2024-10-05 08:44 116
def release(args):
47fd5c32 Poul Sander 2024-10-05 08:44 117
    env = create_build_env()
47fd5c32 Poul Sander 2024-10-05 08:44 118
    fmt_repo = env.fmt_repo
47fd5c32 Poul Sander 2024-10-05 08:44 119
47fd5c32 Poul Sander 2024-10-05 08:44 120
    branch = args.get('<branch>')
47fd5c32 Poul Sander 2024-10-05 08:44 121
    if branch is None:
47fd5c32 Poul Sander 2024-10-05 08:44 122
        branch = 'master'
47fd5c32 Poul Sander 2024-10-05 08:44 123
    if not fmt_repo.update('-b', branch, fmt_repo_url):
47fd5c32 Poul Sander 2024-10-05 08:44 124
        clean_checkout(fmt_repo, branch)
47fd5c32 Poul Sander 2024-10-05 08:44 125
47fd5c32 Poul Sander 2024-10-05 08:44 126
    # Update the date in the changelog and extract the version and the first
47fd5c32 Poul Sander 2024-10-05 08:44 127
    # section content.
47fd5c32 Poul Sander 2024-10-05 08:44 128
    changelog = 'ChangeLog.md'
47fd5c32 Poul Sander 2024-10-05 08:44 129
    changelog_path = os.path.join(fmt_repo.dir, changelog)
47fd5c32 Poul Sander 2024-10-05 08:44 130
    is_first_section = True
47fd5c32 Poul Sander 2024-10-05 08:44 131
    first_section = []
47fd5c32 Poul Sander 2024-10-05 08:44 132
    for i, line in enumerate(fileinput.input(changelog_path, inplace=True)):
47fd5c32 Poul Sander 2024-10-05 08:44 133
        if i == 0:
47fd5c32 Poul Sander 2024-10-05 08:44 134
            version = re.match(r'# (.*) - TBD', line).group(1)
47fd5c32 Poul Sander 2024-10-05 08:44 135
            line = '# {} - {}\n'.format(
47fd5c32 Poul Sander 2024-10-05 08:44 136
                version, datetime.date.today().isoformat())
47fd5c32 Poul Sander 2024-10-05 08:44 137
        elif not is_first_section:
47fd5c32 Poul Sander 2024-10-05 08:44 138
            pass
47fd5c32 Poul Sander 2024-10-05 08:44 139
        elif line.startswith('#'):
47fd5c32 Poul Sander 2024-10-05 08:44 140
            is_first_section = False
47fd5c32 Poul Sander 2024-10-05 08:44 141
        else:
47fd5c32 Poul Sander 2024-10-05 08:44 142
            first_section.append(line)
47fd5c32 Poul Sander 2024-10-05 08:44 143
        sys.stdout.write(line)
47fd5c32 Poul Sander 2024-10-05 08:44 144
    if first_section[0] == '\n':
47fd5c32 Poul Sander 2024-10-05 08:44 145
        first_section.pop(0)
47fd5c32 Poul Sander 2024-10-05 08:44 146
47fd5c32 Poul Sander 2024-10-05 08:44 147
    ns_version = None
47fd5c32 Poul Sander 2024-10-05 08:44 148
    base_h_path = os.path.join(fmt_repo.dir, 'include', 'fmt', 'base.h')
47fd5c32 Poul Sander 2024-10-05 08:44 149
    for line in fileinput.input(base_h_path):
47fd5c32 Poul Sander 2024-10-05 08:44 150
        m = re.match(r'\s*inline namespace v(.*) .*', line)
47fd5c32 Poul Sander 2024-10-05 08:44 151
        if m:
47fd5c32 Poul Sander 2024-10-05 08:44 152
            ns_version = m.group(1)
47fd5c32 Poul Sander 2024-10-05 08:44 153
            break
47fd5c32 Poul Sander 2024-10-05 08:44 154
    major_version = version.split('.')[0]
47fd5c32 Poul Sander 2024-10-05 08:44 155
    if not ns_version or ns_version != major_version:
47fd5c32 Poul Sander 2024-10-05 08:44 156
        raise Exception(f'Version mismatch {ns_version} != {major_version}')
47fd5c32 Poul Sander 2024-10-05 08:44 157
47fd5c32 Poul Sander 2024-10-05 08:44 158
    # Workaround GitHub-flavored Markdown treating newlines as <br>.
47fd5c32 Poul Sander 2024-10-05 08:44 159
    changes = ''
47fd5c32 Poul Sander 2024-10-05 08:44 160
    code_block = False
47fd5c32 Poul Sander 2024-10-05 08:44 161
    stripped = False
47fd5c32 Poul Sander 2024-10-05 08:44 162
    for line in first_section:
47fd5c32 Poul Sander 2024-10-05 08:44 163
        if re.match(r'^\s*```', line):
47fd5c32 Poul Sander 2024-10-05 08:44 164
            code_block = not code_block
47fd5c32 Poul Sander 2024-10-05 08:44 165
            changes += line
47fd5c32 Poul Sander 2024-10-05 08:44 166
            stripped = False
47fd5c32 Poul Sander 2024-10-05 08:44 167
            continue
47fd5c32 Poul Sander 2024-10-05 08:44 168
        if code_block:
47fd5c32 Poul Sander 2024-10-05 08:44 169
            changes += line
47fd5c32 Poul Sander 2024-10-05 08:44 170
            continue
47fd5c32 Poul Sander 2024-10-05 08:44 171
        if line == '\n' or re.match(r'^\s*\|.*', line):
47fd5c32 Poul Sander 2024-10-05 08:44 172
            if stripped:
47fd5c32 Poul Sander 2024-10-05 08:44 173
                changes += '\n'
47fd5c32 Poul Sander 2024-10-05 08:44 174
                stripped = False
47fd5c32 Poul Sander 2024-10-05 08:44 175
            changes += line
47fd5c32 Poul Sander 2024-10-05 08:44 176
            continue
47fd5c32 Poul Sander 2024-10-05 08:44 177
        if stripped:
47fd5c32 Poul Sander 2024-10-05 08:44 178
            line = ' ' + line.lstrip()
47fd5c32 Poul Sander 2024-10-05 08:44 179
        changes += line.rstrip()
47fd5c32 Poul Sander 2024-10-05 08:44 180
        stripped = True
47fd5c32 Poul Sander 2024-10-05 08:44 181
47fd5c32 Poul Sander 2024-10-05 08:44 182
    fmt_repo.checkout('-B', 'release')
47fd5c32 Poul Sander 2024-10-05 08:44 183
    fmt_repo.add(changelog)
47fd5c32 Poul Sander 2024-10-05 08:44 184
    fmt_repo.commit('-m', 'Update version')
47fd5c32 Poul Sander 2024-10-05 08:44 185
47fd5c32 Poul Sander 2024-10-05 08:44 186
    # Build the docs and package.
47fd5c32 Poul Sander 2024-10-05 08:44 187
    run = Runner(fmt_repo.dir)
47fd5c32 Poul Sander 2024-10-05 08:44 188
    run('cmake', '.')
47fd5c32 Poul Sander 2024-10-05 08:44 189
    run('make', 'doc', 'package_source')
47fd5c32 Poul Sander 2024-10-05 08:44 190
47fd5c32 Poul Sander 2024-10-05 08:44 191
    # Create a release on GitHub.
47fd5c32 Poul Sander 2024-10-05 08:44 192
    fmt_repo.push('origin', 'release')
47fd5c32 Poul Sander 2024-10-05 08:44 193
    auth_headers = {'Authorization': 'token ' + os.getenv('FMT_TOKEN')}
47fd5c32 Poul Sander 2024-10-05 08:44 194
    r = requests.post('https://api.github.com/repos/fmtlib/fmt/releases',
47fd5c32 Poul Sander 2024-10-05 08:44 195
                      headers=auth_headers,
47fd5c32 Poul Sander 2024-10-05 08:44 196
                      data=json.dumps({'tag_name': version,
47fd5c32 Poul Sander 2024-10-05 08:44 197
                                       'target_commitish': 'release',
47fd5c32 Poul Sander 2024-10-05 08:44 198
                                       'body': changes, 'draft': True}))
47fd5c32 Poul Sander 2024-10-05 08:44 199
    if r.status_code != 201:
47fd5c32 Poul Sander 2024-10-05 08:44 200
        raise Exception('Failed to create a release ' + str(r))
47fd5c32 Poul Sander 2024-10-05 08:44 201
    id = r.json()['id']
47fd5c32 Poul Sander 2024-10-05 08:44 202
    uploads_url = 'https://uploads.github.com/repos/fmtlib/fmt/releases'
47fd5c32 Poul Sander 2024-10-05 08:44 203
    package = 'fmt-{}.zip'.format(version)
47fd5c32 Poul Sander 2024-10-05 08:44 204
    r = requests.post(
47fd5c32 Poul Sander 2024-10-05 08:44 205
        '{}/{}/assets?name={}'.format(uploads_url, id, package),
47fd5c32 Poul Sander 2024-10-05 08:44 206
        headers={'Content-Type': 'application/zip'} | auth_headers,
47fd5c32 Poul Sander 2024-10-05 08:44 207
        data=open('build/fmt/' + package, 'rb'))
47fd5c32 Poul Sander 2024-10-05 08:44 208
    if r.status_code != 201:
47fd5c32 Poul Sander 2024-10-05 08:44 209
        raise Exception('Failed to upload an asset ' + str(r))
47fd5c32 Poul Sander 2024-10-05 08:44 210
47fd5c32 Poul Sander 2024-10-05 08:44 211
    update_site(env)
47fd5c32 Poul Sander 2024-10-05 08:44 212
47fd5c32 Poul Sander 2024-10-05 08:44 213
if __name__ == '__main__':
47fd5c32 Poul Sander 2024-10-05 08:44 214
    args = docopt.docopt(__doc__)
47fd5c32 Poul Sander 2024-10-05 08:44 215
    if args.get('release'):
47fd5c32 Poul Sander 2024-10-05 08:44 216
        release(args)
47fd5c32 Poul Sander 2024-10-05 08:44 217
    elif args.get('site'):
47fd5c32 Poul Sander 2024-10-05 08:44 218
        update_site(create_build_env())
1970-01-01 00:00 219