aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/command/diagnose_command.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-29 02:16:43 +0900
committernsfisis <nsfisis@gmail.com>2026-06-29 02:17:57 +0900
commit3b28fc65f5de7c6ad69bee48b2d1f52dd9b30972 (patch)
treedd2567446a1fe6e7245fd35190dc039bb46cc86b /crates/shirabe/src/command/diagnose_command.rs
parent1036b7e33a4360df8b99f81ef03492fee8328bd0 (diff)
downloadphp-shirabe-3b28fc65f5de7c6ad69bee48b2d1f52dd9b30972.tar.gz
php-shirabe-3b28fc65f5de7c6ad69bee48b2d1f52dd9b30972.tar.zst
php-shirabe-3b28fc65f5de7c6ad69bee48b2d1f52dd9b30972.zip
fix(advisory): pass IO as shared handle to Auditor::audit
Auditor::audit took io as &mut dyn IOInterface, forcing the audit and installer post-audit call sites to hold a borrow_mut() on the shared IO RefCell for the whole call. During advisory fetching the repositories write to their own clones of the same handle, so the borrow_mut() collided with their borrow() and panicked with 'RefCell already mutably borrowed' on 'audit --locked'. Take the Rc<RefCell<dyn IOInterface>> handle instead so writes borrow briefly and never overlap. Un-ignore the locked-audit regression test that this unblocks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command/diagnose_command.rs')
-rw-r--r--crates/shirabe/src/command/diagnose_command.rs12
1 files changed, 9 insertions, 3 deletions
diff --git a/crates/shirabe/src/command/diagnose_command.rs b/crates/shirabe/src/command/diagnose_command.rs
index a465182..0c50d69 100644
--- a/crates/shirabe/src/command/diagnose_command.rs
+++ b/crates/shirabe/src/command/diagnose_command.rs
@@ -996,9 +996,11 @@ impl DiagnoseCommand {
)?);
repo_set.add_repository(composer_repo_as_repo)?;
- let mut io = BufferIO::new(String::new(), 0, None)?;
+ let io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>> = std::rc::Rc::new(
+ std::cell::RefCell::new(BufferIO::new(String::new(), 0, None)?),
+ );
let result = match auditor.audit(
- &mut io,
+ &io,
&repo_set,
packages,
Auditor::FORMAT_TABLE,
@@ -1022,7 +1024,11 @@ impl DiagnoseCommand {
return Ok(PhpMixed::String(format!(
"<highlight>Audit found some issues:</>{}{}",
PHP_EOL,
- io.get_output()
+ io.borrow()
+ .as_any()
+ .downcast_ref::<BufferIO>()
+ .unwrap()
+ .get_output()
)));
}