mirror of
https://gitlab.com/kupfer/kupferbootstrap.git
synced 2025-06-24 01:18:22 -04:00
79 lines
3.1 KiB
Python
79 lines
3.1 KiB
Python
import logging
|
|
import os
|
|
|
|
from typing import Union
|
|
from utils import git
|
|
|
|
from .compare import semver_compare, VerComp
|
|
from distro.repo_config import ReposConfigFile
|
|
|
|
KBS_VERSION: Union[str, None] = None
|
|
|
|
KBS_VERSION_MIN_KEY = "kbs_min_version"
|
|
KBS_VERSION_CI_MIN_KEY = 'kbs_ci_version'
|
|
|
|
|
|
def get_kbs_version(kbs_folder: Union[str, None] = None) -> Union[str, None]:
|
|
if KBS_VERSION:
|
|
return KBS_VERSION
|
|
if not kbs_folder:
|
|
kbs_folder = os.path.join(os.path.dirname(__file__), "..")
|
|
try:
|
|
res = git(
|
|
['describe', '--tags', '--match', 'v*.*.*'],
|
|
use_git_dir=True,
|
|
git_dir=os.path.join(kbs_folder, ".git"),
|
|
capture_output=True,
|
|
)
|
|
if res.returncode:
|
|
output = res.stderr or res.stdout
|
|
if output and not isinstance(output, str):
|
|
output = output.decode().strip()
|
|
raise Exception(output or f'[Git failed without output. Return Code: {res.returncode}]')
|
|
return (res.stdout or b'').decode().strip()
|
|
except Exception as ex:
|
|
logging.warning(f"Failed to fetch KBS version with git: {ex!s}")
|
|
return None
|
|
|
|
|
|
def compare_kbs_version_generic(
|
|
kbs_version: str,
|
|
minimum_ver: str | None,
|
|
) -> Union[VerComp, None]:
|
|
if not minimum_ver:
|
|
return None
|
|
try:
|
|
return semver_compare(minimum_ver.lstrip("v"), kbs_version.lstrip("v"))
|
|
except Exception as ex:
|
|
logging.warning(f'Failed to compare KBS version {kbs_version!r} to required minimum version {minimum_ver!r}: {ex!r}')
|
|
return None
|
|
|
|
|
|
def compare_kbs_version(kbs_version: str, repo_config: ReposConfigFile) -> bool | None:
|
|
"""Returns True if KBS is new enough for PKGBUILDs"""
|
|
minimum_ver = repo_config.get(KBS_VERSION_MIN_KEY)
|
|
kbs_state = compare_kbs_version_generic(kbs_version=kbs_version, minimum_ver=minimum_ver)
|
|
if not minimum_ver:
|
|
logging.warning(f"Can't check PKGBUILDs for compatible KBS version as {KBS_VERSION_MIN_KEY!r} "
|
|
'is empty in PKGBUILDs repos.yml')
|
|
return None
|
|
if kbs_state == VerComp.RIGHT_OLDER:
|
|
logging.warning(f'KBS version {kbs_version!r} is older than {minimum_ver!r} required by PKGBUILDs.\n'
|
|
'Some functionality may randomly be broken.\nYou have been warned.')
|
|
return False
|
|
return True
|
|
|
|
|
|
def compare_kbs_ci_version(kbs_version: str, repo_config: ReposConfigFile) -> bool | None:
|
|
"""Returns True if KBS is new enough for PKGBUILDs in CI"""
|
|
minimum_ver = repo_config.get(KBS_VERSION_CI_MIN_KEY)
|
|
if not minimum_ver:
|
|
logging.warning("Can't check PKGBUILDs for compatible KBS CI version: "
|
|
f'Minimum CI KBS version {KBS_VERSION_CI_MIN_KEY!r} is empty in PKGBUILDs repos.yml!')
|
|
return None
|
|
kbs_state = compare_kbs_version_generic(kbs_version=kbs_version, minimum_ver=minimum_ver)
|
|
if kbs_state == VerComp.RIGHT_OLDER:
|
|
logging.error(f'KBS CI version {kbs_version!r} is older than {minimum_ver!r} required by PKGBUILDs kbs_ci_version!\n'
|
|
'CI is likely to fail!')
|
|
return False
|
|
return True
|