From 96a8ff0513ae7b012b3e4ba8e43a3eca71847458 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 20 Jul 2026 03:24:57 +0900 Subject: fix(remote-filesystem): read scheme-less local paths in get_remote_contents PHP's getRemoteContents calls file_get_contents unconditionally: the same stream wrapper reads file:// URLs, plain local paths and network schemes. The Rust port only handled the explicit "file" scheme, so a scheme-less local packages.json repository failed with "file could not be downloaded". Extend the local branch to empty schemes; the http(s) stub is unchanged. This clears the first blocker of the create-project functional test; its ignore reason now documents the remaining ones (live network and Glob::to_regex emitting PCRE lookaheads the regex crate cannot compile), which need a user decision. Co-Authored-By: Claude Fable 5 --- crates/shirabe/src/util/remote_filesystem.rs | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'crates/shirabe/src/util') diff --git a/crates/shirabe/src/util/remote_filesystem.rs b/crates/shirabe/src/util/remote_filesystem.rs index 9eaf8229..08e8581f 100644 --- a/crates/shirabe/src/util/remote_filesystem.rs +++ b/crates/shirabe/src/util/remote_filesystem.rs @@ -722,17 +722,21 @@ impl RemoteFilesystem { } let mut caught_e: Option = None; - let outer: Result, anyhow::Error> = if self.scheme == "file" { - Ok(match max_file_size { - Some(max) => file_get_contents5(file_url, false, PhpMixed::Null, 0, Some(max)), - None => file_get_contents(file_url), - }) - } else { - // TODO(phase-c): 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) - }; + // PHP has no scheme branch here: `file_get_contents` reads `file://` URLs and plain + // (scheme-less) local paths through the same stream wrapper it uses for the network + // schemes. Only the local subset is modeled so far. + let outer: Result, anyhow::Error> = + if self.scheme == "file" || self.scheme.is_empty() { + Ok(match max_file_size { + Some(max) => file_get_contents5(file_url, false, PhpMixed::Null, 0, Some(max)), + None => file_get_contents(file_url), + }) + } else { + // TODO(phase-c): 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) + }; match outer { Ok(v) => result = v, Err(e) => caught_e = Some(e), -- cgit v1.3.1