75 lines
2.9 KiB
Python
Executable File
75 lines
2.9 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import importlib.util
|
|
import os
|
|
import sys
|
|
|
|
ARCH_DICT = {
|
|
"x86_64": "4",
|
|
"arm64-v8a": "3",
|
|
"armeabi-v7a": "2",
|
|
"x86": "1",
|
|
"null": "0",
|
|
}
|
|
|
|
|
|
def get_electrum_version() -> str:
|
|
project_root = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
|
|
version_file_path = os.path.join(project_root, "electrum", "version.py")
|
|
# load version.py; needlessly complicated alternative to "imp.load_source":
|
|
version_spec = importlib.util.spec_from_file_location('version', version_file_path)
|
|
version_module = version = importlib.util.module_from_spec(version_spec)
|
|
version_spec.loader.exec_module(version_module)
|
|
return version.ELECTRUM_VERSION
|
|
|
|
|
|
def get_android_versioncode(*, arch_name: str) -> int:
|
|
version_code = 0
|
|
# add ELECTRUM_VERSION
|
|
app_version = get_electrum_version()
|
|
# if alpha/beta, and not stable: strip out alpha/beta part from last component.
|
|
# NOTE: we REUSE the version_code int between alphas/betas and the final stable.
|
|
# This is not allowed on Google Play or F-Droid.
|
|
# This means we MUST NOT upload alphas/betas there.
|
|
if any(c in app_version for c in ("a", "b")):
|
|
c_pos = app_version.find("a")
|
|
if c_pos == -1:
|
|
c_pos = app_version.find("b")
|
|
app_version = app_version[:c_pos]
|
|
# now the app_version str must contain exactly three dot-delimited components
|
|
app_version_components = app_version.split('.')
|
|
assert len(app_version_components) == 3, f"version str expected to have 3 components, but got {app_version!r}"
|
|
# convert to int
|
|
for i in app_version_components:
|
|
version_code *= 100
|
|
version_code += int(i)
|
|
# add arch
|
|
arch_code = ARCH_DICT[arch_name]
|
|
assert len(arch_code) == 1
|
|
version_code *= 10
|
|
version_code += int(arch_code)
|
|
# compensate for legacy scheme
|
|
# note: up until version 4.5.5, we used a different scheme for version_code.
|
|
# 4_______________4_05_05_00
|
|
# ^ android arch, ^ app_version (4.5.5.0)
|
|
# This offset ensures that all new-scheme version codes are larger than the old-scheme version codes.
|
|
offset_due_to_legacy_scheme = 45_000_000
|
|
version_code += offset_due_to_legacy_scheme
|
|
return version_code
|
|
|
|
|
|
if __name__ == '__main__':
|
|
try:
|
|
android_arch = sys.argv[1]
|
|
except Exception:
|
|
print(f"usage: {os.path.basename(__file__)} <android_arch>", file=sys.stderr)
|
|
sys.exit(1)
|
|
if android_arch not in ARCH_DICT:
|
|
print(f"usage: {os.path.basename(__file__)} <android_arch>", file=sys.stderr)
|
|
print(f"error: unknown {android_arch=}", file=sys.stderr)
|
|
print(f" should be one of: {list(ARCH_DICT.keys())}", file=sys.stderr)
|
|
sys.exit(1)
|
|
version_code = get_android_versioncode(arch_name=android_arch)
|
|
assert isinstance(version_code, int), f"{version_code=!r} must be an int."
|
|
print(version_code, file=sys.stdout)
|