provision: Avoid distutils; keep PROVISION_VERSION as a tuple.

distutils is deprecated in Python 3.10 and will be removed in Python
3.12.  We don’t need a full-powered version parser for this anyway.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg 2022-07-20 13:24:54 -07:00 committed by Tim Abbott
parent 22ebf701aa
commit 412e90f601
5 changed files with 13 additions and 23 deletions

View File

@ -43,7 +43,7 @@ In `version.py`, we have a special parameter, `PROVISION_VERSION`,
which is used to help ensure developers don't spend time debugging
test/linter/etc. failures that actually were caused by the developer
rebasing and forgetting to provision". `PROVISION_VERSION` has a
format of `x.y`; when `x` doesn't match the value from the last time
format of `(x, y)`; when `x` doesn't match the value from the last time
the user provisioned, or `y` is higher than the value from last
time, most Zulip tools will crash early and ask the user to provision.
This has empirically made a huge impact on how often developers spend

View File

@ -76,12 +76,12 @@ def check_django() -> bool:
def provision_version() -> bool:
fn = os.path.join(UUID_VAR_PATH, "provision_version")
with open(fn) as f:
version = f.read().strip()
version = tuple(map(int, f.read().strip().split(".")))
print("latest version provisioned:", version)
from version import PROVISION_VERSION
print("desired version:", PROVISION_VERSION)
if version != PROVISION_VERSION:
if not (PROVISION_VERSION <= version < (PROVISION_VERSION[0] + 1,)):
print("You need to provision!")
return False
return True

View File

@ -362,7 +362,7 @@ def main(options: argparse.Namespace) -> int:
version_file = os.path.join(UUID_VAR_PATH, "provision_version")
print(f"writing to {version_file}\n")
with open(version_file, "w") as f:
f.write(PROVISION_VERSION + "\n")
f.write(".".join(map(str, PROVISION_VERSION)) + "\n")
print()
print(OKBLUE + "Zulip development environment setup succeeded!" + ENDC)

View File

@ -3,7 +3,6 @@ import os
import subprocess
import sys
from argparse import ArgumentParser
from distutils.version import LooseVersion
from typing import Iterable, List, Optional, Tuple
from scripts.lib.zulip_tools import get_dev_uuid_var_path
@ -12,10 +11,6 @@ from version import PROVISION_VERSION
ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
def get_major_version(v: str) -> int:
return int(v.split(".")[0])
def get_version_file() -> str:
uuid_var_path = get_dev_uuid_var_path()
return os.path.join(uuid_var_path, "provision_version")
@ -30,7 +25,7 @@ properly.
"""
def preamble(version: str) -> str:
def preamble(version: Tuple[int, ...]) -> str:
text = PREAMBLE.format(version, PROVISION_VERSION)
text += "\n"
return text
@ -64,22 +59,17 @@ def get_provisioning_status() -> Tuple[bool, Optional[str]]:
return True, None
with open(version_file) as f:
version = f.read().strip()
# Normal path for people that provision--we're all good!
if version == PROVISION_VERSION:
return True, None
version = tuple(map(int, f.read().strip().split(".")))
# We may be more provisioned than the branch we just moved to. As
# long as the major version hasn't changed, then we should be ok.
if LooseVersion(version) > LooseVersion(PROVISION_VERSION):
if get_major_version(version) == get_major_version(PROVISION_VERSION):
if version < PROVISION_VERSION:
return False, preamble(version) + NEED_TO_UPGRADE
elif version < (PROVISION_VERSION[0] + 1,):
return True, None
else:
return False, preamble(version) + NEED_TO_DOWNGRADE
return False, preamble(version) + NEED_TO_UPGRADE
def assert_provisioning_status_ok(skip_provision_check: bool) -> None:
if not skip_provision_check:

View File

@ -48,4 +48,4 @@ API_FEATURE_LEVEL = 133
# historical commits sharing the same major version, in which case a
# minor version bump suffices.
PROVISION_VERSION = "195.0"
PROVISION_VERSION = (195, 0)