aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/util/perforce.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-20 23:37:42 +0900
committernsfisis <nsfisis@gmail.com>2026-06-20 23:37:42 +0900
commit84655bf3a4a21dbbe7aec8e3aee1e661505bbb6d (patch)
tree189f8ce5d7d53246632d5e2419c392d58f06e2b8 /crates/shirabe/src/util/perforce.rs
parent10840ec1fd7f1140305449fc94175d60998572c1 (diff)
downloadphp-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.rs37
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 {