diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-20 23:37:42 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-20 23:37:42 +0900 |
| commit | 84655bf3a4a21dbbe7aec8e3aee1e661505bbb6d (patch) | |
| tree | 189f8ce5d7d53246632d5e2419c392d58f06e2b8 /crates/shirabe/src/util/perforce.rs | |
| parent | 10840ec1fd7f1140305449fc94175d60998572c1 (diff) | |
| download | php-shirabe-84655bf3a4a21dbbe7aec8e3aee1e661505bbb6d.tar.gz php-shirabe-84655bf3a4a21dbbe7aec8e3aee1e661505bbb6d.tar.zst php-shirabe-84655bf3a4a21dbbe7aec8e3aee1e661505bbb6d.zip | |
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 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/util/perforce.rs')
| -rw-r--r-- | crates/shirabe/src/util/perforce.rs | 37 |
1 files changed, 27 insertions, 10 deletions
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<i64> { 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 { |
