Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/tools/maint/create_release.py
4150 views
1
#!/usr/bin/env python3
2
# Copyright 2022 The Emscripten Authors. All rights reserved.
3
# Emscripten is available under two separate licenses, the MIT license and the
4
# University of Illinois/NCSA Open Source License. Both these licenses can be
5
# found in the LICENSE file.
6
7
from datetime import datetime
8
import os
9
import subprocess
10
import sys
11
12
script_dir = os.path.dirname(os.path.abspath(__file__))
13
root_dir = os.path.dirname(os.path.dirname(script_dir))
14
15
sys.path.insert(0, root_dir)
16
from tools import utils
17
18
19
def update_version_txt(release_version, new_version):
20
version_file = os.path.join(root_dir, 'emscripten-version.txt')
21
old_content = utils.read_file(version_file)
22
utils.write_file(version_file, old_content.replace(release_version, new_version))
23
24
25
def update_changelog(release_version, new_version):
26
changelog_file = os.path.join(root_dir, 'ChangeLog.md')
27
changelog = utils.read_file(changelog_file)
28
marker = f'{release_version} (in development)'
29
pos = changelog.find(marker)
30
assert pos != -1
31
pos += len(marker) + 1
32
# Skip the next line which should just be hyphens
33
assert changelog[pos] == '-'
34
pos = changelog.find('\n', pos)
35
assert pos != -1
36
37
# Add new entry
38
today = datetime.now().strftime('%m/%d/%y')
39
new_entry = f'{release_version} - {today}'
40
new_entry = '\n\n' + new_entry + '\n' + ('-' * len(new_entry))
41
changelog = changelog[:pos] + new_entry + changelog[pos:]
42
43
# Update the "in development" entry
44
changelog = changelog.replace(f'{release_version} (in development)', f'{new_version} (in development)')
45
46
utils.write_file(changelog_file, changelog)
47
48
49
def create_git_branch(release_version):
50
branch_name = 'version_' + release_version
51
52
# Create a new git branch
53
subprocess.check_call(['git', 'checkout', '-b', branch_name, 'upstream/main'], cwd=root_dir)
54
55
# Create auto-generated changes to the new git branch
56
subprocess.check_call(['git', 'add', '-u', '.'], cwd=root_dir)
57
subprocess.check_call(['git', 'commit', '-m', f'Mark {release_version} as released'], cwd=root_dir)
58
print('New release created in branch: `%s`' % branch_name)
59
60
if '-n' not in sys.argv:
61
# Push new branch to upstream
62
subprocess.check_call(['git', 'push', 'upstream', branch_name], cwd=root_dir)
63
64
65
def main(argv):
66
if subprocess.check_output(['git', 'status', '-uno', '--porcelain'], cwd=root_dir).strip():
67
print('tree is not clean')
68
return 1
69
70
is_github_runner = len(argv) > 1 and argv[1] == '--action'
71
72
utils.set_version_globals()
73
74
release_version = [utils.EMSCRIPTEN_VERSION_MAJOR, utils.EMSCRIPTEN_VERSION_MINOR,
75
utils.EMSCRIPTEN_VERSION_TINY]
76
new_dev_version = list(release_version)
77
new_dev_version[2] += 1
78
79
release_version = '.'.join(str(v) for v in release_version)
80
new_dev_version = '.'.join(str(v) for v in new_dev_version)
81
82
update_version_txt(release_version, new_dev_version)
83
update_changelog(release_version, new_dev_version)
84
85
print('Creating new release: %s' % release_version)
86
87
if is_github_runner: # For GitHub Actions workflows
88
with open(os.environ['GITHUB_ENV'], 'a') as f:
89
f.write(f'RELEASE_VERSION={release_version}')
90
else: # Local use
91
create_git_branch(release_version)
92
# TODO(sbc): Maybe create the tag too
93
94
return 0
95
96
97
if __name__ == '__main__':
98
sys.exit(main(sys.argv))
99
100