6.NUR/ci/nur/update.py
2025-02-10 14:28:10 -08:00

61 lines
2.1 KiB
Python

import logging
from argparse import Namespace
from concurrent.futures import ThreadPoolExecutor, as_completed
from .eval import EvalError, eval_repo
from .manifest import Repo, load_manifest, update_lock_file
from .path import LOCK_PATH, MANIFEST_PATH
from .prefetch import prefetch
logger = logging.getLogger(__name__)
def update(repo: Repo) -> Repo:
repo, locked_version, repo_path = prefetch(repo)
if repo_path:
eval_repo(repo, repo_path)
repo.locked_version = locked_version
return repo
def update_command(args: Namespace) -> None:
logging.basicConfig(level=logging.INFO)
manifest = load_manifest(MANIFEST_PATH, LOCK_PATH)
if getattr(args, "debug", False):
for repo in manifest.repos:
try:
update(repo)
except EvalError as err:
if repo.locked_version is None:
logger.error(
f"repository {repo.name} failed to evaluate: {err}. This repo is not yet in our lock file!!!!"
)
raise
logger.error(f"repository {repo.name} failed to evaluate: {err}")
except Exception:
logger.exception(f"Failed to update repository {repo.name}")
else:
with ThreadPoolExecutor() as executor:
future_to_repo = {
executor.submit(update, repo): repo for repo in manifest.repos
}
for future in as_completed(future_to_repo):
repo = future_to_repo[future]
try:
future.result()
except EvalError as err:
if repo.locked_version is None:
logger.error(
f"repository {repo.name} failed to evaluate: {err}. This repo is not yet in our lock file!!!!"
)
raise
logger.error(f"repository {repo.name} failed to evaluate: {err}")
except Exception:
logger.exception(f"Failed to update repository {repo.name}")
update_lock_file(manifest.repos, LOCK_PATH)