diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index add99854fbd..56325a61e75 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -1881,6 +1881,7 @@ name = "codex-utils-cargo-bin" version = "0.0.0" dependencies = [ "assert_cmd", + "path-absolutize", "thiserror 2.0.17", ] @@ -2845,7 +2846,6 @@ dependencies = [ "anyhow", "codex-core", "codex-utils-cargo-bin", - "path-absolutize", "rmcp", "serde_json", "tokio", diff --git a/codex-rs/exec-server/tests/common/Cargo.toml b/codex-rs/exec-server/tests/common/Cargo.toml index 4846db52f75..6444b61f97e 100644 --- a/codex-rs/exec-server/tests/common/Cargo.toml +++ b/codex-rs/exec-server/tests/common/Cargo.toml @@ -11,7 +11,6 @@ path = "lib.rs" anyhow = { workspace = true } codex-core = { workspace = true } codex-utils-cargo-bin = { workspace = true } -path-absolutize = { workspace = true } rmcp = { workspace = true } serde_json = { workspace = true } tokio = { workspace = true } diff --git a/codex-rs/exec-server/tests/common/lib.rs b/codex-rs/exec-server/tests/common/lib.rs index b587868d80f..562d3504f6e 100644 --- a/codex-rs/exec-server/tests/common/lib.rs +++ b/codex-rs/exec-server/tests/common/lib.rs @@ -2,7 +2,6 @@ use codex_core::MCP_SANDBOX_STATE_METHOD; use codex_core::SandboxState; use codex_core::protocol::SandboxPolicy; use codex_utils_cargo_bin::find_resource; -use path_absolutize::Absolutize; use rmcp::ClientHandler; use rmcp::ErrorData as McpError; use rmcp::RoleClient; @@ -38,14 +37,8 @@ where let execve_wrapper = codex_utils_cargo_bin::cargo_bin("codex-execve-wrapper")?; // `bash` is a test resource rather than a binary target, so we must use - // `find_resource!` to locate it instead of `cargo_bin`. - // - // Note we also have to normalize (but not canonicalize!) the path for - // _Bazel_ because the original value ends with - // `codex-rs/exec-server/tests/common/../suite/bash`, but the `tests/common` - // folder will not exist at runtime under Bazel. As such, we have to - // normalize it before passing it to `dotslash fetch`. - let bash = find_resource!("../suite/bash")?.absolutize()?.to_path_buf(); + // `find_resource!` to locate it instead of `cargo_bin()`. + let bash = find_resource!("../suite/bash")?; // Need to ensure the artifact associated with the bash DotSlash file is // available before it is run in a read-only sandbox. diff --git a/codex-rs/utils/cargo-bin/Cargo.toml b/codex-rs/utils/cargo-bin/Cargo.toml index d8e6877e6e8..fe3a410547d 100644 --- a/codex-rs/utils/cargo-bin/Cargo.toml +++ b/codex-rs/utils/cargo-bin/Cargo.toml @@ -9,4 +9,5 @@ workspace = true [dependencies] assert_cmd = { workspace = true } +path-absolutize = { workspace = true } thiserror = { workspace = true } diff --git a/codex-rs/utils/cargo-bin/src/lib.rs b/codex-rs/utils/cargo-bin/src/lib.rs index 2858ad6bca7..40fa40c62fd 100644 --- a/codex-rs/utils/cargo-bin/src/lib.rs +++ b/codex-rs/utils/cargo-bin/src/lib.rs @@ -1,6 +1,8 @@ use std::ffi::OsString; use std::path::PathBuf; +pub use path_absolutize; + #[derive(Debug, thiserror::Error)] pub enum CargoBinError { #[error("failed to read current exe")] @@ -91,19 +93,33 @@ macro_rules! find_resource { // included in the compiled binary (even if it is built with Cargo), but // we only check it at runtime if `RUNFILES_DIR` is set. let resource = std::path::Path::new(&$resource); - let manifest_dir = match std::env::var("RUNFILES_DIR") { + match std::env::var("RUNFILES_DIR") { Ok(bazel_runtime_files) => match option_env!("BAZEL_PACKAGE") { - Some(bazel_package) => Ok(std::path::PathBuf::from(bazel_runtime_files) - .join("_main") - .join(bazel_package)), + Some(bazel_package) => { + use $crate::path_absolutize::Absolutize; + + let manifest_dir = std::path::PathBuf::from(bazel_runtime_files) + .join("_main") + .join(bazel_package) + .join(resource); + // Note we also have to normalize (but not canonicalize!) + // the path for _Bazel_ because the original value ends with + // `codex-rs/exec-server/tests/common/../suite/bash`, but + // the `tests/common` folder will not exist at runtime under + // Bazel. As such, we have to normalize it before passing it + // to `dotslash fetch`. + manifest_dir.absolutize().map(|p| p.to_path_buf()) + } None => Err(std::io::Error::new( std::io::ErrorKind::NotFound, "BAZEL_PACKAGE not set in Bazel build", )), }, - Err(_) => Ok(std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))), - }; - manifest_dir.map(|dir| dir.join(resource)) + Err(_) => { + let manifest_dir = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); + Ok(manifest_dir.join(resource)) + } + } }}; }