blob: 15ea733eb14c7602ba799992c738461cd74d77ff [file] [log] [blame]
"""
$ python update_antlr_version.py 4.9.3 4.10
Read file
"""
import sys
import os
import subprocess
def runme(cmd):
return subprocess.check_output(cmd.split(' '))
def freshen(ROOT):
ok = input("Perform antlr4 `mvn clean` and wipe build dirs Y/N? (default no): ")
ok = ok.lower()
if ok.lower() != 'y' and ok !='yes':
print("Ok, not cleaning antlr4 dir")
return
# runme("mvn clean")
runme(f"rm -rf {ROOT}/runtime/CSharp/src/bin")
runme(f"rm -rf {ROOT}/runtime/CSharp/src/obj")
runme(f"rm -rf {ROOT}/runtime/Cpp/runtime/build")
runme(f"rm -rf {ROOT}/runtime/gen")
runme(f"rm -rf {ROOT}/runtime/JavaScript/dist")
def get_change_list(fname):
files = {}
with open(fname, "r") as f:
for line in f.readlines():
line = line.strip()
if len(line)>0 and not line.startswith("#"):
if line.startswith('*'): # '*' implies change multiple lines
files[line[1:].strip()] = True
else:
files[line] = False
return files
def update_file(qfname, multi, before, after):
with open(qfname, "r", encoding="UTF-8") as f:
text = f.read()
if before not in text:
print(f"{before} not in {qfname}")
return
# Don't update if on > 1 line; too complex for tool
lines = text.split('\n')
count = sum(before in line for line in lines)
if count>1 and not multi:
print(f"{before} appears on {count} lines so _not_ updating {qfname}")
else:
# print(f"{before} => {after} in {qfname}")
text = text.replace(before, after)
with open(qfname, "w", encoding="UTF-8") as f:
f.write(text)
def update_files(ROOT, before, after):
files = get_change_list(f"{ROOT}/scripts/files-to-update.txt")
for fname,multi in files.items():
update_file(f"{ROOT}/{fname}", multi, before, after)
def find_remaining(ROOT, before):
return
if __name__ == '__main__':
# This is where parrt puts antlr
ROOT = f"{os.path.expanduser('~')}/antlr/code/antlr4"
# ROOT = f"/tmp/antlr4" # for testing, it's nice to have diff target
before = sys.argv[1]
after = sys.argv[2]
print(f"Updating ANTLR version from {before} to {after}")
root = input(f"Set ANTLR repo root (default {ROOT}): ")
if len(root.strip())>0:
ROOT = root
freshen(ROOT)
update_files(ROOT, before, after)
find_remaining(ROOT, before)
print("Warning: manually update runtime/Cpp/runtime/src/Version.h has non-standard version mechanism")
print("Warning: some targets can't handle 4.x; must be 4.x.0:")
print("\truntime/Dart/pubspec.yaml")
print("\truntime/JavaScript/package.json")