util: standardize expression construction; more tests
Some checks are pending
Rust / build (push) Waiting to run

Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: Ib5f28098bb5d319bbdc108bd9248f6186a6a6964
This commit is contained in:
raf 2026-03-20 13:57:55 +03:00
commit df28971308
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF

View file

@ -309,6 +309,16 @@ fn is_hash_mismatch_error(stderr: &str) -> bool {
|| (stderr.contains("specified:") && stderr.contains("got:"))
}
/// Construct the eval expression for a given argument.
/// Handles both plain package names and flake references.
fn make_eval_expr(eval_arg: &str) -> String {
if eval_arg.contains('#') {
format!("{eval_arg}.meta")
} else {
format!("nixpkgs#{eval_arg}.meta")
}
}
/// Check if a package has an unfree, insecure, or broken attribute set.
/// Returns the appropriate `RetryAction` if any of these are true. Makes a
/// single nix eval call to minimize overhead.
@ -320,7 +330,7 @@ fn check_package_flags(args: &[String]) -> Result<RetryAction> {
.cloned()
.unwrap_or_else(|| ".".to_string());
let eval_expr = format!("nixpkgs#{eval_arg}.meta");
let eval_expr = make_eval_expr(&eval_arg);
let eval_cmd = NixCommand::new("eval")
.arg("--json")
.arg(&eval_expr)
@ -1005,4 +1015,59 @@ mod tests {
"Original hash should be untouched"
);
}
#[test]
fn test_eval_expr_plain_package_name() {
assert_eq!(
make_eval_expr("vscode"),
"nixpkgs#vscode.meta",
"Plain package names should be prefixed with nixpkgs#"
);
}
#[test]
fn test_eval_expr_nixpkgs_prefixed() {
assert_eq!(
make_eval_expr("nixpkgs#vscode"),
"nixpkgs#vscode.meta",
"nixpkgs# prefix should not be duplicated"
);
}
#[test]
fn test_eval_expr_custom_flake() {
assert_eq!(
make_eval_expr("myflake#vscode"),
"myflake#vscode.meta",
"Custom flake references should be preserved"
);
}
#[test]
fn test_eval_expr_github_flake() {
assert_eq!(
make_eval_expr("github:owner/repo#vscode"),
"github:owner/repo#vscode.meta",
"GitHub flake references should be preserved"
);
}
#[test]
fn test_eval_expr_path_flake() {
assert_eq!(
make_eval_expr("./myflake#vscode"),
"./myflake#vscode.meta",
"Path-based flake references should be preserved"
);
}
#[test]
fn test_eval_expr_special_nixpkg_forms() {
// Test various nixpkgs forms that might be used
assert_eq!(
make_eval_expr("nixpkgs#legacyPackages.x86_64-linux.vscode"),
"nixpkgs#legacyPackages.x86_64-linux.vscode.meta",
"Complex nixpkgs references should be preserved"
);
}
}