1
0
mirror of https://github.com/j178/prek.git synced 2026-04-25 02:11:36 +02:00

Fallback to use remote repo package root instead of erroring (#1203)

This commit is contained in:
Jo
2025-12-09 00:46:15 +08:00
committed by GitHub
parent 554fb51250
commit 53ae118348
2 changed files with 56 additions and 11 deletions
+24 -11
View File
@@ -8,6 +8,7 @@ use anyhow::Context;
use cargo_metadata::{MetadataCommand, Package};
use itertools::{Either, Itertools};
use prek_consts::env_vars::EnvVars;
use tracing::debug;
use crate::cli::reporter::HookInstallReporter;
use crate::hook::{Hook, InstallInfo, InstalledHook};
@@ -36,7 +37,7 @@ async fn find_package_dir(
repo: &Path,
binary_name: &str,
cargo: Option<&Path>,
) -> anyhow::Result<(PathBuf, String, bool)> {
) -> anyhow::Result<(PathBuf, Option<String>, bool)> {
let repo = repo.to_path_buf();
let binary_name = binary_name.to_string();
let cargo = cargo.map(Path::to_path_buf);
@@ -74,7 +75,7 @@ async fn find_package_dir(
let is_workspace = metadata.workspace_members.len() > 1
|| package_dir != metadata.workspace_root.as_std_path();
return Ok((package_dir, package.name.to_string(), is_workspace));
return Ok((package_dir, Some(package.name.to_string()), is_workspace));
}
}
@@ -213,7 +214,19 @@ impl LanguageImpl for Rust {
// Find the specific package directory for this hook's binary
let (package_dir, package_name, is_workspace) =
find_package_dir(repo, binary_name, Some(&cargo)).await?;
match find_package_dir(repo, binary_name, Some(&cargo)).await {
Ok(res) => res,
Err(e) => {
debug!(
"Failed to find package for binary '{}' in {}: {}",
binary_name,
repo.display(),
e
);
debug!("Falling back to using repo root as package dir");
(repo.to_path_buf(), None, false)
}
};
if lib_deps.is_empty() && !is_workspace {
// For single packages without lib deps, use cargo install directly
@@ -310,8 +323,8 @@ impl LanguageImpl for Rust {
.arg(&target_dir);
// For workspace members, explicitly specify the package
if is_workspace {
cmd.args(["--package", &package_name]);
if is_workspace && let Some(package_name) = &package_name {
cmd.args(["--package", package_name]);
}
cmd.current_dir(&package_dir)
@@ -440,7 +453,7 @@ edition = "2021"
.await
.unwrap();
assert_eq!(path, temp.path());
assert_eq!(pkg_name, "my-tool");
assert_eq!(pkg_name.unwrap(), "my-tool");
assert!(!is_workspace);
}
@@ -493,7 +506,7 @@ edition = "2021"
.await
.unwrap();
assert_eq!(path, temp.path());
assert_eq!(pkg_name, "cargo-deny");
assert_eq!(pkg_name.unwrap(), "cargo-deny");
assert!(is_workspace);
}
@@ -527,7 +540,7 @@ edition = "2021"
let (path, pkg_name, is_workspace) =
find_package_dir(temp.path(), "my-cli", None).await.unwrap();
assert_eq!(path, temp.path().join("cli"));
assert_eq!(pkg_name, "my-cli");
assert_eq!(pkg_name.unwrap(), "my-cli");
assert!(is_workspace);
}
@@ -563,7 +576,7 @@ path = "src/main.rs"
let (path, pkg_name, is_workspace) =
find_package_dir(temp.path(), "typos", None).await.unwrap();
assert_eq!(path, temp.path().join("crates/typos-cli"));
assert_eq!(pkg_name, "typos-cli");
assert_eq!(pkg_name.unwrap(), "typos-cli");
assert!(is_workspace);
}
@@ -612,7 +625,7 @@ edition = "2021"
.await
.unwrap();
assert_eq!(path, temp.path().join("crates/cli"));
assert_eq!(pkg_name, "virtual-cli");
assert_eq!(pkg_name.unwrap(), "virtual-cli");
assert!(is_workspace);
}
@@ -647,7 +660,7 @@ edition = "2021"
let (path, pkg_name, is_workspace) =
find_package_dir(temp.path(), "my-cli", None).await.unwrap();
assert_eq!(path, temp.path().join("crates/cli"));
assert_eq!(pkg_name, "my-cli");
assert_eq!(pkg_name.unwrap(), "my-cli");
assert!(is_workspace);
// my-lib is a library (no binary), so searching for it should fail
+32
View File
@@ -207,6 +207,38 @@ fn remote_hooks() {
");
}
/// Test that remote Rust hooks from non-workspace repos are installed and run correctly.
#[test]
fn remote_hook_non_workspace() {
let context = TestContext::new();
context.init_project();
context.write_pre_commit_config(indoc::indoc! {r"
repos:
- repo: https://github.com/prek-test-repos/rust-hooks-non-workspace
rev: v1.0.0
hooks:
- id: hello-world
verbose: true
pass_filenames: false
always_run: true
"});
context.git_add(".");
cmd_snapshot!(context.filters(), context.run(), @r"
success: true
exit_code: 0
----- stdout -----
hello-world..............................................................Passed
- hook id: hello-world
- duration: [TIME]
Hello, Prek!
----- stderr -----
");
}
/// Test that library dependencies (non-cli: prefix) work correctly on remote hooks.
/// This verifies that the shared repo is not modified when adding dependencies.
#[test]