current commit
261002.4 · Re-indent python using 4-space indentation. NFC (#1799)
#!/usr/bin/env python3

import argparse
import json
import os
import re
import subprocess
import sys
from collections import OrderedDict

script_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(script_dir)
sys.path.append(root_dir)

import emsdk


def version_key(version_string):
    parts = re.split('[.-]', version_string)
    key = [[int(part) for part in parts[:3]], -len(parts), parts[3:]]
    return key


def main():
    if subprocess.check_output(['git', 'status', '--porcelain'], cwd=root_dir).strip():
        print('tree is not clean')
        sys.exit(1)

    parser = argparse.ArgumentParser()
    parser.add_argument('-r', '--release-hash')
    parser.add_argument('-a', '--asserts-hash')
    parser.add_argument('-v', '--new-version')
    parser.add_argument('--gh-action', action='store_true')
    options = parser.parse_args()

    release_info = emsdk.load_releases_info()
    if options.new_version:
        new_version = options.new_version
    else:
        new_version = version_key(release_info['aliases']['latest'])[0]
        new_version[-1] += 1
        new_version = '.'.join(str(part) for part in new_version)

    asserts_hash = None
    if options.release_hash:
        new_hash = options.release_hash
        asserts_hash = options.asserts_hash
    else:
        new_hash = emsdk.get_emscripten_releases_tot()

    print(f'Creating new release: {new_version} -> {new_hash}')
    release_info['releases'][new_version] = new_hash
    if asserts_hash:
        asserts_name = new_version + '-asserts'
        release_info['releases'][asserts_name] = asserts_hash

    releases = [(k, v) for k, v in release_info['releases'].items()]
    releases.sort(key=lambda pair: version_key(pair[0]))

    release_info['releases'] = OrderedDict(reversed(releases))
    release_info['aliases']['latest'] = new_version

    with open(os.path.join(root_dir, 'emscripten-releases-tags.json'), 'w') as f:
        f.write(json.dumps(release_info, indent=2))
        f.write('\n')

    subprocess.check_call(
      [sys.executable, os.path.join(script_dir, 'update_bazel_workspace.py')],
      cwd=root_dir)

    branch_name = 'version_' + new_version

    if options.gh_action:  # For GitHub Actions workflows
        with open(os.environ['GITHUB_ENV'], 'a') as f:
            f.write(f'RELEASE_VERSION={new_version}')
    else:  # Local use
        # Create a new git branch
        subprocess.check_call(['git', 'checkout', '-b', branch_name, 'origin/main'], cwd=root_dir)

        # Create auto-generated changes to the new git branch
        subprocess.check_call(['git', 'add', '-u', '.'], cwd=root_dir)
        subprocess.check_call(['git', 'commit', '-m', new_version], cwd=root_dir)
        print(f'New release created in branch: `{branch_name}`')

        # Push new branch to origin
        subprocess.check_call(['git', 'push', 'origin', branch_name], cwd=root_dir)

    return 0


if __name__ == '__main__':
    sys.exit(main())