aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-09 06:50:56 +0900
committernsfisis <nsfisis@gmail.com>2026-08-09 06:50:56 +0900
commit6b83e68d7961f150ec15dd59d457d519e0bf8663 (patch)
tree8342c9d7d31679c669e14a76d0349c777f6c2566 /crates/shirabe/src
parentff17dcdb757656c5e81b10070a7bbcc4ef3e97f7 (diff)
downloadphp-shirabe-6b83e68d7961f150ec15dd59d457d519e0bf8663.tar.gz
php-shirabe-6b83e68d7961f150ec15dd59d457d519e0bf8663.tar.zst
php-shirabe-6b83e68d7961f150ec15dd59d457d519e0bf8663.zip
refactor(env): split and join PATH lists with std::env
The shim's PATH_SEPARATOR was hardcoded to ":", so every PATH list was split and joined on the wrong character off Unix. std::env::split_paths and join_paths use the platform's separator, which also lets the bin-dir membership test in EventDispatcher compare list entries instead of regex-matching the raw PATH string. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src')
-rw-r--r--crates/shirabe/src/event_dispatcher/event_dispatcher.rs25
1 files changed, 11 insertions, 14 deletions
diff --git a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
index 3db924d4..f037f87d 100644
--- a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
+++ b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
@@ -31,7 +31,7 @@ use shirabe_php_rpc::{
};
use shirabe_php_shim::Catch as _;
use shirabe_php_shim::{
- InvalidArgumentException, PATH_SEPARATOR, PhpMixed, RuntimeException, array_pop, array_push,
+ InvalidArgumentException, PhpMixed, RuntimeException, array_pop, array_push,
array_search_in_vec, array_splice, file_exists, get_class, hash, implode, ini_get, is_array,
is_callable, is_object, is_string, krsort, php_regex, preg_quote, realpath,
spl_autoload_functions, spl_autoload_register, spl_autoload_unregister, spl_object_hash,
@@ -1413,19 +1413,16 @@ try {{
if shirabe_php_shim::is_dir(&bin_dir) {
let bin_dir = realpath(&bin_dir).unwrap_or(bin_dir);
let path_value = Platform::get_env(path_env).unwrap_or_default();
- if !Preg::is_match(
- format!(
- "{{(^|{}){}($|{})}}",
- PATH_SEPARATOR,
- preg_quote(&bin_dir, None),
- PATH_SEPARATOR
- ),
- &path_value,
- ) {
- Platform::put_env(
- path_env,
- &format!("{}{}{}", bin_dir, PATH_SEPARATOR, path_value),
- );
+ if !std::env::split_paths(&path_value).any(|dir| dir == std::path::Path::new(&bin_dir))
+ {
+ let path_value = std::env::join_paths(
+ std::iter::once(std::path::PathBuf::from(&bin_dir))
+ .chain(std::env::split_paths(&path_value)),
+ )
+ .expect("bin-dir holds no path separator")
+ .into_string()
+ .unwrap();
+ Platform::put_env(path_env, &path_value);
}
}
}