2022-05-13 11:46:36 +03:00
|
|
|
#!/usr/bin/env python3
|
2022-10-04 13:12:54 +03:00
|
|
|
|
|
|
|
# Copyright (C) 2022 Yubico.
|
|
|
|
#
|
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
# limitations under the License.
|
|
|
|
|
2022-05-13 11:46:36 +03:00
|
|
|
import re
|
|
|
|
import sys
|
|
|
|
|
|
|
|
"""
|
|
|
|
This script updates version numbers in various files.
|
|
|
|
"""
|
|
|
|
|
|
|
|
version_pattern = r"(\d+)\.(\d+)\.(\d+)(-[^\s+]+)?"
|
|
|
|
lib_version_pattern = rf"const\s+String\s+version\s+=\s+'({version_pattern})';"
|
2023-01-25 12:18:33 +03:00
|
|
|
lib_build_pattern = r"const\s+int\s+build\s+=\s+(\d+);"
|
2022-05-13 11:46:36 +03:00
|
|
|
|
|
|
|
|
2022-05-24 14:13:20 +03:00
|
|
|
def sub1(pattern, repl, string):
|
|
|
|
buf, n = re.subn(pattern, repl, string)
|
|
|
|
if n != 1:
|
|
|
|
raise ValueError(f"Did not find string matching {pattern} to replace")
|
|
|
|
return buf
|
|
|
|
|
2023-01-25 12:18:33 +03:00
|
|
|
|
2022-05-13 11:46:36 +03:00
|
|
|
def update_file(fname, func):
|
|
|
|
with open(fname) as f:
|
|
|
|
orig = f.read()
|
|
|
|
|
|
|
|
buf = func(orig)
|
|
|
|
|
|
|
|
if buf != orig:
|
|
|
|
with open(fname, "w") as f:
|
|
|
|
f.write(buf)
|
|
|
|
print("Updated", fname)
|
|
|
|
|
2023-01-25 12:18:33 +03:00
|
|
|
|
2022-05-13 11:46:36 +03:00
|
|
|
def read_lib_version():
|
|
|
|
with open("lib/version.dart") as f:
|
|
|
|
buf = f.read()
|
|
|
|
|
|
|
|
m = re.search(
|
|
|
|
lib_version_pattern,
|
|
|
|
buf,
|
|
|
|
re.MULTILINE,
|
|
|
|
)
|
|
|
|
version = m.group(1)
|
|
|
|
m = re.search(
|
|
|
|
lib_build_pattern,
|
|
|
|
buf,
|
|
|
|
re.MULTILINE,
|
|
|
|
)
|
|
|
|
build = int(m.group(1))
|
|
|
|
return version, build
|
|
|
|
|
|
|
|
|
|
|
|
def update_lib(buf):
|
2022-05-24 14:13:20 +03:00
|
|
|
buf = sub1(
|
2022-05-13 11:46:36 +03:00
|
|
|
lib_version_pattern,
|
|
|
|
f"const String version = '{version}';",
|
|
|
|
buf,
|
|
|
|
)
|
|
|
|
|
2022-05-24 14:13:20 +03:00
|
|
|
buf = sub1(
|
2022-05-13 11:46:36 +03:00
|
|
|
lib_build_pattern,
|
|
|
|
f"const int build = {build};",
|
|
|
|
buf,
|
|
|
|
)
|
|
|
|
|
|
|
|
return buf
|
|
|
|
|
2023-01-25 12:18:33 +03:00
|
|
|
|
2022-05-13 11:46:36 +03:00
|
|
|
# Handle invocation
|
|
|
|
args = sys.argv[1:]
|
|
|
|
if not args:
|
|
|
|
version, build = read_lib_version()
|
2022-09-22 15:37:06 +03:00
|
|
|
print(f"{version}\n{build}")
|
2022-05-13 11:46:36 +03:00
|
|
|
elif len(args) == 2:
|
|
|
|
version = args[0]
|
|
|
|
if not re.fullmatch(version_pattern, version):
|
|
|
|
print("Version is not a valid semver string!")
|
|
|
|
sys.exit(1)
|
|
|
|
build = int(args[1])
|
|
|
|
print(f"Setting new version: {version}, build: {build}...")
|
|
|
|
update_file("lib/version.dart", update_lib)
|
|
|
|
else:
|
|
|
|
print("Usage: set-version.py <version> <build>")
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
# x.y.z without trailing part
|
2023-01-25 12:18:33 +03:00
|
|
|
short_version = re.search(r"(\d+\.\d+\.\d+)", version).group()
|
|
|
|
|
2022-05-13 11:46:36 +03:00
|
|
|
|
|
|
|
# pubspec.yaml
|
|
|
|
def update_pubspec(buf):
|
2022-05-24 14:13:20 +03:00
|
|
|
return sub1(
|
2023-01-25 12:18:33 +03:00
|
|
|
r"version:\s+\d+\.\d+\.\d+.*\+\d+",
|
|
|
|
f"version: {version}+{build}",
|
2022-05-13 11:46:36 +03:00
|
|
|
buf,
|
|
|
|
)
|
|
|
|
|
2023-01-25 12:18:33 +03:00
|
|
|
|
2022-05-13 11:46:36 +03:00
|
|
|
# Helper version_info
|
|
|
|
def update_helper_version(buf):
|
|
|
|
version_tuple = repr(tuple(int(d) for d in short_version.split(".")) + (0,))
|
2022-05-24 14:13:20 +03:00
|
|
|
buf = sub1(
|
2023-01-25 12:18:33 +03:00
|
|
|
r"filevers=\(\d+, \d+, \d+, \d+\)",
|
|
|
|
f"filevers={version_tuple}",
|
2022-05-13 11:46:36 +03:00
|
|
|
buf,
|
|
|
|
)
|
2022-05-24 14:13:20 +03:00
|
|
|
buf = sub1(
|
2023-01-25 12:18:33 +03:00
|
|
|
r"prodvers=\(\d+, \d+, \d+, \d+\)",
|
|
|
|
f"prodvers={version_tuple}",
|
2022-05-13 11:46:36 +03:00
|
|
|
buf,
|
|
|
|
)
|
2022-05-24 14:13:20 +03:00
|
|
|
buf = sub1(
|
2022-05-13 11:46:36 +03:00
|
|
|
rf"'FileVersion', '{version_pattern}'",
|
|
|
|
f"'FileVersion', '{version}'",
|
|
|
|
buf,
|
|
|
|
)
|
2022-05-24 14:13:20 +03:00
|
|
|
buf = sub1(
|
2022-05-13 11:46:36 +03:00
|
|
|
rf"'ProductVersion', '{version_pattern}'",
|
|
|
|
f"'ProductVersion', '{version}'",
|
|
|
|
buf,
|
|
|
|
)
|
|
|
|
return buf
|
|
|
|
|
2023-01-25 12:18:33 +03:00
|
|
|
|
2022-07-01 10:12:54 +03:00
|
|
|
# release-win.ps1
|
|
|
|
def update_release_win(buf):
|
|
|
|
return sub1(
|
2022-11-11 14:55:00 +03:00
|
|
|
rf'\$version="{version_pattern}"',
|
|
|
|
f'$version="{version}"',
|
2022-07-01 10:12:54 +03:00
|
|
|
buf,
|
|
|
|
)
|
2022-05-13 11:46:36 +03:00
|
|
|
|
2023-01-25 12:18:33 +03:00
|
|
|
|
|
|
|
# MSI .wxs file
|
|
|
|
def update_win_msi(buf):
|
|
|
|
return sub1(
|
|
|
|
rf'ProductVersion="{version_pattern}"',
|
|
|
|
f'ProductVersion="{short_version}"',
|
|
|
|
buf,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-05-13 11:46:36 +03:00
|
|
|
update_file("pubspec.yaml", update_pubspec)
|
2022-07-01 10:12:54 +03:00
|
|
|
update_file("helper/version_info.txt", update_helper_version)
|
2022-09-20 15:04:14 +03:00
|
|
|
update_file("resources/win/release-win.ps1", update_release_win)
|
2023-01-25 12:18:33 +03:00
|
|
|
update_file("resources/win/yubioath-desktop.wxs", update_win_msi)
|