mirror of
https://github.com/openai/codex.git
synced 2026-05-02 12:21:26 +03:00
## Why Follow-up to #16345, the Bazel clippy rollout in #15955, and the cleanup pass in #16353. `cargo clippy` was enforcing the workspace deny-list from `codex-rs/Cargo.toml` because the member crates opt into `[lints] workspace = true`, but Bazel clippy was only using `rules_rust` plus `clippy.toml`. That left the Bazel lane vulnerable to drift: `clippy.toml` can tune lint behavior, but it cannot set allow/warn/deny/forbid levels. This PR now closes both sides of the follow-up. It keeps `.bazelrc` in sync with `[workspace.lints.clippy]`, and it fixes the real clippy violations that the newly-synced Windows Bazel lane surfaced once that deny-list started matching Cargo. ## What Changed - added `.github/scripts/verify_bazel_clippy_lints.py`, a Python check that parses `codex-rs/Cargo.toml` with `tomllib`, reads the Bazel `build:clippy` `clippy_flag` entries from `.bazelrc`, and reports missing, extra, or mismatched lint levels - ran that verifier from the lightweight `ci.yml` workflow so the sync check does not depend on a Rust toolchain being installed first - expanded the `.bazelrc` comment to explain the Cargo `workspace = true` linkage and why Bazel needs the deny-list duplicated explicitly - fixed the Windows-only `codex-windows-sandbox` violations that Bazel clippy reported after the sync, using the same style as #16353: inline `format!` args, method references instead of trivial closures, removed redundant clones, and replaced SID conversion `unwrap` and `expect` calls with proper errors - cleaned up the remaining cross-platform violations the Bazel lane exposed in `codex-backend-client` and `core_test_support` ## Testing Key new test introduced by this PR: `python3 .github/scripts/verify_bazel_clippy_lints.py`
63 lines
1.8 KiB
Rust
63 lines
1.8 KiB
Rust
use anyhow::Result;
|
|
use std::ffi::OsStr;
|
|
use windows_sys::Win32::Foundation::CloseHandle;
|
|
use windows_sys::Win32::Foundation::ERROR_ALREADY_EXISTS;
|
|
use windows_sys::Win32::Foundation::ERROR_FILE_NOT_FOUND;
|
|
use windows_sys::Win32::Foundation::GetLastError;
|
|
use windows_sys::Win32::Foundation::HANDLE;
|
|
use windows_sys::Win32::System::Threading::CreateMutexW;
|
|
use windows_sys::Win32::System::Threading::MUTEX_ALL_ACCESS;
|
|
use windows_sys::Win32::System::Threading::OpenMutexW;
|
|
use windows_sys::Win32::System::Threading::ReleaseMutex;
|
|
|
|
use super::to_wide;
|
|
|
|
const READ_ACL_MUTEX_NAME: &str = "Local\\CodexSandboxReadAcl";
|
|
|
|
pub struct ReadAclMutexGuard {
|
|
handle: HANDLE,
|
|
}
|
|
|
|
impl Drop for ReadAclMutexGuard {
|
|
fn drop(&mut self) {
|
|
unsafe {
|
|
let _ = ReleaseMutex(self.handle);
|
|
CloseHandle(self.handle);
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn read_acl_mutex_exists() -> Result<bool> {
|
|
let name = to_wide(OsStr::new(READ_ACL_MUTEX_NAME));
|
|
let handle = unsafe { OpenMutexW(MUTEX_ALL_ACCESS, 0, name.as_ptr()) };
|
|
if handle == 0 {
|
|
let err = unsafe { GetLastError() };
|
|
if err == ERROR_FILE_NOT_FOUND {
|
|
return Ok(false);
|
|
}
|
|
return Err(anyhow::anyhow!("OpenMutexW failed: {err}"));
|
|
}
|
|
unsafe {
|
|
CloseHandle(handle);
|
|
}
|
|
Ok(true)
|
|
}
|
|
|
|
pub fn acquire_read_acl_mutex() -> Result<Option<ReadAclMutexGuard>> {
|
|
let name = to_wide(OsStr::new(READ_ACL_MUTEX_NAME));
|
|
let handle = unsafe { CreateMutexW(std::ptr::null_mut(), 1, name.as_ptr()) };
|
|
if handle == 0 {
|
|
return Err(anyhow::anyhow!("CreateMutexW failed: {}", unsafe {
|
|
GetLastError()
|
|
}));
|
|
}
|
|
let err = unsafe { GetLastError() };
|
|
if err == ERROR_ALREADY_EXISTS {
|
|
unsafe {
|
|
CloseHandle(handle);
|
|
}
|
|
return Ok(None);
|
|
}
|
|
Ok(Some(ReadAclMutexGuard { handle }))
|
|
}
|