diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-07-20 03:24:57 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-07-20 03:24:57 +0900 |
| commit | 96a8ff0513ae7b012b3e4ba8e43a3eca71847458 (patch) | |
| tree | f0512378e35aed815051dd2a47839c88a63a7e9c /crates | |
| parent | 3f4efd805d0a530e3f515720131c6fbce2c3d31c (diff) | |
| download | php-shirabe-96a8ff0513ae7b012b3e4ba8e43a3eca71847458.tar.gz php-shirabe-96a8ff0513ae7b012b3e4ba8e43a3eca71847458.tar.zst php-shirabe-96a8ff0513ae7b012b3e4ba8e43a3eca71847458.zip | |
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 <noreply@anthropic.com>
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/shirabe/src/util/remote_filesystem.rs | 26 | ||||
| -rw-r--r-- | crates/shirabe/tests/all_functional_test.rs | 11 |
2 files changed, 25 insertions, 12 deletions
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<anyhow::Error> = None; - let outer: Result<Option<String>, 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<Option<String>, 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), diff --git a/crates/shirabe/tests/all_functional_test.rs b/crates/shirabe/tests/all_functional_test.rs index e540ca15..5b473589 100644 --- a/crates/shirabe/tests/all_functional_test.rs +++ b/crates/shirabe/tests/all_functional_test.rs @@ -260,7 +260,16 @@ fn test_integration_create_project_command() { #[test] #[serial] -#[ignore = "RemoteFilesystem::get_remote_contents is an unimplemented Phase C stub (returns None), so reading the local packages.json repository via JsonFile/HttpDownloader fails with \"file could not be downloaded\""] +#[ignore = "the former blocker (scheme-less packages.json read via RemoteFilesystem::\ + get_remote_contents) is fixed and the EXPECT-REGEX assertion itself now passes, but \ + only incidentally: the run needs live network (real git clone from github.com) and \ + still panics with exit 101 (Composer exits 0) during CreateProjectCommand's keep-vcs \ + cleanup, whose Symfony Finder name patterns go through Glob::to_regex, which \ + faithfully emits PCRE lookaheads ((?=[^\\.])) the regex crate cannot compile; the \ + fixture just never asserts the exit code. Making Glob::to_regex regex-crate-compatible \ + would change the pattern text git_exclude_filter_test::test_pattern_escape asserts \ + verbatim, so both that rewrite and un-ignoring this green-but-crashing test need a \ + user decision"] fn test_integration_create_project_shows_full_hash_for_dev_packages() { run_integration("create-project-shows-full-hash-for-dev-packages.test"); } |
