From 84655bf3a4a21dbbe7aec8e3aee1e661505bbb6d Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sat, 20 Jun 2026 23:37:42 +0900 Subject: feat(symfony-process): port full Process class from PHP Faithfully port every method, field and constant of Symfony's Process.php into process.rs, replacing the reduced stub. Add the supporting pipes module (PipesInterface/AbstractPipes/UnixPipes/ WindowsPipes), ProcessUtils and the missing process exceptions (LogicException/InvalidArgumentException) with constructors. Methods now return anyhow::Result where PHP throws, take the env argument and a bool-returning callback, and borrow &mut for status-updating accessors; all callers are updated accordingly. Extend the php-shim with proc_open/proc_close (PHP-compatible signatures), proc_get_status, proc_terminate, posix_kill, uniqid, ftruncate, ftell_stream, fseek3, stream_get_contents3 and env helpers. Co-Authored-By: Claude Opus 4.8 --- crates/shirabe/src/util/perforce.rs | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) (limited to 'crates/shirabe/src/util/perforce.rs') diff --git a/crates/shirabe/src/util/perforce.rs b/crates/shirabe/src/util/perforce.rs index 0d56afb..d5facd2 100644 --- a/crates/shirabe/src/util/perforce.rs +++ b/crates/shirabe/src/util/perforce.rs @@ -382,7 +382,7 @@ impl Perforce { Ok(true) } - pub fn connect_client(&mut self) { + pub fn connect_client(&mut self) -> Result<()> { let p4_create_client_command = self.generate_p4_command(vec!["client".to_string(), "-i".to_string()], true); @@ -390,10 +390,13 @@ impl Perforce { p4_create_client_command, None, None, - file_get_contents(&self.get_p4_client_spec()), + file_get_contents(&self.get_p4_client_spec()) + .map(PhpMixed::String) + .unwrap_or(PhpMixed::Null), None, - ); - process.run(None); + )?; + process.run(None, indexmap::IndexMap::new())?; + Ok(()) } pub fn sync_code_base(&mut self, source_reference: Option<&str>) -> Result<()> { @@ -531,12 +534,20 @@ impl Perforce { } } - pub fn windows_login(&mut self, password: Option<&str>) -> i64 { + pub fn windows_login(&mut self, password: Option<&str>) -> Result { let command = self.generate_p4_command(vec!["login".to_string(), "-a".to_string()], true); - let mut process = Process::new(command, None, None, password.map(|s| s.to_string()), None); + let mut process = Process::new( + command, + None, + None, + password + .map(|s| PhpMixed::String(s.to_string())) + .unwrap_or(PhpMixed::Null), + None, + )?; - process.run(None) + process.run(None, indexmap::IndexMap::new()) } pub fn p4_login(&mut self) -> Result<()> { @@ -544,13 +555,19 @@ impl Perforce { if !self.is_logged_in()? { let password = self.query_p4_password(); if self.windows_flag { - self.windows_login(password.as_deref()); + self.windows_login(password.as_deref())?; } else { let command = self.generate_p4_command(vec!["login".to_string(), "-a".to_string()], false); - let mut process = Process::new(command, None, None, password, None); - process.run(None); + let mut process = Process::new( + command, + None, + None, + password.map(PhpMixed::String).unwrap_or(PhpMixed::Null), + None, + )?; + process.run(None, indexmap::IndexMap::new())?; if !process.is_successful() { return Err(Exception { -- cgit v1.3.1