| | |
| |
|
| | import datetime |
| | import json |
| | import os |
| | import pathlib |
| | import re |
| | import subprocess |
| | from argparse import ArgumentParser |
| | from pathlib import Path |
| |
|
| | rex = re.compile(r'version = "(\S+)"') |
| |
|
| |
|
| | def regex_matches(relpath, regex=rex): |
| | p = pathlib.Path(relpath) |
| | assert p.exists() |
| | for line in open(str(p)): |
| | m = regex.match(line) |
| | if m is not None: |
| | return m |
| |
|
| |
|
| | def read_toml_version(relpath): |
| | res = regex_matches(relpath, rex) |
| | if res is not None: |
| | return res.group(1) |
| | raise ValueError(f"no version found in {relpath}") |
| |
|
| |
|
| | def replace_toml_version(relpath, newversion): |
| | p = pathlib.Path(relpath) |
| | assert p.exists() |
| | tmp_path = str(p) + "_tmp" |
| | with open(tmp_path, "w") as f: |
| | for line in open(str(p)): |
| | m = rex.match(line) |
| | if m is not None: |
| | print(f"{relpath}: set version={newversion}") |
| | f.write(f'version = "{newversion}"\n') |
| | else: |
| | f.write(line) |
| | os.rename(tmp_path, str(p)) |
| |
|
| |
|
| | def read_json_version(relpath): |
| | p = pathlib.Path(relpath) |
| | assert p.exists() |
| | with open(p) as f: |
| | json_data = json.loads(f.read()) |
| | return json_data["version"] |
| |
|
| |
|
| | def update_package_json(relpath, newversion): |
| | p = pathlib.Path(relpath) |
| | assert p.exists() |
| | with open(p) as f: |
| | json_data = json.loads(f.read()) |
| | json_data["version"] = newversion |
| | with open(p, "w") as f: |
| | json.dump(json_data, f, sort_keys=True, indent=2) |
| | f.write("\n") |
| |
|
| |
|
| | def main(): |
| | parser = ArgumentParser(prog="set_core_version") |
| | parser.add_argument("newversion") |
| |
|
| | json_list = [ |
| | "deltachat-jsonrpc/typescript/package.json", |
| | "deltachat-rpc-server/npm-package/package.json", |
| | ] |
| | toml_list = [ |
| | "Cargo.toml", |
| | "deltachat-ffi/Cargo.toml", |
| | "deltachat-jsonrpc/Cargo.toml", |
| | "deltachat-rpc-server/Cargo.toml", |
| | "deltachat-repl/Cargo.toml", |
| | "python/pyproject.toml", |
| | "deltachat-rpc-client/pyproject.toml", |
| | ] |
| | try: |
| | opts = parser.parse_args() |
| | except SystemExit: |
| | print() |
| | for x in toml_list: |
| | print(f"{x}: {read_toml_version(x)}") |
| | for x in json_list: |
| | print(f"{x}: {read_json_version(x)}") |
| | print() |
| | raise SystemExit("need argument: new version, example: 1.25.0") |
| |
|
| | newversion = opts.newversion |
| | if newversion.count(".") < 2: |
| | raise SystemExit("need at least two dots in version") |
| |
|
| | core_toml = read_toml_version("Cargo.toml") |
| | ffi_toml = read_toml_version("deltachat-ffi/Cargo.toml") |
| | assert core_toml == ffi_toml, (core_toml, ffi_toml) |
| |
|
| | today = datetime.date.today().isoformat() |
| |
|
| | if "alpha" not in newversion: |
| | found = False |
| | for line in Path("CHANGELOG.md").open(): |
| | if line == f"## [{newversion}] - {today}\n": |
| | found = True |
| | if not found: |
| | raise SystemExit( |
| | f"CHANGELOG.md contains no entry for version: {newversion}" |
| | ) |
| |
|
| | for toml_filename in toml_list: |
| | replace_toml_version(toml_filename, newversion) |
| |
|
| | for json_filename in json_list: |
| | update_package_json(json_filename, newversion) |
| |
|
| | with open("release-date.in", "w") as f: |
| | f.write(today) |
| |
|
| | print("running cargo check") |
| | subprocess.call(["cargo", "check"]) |
| |
|
| | print("adding changes to git index") |
| | subprocess.call(["git", "add", "-u"]) |
| | |
| |
|
| | print("After commit, make sure to:") |
| | print() |
| | print(f" git tag -a v{newversion}") |
| | print(f" git push origin v{newversion}") |
| | print(f" gh release create v{newversion} -n ''") |
| | print() |
| | print("Merge release branch into `master` if the release") |
| | print("is made on a stable branch.") |
| | print() |
| |
|
| |
|
| | if __name__ == "__main__": |
| | main() |
| |
|