aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-08-12 00:19:10 +0900
committernsfisis <nsfisis@gmail.com>2026-08-12 00:19:36 +0900
commit561924db750cbb4e4c183f9616472ed9a5b0fc7f (patch)
tree13d27f8c4d3a0fca8cfd447ea32befa9aa358228 /crates
parentdaa1acf091627f4f1af63ad44eee988048fa4136 (diff)
downloadphp-shirabe-561924db750cbb4e4c183f9616472ed9a5b0fc7f.tar.gz
php-shirabe-561924db750cbb4e4c183f9616472ed9a5b0fc7f.tar.zst
php-shirabe-561924db750cbb4e4c183f9616472ed9a5b0fc7f.zip
docs(todo): retag TODO markers by root cause
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'crates')
-rw-r--r--crates/shirabe-ca-bundle/src/ca_bundle.rs6
-rw-r--r--crates/shirabe-php-rpc/src/lib.rs2
-rw-r--r--crates/shirabe-php-shim/src/array.rs2
-rw-r--r--crates/shirabe-php-shim/src/datetime.rs2
-rw-r--r--crates/shirabe-php-shim/src/env.rs4
-rw-r--r--crates/shirabe-php-shim/src/exception.rs2
-rw-r--r--crates/shirabe-php-shim/src/filter.rs10
-rw-r--r--crates/shirabe-php-shim/src/fs.rs18
-rw-r--r--crates/shirabe-php-shim/src/json.rs2
-rw-r--r--crates/shirabe-php-shim/src/lib.rs4
-rw-r--r--crates/shirabe-php-shim/src/net.rs2
-rw-r--r--crates/shirabe-php-shim/src/phar.rs2
-rw-r--r--crates/shirabe-php-shim/src/preg.rs4
-rw-r--r--crates/shirabe-php-shim/src/process.rs2
-rw-r--r--crates/shirabe-php-shim/src/runtime.rs14
-rw-r--r--crates/shirabe-php-shim/src/stream.rs4
-rw-r--r--crates/shirabe-php-shim/src/string.rs8
-rw-r--r--crates/shirabe-php-shim/src/url.rs2
-rw-r--r--crates/shirabe-php-shim/src/var.rs4
-rw-r--r--crates/shirabe-php-src/src/standard/string.rs2
-rw-r--r--crates/shirabe-symfony-console/src/formatter/output_formatter.rs2
-rw-r--r--crates/shirabe-symfony-console/src/style/symfony_style.rs2
-rw-r--r--crates/shirabe-symfony-finder/src/finder.rs6
-rw-r--r--crates/shirabe-symfony-finder/src/spl_file_info.rs2
-rw-r--r--crates/shirabe-symfony-string/src/unicode_string.rs8
-rw-r--r--crates/shirabe/src/advisory/audit_config.rs2
-rw-r--r--crates/shirabe/src/command/diagnose_command.rs2
-rw-r--r--crates/shirabe/src/command/script_alias_command.rs6
-rw-r--r--crates/shirabe/src/command/search_command.rs2
-rw-r--r--crates/shirabe/src/composer.rs2
-rw-r--r--crates/shirabe/src/console/application.rs4
-rw-r--r--crates/shirabe/src/event_dispatcher/event_dispatcher.rs2
-rw-r--r--crates/shirabe/src/factory.rs2
-rw-r--r--crates/shirabe/src/installer/installation_manager.rs4
-rw-r--r--crates/shirabe/src/io/console_io.rs4
-rw-r--r--crates/shirabe/src/json/json_file.rs4
-rw-r--r--crates/shirabe/src/main.rs2
-rw-r--r--crates/shirabe/src/plugin/php_plugin_proxy.rs14
-rw-r--r--crates/shirabe/src/plugin/plugin_manager.rs2
-rw-r--r--crates/shirabe/src/repository/composer_repository.rs4
-rw-r--r--crates/shirabe/src/repository/platform_repository.rs2
-rw-r--r--crates/shirabe/src/repository/vcs_repository.rs2
-rw-r--r--crates/shirabe/src/signal.rs2
-rw-r--r--crates/shirabe/src/util/filesystem.rs4
-rw-r--r--crates/shirabe/src/util/http/curl_downloader.rs10
-rw-r--r--crates/shirabe/src/util/http_downloader.rs2
-rw-r--r--crates/shirabe/src/util/loop.rs4
-rw-r--r--crates/shirabe/src/util/process_executor.rs2
-rw-r--r--crates/shirabe/src/util/remote_filesystem.rs10
-rw-r--r--crates/shirabe/src/util/sync_executor.rs2
-rw-r--r--crates/shirabe/tests/all_functional_test.rs2
-rw-r--r--crates/shirabe/tests/autoload/autoload_generator_test.rs6
-rw-r--r--crates/shirabe/tests/autoload/class_loader_test.rs2
-rw-r--r--crates/shirabe/tests/command/run_script_command_test.rs2
-rw-r--r--crates/shirabe/tests/command/show_command_test.rs2
-rw-r--r--crates/shirabe/tests/common/bootstrap.rs4
-rw-r--r--crates/shirabe/tests/downloader/file_downloader_test.rs4
-rw-r--r--crates/shirabe/tests/installed_versions_test.rs26
-rw-r--r--crates/shirabe/tests/installer/installation_manager_test.rs2
-rw-r--r--crates/shirabe/tests/installer_test.rs6
-rw-r--r--crates/shirabe/tests/io/console_io_test.rs4
-rw-r--r--crates/shirabe/tests/package/dumper/array_dumper_test.rs2
-rw-r--r--crates/shirabe/tests/plugin/e2e_package_event_test.rs2
-rw-r--r--crates/shirabe/tests/repository/filesystem_repository_test.rs2
-rw-r--r--crates/shirabe/tests/repository/platform_repository_test.rs2
-rw-r--r--crates/shirabe/tests/util/auth_helper_test.rs4
-rw-r--r--crates/shirabe/tests/util/error_handler_test.rs6
-rw-r--r--crates/shirabe/tests/util/process_executor_test.rs4
-rw-r--r--crates/shirabe/tests/util/remote_filesystem_test.rs10
-rw-r--r--crates/shirabe/tests/util/stream_context_factory_test.rs4
-rw-r--r--crates/shirabe/tests/util/zip_test.rs2
71 files changed, 155 insertions, 155 deletions
diff --git a/crates/shirabe-ca-bundle/src/ca_bundle.rs b/crates/shirabe-ca-bundle/src/ca_bundle.rs
index 3c372cb1..b8e4c391 100644
--- a/crates/shirabe-ca-bundle/src/ca_bundle.rs
+++ b/crates/shirabe-ca-bundle/src/ca_bundle.rs
@@ -5,7 +5,7 @@ pub struct CaBundle;
impl CaBundle {
// TODO(plugin): unused for now; kept for API parity.
- // TODO(phase-c): The original inspects the linked OpenSSL version to decide
+ // TODO(http): The original inspects the linked OpenSSL version to decide
// whether openssl_x509_parse can be called safely. Certificate handling is
// slated to move to reqwest, so this dummy always reports safe.
pub fn is_openssl_parse_safe() -> bool {
@@ -16,7 +16,7 @@ impl CaBundle {
// `()` placeholder: CaBundle is expected to be subsumed by a Rust TLS
// library and removed, so it does not need a real logger.
//
- // TODO(phase-c): Dummy stand-in until HTTP handling moves to reqwest, which
+ // TODO(http): Dummy stand-in until HTTP handling moves to reqwest, which
// discovers the system CA bundle itself. This probes the SSL_CERT_FILE /
// SSL_CERT_DIR environment variables and the common distribution CA
// locations, returning the first that exists. Unlike the original it does
@@ -65,7 +65,7 @@ impl CaBundle {
String::new()
}
- // TODO(phase-c): Dummy stand-in until reqwest validates certificates itself.
+ // TODO(http): Dummy stand-in until reqwest validates certificates itself.
// The original parses the file with OpenSSL and rejects malformed or expired
// bundles; here we only require the file to exist and be non-empty.
pub fn validate_ca_file(ca_file: &str, _logger: ()) -> bool {
diff --git a/crates/shirabe-php-rpc/src/lib.rs b/crates/shirabe-php-rpc/src/lib.rs
index 221c49f6..a59ef648 100644
--- a/crates/shirabe-php-rpc/src/lib.rs
+++ b/crates/shirabe-php-rpc/src/lib.rs
@@ -1028,7 +1028,7 @@ impl Worker {
}
}
-// TODO(phase-c): a failed spawn panics rather than propagating a `Result`; this is an interim
+// TODO(error-model): a failed spawn panics rather than propagating a `Result`; this is an interim
// step until PHP RPC gets proper error handling (see docs/dev/php-rpc.md).
static WORKER: LazyLock<Mutex<Worker>> = LazyLock::new(|| {
let worker =
diff --git a/crates/shirabe-php-shim/src/array.rs b/crates/shirabe-php-shim/src/array.rs
index 00e44da3..3870d59e 100644
--- a/crates/shirabe-php-shim/src/array.rs
+++ b/crates/shirabe-php-shim/src/array.rs
@@ -687,7 +687,7 @@ pub fn ksort<V>(array: &mut IndexMap<String, V>) {
// PHP's default SORT_REGULAR comparison for array keys: two integer-like keys
// compare numerically, otherwise byte-wise as strings.
-// TODO(phase-c): full SORT_REGULAR semantics for mixed integer/non-numeric-string
+// TODO(php-semantics): full SORT_REGULAR semantics for mixed integer/non-numeric-string
// keys are not reproduced; every current caller uses homogeneous string keys.
fn php_sort_regular_key(a: &str, b: &str) -> std::cmp::Ordering {
if let (Ok(na), Ok(nb)) = (a.parse::<i64>(), b.parse::<i64>())
diff --git a/crates/shirabe-php-shim/src/datetime.rs b/crates/shirabe-php-shim/src/datetime.rs
index 6bab4afb..fd0348ff 100644
--- a/crates/shirabe-php-shim/src/datetime.rs
+++ b/crates/shirabe-php-shim/src/datetime.rs
@@ -142,7 +142,7 @@ pub fn date_default_timezone_set(tz: &str) -> bool {
pub fn date(format: &str, timestamp: Option<i64>) -> String {
let timestamp = timestamp.unwrap_or_else(time);
- // TODO(phase-c): model the system default timezone. PHP `date()` renders in the default
+ // TODO(php-semantics): model the system default timezone. PHP `date()` renders in the default
// timezone (usually the system's local zone); without a timezone database only "UTC" can be
// resolved here, so on a non-UTC machine this diverges whenever the local date differs from
// the UTC date (e.g. daily 00:00-09:00 JST). Fixing this needs a timezone database (a new
diff --git a/crates/shirabe-php-shim/src/env.rs b/crates/shirabe-php-shim/src/env.rs
index d84a8ad9..8facfb4a 100644
--- a/crates/shirabe-php-shim/src/env.rs
+++ b/crates/shirabe-php-shim/src/env.rs
@@ -14,7 +14,7 @@ pub fn getenv<K: AsRef<std::ffi::OsStr>>(key: K) -> Option<std::ffi::OsString> {
/// thread is concurrently reading or writing the process environment for the
/// duration of this call.
pub unsafe fn putenv<K: AsRef<std::ffi::OsStr>, V: AsRef<std::ffi::OsStr>>(key: K, value: V) {
- // TODO(phase-c): validate key and value format to avoid panic?
+ // TODO(php-semantics): validate key and value format to avoid panic?
unsafe { std::env::set_var(key, value) }
}
@@ -24,7 +24,7 @@ pub unsafe fn putenv<K: AsRef<std::ffi::OsStr>, V: AsRef<std::ffi::OsStr>>(key:
/// thread is concurrently reading or writing the process environment for the
/// duration of this call.
pub unsafe fn putenv_clear<K: AsRef<std::ffi::OsStr>>(key: K) {
- // TODO(phase-c): validate key and value format to avoid panic?
+ // TODO(php-semantics): validate key and value format to avoid panic?
unsafe { std::env::remove_var(key) }
}
diff --git a/crates/shirabe-php-shim/src/exception.rs b/crates/shirabe-php-shim/src/exception.rs
index fd5e4a53..f87ce7c8 100644
--- a/crates/shirabe-php-shim/src/exception.rs
+++ b/crates/shirabe-php-shim/src/exception.rs
@@ -94,7 +94,7 @@ impl AnyThrowable {
}
/// The exception a Rust error carries, or `None` if it carries none.
- // TODO(phase-c): this matches only an error that *is* the exception, where [`Catch`]'s
+ // TODO(error-model): this matches only an error that *is* the exception, where [`Catch`]'s
// `anyhow::Error` impl also sees one behind an `anyhow::Context` layer. Nothing in the port
// adds context to an error yet, so an exception wrapped that way would go silently unseen.
pub fn of<'e>(error: &'e (dyn std::error::Error + 'static)) -> Option<&'e Self> {
diff --git a/crates/shirabe-php-shim/src/filter.rs b/crates/shirabe-php-shim/src/filter.rs
index bbd9a56d..fa2c84ed 100644
--- a/crates/shirabe-php-shim/src/filter.rs
+++ b/crates/shirabe-php-shim/src/filter.rs
@@ -1,4 +1,4 @@
-// TODO(phase-c):
+// TODO(php-semantics):
// Without FILTER_NULL_ON_FAILURE, php_filter_boolean trims surrounding
// whitespace, lowercases, and yields true only for "1"/"true"/"on"/"yes";
// every other input (including the "0"/"false"/"off"/"no"/"" set) yields
@@ -11,7 +11,7 @@ pub fn filter_var_boolean(value: &str) -> bool {
)
}
-// TODO(phase-c): PHP's FILTER_VALIDATE_URL parses with php_url_parse_ex and
+// TODO(php-semantics): PHP's FILTER_VALIDATE_URL parses with php_url_parse_ex and
// additionally validates the host as a domain/IPv6 literal. reqwest::Url
// (WHATWG/RFC 3986) is stricter on some inputs and more lenient on others,
// so this is not a byte-for-byte compatible validator.
@@ -19,7 +19,7 @@ pub fn filter_var_url(value: &str) -> bool {
reqwest::Url::parse(value).is_ok()
}
-// TODO(phase-c):
+// TODO(pcre):
// PHP's FILTER_VALIDATE_EMAIL applies a long PCRE with length lookaheads,
// quoted local parts, and bracketed IP-literal domains, which the `regex` crate
// cannot express. This is a simplified validator covering the common
@@ -67,7 +67,7 @@ fn is_valid_email_domain(domain: &str) -> bool {
})
}
-// TODO(phase-c):
+// TODO(php-semantics):
// PHP's FILTER_VALIDATE_IP accepts both IPv4 and IPv6 literals. Rust's IpAddr
// parser is a close match (both reject leading zeros in IPv4 octets), but is not
// guaranteed byte-for-byte identical to PHP's hand-written validator on exotic
@@ -76,7 +76,7 @@ pub fn filter_var_ip(value: &str) -> bool {
value.parse::<std::net::IpAddr>().is_ok()
}
-// TODO(phase-c):
+// TODO(php-semantics):
// Mirrors PHP's FILTER_VALIDATE_INT with min_range/max_range: surrounding
// whitespace is trimmed, an optional sign is allowed, leading zeros are rejected
// (except a lone "0"), and the parsed value must fall within [min, max]
diff --git a/crates/shirabe-php-shim/src/fs.rs b/crates/shirabe-php-shim/src/fs.rs
index 6aa8eeee..c5a4bdf5 100644
--- a/crates/shirabe-php-shim/src/fs.rs
+++ b/crates/shirabe-php-shim/src/fs.rs
@@ -385,7 +385,7 @@ pub fn fwrite(stream: &PhpResource, data: impl AsRef<[u8]>, length: Option<i64>)
}
/// PHP `fread()`. Reads up to `length` bytes.
-/// TODO(phase-e): byte-string semantics — should return Vec<u8>; from_utf8_lossy can corrupt
+/// TODO(bytes): byte-string semantics — should return Vec<u8>; from_utf8_lossy can corrupt
/// binary reads (filesAreEqual / binary copy).
pub fn fread(stream: &PhpResource, length: i64) -> Option<String> {
let cap = length.max(0) as usize;
@@ -449,7 +449,7 @@ pub fn fclose(stream: &PhpResource) -> bool {
/// PHP `fgets()`. Reads one line, including the trailing newline, capped at `length-1` bytes
/// when given (matching PHP's `length` parameter).
-/// TODO(phase-e): byte-string semantics — should return Vec<u8>; from_utf8_lossy can corrupt
+/// TODO(bytes): byte-string semantics — should return Vec<u8>; from_utf8_lossy can corrupt
/// binary reads.
pub fn fgets(stream: &PhpResource, length: Option<i64>) -> Option<String> {
let limit = match length {
@@ -507,7 +507,7 @@ fn fgets_read_line<R: std::io::Read + ?Sized>(
}
/// PHP `fgetc()`: reads a single byte, or `None` at end-of-stream.
-/// TODO(phase-e): byte-string semantics — should return Vec<u8>.
+/// TODO(bytes): byte-string semantics — should return Vec<u8>.
pub fn fgetc(stream: &PhpResource) -> Option<String> {
let mut byte = [0u8; 1];
match stream {
@@ -793,7 +793,7 @@ pub fn chmod(path: impl AsRef<std::path::Path>, mode: u32) -> bool {
pub fn fileperms(path: impl AsRef<std::path::Path>) -> Result<u32, std::io::Error> {
use std::os::unix::fs::MetadataExt;
- // TODO(phase-e): PHP returns the full st_mode (file type bits included).
+ // TODO(php-semantics): PHP returns the full st_mode (file type bits included).
std::fs::metadata(path.as_ref()).map(|m| m.mode())
}
@@ -843,7 +843,7 @@ pub fn is_dir(path: impl AsRef<std::path::Path>) -> bool {
/// PHP `readlink()`: the target the link points at, without resolving it further.
/// `None` is PHP's `false`-on-failure.
-/// TODO(phase-e): byte-string semantics -- PHP returns the raw bytes of the link target.
+/// TODO(bytes): byte-string semantics -- PHP returns the raw bytes of the link target.
pub fn readlink(path: impl AsRef<std::path::Path>) -> Option<String> {
std::fs::read_link(path)
.ok()
@@ -880,7 +880,7 @@ pub fn file_put_contents(path: &str, data: &[u8]) -> Option<i64> {
}
pub fn file_put_contents3(filename: &str, data: &str, flags: i64) -> Option<i64> {
- // TODO(phase-c): the LOCK_EX and FILE_USE_INCLUDE_PATH flags are ignored; only FILE_APPEND is
+ // TODO(php-semantics): the LOCK_EX and FILE_USE_INCLUDE_PATH flags are ignored; only FILE_APPEND is
// honored.
let append = flags & FILE_APPEND != 0;
let mut opts = std::fs::OpenOptions::new();
@@ -914,7 +914,7 @@ pub fn file_get_contents5(
offset: i64,
length: Option<i64>,
) -> Option<String> {
- // TODO(phase-c): the stream $context and FILE_USE_INCLUDE_PATH are ignored; only $offset and
+ // TODO(php-semantics): the stream $context and FILE_USE_INCLUDE_PATH are ignored; only $offset and
// $length are applied (to the file read from the local filesystem).
// PHP supports the file:// stream wrapper; strip it to read the local file.
let path = path.strip_prefix("file://").unwrap_or(path);
@@ -1060,7 +1060,7 @@ pub fn sys_get_temp_dir() -> String {
// A directory-handle resource. This is a distinct resource kind from the byte streams modeled by
// PhpResource; readdir/closedir have no callers yet, so it only records the opened path.
-// TODO(phase-c): give it real readdir/closedir behavior (cursor over the entries) when needed.
+// TODO(php-semantics): give it real readdir/closedir behavior (cursor over the entries) when needed.
#[derive(Debug)]
pub struct PhpDirHandle {
pub path: std::path::PathBuf,
@@ -1097,7 +1097,7 @@ pub fn pathinfo(path: &str, option: i64) -> String {
}
}
-// TODO(phase-c): returns Option<PathBuf>
+// TODO(type-model): returns Option<PathBuf>
pub fn realpath(path: impl AsRef<std::path::Path>) -> Option<String> {
path.as_ref()
.canonicalize()
diff --git a/crates/shirabe-php-shim/src/json.rs b/crates/shirabe-php-shim/src/json.rs
index 1fa86ca7..a3bed2c0 100644
--- a/crates/shirabe-php-shim/src/json.rs
+++ b/crates/shirabe-php-shim/src/json.rs
@@ -29,7 +29,7 @@ pub fn json_encode_ex<T: serde::Serialize + ?Sized>(
// JSON_UNESCAPED_SLASHES and JSON_UNESCAPED_UNICODE set: forward slashes and non-ASCII
// characters are emitted verbatim. The two flags below re-apply PHP's default escaping when
// they are absent.
- // TODO(phase-c): other flags (e.g. JSON_HEX_*, JSON_THROW_ON_ERROR) are not handled yet; add
+ // TODO(php-semantics): other flags (e.g. JSON_HEX_*, JSON_THROW_ON_ERROR) are not handled yet; add
// them when a call site needs them.
let mut s = if flags & JSON_PRETTY_PRINT != 0 {
// PHP's JSON_PRETTY_PRINT uses a 4-space indent.
diff --git a/crates/shirabe-php-shim/src/lib.rs b/crates/shirabe-php-shim/src/lib.rs
index 607a8887..63e4226e 100644
--- a/crates/shirabe-php-shim/src/lib.rs
+++ b/crates/shirabe-php-shim/src/lib.rs
@@ -67,7 +67,7 @@ pub enum PhpMixed {
String(String),
List(Vec<PhpMixed>),
Array(IndexMap<String, PhpMixed>),
- // TODO(phase-e): consolidate Object to Array.
+ // TODO(type-model): consolidate Object to Array.
Object(IndexMap<String, PhpMixed>),
// Resources, arbitrary objects and callables are intentionally excluded. Do not add these
// things to this type.
@@ -434,7 +434,7 @@ pub enum StreamBacking {
/// A real file on disk (also `/dev/null`); the OS tracks the position.
File(std::fs::File),
/// `php://memory` and `php://temp` — an in-memory growable buffer.
- /// TODO(phase-c): `php://temp/maxmemory:N` spills to a temp file past N bytes;
+ /// TODO(php-semantics): `php://temp/maxmemory:N` spills to a temp file past N bytes;
/// the threshold is ignored here and everything stays in memory.
Memory(std::io::Cursor<Vec<u8>>),
/// A child process pipe created by `proc_open`. Half-duplex and not seekable.
diff --git a/crates/shirabe-php-shim/src/net.rs b/crates/shirabe-php-shim/src/net.rs
index 605ee019..e5d3fcf0 100644
--- a/crates/shirabe-php-shim/src/net.rs
+++ b/crates/shirabe-php-shim/src/net.rs
@@ -45,7 +45,7 @@ thread_local! {
// Engine-side hook with no PHP userland counterpart: the HTTP stream layer must call this
// after each request, like PHP's http wrapper populating `$http_response_header`. No stream
-// layer performs HTTP requests yet (see the TODO(phase-c) in util/remote_filesystem.rs), so
+// layer performs HTTP requests yet (see the TODO(http) in util/remote_filesystem.rs), so
// until then the store stays empty and the getter below returns None, which matches PHP
// before any HTTP stream request was made.
pub fn http_record_last_response_headers(headers: Vec<String>) {
diff --git a/crates/shirabe-php-shim/src/phar.rs b/crates/shirabe-php-shim/src/phar.rs
index a0299a84..dccdfebf 100644
--- a/crates/shirabe-php-shim/src/phar.rs
+++ b/crates/shirabe-php-shim/src/phar.rs
@@ -265,7 +265,7 @@ fn verify_phar_signature(path: &std::path::Path, bytes: &[u8]) -> anyhow::Result
0x0002 => "sha1",
0x0003 => "sha256",
0x0004 => "sha512",
- // TODO(phase-c): OPENSSL phar signatures need an RSA verification decision; they are
+ // TODO(php-semantics): OPENSSL phar signatures need an RSA verification decision; they are
// accepted unverified for now.
0x0010 => return Ok(()),
_ => return Err(broken()),
diff --git a/crates/shirabe-php-shim/src/preg.rs b/crates/shirabe-php-shim/src/preg.rs
index c2ec563b..b0828667 100644
--- a/crates/shirabe-php-shim/src/preg.rs
+++ b/crates/shirabe-php-shim/src/preg.rs
@@ -423,7 +423,7 @@ pub fn preg_grep2(pattern: impl PregPattern, array: &[&str], flags: i64) -> Vec<
// modifiers are handled; PCRE-only constructs (possessive quantifiers,
// lookaround, backreferences) are not supported by `regex` and must be avoided
// in the caller's pattern.
-// TODO(phase-c): replace with a faithful PCRE engine to restore full semantics.
+// TODO(pcre): replace with a faithful PCRE engine to restore full semantics.
// PCRE treats `\<` and `\>` as escaped literal `<`/`>`, but the `regex` crate
// reads them as start/end-of-word boundary assertions. Rewrite those escapes to
// the literal characters so PCRE-sourced patterns (e.g. anything run through
@@ -597,7 +597,7 @@ pub fn php_regex_anchored(pattern: &str) -> bool {
/// compiles to a per-call-site cached `&'static regex::Regex`, instead of going through the
/// runtime `PATTERN_CACHE` lookup by string key. Expands to a `(&'static regex::Regex, bool)`
/// tuple, ready to pass straight into any `preg_*` function.
-// TODO(phase-e): `$php_pattern` is still translated from PHP delimiter/modifier syntax at runtime (on
+// TODO(pcre): `$php_pattern` is still translated from PHP delimiter/modifier syntax at runtime (on
// first use at each call site). Once call sites pass native `regex`-crate syntax directly, drop
// this wrapper and call `regex_macro::regex!` directly.
#[macro_export]
diff --git a/crates/shirabe-php-shim/src/process.rs b/crates/shirabe-php-shim/src/process.rs
index fd8b7d2d..e150d649 100644
--- a/crates/shirabe-php-shim/src/process.rs
+++ b/crates/shirabe-php-shim/src/process.rs
@@ -63,7 +63,7 @@ pub fn system(command: &str, result_code: Option<&mut i64>) -> Option<String> {
*code = result.status.code().unwrap_or(-1) as i64;
}
// PHP system() passes the command output straight through to the script's output.
- // TODO(phase-c): PHP flushes line by line as the command runs; here the whole output is captured
+ // TODO(php-semantics): PHP flushes line by line as the command runs; here the whole output is captured
// and emitted once the command finishes, which changes interleaving/streaming timing.
let _ = std::io::stdout().write_all(&result.stdout);
let _ = std::io::stdout().flush();
diff --git a/crates/shirabe-php-shim/src/runtime.rs b/crates/shirabe-php-shim/src/runtime.rs
index 254a2fe9..286343b4 100644
--- a/crates/shirabe-php-shim/src/runtime.rs
+++ b/crates/shirabe-php-shim/src/runtime.rs
@@ -289,7 +289,7 @@ pub fn spl_object_hash<T: HasAddress>(object: T) -> String {
format!("{:032x}", object.address())
}
-// TODO(phase-c): the Windows branch of php_uname is missing. There PHP reports "Windows NT" as the
+// TODO(windows): the Windows branch of php_uname is missing. There PHP reports "Windows NT" as the
// sysname and derives release/version from the OS version APIs rather than uname(2).
pub fn php_uname(mode: &str) -> String {
let Ok(utsname) = nix::sys::utsname::uname() else {
@@ -339,12 +339,12 @@ pub fn dir() -> String {
}
pub fn memory_get_usage() -> i64 {
- // TODO(phase-c): return PHP's actual emalloc-tracked memory usage instead of a stub 0.
+ // TODO(php-semantics): return PHP's actual emalloc-tracked memory usage instead of a stub 0.
0
}
pub fn memory_get_peak_usage(_real_usage: bool) -> i64 {
- // TODO(phase-c): return PHP's actual emalloc-tracked peak memory usage instead of a stub 0.
+ // TODO(php-semantics): return PHP's actual emalloc-tracked peak memory usage instead of a stub 0.
0
}
@@ -355,22 +355,22 @@ pub fn ini_set(_varname: &str, _value: &str) -> Option<String> {
}
pub fn sapi_windows_vt100_support(_resource: &crate::PhpResource) -> bool {
- // TODO(phase-c): Windows-only SAPI function; not defined on the non-Windows target this build
+ // TODO(windows): Windows-only SAPI function; not defined on the non-Windows target this build
// models (function_exists reports it absent).
todo!()
}
pub fn sapi_windows_cp_get(_kind: Option<&str>) -> i64 {
- // TODO(phase-c): Windows-only SAPI function; see sapi_windows_vt100_support.
+ // TODO(windows): Windows-only SAPI function; see sapi_windows_vt100_support.
todo!()
}
pub fn sapi_windows_cp_set(_codepage: i64) -> bool {
- // TODO(phase-c): Windows-only SAPI function; see sapi_windows_vt100_support.
+ // TODO(windows): Windows-only SAPI function; see sapi_windows_vt100_support.
todo!()
}
pub fn sapi_windows_cp_conv(_in_codepage: i64, _out_codepage: i64, _subject: &str) -> String {
- // TODO(phase-c): Windows-only SAPI function; see sapi_windows_vt100_support.
+ // TODO(windows): Windows-only SAPI function; see sapi_windows_vt100_support.
todo!()
}
diff --git a/crates/shirabe-php-shim/src/stream.rs b/crates/shirabe-php-shim/src/stream.rs
index 6ecf80f5..bd5e10af 100644
--- a/crates/shirabe-php-shim/src/stream.rs
+++ b/crates/shirabe-php-shim/src/stream.rs
@@ -7,7 +7,7 @@ pub const STREAM_NOTIFY_FILE_SIZE_IS: i64 = 5;
pub const STREAM_NOTIFY_PROGRESS: i64 = 7;
/// PHP `stream_get_contents()`: read the remaining bytes from the stream's current position.
-/// TODO(phase-e): byte-string semantics — should return Vec<u8>; from_utf8_lossy can corrupt
+/// TODO(bytes): byte-string semantics — should return Vec<u8>; from_utf8_lossy can corrupt
/// binary reads.
pub fn stream_get_contents(stream: &PhpResource) -> Option<String> {
stream_read_remaining(stream, None)
@@ -80,7 +80,7 @@ pub fn stream_isatty(stream: PhpResource) -> bool {
/// PHP `stream_is_local()`: true for plain paths and the `file://` wrapper, false for remote
/// wrappers (`http://`, `ftp://`, ...).
-/// TODO(phase-c): PHP asks the wrapper registered for the path's scheme whether it is flagged
+/// TODO(php-semantics): PHP asks the wrapper registered for the path's scheme whether it is flagged
/// `STREAM_IS_URL`; this classifies by the scheme itself, so a registered custom wrapper claiming to
/// be local (or vice versa) comes out differently than in PHP.
pub fn stream_is_local(path: &str) -> bool {
diff --git a/crates/shirabe-php-shim/src/string.rs b/crates/shirabe-php-shim/src/string.rs
index e53fc02c..de1a3b6e 100644
--- a/crates/shirabe-php-shim/src/string.rs
+++ b/crates/shirabe-php-shim/src/string.rs
@@ -23,7 +23,7 @@ pub fn substr_count(haystack: &str, needle: &str) -> i64 {
}
// Byte-based, matching PHP's substr_replace.
-// TODO(phase-c): PHP accepts negative $start/$length (counting from the end); this signature takes
+// TODO(php-semantics): PHP accepts negative $start/$length (counting from the end); this signature takes
// usize and therefore cannot express those cases.
pub fn substr_replace(string: &str, replace: &str, start: usize, length: usize) -> String {
let bytes = string.as_bytes();
@@ -389,7 +389,7 @@ pub fn mb_detect_encoding(
}
pub fn mb_strwidth(s: &str, _encoding: Option<&str>) -> i64 {
- // TODO(phase-c): calculate actual width
+ // TODO(unicode): calculate actual width
s.len() as i64
}
@@ -979,7 +979,7 @@ pub fn php_strip_whitespace(path: impl AsRef<std::path::Path>) -> Result<String,
pub fn hexdec(s: &str) -> i64 {
// PHP hexdec() ignores characters outside [0-9A-Fa-f].
- // TODO(phase-c): PHP promotes the result to float on overflow; this i64 return wraps instead.
+ // TODO(php-semantics): PHP promotes the result to float on overflow; this i64 return wraps instead.
let mut acc: u64 = 0;
for &b in s.as_bytes() {
let d = match b {
@@ -1077,7 +1077,7 @@ pub fn uniqid(prefix: &str, more_entropy: bool) -> String {
.unwrap_or_default();
let base = format!("{}{:08x}{:05x}", prefix, now.as_secs(), now.subsec_micros());
if more_entropy {
- // TODO(phase-c): PHP uses its combined LCG; this uses `fastrand`, so the random suffix is
+ // TODO(php-semantics): PHP uses its combined LCG; this uses `fastrand`, so the random suffix is
// not reproducible against PHP (it is non-deterministic in PHP too).
format!("{}.{:.8}", base, fastrand::f64() * 10.0)
} else {
diff --git a/crates/shirabe-php-shim/src/url.rs b/crates/shirabe-php-shim/src/url.rs
index 92ed389b..27463ce0 100644
--- a/crates/shirabe-php-shim/src/url.rs
+++ b/crates/shirabe-php-shim/src/url.rs
@@ -32,7 +32,7 @@ pub fn parse_url(url: &str, component: i64) -> PhpMixed {
}
pub fn parse_url_all(url: &str) -> PhpMixed {
- // TODO(phase-c): PHP's parse_url uses php_url_parse_ex, which accepts relative
+ // TODO(php-semantics): PHP's parse_url uses php_url_parse_ex, which accepts relative
// and partial URLs and leaves an absent component absent. reqwest::Url
// (WHATWG/RFC 3986) requires an absolute URL, lowercases the host of special
// schemes, and normalizes the path (e.g. "http://host" yields path "/"). This
diff --git a/crates/shirabe-php-shim/src/var.rs b/crates/shirabe-php-shim/src/var.rs
index 293997e4..79704df1 100644
--- a/crates/shirabe-php-shim/src/var.rs
+++ b/crates/shirabe-php-shim/src/var.rs
@@ -59,7 +59,7 @@ fn serialize_into(out: &mut String, value: &PhpMixed) {
}
}
-// TODO(phase-c): PHP's serialize uses serialize_precision (-1 => shortest round-trip), which Rust's
+// TODO(php-semantics): PHP's serialize uses serialize_precision (-1 => shortest round-trip), which Rust's
// default float formatting also produces, but the two differ on scientific-notation spelling (PHP
// "1.0E+20" vs Rust "1e20") for very large/small magnitudes.
fn serialize_float(f: f64) -> String {
@@ -188,7 +188,7 @@ pub fn is_numeric_to_int(value: &PhpMixed) -> i64 {
/// Approximates PHP's `<=>` for two strings: if both are numeric strings, compare numerically
/// (as PHP does), otherwise fall back to a byte-wise comparison.
///
-/// TODO(phase-c): this only covers the string/string case of PHP's loose comparison. PHP's `<=>` has many
+/// TODO(php-semantics): this only covers the string/string case of PHP's loose comparison. PHP's `<=>` has many
/// more special-cased rules across other operand type combinations (bool, array, null, object,
/// numeric-string-vs-non-numeric-string, ...). Extend this if a new caller needs those.
pub fn loosely_compare(a: &str, b: &str) -> std::cmp::Ordering {
diff --git a/crates/shirabe-php-src/src/standard/string.rs b/crates/shirabe-php-src/src/standard/string.rs
index 5f723f05..5e0694df 100644
--- a/crates/shirabe-php-src/src/standard/string.rs
+++ b/crates/shirabe-php-src/src/standard/string.rs
@@ -153,7 +153,7 @@ fn hex_digit_value(b: u8) -> Option<u8> {
///
/// The allowed-tags parameter is omitted from this signature.
/// State: 0 = text, 1 = inside a tag, 2 = inside an HTML comment, 3 = inside `<? ... ?>` / `<!`.
-/// TODO(phase-c): this omits allowed-tags handling and the tag-depth counter, so it can diverge
+/// TODO(php-semantics): this omits allowed-tags handling and the tag-depth counter, so it can diverge
/// from PHP on malformed markup (unterminated comments/quotes, nested `<`).
pub fn strip_tags(_str: &str) -> String {
let bytes = _str.as_bytes();
diff --git a/crates/shirabe-symfony-console/src/formatter/output_formatter.rs b/crates/shirabe-symfony-console/src/formatter/output_formatter.rs
index 245707d9..960187d4 100644
--- a/crates/shirabe-symfony-console/src/formatter/output_formatter.rs
+++ b/crates/shirabe-symfony-console/src/formatter/output_formatter.rs
@@ -287,7 +287,7 @@ impl WrappableOutputFormatterInterface for OutputFormatter {
// `regex` crate:
// let open_tag_regex = "[a-z](?:[^\\\\<>]*+ | \\\\.)*";
// let close_tag_regex = "[a-z][^<>]*+";
- // TODO(phase-c): restore the possessive quantifiers once a PCRE-compatible
+ // TODO(pcre): restore the possessive quantifiers once a PCRE-compatible
// engine is available; greedy quantifiers match the same tags here but may
// differ in pathological backtracking cases.
let open_tag_regex = "[a-z](?:[^\\\\<>]* | \\\\.)*";
diff --git a/crates/shirabe-symfony-console/src/style/symfony_style.rs b/crates/shirabe-symfony-console/src/style/symfony_style.rs
index 881d87e0..759b2ba4 100644
--- a/crates/shirabe-symfony-console/src/style/symfony_style.rs
+++ b/crates/shirabe-symfony-console/src/style/symfony_style.rs
@@ -215,7 +215,7 @@ impl SymfonyStyle {
self.question_helper = Some(SymfonyQuestionHelper::new());
}
- // TODO(phase-c): PHP passes `$this` as the OutputInterface, so SymfonyQuestionHelper's
+ // TODO(symfony): PHP passes `$this` as the OutputInterface, so SymfonyQuestionHelper's
// write_error renders through SymfonyStyle::error; SymfonyStyle is not an OutputInterface
// trait object here, so the raw output is passed instead.
let answer = {
diff --git a/crates/shirabe-symfony-finder/src/finder.rs b/crates/shirabe-symfony-finder/src/finder.rs
index 2ab096e5..95ab5d50 100644
--- a/crates/shirabe-symfony-finder/src/finder.rs
+++ b/crates/shirabe-symfony-finder/src/finder.rs
@@ -183,7 +183,7 @@ impl Finder {
resolved_dirs.push(self.normalize_dir(&dir));
} else {
// GLOB_ONLYDIR is emulated by retaining directory matches only.
- // TODO(phase-c): wildcard `in()` paths depend on `shirabe_php_shim::glob`, which is
+ // TODO(php-semantics): wildcard `in()` paths depend on `shirabe_php_shim::glob`, which is
// still `todo!()`; only the real-directory branch above currently resolves.
let mut globbed: Vec<String> =
glob(&dir).into_iter().filter(|path| is_dir(path)).collect();
@@ -451,7 +451,7 @@ impl Finder {
out: &mut Vec<Entry>,
) {
// `RecursiveDirectoryIterator::SKIP_DOTS` is implicit: read_dir omits "." and "..".
- // TODO(phase-c): unreadable directories are skipped here; the SplFileInfo-less,
+ // TODO(symfony): unreadable directories are skipped here; the SplFileInfo-less,
// non-fallible iterator signatures cannot surface the AccessDeniedException that PHP
// throws when ignoreUnreadableDirs is false.
let read = match std::fs::read_dir(dir) {
@@ -715,7 +715,7 @@ fn parse_date_comparator(test: &str) -> (String, i64) {
/// `(new \DateTime($s))->format('U')`.
///
-/// TODO(phase-c): PHP's `\DateTime` accepts any strtotime() expression, but only the
+/// TODO(php-semantics): PHP's `\DateTime` accepts any strtotime() expression, but only the
/// `Y-m-d H:i:s` / `Y-m-d` shapes produced by the callers are parsed here. The components are
/// interpreted as UTC (not PHP's local timezone) so the timestamp round-trips with the
/// `chrono::Utc`-derived thresholds the callers format from.
diff --git a/crates/shirabe-symfony-finder/src/spl_file_info.rs b/crates/shirabe-symfony-finder/src/spl_file_info.rs
index 6f03fe14..b719efc5 100644
--- a/crates/shirabe-symfony-finder/src/spl_file_info.rs
+++ b/crates/shirabe-symfony-finder/src/spl_file_info.rs
@@ -78,7 +78,7 @@ impl SplFileInfo {
pub fn get_size(&self) -> i64 {
// \SplFileInfo::getSize() returns the file size in bytes (throws on failure).
- // TODO(phase-c): PHP throws a \RuntimeException on stat failure; this returns 0 instead.
+ // TODO(php-semantics): PHP throws a \RuntimeException on stat failure; this returns 0 instead.
shirabe_php_shim::filesize(&self.pathname).unwrap_or(0)
}
}
diff --git a/crates/shirabe-symfony-string/src/unicode_string.rs b/crates/shirabe-symfony-string/src/unicode_string.rs
index 9048f77b..21117437 100644
--- a/crates/shirabe-symfony-string/src/unicode_string.rs
+++ b/crates/shirabe-symfony-string/src/unicode_string.rs
@@ -6,7 +6,7 @@ pub struct UnicodeString {
}
impl UnicodeString {
- // TODO(phase-c): the real constructor runs `normalizer_normalize` (Unicode NFC normalization),
+ // TODO(unicode): the real constructor runs `normalizer_normalize` (Unicode NFC normalization),
// which has no Rust std equivalent and would need a dedicated normalization implementation.
// Normalization is skipped here, which is only correct for already-NFC input such as ASCII.
pub fn new(string: &str) -> Self {
@@ -15,7 +15,7 @@ impl UnicodeString {
}
}
- // TODO(phase-c): ASCII-only provisional implementation. The faithful `width()` uses `wcswidth`
+ // TODO(unicode): ASCII-only provisional implementation. The faithful `width()` uses `wcswidth`
// with the Unicode width tables to treat wide characters as width 2 and skip zero-width /
// combining characters; here every character counts as width 1, correct only for ASCII. The
// ANSI/control-character stripping driven by `ignore_ansi_decoration` is likewise not handled.
@@ -34,7 +34,7 @@ impl UnicodeString {
width
}
- // TODO(phase-c): the faithful `length()` uses `grapheme_strlen` (extended grapheme clusters),
+ // TODO(unicode): the faithful `length()` uses `grapheme_strlen` (extended grapheme clusters),
// which needs Unicode segmentation tables with no Rust std equivalent and no permitted crate.
// Approximated with the code-point count, exact only when no combining/multi-code-point
// clusters are present (e.g. ASCII).
@@ -42,7 +42,7 @@ impl UnicodeString {
shirabe_php_shim::mb_strlen(&self.string, "UTF-8")
}
- // TODO(phase-c): the faithful `slice()` uses `grapheme_substr` (grapheme-cluster offsets), which
+ // TODO(unicode): the faithful `slice()` uses `grapheme_substr` (grapheme-cluster offsets), which
// needs Unicode segmentation tables with no std equivalent and no permitted crate. Approximated
// with code-point offsets via `mb_substr`, exact only without combining/multi-code-point clusters.
pub fn slice(&self, start: i64, length: Option<i64>) -> Self {
diff --git a/crates/shirabe/src/advisory/audit_config.rs b/crates/shirabe/src/advisory/audit_config.rs
index fc1cbedb..2d01a4a9 100644
--- a/crates/shirabe/src/advisory/audit_config.rs
+++ b/crates/shirabe/src/advisory/audit_config.rs
@@ -83,7 +83,7 @@ impl AuditConfig {
for (key, value) in entries {
let (id, apply, reason) = match value {
PhpMixed::String(reason_str) => {
- // TODO(phase-e): PHP's `array` type must be modeled more precisely. This is
+ // TODO(type-model): PHP's `array` type must be modeled more precisely. This is
// escape hatch.
if canonical_int_key(key).is_some() {
(reason_str.clone(), "all".to_string(), None)
diff --git a/crates/shirabe/src/command/diagnose_command.rs b/crates/shirabe/src/command/diagnose_command.rs
index dc5d7399..6b339c69 100644
--- a/crates/shirabe/src/command/diagnose_command.rs
+++ b/crates/shirabe/src/command/diagnose_command.rs
@@ -599,7 +599,7 @@ impl DiagnoseCommand {
None,
)?;
if !installed_json.exists() {
- // TODO(phase-c): the native binary never ships vendor/composer/installed.json, so
+ // TODO(distribution): the native binary never ships vendor/composer/installed.json, so
// Composer's "non-standard Composer installation" warning would fire on every run.
// A Composer source snapshot is planned to be embedded together with the plugin API
// implementation, which will make this self-audit functional; until then report
diff --git a/crates/shirabe/src/command/script_alias_command.rs b/crates/shirabe/src/command/script_alias_command.rs
index e4418b53..b10e1671 100644
--- a/crates/shirabe/src/command/script_alias_command.rs
+++ b/crates/shirabe/src/command/script_alias_command.rs
@@ -46,7 +46,7 @@ impl ScriptAliasCommand {
// PHP also calls parent::__construct() (Symfony Command base) and
// $this->ignoreValidationErrors().
- // TODO(phase-c): both are Symfony Command base-class operations — the constructor sets up
+ // TODO(symfony): both are Symfony Command base-class operations — the constructor sets up
// the command's name/definition/application state and ignoreValidationErrors() flips a flag
// on it. Composer's BaseCommand carries no such Symfony Command state yet (the Symfony
// Command base is an intentional todo!() stub), so there is nothing to initialize here.
@@ -118,7 +118,7 @@ impl Command for ScriptAliasCommand {
let args = input.borrow().get_arguments();
- // TODO(phase-c): InputInterface has_to_string/get_class_name not modeled in Rust
+ // TODO(symfony): InputInterface has_to_string/get_class_name not modeled in Rust
// TODO remove for Symfony 6+ as it is then in the interface
if false {
return Err(LogicException::new(
@@ -136,7 +136,7 @@ impl Command for ScriptAliasCommand {
Platform::put_env("COMPOSER_DEV_MODE", if dev_mode { "1" } else { "0" });
- // TODO(phase-c): InputInterface lacks to_string; use a placeholder until it is modeled.
+ // TODO(symfony): InputInterface lacks to_string; use a placeholder until it is modeled.
let input_as_string = String::new();
let _ = input;
let script_alias_input = Preg::replace4(php_regex!(r"{^\S+ ?}"), "", &input_as_string, 1);
diff --git a/crates/shirabe/src/command/search_command.rs b/crates/shirabe/src/command/search_command.rs
index 72a883f1..e66c574b 100644
--- a/crates/shirabe/src/command/search_command.rs
+++ b/crates/shirabe/src/command/search_command.rs
@@ -260,7 +260,7 @@ impl Command for SearchCommand {
}
}
} else if format == "json" {
- // TODO(phase-c): faithful JSON output requires SearchResult to retain the raw result
+ // TODO(type-model): faithful JSON output requires SearchResult to retain the raw result
// array. PHP's fulltext search passes through arbitrary API fields (downloads, favers,
// repository, ...) which the typed SearchResult (name/description/abandoned/url) drops,
// so ComposerRepository-sourced results still diverge from Composer's raw JSON output.
diff --git a/crates/shirabe/src/composer.rs b/crates/shirabe/src/composer.rs
index 2bf59d8b..e714f85d 100644
--- a/crates/shirabe/src/composer.rs
+++ b/crates/shirabe/src/composer.rs
@@ -14,7 +14,7 @@ use crate::util::r#loop::Loop;
use shirabe_pcre::Preg;
use shirabe_php_shim::php_regex;
-// TODO(phase-c): change this information to Shirabe version.
+// TODO(distribution): change this information to Shirabe version.
pub const VERSION: &str = "2.9.7";
pub const BRANCH_ALIAS_VERSION: &str = "";
pub const RELEASE_DATE: &str = "2026-04-14 13:31:52";
diff --git a/crates/shirabe/src/console/application.rs b/crates/shirabe/src/console/application.rs
index fa9f7edd..56947243 100644
--- a/crates/shirabe/src/console/application.rs
+++ b/crates/shirabe/src/console/application.rs
@@ -1345,7 +1345,7 @@ impl Application {
// PHP rewrites `@anonymous\0` markers via class_exists/get_parent_class/class_implements.
// Rust error messages never carry PHP's anonymous-class marker and those reflection
// primitives have no Rust equivalent, so the branch is unreachable here.
- // TODO(phase-c): port the @anonymous rewrite if it ever becomes relevant.
+ // TODO(port): port the @anonymous rewrite if it ever becomes relevant.
let width = if self.terminal.get_width() != 0 {
self.terminal.get_width() - 1
@@ -1371,7 +1371,7 @@ impl Application {
if !throwable_is_exception_interface(e)
|| output_interface::VERBOSITY_VERBOSE <= verbosity
{
- // TODO(phase-c): anyhow::Error carries no PHP file/line, so getFile()/getLine() take
+ // TODO(error-model): anyhow::Error carries no PHP file/line, so getFile()/getLine() take
// the 'n/a' fallback PHP itself uses when they are unavailable. The real source
// location cannot be reproduced (it would be a Rust path, not Composer's PHP path).
messages.push(format!(
diff --git a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
index d9ec9306..368e2227 100644
--- a/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
+++ b/crates/shirabe/src/event_dispatcher/event_dispatcher.rs
@@ -346,7 +346,7 @@ impl EventDispatcher {
// other newly appeared prepended autoloaders should be appended instead to ensure Composer loads its classes first
// PHP: spl_autoload_unregister($cb); spl_autoload_register($cb, true, $prepend);
// TODO(plugin): ClassLoader detection via instanceof — currently treat all callbacks uniformly
- // TODO(phase-c): `cb` is a PhpMixed holding a callable; spl_autoload_register/unregister
+ // TODO(php-runtime): `cb` is a PhpMixed holding a callable; spl_autoload_register/unregister
// (php-shims that stay todo!()) need a typed Box<dyn Fn(&str) -> PhpMixed> callback.
// Bridging requires the callable model to expose the underlying closure from PhpMixed.
let _ = &cb;
diff --git a/crates/shirabe/src/factory.rs b/crates/shirabe/src/factory.rs
index 926ca380..4fe248c5 100644
--- a/crates/shirabe/src/factory.rs
+++ b/crates/shirabe/src/factory.rs
@@ -878,7 +878,7 @@ impl Factory {
// once everything is initialized we can
// purge packages from local repos if they have been deleted on the filesystem
// PHP: $this->purgePackages($rm->getLocalRepository(), $im);
- // TODO(phase-c): purge_packages' removal body (repo.removePackage for packages
+ // TODO(port): purge_packages' removal body (repo.removePackage for packages
// deleted on the filesystem) is still a stub; wire this call once implemented.
// self.purge_packages(&InstalledRepositoryInterfaceHandle::from_repository_handle(&rm.get_local_repository()), &mut im)?;
}
diff --git a/crates/shirabe/src/installer/installation_manager.rs b/crates/shirabe/src/installer/installation_manager.rs
index 8c26bdbc..2d21fb54 100644
--- a/crates/shirabe/src/installer/installation_manager.rs
+++ b/crates/shirabe/src/installer/installation_manager.rs
@@ -839,7 +839,7 @@ impl InstallationManager {
return;
}
- // TODO(phase-c): PHP collects every http_downloader.add() promise and runs them via
+ // TODO(async): PHP collects every http_downloader.add() promise and runs them via
// Loop::wait; the single-threaded sync bridge block_on's each notification serially instead.
let result: anyhow::Result<()> = (|| -> anyhow::Result<()> {
for (repo_url, packages) in self.notifiable_packages.borrow().iter() {
@@ -966,7 +966,7 @@ impl InstallationManager {
/// PHP: waitOnPromises() creates a ProgressBar up front and Loop::wait advances it while the
/// concurrent promises resolve.
- /// TODO(phase-c): Loop::wait has no active-job counter to feed the bar yet, so a
+ /// TODO(async): Loop::wait has no active-job counter to feed the bar yet, so a
/// single 0% -> 100% jump is rendered after the wait instead of PHP's timing-driven
/// intermediate snapshots.
async fn wait_on_promises<'p>(
diff --git a/crates/shirabe/src/io/console_io.rs b/crates/shirabe/src/io/console_io.rs
index 060fa0c6..6e78a105 100644
--- a/crates/shirabe/src/io/console_io.rs
+++ b/crates/shirabe/src/io/console_io.rs
@@ -310,7 +310,7 @@ impl ConsoleIO {
}
/// Ensures a string is valid UTF-8, replacing invalid byte sequences with '?'
- // TODO(phase-c): PHP sanitizes invalid byte sequences here, but `&str` is always valid UTF-8
+ // TODO(bytes): PHP sanitizes invalid byte sequences here, but `&str` is always valid UTF-8
// so this is a no-op for now. The codebase does not yet strictly distinguish `Vec<u8>` from
// `String`; once it does, this should take `&[u8]` and lossily convert it to `String`.
fn ensure_valid_utf8(string: &str) -> String {
@@ -438,7 +438,7 @@ impl IOInterfaceImmutable for ConsoleIO {
self.ask_question(&question)
}
- // TODO(phase-c): ask_confirmation and ask_and_hide_answer still collapse ask_question
+ // TODO(error-model): ask_confirmation and ask_and_hide_answer still collapse ask_question
// errors with .expect() instead of propagating them; extending Result propagation to
// them is a further IOInterface signature change that has not been decided yet.
fn ask_confirmation(&self, question: String, default: bool) -> bool {
diff --git a/crates/shirabe/src/json/json_file.rs b/crates/shirabe/src/json/json_file.rs
index 86dc0a2b..652f1d89 100644
--- a/crates/shirabe/src/json/json_file.rs
+++ b/crates/shirabe/src/json/json_file.rs
@@ -517,10 +517,10 @@ impl JsonFile {
/// @throws ParsingException
/// @return bool true on success
pub(crate) fn validate_syntax(json: &str, file: Option<&str>) -> anyhow::Result<bool> {
- // TODO(phase-c): make json_decode() returns an error object with details.
+ // TODO(php-semantics): make json_decode() returns an error object with details.
let error = match serde_json::from_str::<serde_json::Value>(json) {
Ok(_) => {
- // TODO(phase-c): Rust's &str is guaranteed as UTF-8, but PHP string is not. Change `json`
+ // TODO(bytes): Rust's &str is guaranteed as UTF-8, but PHP string is not. Change `json`
// to &[u8] and check UTF-8 validity here.
// if (defined('JSON_ERROR_UTF8') && JSON_ERROR_UTF8 === json_last_error()) {
diff --git a/crates/shirabe/src/main.rs b/crates/shirabe/src/main.rs
index f8b64c46..c4d9d313 100644
--- a/crates/shirabe/src/main.rs
+++ b/crates/shirabe/src/main.rs
@@ -42,7 +42,7 @@ fn main() {
// here (rather than driving `run` via `.block_on`) just makes it ambiently available via
// `Handle::try_current()` for `util::sync_executor::block_on`'s many scattered call sites,
// which ride it through `tokio::task::block_in_place` instead of each spinning up (or
- // busy-spin-polling without) their own. See sync_executor.rs for the TODO(phase-e) tracking
+ // busy-spin-polling without) their own. See sync_executor.rs for the TODO(async) tracking
// the eventual goal of propagating `async fn` all the way up to here instead.
let runtime = tokio::runtime::Builder::new_multi_thread()
.enable_all()
diff --git a/crates/shirabe/src/plugin/php_plugin_proxy.rs b/crates/shirabe/src/plugin/php_plugin_proxy.rs
index 4edc76ce..9a93ef72 100644
--- a/crates/shirabe/src/plugin/php_plugin_proxy.rs
+++ b/crates/shirabe/src/plugin/php_plugin_proxy.rs
@@ -291,7 +291,7 @@ impl RustMethodDispatcher for PluginRpcDispatcher<'_> {
if rhandle == 0 {
if method_name == "__shirabe_find_file" {
let class = match args.first() {
- // TODO(phase-e): lossy UTF-8; class names are bytes in PHP.
+ // TODO(bytes): lossy UTF-8; class names are bytes in PHP.
Some(PluginValue::String(bytes)) => String::from_utf8_lossy(bytes).into_owned(),
other => {
return Err(runtime_throw(format!(
@@ -307,7 +307,7 @@ impl RustMethodDispatcher for PluginRpcDispatcher<'_> {
if method_name == "__shirabe_run_rust_command" {
let (name, input_line) = match (args.first(), args.get(1)) {
(Some(PluginValue::String(name)), Some(PluginValue::String(line))) => (
- // TODO(phase-e): lossy UTF-8; command lines are bytes in PHP.
+ // TODO(bytes): lossy UTF-8; command lines are bytes in PHP.
String::from_utf8_lossy(name).into_owned(),
String::from_utf8_lossy(line).into_owned(),
),
@@ -393,7 +393,7 @@ impl RustMethodDispatcher for PluginRpcDispatcher<'_> {
/// ends up holding a second, unconnected instance of a Composer service.
pub(crate) fn construct_entity(args: &[PluginValue]) -> Result<PluginValue, PhpThrow> {
let (class, ctor_args) = match (args.first(), args.get(1)) {
- // TODO(phase-e): lossy UTF-8; class names are bytes in PHP.
+ // TODO(bytes): lossy UTF-8; class names are bytes in PHP.
(Some(PluginValue::String(class)), Some(PluginValue::List(ctor_args))) => {
(String::from_utf8_lossy(class).into_owned(), ctor_args)
}
@@ -700,7 +700,7 @@ fn dispatch_config_method(
) -> Result<PluginValue, PhpThrow> {
let key = |position: usize| -> Result<String, PhpThrow> {
match args.get(position) {
- // TODO(phase-e): lossy UTF-8; config keys are bytes in PHP.
+ // TODO(bytes): lossy UTF-8; config keys are bytes in PHP.
Some(PluginValue::String(bytes)) => Ok(String::from_utf8_lossy(bytes).into_owned()),
other => Err(runtime_throw(format!(
"{method_name} expects a string key, got {other:?}"
@@ -790,7 +790,7 @@ fn dispatch_download_manager_method(
) -> Result<PluginValue, PhpThrow> {
let string_arg = |position: usize| -> Result<String, PhpThrow> {
match args.get(position) {
- // TODO(phase-e): lossy UTF-8; paths and types are bytes in PHP.
+ // TODO(bytes): lossy UTF-8; paths and types are bytes in PHP.
Some(PluginValue::String(bytes)) => Ok(String::from_utf8_lossy(bytes).into_owned()),
other => Err(runtime_throw(format!(
"{method_name} expects a string argument at position {position}, got {other:?}"
@@ -2013,7 +2013,7 @@ fn decode_write_args(
method_name: &str,
args: &[PluginValue],
) -> Result<(Vec<String>, bool, i64), PhpThrow> {
- // TODO(phase-e): lossy UTF-8; IO messages are bytes in PHP.
+ // TODO(bytes): lossy UTF-8; IO messages are bytes in PHP.
let messages = match args.first() {
Some(PluginValue::String(bytes)) => vec![String::from_utf8_lossy(bytes).into_owned()],
Some(PluginValue::List(items)) => {
@@ -2289,7 +2289,7 @@ fn decode_subscribed_events(
};
let mut events: IndexMap<String, SubscribedEventEntry> = IndexMap::new();
for (event_name, params) in entries {
- // TODO(phase-e): lossy UTF-8; event and method names are bytes in PHP.
+ // TODO(bytes): lossy UTF-8; event and method names are bytes in PHP.
let event_name = String::from_utf8_lossy(&event_name).into_owned();
let entry = match &params {
PluginValue::String(method) => {
diff --git a/crates/shirabe/src/plugin/plugin_manager.rs b/crates/shirabe/src/plugin/plugin_manager.rs
index 0667c6a9..1d8e6192 100644
--- a/crates/shirabe/src/plugin/plugin_manager.rs
+++ b/crates/shirabe/src/plugin/plugin_manager.rs
@@ -430,7 +430,7 @@ impl PluginManager {
let path = class_loader.find_file(&class).unwrap_or_else(|| {
panic!("plugin class `{class}` is already defined but has no autoloadable file")
});
- // TODO(phase-e): file_get_contents is lossy UTF-8; the eval'd plugin source
+ // TODO(bytes): file_get_contents is lossy UTF-8; the eval'd plugin source
// should be carried as bytes.
let code = file_get_contents(&path)
.unwrap_or_else(|| panic!("unable to read the plugin class file `{path}`"));
diff --git a/crates/shirabe/src/repository/composer_repository.rs b/crates/shirabe/src/repository/composer_repository.rs
index b841d5d3..6a1b16ca 100644
--- a/crates/shirabe/src/repository/composer_repository.rs
+++ b/crates/shirabe/src/repository/composer_repository.rs
@@ -973,7 +973,7 @@ impl ComposerRepository {
// then does a single `$this->loop->wait($promises)`; mirror that here by polling all
// downloads concurrently via FuturesOrdered (submission order preserved) before doing
// any of the per-name response processing below.
- // TODO(phase-c): the fan-out below is structurally concurrent, but each
+ // TODO(async): the fan-out below is structurally concurrent, but each
// `start_cached_async_download` future still resolves through `HttpDownloader::add`'s
// `curl_runtime()`/`sync_executor::block_on` bridge, so real I/O overlap does not happen
// yet (see util/loop.rs::wait). That only changes once a single top-level Runtime
@@ -1765,7 +1765,7 @@ impl ComposerRepository {
// does a single `$this->loop->wait($promises)`; mirror that here by polling all downloads
// concurrently via FuturesOrdered (submission order preserved) before doing any of the
// per-name response processing below.
- // TODO(phase-c): the fan-out below is structurally concurrent, but each
+ // TODO(async): the fan-out below is structurally concurrent, but each
// `start_cached_async_download` future still resolves through `HttpDownloader::add`'s
// `curl_runtime()`/`sync_executor::block_on` bridge, so real I/O overlap does not happen yet
// (see util/loop.rs::wait). That only changes once a single top-level Runtime replaces those
diff --git a/crates/shirabe/src/repository/platform_repository.rs b/crates/shirabe/src/repository/platform_repository.rs
index feb9388f..e43892a0 100644
--- a/crates/shirabe/src/repository/platform_repository.rs
+++ b/crates/shirabe/src/repository/platform_repository.rs
@@ -1594,7 +1594,7 @@ impl PlatformRepository {
));
let mut extra: IndexMap<String, PhpMixed> = IndexMap::new();
extra.insert("config.platform".to_string(), PhpMixed::Bool(true));
- // NOTE(phase-c): neither PackageInterface nor CompletePackageInterface exposes
+ // TODO(type-model): neither PackageInterface nor CompletePackageInterface exposes
// setExtra (PHP defines it on BasePackage), and the handle API does not surface
// it. Disabled packages are always plain CompletePackage objects, so reach the
// concrete Package through the shared Rc.
diff --git a/crates/shirabe/src/repository/vcs_repository.rs b/crates/shirabe/src/repository/vcs_repository.rs
index e0724cd8..4da3f0ad 100644
--- a/crates/shirabe/src/repository/vcs_repository.rs
+++ b/crates/shirabe/src/repository/vcs_repository.rs
@@ -34,7 +34,7 @@ use shirabe_php_shim::{
};
use shirabe_semver::constraint::SimpleConstraint;
-// TODO(phase-c): the driver registration should be refactored later.
+// TODO(port): the driver registration should be refactored later.
#[derive(Debug)]
pub struct VcsRepository {
pub(crate) inner: ArrayRepository,
diff --git a/crates/shirabe/src/signal.rs b/crates/shirabe/src/signal.rs
index a4765e59..26297cc7 100644
--- a/crates/shirabe/src/signal.rs
+++ b/crates/shirabe/src/signal.rs
@@ -62,7 +62,7 @@ impl Default for SignalSubscription {
}
impl SignalSubscription {
- // TODO(phase-c): Windows delivers console control events (CTRL_C_EVENT, CTRL_BREAK_EVENT)
+ // TODO(windows): Windows delivers console control events (CTRL_C_EVENT, CTRL_BREAK_EVENT)
// rather than signals, and they are not subscribed to here.
pub fn new() -> Self {
let seq = SIGNAL_SEQ.load(std::sync::atomic::Ordering::SeqCst);
diff --git a/crates/shirabe/src/util/filesystem.rs b/crates/shirabe/src/util/filesystem.rs
index 2db41238..6cb33385 100644
--- a/crates/shirabe/src/util/filesystem.rs
+++ b/crates/shirabe/src/util/filesystem.rs
@@ -118,7 +118,7 @@ impl Filesystem {
/// Uses the process component if proc_open is enabled on the PHP
/// installation.
pub fn remove_directory(&mut self, directory: impl AsRef<Path>) -> anyhow::Result<bool> {
- // TODO(phase-c):
+ // TODO(bytes):
// This path is matched against a regex (remove_edge_cases) and passed to an
// `rm -rf`/`rmdir` subprocess via the String-based ProcessExecutor, so it has to be
// representable as UTF-8.
@@ -487,7 +487,7 @@ impl Filesystem {
return Ok(());
}
- // TODO(phase-c):
+ // TODO(bytes):
// The fallbacks below (copy_then_remove and the mv/xcopy subprocesses) operate on
// path strings, so beyond this point the paths have to be representable as UTF-8.
let source = source.to_str().ok_or_else(|| {
diff --git a/crates/shirabe/src/util/http/curl_downloader.rs b/crates/shirabe/src/util/http/curl_downloader.rs
index bd77f75e..ff59266e 100644
--- a/crates/shirabe/src/util/http/curl_downloader.rs
+++ b/crates/shirabe/src/util/http/curl_downloader.rs
@@ -11,7 +11,7 @@
//! is preserved. Per-request TLS/proxy/IP-resolve settings that reqwest only exposes per-Client
//! are simplified to a single default Client; see the TODOs below.
//!
-//! TODO(phase-c): `abortRequest()` (PHP `CurlDownloader::abortRequest`, called from
+//! TODO(async): `abortRequest()` (PHP `CurlDownloader::abortRequest`, called from
//! `HttpDownloader.php:275` when a React\Promise consumer cancels a download) has no equivalent
//! here: shirabe has never ported the Promise/canceler machinery (`HttpDownloader::STATUS_ABORTED`
//! is likewise unused), and there is no job table left to cancel now that `download()` runs to
@@ -76,9 +76,9 @@ impl CurlDownloader {
// - cookie_store(true) ~ CURL_LOCK_DATA_COOKIE
// - redirect(none) ~ CURLOPT_FOLLOWLOCATION = false (we follow manually)
// The libcurl version-specific multiplexing / accept-encoding workarounds are not needed.
- // TODO(phase-e): a brand-new reqwest client is created per CurlDownloader; that is acceptable here
+ // TODO(http): a brand-new reqwest client is created per CurlDownloader; that is acceptable here
// (one HttpDownloader owns one CurlDownloader) but not pooled across them.
- // TODO(phase-c): cookie sharing (CURL_LOCK_DATA_COOKIE) would need reqwest's `cookies` feature
+ // TODO(http): cookie sharing (CURL_LOCK_DATA_COOKIE) would need reqwest's `cookies` feature
// (.cookie_store(true)); omitted as it is not required for package downloads.
let client = reqwest::Client::builder()
.pool_max_idle_per_host(8)
@@ -493,10 +493,10 @@ impl CurlDownloader {
.and_then(|v| v.as_int())
.map(|n| n as u64);
- // TODO(phase-c): per-request ssl (cafile/verify_peer/local_cert) and proxy settings are reqwest
+ // TODO(http): per-request ssl (cafile/verify_peer/local_cert) and proxy settings are reqwest
// Client-level, not request-level. They are not applied here yet; a ConnectionOptions-keyed
// Client cache (as in the design sketch) is required to honor them.
- // TODO(phase-c): CURLOPT_IPRESOLVE (force IPv4/IPv6) has no direct reqwest API.
+ // TODO(http): CURLOPT_IPRESOLVE (force IPv4/IPv6) has no direct reqwest API.
let _ = attributes;
let reqwest_method =
diff --git a/crates/shirabe/src/util/http_downloader.rs b/crates/shirabe/src/util/http_downloader.rs
index 0aa589ca..c8fb943b 100644
--- a/crates/shirabe/src/util/http_downloader.rs
+++ b/crates/shirabe/src/util/http_downloader.rs
@@ -475,7 +475,7 @@ impl HttpDownloader {
http_map.insert("follow_location".to_string(), PhpMixed::Bool(false));
http_map.insert("ignore_errors".to_string(), PhpMixed::Bool(true));
ctx_options.insert("http".to_string(), PhpMixed::Array(http_map));
- // TODO(phase-c): file_get_contents only takes a path; the stream context arg is dropped
+ // TODO(http): file_get_contents only takes a path; the stream context arg is dropped
// until the PHP stream-context layer is modeled.
let _ = stream_context_create(&ctx_options, None);
let test_connectivity = file_get_contents("https://8.8.8.8");
diff --git a/crates/shirabe/src/util/loop.rs b/crates/shirabe/src/util/loop.rs
index 5d2845c1..dccf5325 100644
--- a/crates/shirabe/src/util/loop.rs
+++ b/crates/shirabe/src/util/loop.rs
@@ -49,7 +49,7 @@ impl Loop {
let mut pending: FuturesUnordered<_> = promises.into_iter().collect();
let mut uncaught: Option<anyhow::Error> = None;
- // TODO(phase-c): promises are now polled concurrently via FuturesUnordered, but
+ // TODO(async): promises are now polled concurrently via FuturesUnordered, but
// each individual future (HttpDownloader::add/add_copy etc.) still resolves through a
// blocking bridge (curl_runtime()/sync_executor::block_on), so real I/O overlap does not
// happen yet — the bridged future fully blocks the thread until it settles before the next
@@ -67,7 +67,7 @@ impl Loop {
}
pub fn abort_jobs(&self) {
- // TODO(phase-c): no-op until a cancellation mechanism is introduced. PHP cancels
+ // TODO(async): no-op until a cancellation mechanism is introduced. PHP cancels
// every in-flight promise group it tracks in $currentPromises; reintroduce that tracking
// once the asynchronous workers support cancellation on a multi-thread runtime.
}
diff --git a/crates/shirabe/src/util/process_executor.rs b/crates/shirabe/src/util/process_executor.rs
index 4808d0be..3f300317 100644
--- a/crates/shirabe/src/util/process_executor.rs
+++ b/crates/shirabe/src/util/process_executor.rs
@@ -161,7 +161,7 @@ impl ProcessExecutor {
/// Forwards to `execute`, returning the status code (1 on Err for compatibility) — this
/// mirrors PHP call sites that check the `int` return of `execute()` without a surrounding
/// `try`/`catch`, where an uncaught mock-mismatch exception would otherwise propagate.
- // TODO(phase-d): under a strict `ProcessExecutorMock`, an incomplete expectation list now
+ // TODO(mock): under a strict `ProcessExecutorMock`, an incomplete expectation list now
// surfaces here as a swallowed "exit code 1" instead of the old `panic!`, so a future test
// ported through this call site could silently take a wrong branch instead of failing loudly.
// `ProcessExecutorMockGuard::__assert_complete` still catches unconsumed expectations at
diff --git a/crates/shirabe/src/util/remote_filesystem.rs b/crates/shirabe/src/util/remote_filesystem.rs
index 28edb65c..ce24e39a 100644
--- a/crates/shirabe/src/util/remote_filesystem.rs
+++ b/crates/shirabe/src/util/remote_filesystem.rs
@@ -315,7 +315,7 @@ impl RemoteFilesystem {
let mut error_message = String::new();
let error_code = 0_i64;
let mut result: Option<String> = None;
- // TODO(phase-c): PHP captures file_get_contents warnings here via set_error_handler. Rust
+ // TODO(http): PHP captures file_get_contents warnings here via set_error_handler. Rust
// reports I/O failures through return values rather than warnings, so error_message stays
// empty until get_remote_contents surfaces a read reason.
let mut http_response_header: Vec<String> = Vec::new();
@@ -617,7 +617,7 @@ impl RemoteFilesystem {
.into());
}
- // TODO(phase-c): PHP captures the file_put_contents warning here via set_error_handler
+ // TODO(php-semantics): PHP captures the file_put_contents warning here via set_error_handler
// (see the get() reads above); Rust reports the failure through the return value, so
// put_error_message stays empty until file_put_contents surfaces a write reason.
let put_error_message = String::new();
@@ -738,7 +738,7 @@ impl RemoteFilesystem {
None => file_get_contents(file_url),
})
} else {
- // TODO(phase-c): wrap PHP's `file_get_contents` with stream context and error capture
+ // TODO(http): wrap PHP's `file_get_contents` with stream context and error capture
// for http(s) and other network schemes; depends on the unmodeled PHP stream-context
// layer.
Ok(None)
@@ -764,7 +764,7 @@ impl RemoteFilesystem {
*response_headers = http_get_last_response_headers().unwrap_or_default();
http_clear_last_response_headers();
} else {
- // TODO(phase-c): read the magic `$http_response_header` PHP variable; depends on the
+ // TODO(http): read the magic `$http_response_header` PHP variable; depends on the
// unmodeled PHP stream layer that populates it.
*response_headers = Vec::new();
}
@@ -1040,7 +1040,7 @@ impl RemoteFilesystem {
let decoded = zlib_decode(result.as_deref().unwrap_or("").as_bytes());
result = match decoded {
- // TODO(phase-e): byte-string semantics — the response body travels through
+ // TODO(bytes): byte-string semantics — the response body travels through
// RemoteFilesystem as a String; from_utf8_lossy can corrupt binary payloads
Some(d) => Some(String::from_utf8_lossy(&d).into_owned()),
None => {
diff --git a/crates/shirabe/src/util/sync_executor.rs b/crates/shirabe/src/util/sync_executor.rs
index 8ba45bd2..f770c6a2 100644
--- a/crates/shirabe/src/util/sync_executor.rs
+++ b/crates/shirabe/src/util/sync_executor.rs
@@ -16,7 +16,7 @@
//! case — and for any other call site reached before `main.rs`'s runtime exists — `block_on` falls
//! back to a disposable single-threaded runtime scoped to just that one call.
//!
-//! TODO(phase-e): this still leaves every one of `block_on`'s call sites synchronous rather than
+//! TODO(async): this still leaves every one of `block_on`'s call sites synchronous rather than
//! genuinely `async fn` propagated up to `Command::execute`, which remains the end goal of the
//! async re-architecture (see the design doc). Nested `block_on` call sites (a sync fn reached
//! from inside another `block_on`'s async block) do not run concurrently with their siblings —
diff --git a/crates/shirabe/tests/all_functional_test.rs b/crates/shirabe/tests/all_functional_test.rs
index eaf37558..a05a575a 100644
--- a/crates/shirabe/tests/all_functional_test.rs
+++ b/crates/shirabe/tests/all_functional_test.rs
@@ -246,7 +246,7 @@ fn run_integration(test_filename: &str) {
#[ignore = "Rust has no phar; the binary under test is built by cargo (CARGO_BIN_EXE_shirabe), so bin/compile (the phar build) has no equivalent"]
fn test_build_phar() {
let _guard = set_up();
- // TODO(phase-d): no phar-build equivalent in Rust; the binary under test is produced by cargo
+ // TODO(distribution): no phar-build equivalent in Rust; the binary under test is produced by cargo
// and located via CARGO_BIN_EXE_shirabe, so there is nothing analogous to bin/compile to test.
todo!()
}
diff --git a/crates/shirabe/tests/autoload/autoload_generator_test.rs b/crates/shirabe/tests/autoload/autoload_generator_test.rs
index cd0a3e5b..e55635fc 100644
--- a/crates/shirabe/tests/autoload/autoload_generator_test.rs
+++ b/crates/shirabe/tests/autoload/autoload_generator_test.rs
@@ -1751,7 +1751,7 @@ fn test_exclude_from_classmap() {
#[test]
#[ignore = "require autoload.php + function_exists() assertions are unportable (composer_require todo!())"]
fn test_files_autoload_order_by_dependencies() {
- // TODO(phase-d): PHP `require autoload.php` + function_exists() assertions have no Rust
+ // TODO(php-runtime): PHP `require autoload.php` + function_exists() assertions have no Rust
// equivalent (no runtime PHP file loading/class definition).
todo!()
}
@@ -1924,7 +1924,7 @@ fn test_files_autoload_generation_remove_extra_entities_from_autoload_files() {
#[test]
#[ignore = "asserts PHP get_include_path() after require autoload.php"]
fn test_include_paths_are_prepended_in_autoload_file() {
- // TODO(phase-d): asserts PHP get_include_path() after `require autoload.php`; no Rust
+ // TODO(php-runtime): asserts PHP get_include_path() after `require autoload.php`; no Rust
// equivalent for PHP's include path / runtime require.
todo!()
}
@@ -1932,7 +1932,7 @@ fn test_include_paths_are_prepended_in_autoload_file() {
#[test]
#[ignore = "asserts PHP get_include_path() after require autoload.php"]
fn test_include_paths_in_root_package() {
- // TODO(phase-d): asserts PHP get_include_path() after `require autoload.php`; no Rust
+ // TODO(php-runtime): asserts PHP get_include_path() after `require autoload.php`; no Rust
// equivalent for PHP's include path / runtime require.
todo!()
}
diff --git a/crates/shirabe/tests/autoload/class_loader_test.rs b/crates/shirabe/tests/autoload/class_loader_test.rs
index 998683c9..00cda87d 100644
--- a/crates/shirabe/tests/autoload/class_loader_test.rs
+++ b/crates/shirabe/tests/autoload/class_loader_test.rs
@@ -43,7 +43,7 @@ fn test_get_prefixes_with_no_psr0_configuration() {
#[test]
#[ignore = "the round trip is `unserialize(serialize($loader))`: shirabe_php_shim::serialize takes a PhpMixed (a ClassLoader cannot be turned into one) and there is no unserialize at all, so the ClassLoader under test cannot be round-tripped"]
fn test_serializability() {
- // TODO(phase-d): the round trip is `unserialize(serialize($loader))`. serialize() in the shim
+ // TODO(php-semantics): the round trip is `unserialize(serialize($loader))`. serialize() in the shim
// takes a PhpMixed, which a ClassLoader cannot be converted into, and there is no unserialize
// symbol to produce the second ClassLoader the assertions compare against.
todo!()
diff --git a/crates/shirabe/tests/command/run_script_command_test.rs b/crates/shirabe/tests/command/run_script_command_test.rs
index 311091a0..6c7f45c8 100644
--- a/crates/shirabe/tests/command/run_script_command_test.rs
+++ b/crates/shirabe/tests/command/run_script_command_test.rs
@@ -17,7 +17,7 @@ use shirabe_php_shim::PhpMixed;
harness is inexpressible; the event-side isDevMode downcast now exists \
(EventInterface::as_any), but that alone does not unblock the test."]
fn test_detect_and_pass_dev_mode_to_event_and_to_dispatching() {
- // TODO(phase-d): PHP mocks RunScriptCommand itself (onlyMethods incl. requireComposer -> a
+ // TODO(mock): PHP mocks RunScriptCommand itself (onlyMethods incl. requireComposer -> a
// composer whose EventDispatcher is a hasEventListeners/dispatchScript recording mock) and
// drives run() with mocked Input/Output. The Rust RunScriptCommand has no requireComposer
// override seam and Input/Output are concrete types, so the mocked harness is
diff --git a/crates/shirabe/tests/command/show_command_test.rs b/crates/shirabe/tests/command/show_command_test.rs
index d00852dd..47eae462 100644
--- a/crates/shirabe/tests/command/show_command_test.rs
+++ b/crates/shirabe/tests/command/show_command_test.rs
@@ -1026,7 +1026,7 @@ fn test_self_and_package_combination() {
#[ignore = "the shim date() renders in UTC only (no timezone database) while PHP's date() uses \
the system default timezone, so ShowCommand::get_relative_time misses the \"today\" \
match and prints \"this week\" whenever the local date differs from the UTC date \
- (e.g. daily 00:00-09:00 JST); see TODO(phase-c) in shirabe-php-shim datetime.rs"]
+ (e.g. daily 00:00-09:00 JST); see TODO(php-semantics) in shirabe-php-shim datetime.rs"]
fn test_self() {
let today = chrono::Local::now().format("%Y-%m-%d").to_string();
let _tear_down = init_temp_composer(
diff --git a/crates/shirabe/tests/common/bootstrap.rs b/crates/shirabe/tests/common/bootstrap.rs
index 8b2a8aa0..a908bff2 100644
--- a/crates/shirabe/tests/common/bootstrap.rs
+++ b/crates/shirabe/tests/common/bootstrap.rs
@@ -8,7 +8,7 @@ use shirabe::util::platform::Platform;
/// a tty (as it isn't under `cargo test`), so interactive `ApplicationTester` runs silently no-op
/// instead of consuming `set_inputs`.
///
-/// TODO(phase-d): this is only wired into `get_application_tester()` (used by the `command` test
+/// TODO(port): this is only wired into `get_application_tester()` (used by the `command` test
/// binary) rather than into every test binary's `main.rs`, unlike PHPUnit's bootstrap which
/// covers the whole suite unconditionally. Rust's libtest has no per-binary setup hook, so a true
/// equivalent needs either the `ctor` crate (new dependency, user decision) or wiring a call into
@@ -22,7 +22,7 @@ pub fn bootstrap() {
shirabe_php_shim::date_default_timezone_set(&shirabe_php_shim::date_default_timezone_get());
// PHP: require src/bootstrap.php and refresh vendor/composer/InstalledVersions.php.
- // TODO(phase-d): port remaining bootstrap processes (the src/bootstrap.php include and
+ // TODO(php-runtime): port remaining bootstrap processes (the src/bootstrap.php include and
// the InstalledVersions refresh are PHP autoload mechanics with no Rust counterpart yet).
Platform::put_env("COMPOSER_TESTS_ARE_RUNNING", "1");
diff --git a/crates/shirabe/tests/downloader/file_downloader_test.rs b/crates/shirabe/tests/downloader/file_downloader_test.rs
index eac4e45e..a8f1bdf2 100644
--- a/crates/shirabe/tests/downloader/file_downloader_test.rs
+++ b/crates/shirabe/tests/downloader/file_downloader_test.rs
@@ -180,7 +180,7 @@ fn test_download_but_file_is_unsaved() {
#[test]
#[ignore = "the listener is a closure that mutates the event (setProcessedUrl), but Callable::Closure receives `&dyn EventInterface`, so it cannot; and CacheMock has no copy_to/copy_from hooks to assert the cache key on"]
fn test_download_with_custom_processed_url() {
- // TODO(phase-d): the PRE_FILE_DOWNLOAD listener is a closure calling
+ // TODO(mock): the PRE_FILE_DOWNLOAD listener is a closure calling
// PreFileDownloadEvent::setProcessedUrl, but Callable::Closure is
// `Fn(&dyn EventInterface)`, so a listener cannot mutate the event it receives. The Cache
// half is likewise inexpressible: CacheMock carries only finder/gc overrides, with no
@@ -191,7 +191,7 @@ fn test_download_with_custom_processed_url() {
#[test]
#[ignore = "the listener is a closure that mutates the event (setCustomCacheKey), but Callable::Closure receives `&dyn EventInterface`, so it cannot; and CacheMock has no copy_to/copy_from hooks to assert the cache key on"]
fn test_download_with_custom_cache_key() {
- // TODO(phase-d): the PRE_FILE_DOWNLOAD listener is a closure calling
+ // TODO(mock): the PRE_FILE_DOWNLOAD listener is a closure calling
// PreFileDownloadEvent::setCustomCacheKey, but Callable::Closure is
// `Fn(&dyn EventInterface)`, so a listener cannot mutate the event it receives. The Cache
// half is likewise inexpressible: CacheMock carries only finder/gc overrides, with no
diff --git a/crates/shirabe/tests/installed_versions_test.rs b/crates/shirabe/tests/installed_versions_test.rs
index 724c844e..49007a81 100644
--- a/crates/shirabe/tests/installed_versions_test.rs
+++ b/crates/shirabe/tests/installed_versions_test.rs
@@ -7,91 +7,91 @@
#[test]
#[ignore = "InstalledVersions::getInstalledPackages has no Rust counterpart"]
fn test_get_installed_packages() {
- // TODO(phase-d): needs InstalledVersions::get_installed_packages.
+ // TODO(port): needs InstalledVersions::get_installed_packages.
todo!()
}
#[test]
#[ignore = "InstalledVersions::isInstalled has no Rust counterpart"]
fn test_is_installed() {
- // TODO(phase-d): needs InstalledVersions::is_installed.
+ // TODO(port): needs InstalledVersions::is_installed.
todo!()
}
#[test]
#[ignore = "InstalledVersions::satisfies has no Rust counterpart"]
fn test_satisfies() {
- // TODO(phase-d): needs InstalledVersions::satisfies.
+ // TODO(port): needs InstalledVersions::satisfies.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getVersionRanges has no Rust counterpart"]
fn test_get_version_ranges() {
- // TODO(phase-d): needs InstalledVersions::get_version_ranges.
+ // TODO(port): needs InstalledVersions::get_version_ranges.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getVersion has no Rust counterpart"]
fn test_get_version() {
- // TODO(phase-d): needs InstalledVersions::get_version.
+ // TODO(port): needs InstalledVersions::get_version.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getPrettyVersion has no Rust counterpart"]
fn test_get_pretty_version() {
- // TODO(phase-d): needs InstalledVersions::get_pretty_version.
+ // TODO(port): needs InstalledVersions::get_pretty_version.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getVersion has no Rust counterpart"]
fn test_get_version_out_of_bounds() {
- // TODO(phase-d): needs InstalledVersions::get_version.
+ // TODO(port): needs InstalledVersions::get_version.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getRootPackage has no Rust counterpart"]
fn test_get_root_package() {
- // TODO(phase-d): needs InstalledVersions::get_root_package.
+ // TODO(port): needs InstalledVersions::get_root_package.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getRawData has no Rust counterpart"]
fn test_get_raw_data() {
- // TODO(phase-d): needs InstalledVersions::get_raw_data.
+ // TODO(port): needs InstalledVersions::get_raw_data.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getReference has no Rust counterpart"]
fn test_get_reference() {
- // TODO(phase-d): needs InstalledVersions::get_reference.
+ // TODO(port): needs InstalledVersions::get_reference.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getInstalledPackagesByType has no Rust counterpart"]
fn test_get_installed_packages_by_type() {
- // TODO(phase-d): needs InstalledVersions::get_installed_packages_by_type.
+ // TODO(port): needs InstalledVersions::get_installed_packages_by_type.
todo!()
}
#[test]
#[ignore = "InstalledVersions::getInstallPath has no Rust counterpart"]
fn test_get_install_path() {
- // TODO(phase-d): needs InstalledVersions::get_install_path.
+ // TODO(port): needs InstalledVersions::get_install_path.
todo!()
}
#[test]
#[ignore = "InstalledVersions::isInstalled and getRootPackage have no Rust counterpart"]
fn test_with_class_loader_loaded() {
- // TODO(phase-d): needs InstalledVersions::is_installed and
+ // TODO(port): needs InstalledVersions::is_installed and
// InstalledVersions::get_root_package.
todo!()
}
diff --git a/crates/shirabe/tests/installer/installation_manager_test.rs b/crates/shirabe/tests/installer/installation_manager_test.rs
index c511703e..f15729c3 100644
--- a/crates/shirabe/tests/installer/installation_manager_test.rs
+++ b/crates/shirabe/tests/installer/installation_manager_test.rs
@@ -323,7 +323,7 @@ fn test_add_remove_installer() {
#[ignore = "partial mock of InstallationManager (onlyMethods install/update/uninstall) with expects(once)->with(...) is not reproducible without method-overriding mocks; execute() also takes the batched download path"]
#[test]
fn test_execute() {
- // TODO(phase-d): a partial mock of InstallationManager (onlyMethods install/update/uninstall)
+ // TODO(mock): a partial mock of InstallationManager (onlyMethods install/update/uninstall)
// with expects(once)->with(...) is not reproducible without method-overriding mocks: the PHP
// test runs the *real* execute() (batched download path included, via NoopInstaller) while
// spying on the three per-operation methods it dispatches to. The existing
diff --git a/crates/shirabe/tests/installer_test.rs b/crates/shirabe/tests/installer_test.rs
index b6d19b10..5c835aff 100644
--- a/crates/shirabe/tests/installer_test.rs
+++ b/crates/shirabe/tests/installer_test.rs
@@ -812,8 +812,8 @@ fn evaluate_condition(condition: &str) -> bool {
}
// HHVM is never defined under the Rust port.
"!defined('HHVM_VERSION')" => true,
- // TODO(phase-d): unported CONDITION expression (PHP eval has no Rust equivalent).
- other => panic!("// TODO(phase-d): unported CONDITION: {}", other),
+ // TODO(php-runtime): unported CONDITION expression (PHP eval has no Rust equivalent).
+ other => panic!("// TODO(php-runtime): unported CONDITION: {}", other),
}
}
@@ -1305,7 +1305,7 @@ fn test_slow_integration() {
let _tear_down = TearDown::new();
for case in load_integration_tests("installer-slow/") {
if case.file == "github-issues-7665.test" {
- // TODO(phase-d): upstream Composer defect (composer/composer#12111), not a porting
+ // TODO(upstream): upstream Composer defect (composer/composer#12111), not a porting
// bug. Problem::getPrettyString breaks RULE_LEARNED sort ties with
// getSortableString() <=> getSortableString(), which compares numerically when both
// sides are numeric strings and by byte otherwise, so it is not transitive. Those
diff --git a/crates/shirabe/tests/io/console_io_test.rs b/crates/shirabe/tests/io/console_io_test.rs
index 3c142cfe..b0c6380d 100644
--- a/crates/shirabe/tests/io/console_io_test.rs
+++ b/crates/shirabe/tests/io/console_io_test.rs
@@ -138,7 +138,7 @@ fn test_write_error() {
#[ignore = "ConsoleIO::write3 takes a single &str; the test feeds a 2-element array ['First line','Second lines'] and asserts a per-element regex on the debugging-prefixed messages array, which the &str signature cannot represent"]
#[test]
fn test_write_with_multiple_line_string_when_debugging() {
- // TODO(phase-d): ConsoleIO::write3 takes a single &str; the test feeds a 2-element array
+ // TODO(type-model): ConsoleIO::write3 takes a single &str; the test feeds a 2-element array
// ['First line','Second lines'] and asserts a per-element regex on the debugging-prefixed
// messages array, which the &str signature cannot represent.
todo!()
@@ -294,7 +294,7 @@ fn test_has_authentication() {
#[ignore = "data provider includes malformed-UTF-8 inputs (e.g. \\xFF, \\xC3\\x28); sanitize() takes PhpMixed::String which is UTF-8-only and cannot carry invalid bytes, so those cases are unrepresentable"]
#[test]
fn test_sanitize() {
- // TODO(phase-d): the data provider includes malformed-UTF-8 inputs (e.g. \xFF, \xC3\x28);
+ // TODO(bytes): the data provider includes malformed-UTF-8 inputs (e.g. \xFF, \xC3\x28);
// sanitize() takes PhpMixed::String which is UTF-8-only and cannot carry invalid bytes, so
// those cases are unrepresentable.
todo!()
diff --git a/crates/shirabe/tests/package/dumper/array_dumper_test.rs b/crates/shirabe/tests/package/dumper/array_dumper_test.rs
index 430900c4..781d1ec8 100644
--- a/crates/shirabe/tests/package/dumper/array_dumper_test.rs
+++ b/crates/shirabe/tests/package/dumper/array_dumper_test.rs
@@ -90,7 +90,7 @@ fn test_dump_abandoned_replacement() {
#[test]
#[ignore = "authors/scripts/funding data sets pass loosely-typed PHP arrays the narrowed Rust set_authors/set_scripts/set_funding types cannot represent, and the dumper re-wraps them; faithful all-or-nothing port blocked without loosening those production types"]
fn test_keys() {
- // TODO(phase-d): authors/scripts/funding data sets pass loosely-typed PHP arrays the
+ // TODO(type-model): authors/scripts/funding data sets pass loosely-typed PHP arrays the
// narrowed Rust set_authors/set_scripts/set_funding types cannot represent, and the
// dumper re-wraps them; faithful all-or-nothing port blocked without loosening those
// production types.
diff --git a/crates/shirabe/tests/plugin/e2e_package_event_test.rs b/crates/shirabe/tests/plugin/e2e_package_event_test.rs
index ef334685..a6569105 100644
--- a/crates/shirabe/tests/plugin/e2e_package_event_test.rs
+++ b/crates/shirabe/tests/plugin/e2e_package_event_test.rs
@@ -86,7 +86,7 @@ post-package-install devMode=1 class=Composer\\DependencyResolver\\Operation\\In
// previous one installed. Shirabe builds a lazy future per operation and only drives them in
// wait_on_promises, so every pre-event of a batch sees the repository as it was before the
// batch. Upstream: 1 / 1 / 2 / 3 / 3, Shirabe: 1 / 1 / 1 / 3 / 3.
-#[ignore = "operation chains run where they are built upstream but only in wait_on_promises here, so the repository state a package event observes differs (TODO(phase-c) promise cluster)"]
+#[ignore = "operation chains run where they are built upstream but only in wait_on_promises here, so the repository state a package event observes differs (TODO(async) promise cluster)"]
#[test]
fn test_local_repository_seen_by_package_events_matches_upstream_composer() {
if !php_runtime_available() {
diff --git a/crates/shirabe/tests/repository/filesystem_repository_test.rs b/crates/shirabe/tests/repository/filesystem_repository_test.rs
index b87e1502..59901072 100644
--- a/crates/shirabe/tests/repository/filesystem_repository_test.rs
+++ b/crates/shirabe/tests/repository/filesystem_repository_test.rs
@@ -328,7 +328,7 @@ fn test_repository_writes_installed_php() {
#[ignore = "safely_load_installed_versions's pattern uses a PCRE (?(DEFINE)...) recursive grammar the regex crate cannot compile, and InstalledVersions::getAllRawData has no Rust counterpart"]
#[test]
fn test_safely_load_installed_versions() {
- // TODO(phase-d): needs a regex-crate expression equivalent to the PCRE recursive grammar, and
+ // TODO(pcre): needs a regex-crate expression equivalent to the PCRE recursive grammar, and
// InstalledVersions::get_all_raw_data.
todo!()
}
diff --git a/crates/shirabe/tests/repository/platform_repository_test.rs b/crates/shirabe/tests/repository/platform_repository_test.rs
index 573f96ed..c16f3a3e 100644
--- a/crates/shirabe/tests/repository/platform_repository_test.rs
+++ b/crates/shirabe/tests/repository/platform_repository_test.rs
@@ -205,7 +205,7 @@ fn test_php_version() {
#[test]
fn test_inet_pton_regression() {
// PHP: ->expects(self::once())->method('invoke')->with('inet_pton', ['::'])->willReturn(false).
- // TODO(phase-d): the payload reports the result of `@inet_pton('::')` instead of answering a
+ // TODO(mock): the payload reports the result of `@inet_pton('::')` instead of answering a
// call, so there is nothing left for the once() call-count check to observe.
let functions = [(
PhpMixed::String("inet_pton".to_string()),
diff --git a/crates/shirabe/tests/util/auth_helper_test.rs b/crates/shirabe/tests/util/auth_helper_test.rs
index 2f2feb23..102a798c 100644
--- a/crates/shirabe/tests/util/auth_helper_test.rs
+++ b/crates/shirabe/tests/util/auth_helper_test.rs
@@ -806,7 +806,7 @@ fn test_add_authentication_header_with_custom_headers() {
#[ignore = "exercises the deprecated addAuthenticationHeader wrapper (not ported) which relies on \
trigger_error/E_USER_DEPRECATED; the PHP error-handler subsystem is not modeled"]
fn test_add_authentication_header_is_working() {
- // TODO(phase-d): see test_add_authentication_header_with_custom_headers above — same
+ // TODO(php-runtime): see test_add_authentication_header_with_custom_headers above — same
// unported addAuthenticationHeader deprecated wrapper.
todo!()
}
@@ -815,7 +815,7 @@ fn test_add_authentication_header_is_working() {
#[ignore = "exercises the deprecated addAuthenticationHeader wrapper (not ported) which relies on \
trigger_error/E_USER_DEPRECATED converted to a RuntimeException via set_error_handler; not modeled"]
fn test_add_authentication_header_deprecation() {
- // TODO(phase-d): asserts that calling addAuthenticationHeader itself raises a
+ // TODO(php-runtime): asserts that calling addAuthenticationHeader itself raises a
// RuntimeException via a custom set_error_handler converting E_USER_DEPRECATED; same
// unported wrapper and unmodeled error-handler subsystem as the two tests above.
todo!()
diff --git a/crates/shirabe/tests/util/error_handler_test.rs b/crates/shirabe/tests/util/error_handler_test.rs
index efaf4e11..9a34fd73 100644
--- a/crates/shirabe/tests/util/error_handler_test.rs
+++ b/crates/shirabe/tests/util/error_handler_test.rs
@@ -30,7 +30,7 @@ impl Drop for TearDown {
#[ignore = "depends on PHP runtime routing an undefined-index notice through set_error_handler; no Rust equivalent for $array['baz'] triggering ErrorHandler::handle"]
#[test]
fn test_error_handler_capture_notice() {
- // TODO(phase-d): depends on PHP runtime routing an undefined-index notice through
+ // TODO(php-runtime): depends on PHP runtime routing an undefined-index notice through
// set_error_handler; no Rust equivalent for $array['baz'] triggering
// ErrorHandler::handle.
todo!()
@@ -39,7 +39,7 @@ fn test_error_handler_capture_notice() {
#[ignore = "depends on PHP runtime emitting a TypeError/warning from array_merge([], 'string') via set_error_handler; no Rust equivalent"]
#[test]
fn test_error_handler_capture_warning() {
- // TODO(phase-d): depends on PHP runtime emitting a TypeError/warning from
+ // TODO(php-runtime): depends on PHP runtime emitting a TypeError/warning from
// array_merge([], 'string') via set_error_handler; no Rust equivalent.
todo!()
}
@@ -47,7 +47,7 @@ fn test_error_handler_capture_warning() {
#[ignore = "depends on the PHP @ error-suppression operator and trigger_error routing through set_error_handler; no Rust equivalent"]
#[test]
fn test_error_handler_respects_at_operator() {
- // TODO(phase-d): depends on the PHP @ error-suppression operator and trigger_error
+ // TODO(php-runtime): depends on the PHP @ error-suppression operator and trigger_error
// routing through set_error_handler; no Rust equivalent.
todo!()
}
diff --git a/crates/shirabe/tests/util/process_executor_test.rs b/crates/shirabe/tests/util/process_executor_test.rs
index 9599775e..93e74a12 100644
--- a/crates/shirabe/tests/util/process_executor_test.rs
+++ b/crates/shirabe/tests/util/process_executor_test.rs
@@ -2,7 +2,7 @@
// These run real subprocesses (capturing output/stderr/timeout) and assert ProcessExecutor's
// password hiding, line splitting and argument escaping. A few data points remain unportable —
-// see the individual `// TODO(phase-d)` comments below.
+// see the individual `// TODO(async)` comments below.
use shirabe::io::ConsoleIO;
use shirabe::io::IOInterface;
@@ -179,7 +179,7 @@ fn test_console_io_does_not_format_symfony_console_style() {
#[ignore = "none of the three symbols this test drives exist: execute_async returns a plain future with no cancel(), and ProcessExecutor has no count_active_jobs or wait (PHP's $jobs/$maxJobs queue is a tokio semaphore here)"]
#[test]
fn test_execute_async_cancel() {
- // TODO(phase-d): PHP's executeAsync returns a React\Promise\PromiseInterface with cancel(),
+ // TODO(async): PHP's executeAsync returns a React\Promise\PromiseInterface with cancel(),
// and the test reads countActiveJobs() around it and then calls wait(). execute_async here
// returns a plain future with no cancel(), and ProcessExecutor has neither count_active_jobs
// nor wait: the PHP job queue those methods expose is a tokio semaphore in this port.
diff --git a/crates/shirabe/tests/util/remote_filesystem_test.rs b/crates/shirabe/tests/util/remote_filesystem_test.rs
index 43f0aae0..6d21732f 100644
--- a/crates/shirabe/tests/util/remote_filesystem_test.rs
+++ b/crates/shirabe/tests/util/remote_filesystem_test.rs
@@ -274,10 +274,10 @@ fn test_copy() {
#[test]
#[ignore = "requires a MockObject subclass of RemoteFilesystem overriding private get_remote_contents; no subclass-mocking infrastructure exists"]
fn test_copy_with_no_retry_on_failure() {
- // TODO(phase-d): requires a MockObject subclass of RemoteFilesystem overriding the
+ // TODO(mock): requires a MockObject subclass of RemoteFilesystem overriding the
// private get_remote_contents method. There is no subclass-mocking infrastructure in
// Rust for this, and get_remote_contents's http(s) branch is itself still a
- // TODO(phase-c) stub (always returns Ok(None)), so there is nothing yet to intercept
+ // TODO(http) stub (always returns Ok(None)), so there is nothing yet to intercept
// even with a seam.
todo!()
}
@@ -285,10 +285,10 @@ fn test_copy_with_no_retry_on_failure() {
#[test]
#[ignore = "requires MockObject subclasses overriding RemoteFilesystem::get_remote_contents and AuthHelper::prompt_auth_if_needed; no subclass-mocking infrastructure exists"]
fn test_copy_with_success_on_retry() {
- // TODO(phase-d): requires MockObject subclasses overriding
+ // TODO(mock): requires MockObject subclasses overriding
// RemoteFilesystem::get_remote_contents and AuthHelper::prompt_auth_if_needed to
// simulate a first failure and a retried success; same missing-subclass-mocking-
- // infrastructure and TODO(phase-c) http(s)-stub blockers as
+ // infrastructure and TODO(http) http(s)-stub blockers as
// test_copy_with_no_retry_on_failure above.
todo!()
}
@@ -350,7 +350,7 @@ fn provide_bitbucket_public_download_urls() -> Vec<(&'static str, &'static str)>
}
#[test]
-#[ignore = "performs a real network download; get_remote_contents has no stream layer (TODO(phase-c)) and returns None, so getContents raises a TransportException"]
+#[ignore = "performs a real network download; get_remote_contents has no stream layer (TODO(http)) and returns None, so getContents raises a TransportException"]
fn test_bit_bucket_public_download() {
for (url, contents) in provide_bitbucket_public_download_urls() {
let io: std::rc::Rc<std::cell::RefCell<dyn IOInterface>> =
diff --git a/crates/shirabe/tests/util/stream_context_factory_test.rs b/crates/shirabe/tests/util/stream_context_factory_test.rs
index f9d840cf..a2a9cb44 100644
--- a/crates/shirabe/tests/util/stream_context_factory_test.rs
+++ b/crates/shirabe/tests/util/stream_context_factory_test.rs
@@ -100,7 +100,7 @@ impl Drop for TearDown {
}
}
-// TODO(phase-d): PHP's dataGetContext second data set passes a `notification` closure in both
+// TODO(type-model): PHP's dataGetContext second data set passes a `notification` closure in both
// the default and expected params; PhpMixed has no closure variant, so that data set (and thus
// the all-or-nothing testGetContext, which a data provider test cannot partially skip) cannot be
// expressed.
@@ -110,7 +110,7 @@ impl Drop for TearDown {
fn test_get_context() {
let _tear_down = TearDown;
set_up();
- // TODO(phase-d): dataGetContext's second data set passes a `notification` closure in
+ // TODO(type-model): dataGetContext's second data set passes a `notification` closure in
// params; PhpMixed cannot represent a PHP closure, so that data set (and thus the
// all-or-nothing testGetContext, which a data provider test cannot partially skip) is
// unportable.
diff --git a/crates/shirabe/tests/util/zip_test.rs b/crates/shirabe/tests/util/zip_test.rs
index e3e976de..569ac7a2 100644
--- a/crates/shirabe/tests/util/zip_test.rs
+++ b/crates/shirabe/tests/util/zip_test.rs
@@ -11,7 +11,7 @@ fn fixture(name: &str) -> String {
)
}
-// TODO(phase-d): PHP runs this test only when the zip extension is NOT loaded (it is
+// TODO(php-runtime): PHP runs this test only when the zip extension is NOT loaded (it is
// markTestSkipped otherwise). The Rust port links zip support unconditionally, so the
// "extension not loaded" precondition cannot exist and the expected RuntimeException
// ("The Zip Util requires PHP's zip extension") is unreachable by design.