nur: add eval command for local testing
This commit is contained in:
parent
6d46ca7b4b
commit
f8a1c2f3cf
3 changed files with 83 additions and 52 deletions
|
|
@ -8,6 +8,7 @@ from .format_manifest import format_manifest_command
|
|||
from .index import index_command
|
||||
from .path import ROOT
|
||||
from .update import update_command
|
||||
from .eval import eval_command
|
||||
|
||||
LOG_LEVELS = dict(
|
||||
debug=logging.DEBUG,
|
||||
|
|
@ -37,6 +38,10 @@ def parse_arguments(argv: List[str]) -> argparse.Namespace:
|
|||
update = subparsers.add_parser("update")
|
||||
update.set_defaults(func=update_command)
|
||||
|
||||
eval = subparsers.add_parser("eval")
|
||||
eval.add_argument("directory", default=".")
|
||||
eval.set_defaults(func=eval_command)
|
||||
|
||||
index = subparsers.add_parser("index")
|
||||
index.add_argument("directory", default=ROOT)
|
||||
index.set_defaults(func=index_command)
|
||||
|
|
|
|||
76
ci/nur/eval.py
Normal file
76
ci/nur/eval.py
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import logging
|
||||
import subprocess
|
||||
import tempfile
|
||||
import os
|
||||
from argparse import Namespace
|
||||
from pathlib import Path
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from .error import EvalError
|
||||
from .manifest import Repo
|
||||
from .path import EVALREPO_PATH, nixpkgs_path
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def eval_repo(repo: Repo, repo_path: Path) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
eval_path = Path(d).joinpath("default.nix")
|
||||
with open(eval_path, "w") as f:
|
||||
f.write(
|
||||
f"""
|
||||
with import <nixpkgs> {{}};
|
||||
import {EVALREPO_PATH} {{
|
||||
name = "{repo.name}";
|
||||
url = "{repo.url}";
|
||||
src = {repo_path.joinpath(repo.file)};
|
||||
inherit pkgs lib;
|
||||
}}
|
||||
"""
|
||||
)
|
||||
|
||||
# fmt: off
|
||||
cmd = [
|
||||
"nix-env",
|
||||
"-f", str(eval_path),
|
||||
"-qa", "*",
|
||||
"--meta",
|
||||
"--xml",
|
||||
"--allowed-uris", "https://static.rust-lang.org",
|
||||
"--option", "restrict-eval", "true",
|
||||
"--option", "allow-import-from-derivation", "true",
|
||||
"--drv-path",
|
||||
"--show-trace",
|
||||
"-I", f"nixpkgs={nixpkgs_path()}",
|
||||
"-I", str(repo_path),
|
||||
"-I", str(eval_path),
|
||||
"-I", str(EVALREPO_PATH),
|
||||
]
|
||||
# fmt: on
|
||||
|
||||
logger.info(f"Evaluate repository {repo.name}")
|
||||
env = dict(PATH=os.environ["PATH"], NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM="1")
|
||||
proc = subprocess.Popen(cmd, env=env, stdout=subprocess.DEVNULL)
|
||||
try:
|
||||
res = proc.wait(15)
|
||||
except subprocess.TimeoutExpired:
|
||||
raise EvalError(f"evaluation for {repo.name} timed out of after 15 seconds")
|
||||
if res != 0:
|
||||
raise EvalError(f"{repo.name} does not evaluate:\n$ {' '.join(cmd)}")
|
||||
|
||||
|
||||
def eval_command(args: Namespace) -> None:
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
repo_path = Path(args.directory)
|
||||
name = repo_path.name
|
||||
repo = Repo(
|
||||
name,
|
||||
urlparse("localhost"),
|
||||
False,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
)
|
||||
eval_repo(repo, repo_path)
|
||||
|
|
@ -1,64 +1,14 @@
|
|||
import logging
|
||||
import os
|
||||
import subprocess
|
||||
import tempfile
|
||||
from argparse import Namespace
|
||||
from pathlib import Path
|
||||
|
||||
from .error import EvalError
|
||||
from .eval import EvalError, eval_repo
|
||||
from .manifest import Repo, load_manifest, update_lock_file
|
||||
from .path import EVALREPO_PATH, LOCK_PATH, MANIFEST_PATH, nixpkgs_path
|
||||
from .path import LOCK_PATH, MANIFEST_PATH
|
||||
from .prefetch import prefetch
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def eval_repo(repo: Repo, repo_path: Path) -> None:
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
eval_path = Path(d).joinpath("default.nix")
|
||||
with open(eval_path, "w") as f:
|
||||
f.write(
|
||||
f"""
|
||||
with import <nixpkgs> {{}};
|
||||
import {EVALREPO_PATH} {{
|
||||
name = "{repo.name}";
|
||||
url = "{repo.url}";
|
||||
src = {repo_path.joinpath(repo.file)};
|
||||
inherit pkgs lib;
|
||||
}}
|
||||
"""
|
||||
)
|
||||
|
||||
# fmt: off
|
||||
cmd = [
|
||||
"nix-env",
|
||||
"-f", str(eval_path),
|
||||
"-qa", "*",
|
||||
"--meta",
|
||||
"--xml",
|
||||
"--allowed-uris", "https://static.rust-lang.org",
|
||||
"--option", "restrict-eval", "true",
|
||||
"--option", "allow-import-from-derivation", "true",
|
||||
"--drv-path",
|
||||
"--show-trace",
|
||||
"-I", f"nixpkgs={nixpkgs_path()}",
|
||||
"-I", str(repo_path),
|
||||
"-I", str(eval_path),
|
||||
"-I", str(EVALREPO_PATH),
|
||||
]
|
||||
# fmt: on
|
||||
|
||||
logger.info(f"Evaluate repository {repo.name}")
|
||||
env = dict(PATH=os.environ["PATH"], NIXPKGS_ALLOW_UNSUPPORTED_SYSTEM="1")
|
||||
proc = subprocess.Popen(cmd, env=env, stdout=subprocess.DEVNULL)
|
||||
try:
|
||||
res = proc.wait(15)
|
||||
except subprocess.TimeoutExpired:
|
||||
raise EvalError(f"evaluation for {repo.name} timed out of after 15 seconds")
|
||||
if res != 0:
|
||||
raise EvalError(f"{repo.name} does not evaluate:\n$ {' '.join(cmd)}")
|
||||
|
||||
|
||||
def update(repo: Repo) -> Repo:
|
||||
repo, locked_version, repo_path = prefetch(repo)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue