Fix more issues, update baseline (2203/106)

main
Jordi Boggiano 2 years ago
parent 6a466a120a
commit beb575dd00
No known key found for this signature in database
GPG Key ID: 7BBD42C429EC80BC

@ -130,11 +130,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/EventDispatcher/EventDispatcher.php path: ../src/Composer/EventDispatcher/EventDispatcher.php
-
message: "#^Parameter \\#1 \\$string of function trim expects string, string\\|false given\\.$#"
count: 1
path: ../src/Composer/Factory.php
- -
message: "#^Parameter \\#1 \\$stream of function fwrite expects resource, resource\\|false given\\.$#" message: "#^Parameter \\#1 \\$stream of function fwrite expects resource, resource\\|false given\\.$#"
count: 1 count: 1
@ -215,31 +210,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Util/AuthHelper.php path: ../src/Composer/Util/AuthHelper.php
-
message: "#^Parameter \\#1 \\$from of function stream_copy_to_stream expects resource, resource\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#1 \\$stream of function fclose expects resource, resource\\|false given\\.$#"
count: 4
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#1 \\$stream of function feof expects resource, resource\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#1 \\$stream of function fread expects resource, resource\\|false given\\.$#"
count: 2
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#2 \\$to of function stream_copy_to_stream expects resource, resource\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
- -
message: "#^Parameter \\#1 \\$string of function rawurlencode expects string, string\\|null given\\.$#" message: "#^Parameter \\#1 \\$string of function rawurlencode expects string, string\\|null given\\.$#"
count: 15 count: 15

@ -1575,11 +1575,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Console/Application.php path: ../src/Composer/Console/Application.php
-
message: "#^Only booleans are allowed in a negated boolean, string given\\.$#"
count: 1
path: ../src/Composer/Console/Application.php
- -
message: "#^Only booleans are allowed in a negated boolean, string\\|false given\\.$#" message: "#^Only booleans are allowed in a negated boolean, string\\|false given\\.$#"
count: 2 count: 2
@ -1595,11 +1590,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Console/Application.php path: ../src/Composer/Console/Application.php
-
message: "#^Only booleans are allowed in an if condition, string given\\.$#"
count: 1
path: ../src/Composer/Console/Application.php
- -
message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#" message: "#^Only booleans are allowed in an if condition, string\\|null given\\.$#"
count: 2 count: 2
@ -2295,11 +2285,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Downloader/FileDownloader.php path: ../src/Composer/Downloader/FileDownloader.php
-
message: "#^Parameter \\#1 \\$url of function parse_url expects string, string\\|null given\\.$#"
count: 2
path: ../src/Composer/Downloader/FileDownloader.php
- -
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
count: 4 count: 4
@ -2395,11 +2380,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Downloader/GzipDownloader.php path: ../src/Composer/Downloader/GzipDownloader.php
-
message: "#^Parameter \\#1 \\$url of function parse_url expects string, string\\|null given\\.$#"
count: 1
path: ../src/Composer/Downloader/GzipDownloader.php
- -
message: "#^Parameter \\#1 \\$zp of function gzclose expects resource, resource\\|false given\\.$#" message: "#^Parameter \\#1 \\$zp of function gzclose expects resource, resource\\|false given\\.$#"
count: 1 count: 1
@ -3515,11 +3495,6 @@ parameters:
count: 10 count: 10
path: ../src/Composer/Package/Loader/ArrayLoader.php path: ../src/Composer/Package/Loader/ArrayLoader.php
-
message: "#^Instanceof between Composer\\\\Package\\\\CompletePackage and Composer\\\\Package\\\\CompletePackage will always evaluate to true\\.$#"
count: 1
path: ../src/Composer/Package/Loader/ArrayLoader.php
- -
message: "#^Instanceof between Composer\\\\Package\\\\CompletePackage and Composer\\\\Package\\\\CompletePackageInterface will always evaluate to true\\.$#" message: "#^Instanceof between Composer\\\\Package\\\\CompletePackage and Composer\\\\Package\\\\CompletePackageInterface will always evaluate to true\\.$#"
count: 1 count: 1
@ -3555,11 +3530,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Package/Loader/ArrayLoader.php path: ../src/Composer/Package/Loader/ArrayLoader.php
-
message: "#^Call to function is_string\\(\\) with string will always evaluate to true\\.$#"
count: 1
path: ../src/Composer/Package/Loader/JsonLoader.php
- -
message: "#^Parameter \\#1 \\$json of static method Composer\\\\Json\\\\JsonFile\\:\\:parseJson\\(\\) expects string\\|null, string\\|false given\\.$#" message: "#^Parameter \\#1 \\$json of static method Composer\\\\Json\\\\JsonFile\\:\\:parseJson\\(\\) expects string\\|null, string\\|false given\\.$#"
count: 1 count: 1
@ -4305,16 +4275,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Repository/FilesystemRepository.php path: ../src/Composer/Repository/FilesystemRepository.php
-
message: "#^Call to function is_array\\(\\) with array\\<string\\> will always evaluate to true\\.$#"
count: 2
path: ../src/Composer/Repository/FilterRepository.php
-
message: "#^Call to function is_bool\\(\\) with bool will always evaluate to true\\.$#"
count: 1
path: ../src/Composer/Repository/FilterRepository.php
- -
message: "#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#" message: "#^Only booleans are allowed in &&, string\\|null given on the left side\\.$#"
count: 1 count: 1
@ -4503,11 +4463,6 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Repository/RepositoryFactory.php path: ../src/Composer/Repository/RepositoryFactory.php
-
message: "#^Parameter \\#3 \\$name of method Composer\\\\Repository\\\\RepositoryManager\\:\\:createRepository\\(\\) expects string\\|null, int\\|string given\\.$#"
count: 1
path: ../src/Composer/Repository/RepositoryFactory.php
- -
message: "#^Only booleans are allowed in an if condition, Composer\\\\Package\\\\BasePackage\\|null given\\.$#" message: "#^Only booleans are allowed in an if condition, Composer\\\\Package\\\\BasePackage\\|null given\\.$#"
count: 1 count: 1
@ -4793,21 +4748,11 @@ parameters:
count: 3 count: 3
path: ../src/Composer/Repository/Vcs/GitLabDriver.php path: ../src/Composer/Repository/Vcs/GitLabDriver.php
-
message: "#^Parameter \\#1 \\$haystack of function strpos expects string, string\\|false given\\.$#"
count: 2
path: ../src/Composer/Repository/Vcs/GitLabDriver.php
- -
message: "#^Parameter \\#2 \\$str of function explode expects string, string\\|null given\\.$#" message: "#^Parameter \\#2 \\$str of function explode expects string, string\\|null given\\.$#"
count: 1 count: 1
path: ../src/Composer/Repository/Vcs/GitLabDriver.php path: ../src/Composer/Repository/Vcs/GitLabDriver.php
-
message: "#^Property Composer\\\\Repository\\\\Vcs\\\\VcsDriver\\:\\:\\$originUrl \\(string\\) does not accept string\\|false\\.$#"
count: 1
path: ../src/Composer/Repository/Vcs/GitLabDriver.php
- -
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#" message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
count: 2 count: 2
@ -5183,96 +5128,11 @@ parameters:
count: 1 count: 1
path: ../src/Composer/Util/ErrorHandler.php path: ../src/Composer/Util/ErrorHandler.php
-
message: "#^Cannot call method getPathname\\(\\) on SplFileInfo\\|string\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Cannot call method isDir\\(\\) on SplFileInfo\\|string\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
- -
message: "#^Casting to string something that's already string\\.$#" message: "#^Casting to string something that's already string\\.$#"
count: 2
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Method Composer\\\\Util\\\\Filesystem\\:\\:size\\(\\) should return int but returns int\\<0, max\\>\\|false\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Offset 'message' does not exist on array\\{type\\: int, message\\: string, file\\: string, line\\: int\\}\\|null\\.$#"
count: 2
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Only booleans are allowed in a negated boolean, Composer\\\\Util\\\\ProcessExecutor\\|null given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Only booleans are allowed in a negated boolean, int\\<0, max\\> given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Only booleans are allowed in a negated boolean, string\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Only booleans are allowed in a ternary operator condition, array\\<int\\|string, int\\>\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Only booleans are allowed in a ternary operator condition, int\\<0, max\\> given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Only numeric types are allowed in \\+, bool given on the right side\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#1 \\$fp of function fclose expects resource, resource\\|false given\\.$#"
count: 4 count: 4
path: ../src/Composer/Util/Filesystem.php path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#1 \\$fp of function feof expects resource, resource\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#1 \\$fp of function fread expects resource, resource\\|false given\\.$#"
count: 2
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#1 \\$source of function stream_copy_to_stream expects resource, resource\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Parameter \\#2 \\$dest of function stream_copy_to_stream expects resource, resource\\|false given\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
-
message: "#^Short ternary operator is not allowed\\. Use null coalesce operator if applicable or consider using long ternary\\.$#"
count: 1
path: ../src/Composer/Util/Filesystem.php
- -
message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#" message: "#^Call to function in_array\\(\\) requires parameter \\#3 to be set\\.$#"
count: 1 count: 1
@ -5385,7 +5245,7 @@ parameters:
- -
message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#" message: "#^Call to function is_resource\\(\\) with resource will always evaluate to true\\.$#"
count: 4 count: 3
path: ../src/Composer/Util/Http/CurlDownloader.php path: ../src/Composer/Util/Http/CurlDownloader.php
- -
@ -6283,11 +6143,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/AllFunctionalTest.php path: ../tests/Composer/Test/AllFunctionalTest.php
-
message: "#^Method Composer\\\\Test\\\\AllFunctionalTest\\:\\:getTestFiles\\(\\) should return array\\<string, array\\<string\\>\\> but returns array\\<string, array\\<int, string\\|false\\>\\>\\.$#"
count: 1
path: ../tests/Composer/Test/AllFunctionalTest.php
- -
message: "#^Only booleans are allowed in an if condition, string\\|false given\\.$#" message: "#^Only booleans are allowed in an if condition, string\\|false given\\.$#"
count: 1 count: 1
@ -6438,11 +6293,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/DependencyResolver/PoolBuilderTest.php path: ../tests/Composer/Test/DependencyResolver/PoolBuilderTest.php
-
message: "#^Parameter \\#1 \\$filename of function file_get_contents expects string, string\\|false given\\.$#"
count: 1
path: ../tests/Composer/Test/DependencyResolver/PoolBuilderTest.php
- -
message: "#^Parameter \\#2 \\$fixturesDir of method Composer\\\\Test\\\\DependencyResolver\\\\PoolBuilderTest\\:\\:readTestFile\\(\\) expects string, string\\|false given\\.$#" message: "#^Parameter \\#2 \\$fixturesDir of method Composer\\\\Test\\\\DependencyResolver\\\\PoolBuilderTest\\:\\:readTestFile\\(\\) expects string, string\\|false given\\.$#"
count: 1 count: 1
@ -6458,11 +6308,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/DependencyResolver/PoolBuilderTest.php path: ../tests/Composer/Test/DependencyResolver/PoolBuilderTest.php
-
message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, array\\|string given\\.$#"
count: 2
path: ../tests/Composer/Test/DependencyResolver/PoolBuilderTest.php
- -
message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
count: 1 count: 1
@ -6478,11 +6323,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php path: ../tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php
-
message: "#^Parameter \\#1 \\$filename of function file_get_contents expects string, string\\|false given\\.$#"
count: 1
path: ../tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php
- -
message: "#^Parameter \\#2 \\$fixturesDir of method Composer\\\\Test\\\\DependencyResolver\\\\PoolOptimizerTest\\:\\:readTestFile\\(\\) expects string, string\\|false given\\.$#" message: "#^Parameter \\#2 \\$fixturesDir of method Composer\\\\Test\\\\DependencyResolver\\\\PoolOptimizerTest\\:\\:readTestFile\\(\\) expects string, string\\|false given\\.$#"
count: 1 count: 1
@ -6493,11 +6333,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php path: ../tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php
-
message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, array\\|string given\\.$#"
count: 2
path: ../tests/Composer/Test/DependencyResolver/PoolOptimizerTest.php
- -
message: "#^Parameter \\#1 \\$packages of class Composer\\\\DependencyResolver\\\\Pool constructor expects array\\<Composer\\\\Package\\\\BasePackage\\>, array\\<Composer\\\\Package\\\\BasePackage\\>\\|null given\\.$#" message: "#^Parameter \\#1 \\$packages of class Composer\\\\DependencyResolver\\\\Pool constructor expects array\\<Composer\\\\Package\\\\BasePackage\\>, array\\<Composer\\\\Package\\\\BasePackage\\>\\|null given\\.$#"
count: 1 count: 1
@ -6696,11 +6531,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/InstallerTest.php path: ../tests/Composer/Test/InstallerTest.php
-
message: "#^Parameter \\#1 \\$filename of function file_get_contents expects string, string\\|false given\\.$#"
count: 1
path: ../tests/Composer/Test/InstallerTest.php
- -
message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false\\|null given\\.$#" message: "#^Parameter \\#1 \\$json of function json_decode expects string, string\\|false\\|null given\\.$#"
count: 1 count: 1
@ -6726,11 +6556,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/InstallerTest.php path: ../tests/Composer/Test/InstallerTest.php
-
message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, array\\|string given\\.$#"
count: 2
path: ../tests/Composer/Test/InstallerTest.php
- -
message: "#^Parameter \\#4 \\$composerFileContents of class Composer\\\\Package\\\\Locker constructor expects string, string\\|false given\\.$#" message: "#^Parameter \\#4 \\$composerFileContents of class Composer\\\\Package\\\\Locker constructor expects string, string\\|false given\\.$#"
count: 1 count: 1
@ -6791,11 +6616,6 @@ parameters:
count: 1 count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
-
message: "#^Offset 'return' on array\\{return\\: int, stdout\\?\\: string, stderr\\?\\: string\\} on left side of \\?\\? always exists and is not nullable\\.$#"
count: 1
path: ../tests/Composer/Test/Mock/ProcessExecutorMock.php
- -
message: "#^Offset 'stderr' does not exist on array\\{cmd\\: array\\<int, string\\>\\|string, return\\?\\: int, stdout\\?\\: string, stderr\\?\\: string, callback\\?\\: callable\\(\\)\\: mixed\\}\\.$#" message: "#^Offset 'stderr' does not exist on array\\{cmd\\: array\\<int, string\\>\\|string, return\\?\\: int, stdout\\?\\: string, stderr\\?\\: string, callback\\?\\: callable\\(\\)\\: mixed\\}\\.$#"
count: 1 count: 1

@ -17,6 +17,7 @@ parameters:
- '../tests/Composer/Test/PolyfillTestCase.php' - '../tests/Composer/Test/PolyfillTestCase.php'
reportUnmatchedIgnoredErrors: false reportUnmatchedIgnoredErrors: false
treatPhpDocTypesAsCertain: false
ignoreErrors: ignoreErrors:
# unused parameters # unused parameters

@ -744,11 +744,11 @@ EOF;
/** /**
* @param array<int, array{0: PackageInterface, 1: string}> $packageMap * @param array<int, array{0: PackageInterface, 1: string}> $packageMap
* @param bool $checkPlatform * @param bool|'php-only' $checkPlatform
* @param string[] $devPackageNames * @param string[] $devPackageNames
* @return ?string * @return ?string
*/ */
protected function getPlatformCheck(array $packageMap, bool $checkPlatform, array $devPackageNames) protected function getPlatformCheck(array $packageMap, $checkPlatform, array $devPackageNames)
{ {
$lowestPhpVersion = Bound::zero(); $lowestPhpVersion = Bound::zero();
$requiredExtensions = array(); $requiredExtensions = array();

@ -343,7 +343,7 @@ class FileDownloader implements DownloaderInterface, ChangeReportInterface
$this->filesystem->emptyDirectory($path); $this->filesystem->emptyDirectory($path);
$this->filesystem->ensureDirectoryExists($path); $this->filesystem->ensureDirectoryExists($path);
$this->filesystem->rename($this->getFileName($package, $path), $path . '/' . pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_BASENAME)); $this->filesystem->rename($this->getFileName($package, $path), $path . '/' . pathinfo(parse_url(strtr((string) $package->getDistUrl(), '\\', '/'), PHP_URL_PATH), PATHINFO_BASENAME));
if ($package->getBinaries()) { if ($package->getBinaries()) {
// Single files can not have a mode set like files in archives // Single files can not have a mode set like files in archives
@ -436,7 +436,7 @@ class FileDownloader implements DownloaderInterface, ChangeReportInterface
*/ */
protected function getFileName(PackageInterface $package, string $path): string protected function getFileName(PackageInterface $package, string $path): string
{ {
return rtrim($this->config->get('vendor-dir').'/composer/tmp-'.md5($package.spl_object_hash($package)).'.'.pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_EXTENSION), '.'); return rtrim($this->config->get('vendor-dir').'/composer/tmp-'.md5($package.spl_object_hash($package)).'.'.pathinfo(parse_url(strtr((string) $package->getDistUrl(), '\\', '/'), PHP_URL_PATH), PATHINFO_EXTENSION), '.');
} }
/** /**

@ -26,7 +26,7 @@ class GzipDownloader extends ArchiveDownloader
{ {
protected function extract(PackageInterface $package, string $file, string $path): PromiseInterface protected function extract(PackageInterface $package, string $file, string $path): PromiseInterface
{ {
$filename = pathinfo(parse_url($package->getDistUrl(), PHP_URL_PATH), PATHINFO_FILENAME); $filename = pathinfo(parse_url(strtr((string) $package->getDistUrl(), '\\', '/'), PHP_URL_PATH), PATHINFO_FILENAME);
$targetFilepath = $path . DIRECTORY_SEPARATOR . $filename; $targetFilepath = $path . DIRECTORY_SEPARATOR . $filename;
// Try to use gunzip on *nix // Try to use gunzip on *nix

@ -201,6 +201,8 @@ abstract class BaseIO implements IOInterface
public function log($level, $message, array $context = array()): void public function log($level, $message, array $context = array()): void
{ {
$message = (string) $message;
if (in_array($level, array(LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR))) { if (in_array($level, array(LogLevel::EMERGENCY, LogLevel::ALERT, LogLevel::CRITICAL, LogLevel::ERROR))) {
$this->writeError('<error>'.$message.'</error>'); $this->writeError('<error>'.$message.'</error>');
} elseif ($level === LogLevel::WARNING) { } elseif ($level === LogLevel::WARNING) {

@ -286,7 +286,7 @@ class ValidatingArrayLoader implements LoaderInterface
// check requires for exact constraints // check requires for exact constraints
($this->flags & self::CHECK_STRICT_CONSTRAINTS) ($this->flags & self::CHECK_STRICT_CONSTRAINTS)
&& 'require' === $linkType && 'require' === $linkType
&& $linkConstraint instanceof Constraint && $linkConstraint->getOperator() === Constraint::STR_OP_EQ && $linkConstraint instanceof Constraint && in_array($linkConstraint->getOperator(), ['==', '='], true)
&& (new Constraint('>=', '1.0.0.0-dev'))->matches($linkConstraint) && (new Constraint('>=', '1.0.0.0-dev'))->matches($linkConstraint)
) { ) {
$this->warnings[] = $linkType.'.'.$package.' : exact version constraints ('.$constraint.') should be avoided if the package follows semantic versioning'; $this->warnings[] = $linkType.'.'.$package.' : exact version constraints ('.$constraint.') should be avoided if the package follows semantic versioning';

@ -142,7 +142,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
$repoConfig['url'] = (extension_loaded('openssl') ? 'https' : 'http') . substr($repoConfig['url'], 6); $repoConfig['url'] = (extension_loaded('openssl') ? 'https' : 'http') . substr($repoConfig['url'], 6);
} }
$urlBits = parse_url($repoConfig['url']); $urlBits = parse_url(strtr($repoConfig['url'], '\\', '/'));
if ($urlBits === false || empty($urlBits['scheme'])) { if ($urlBits === false || empty($urlBits['scheme'])) {
throw new \UnexpectedValueException('Invalid url given for Composer repository: '.$repoConfig['url']); throw new \UnexpectedValueException('Invalid url given for Composer repository: '.$repoConfig['url']);
} }
@ -998,7 +998,7 @@ class ComposerRepository extends ArrayRepository implements ConfigurableReposito
*/ */
private function getPackagesJsonUrl(): string private function getPackagesJsonUrl(): string
{ {
$jsonUrlParts = parse_url($this->url); $jsonUrlParts = parse_url(strtr($this->url, '\\', '/'));
if (isset($jsonUrlParts['path']) && false !== strpos($jsonUrlParts['path'], '.json')) { if (isset($jsonUrlParts['path']) && false !== strpos($jsonUrlParts['path'], '.json')) {
return $this->url; return $this->url;

@ -291,7 +291,7 @@ class Filesystem
if (!$unlinked) { if (!$unlinked) {
$error = error_get_last(); $error = error_get_last();
$message = 'Could not delete '.$path.': ' . @$error['message']; $message = 'Could not delete '.$path.': ' . ($error['message'] ?? '');
if (Platform::isWindows()) { if (Platform::isWindows()) {
$message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed"; $message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed";
} }
@ -322,7 +322,7 @@ class Filesystem
if (!$deleted) { if (!$deleted) {
$error = error_get_last(); $error = error_get_last();
$message = 'Could not delete '.$path.': ' . @$error['message']; $message = 'Could not delete '.$path.': ' . ($error['message'] ?? '');
if (Platform::isWindows()) { if (Platform::isWindows()) {
$message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed"; $message .= "\nThis can be due to an antivirus or the Windows Search Indexer locking the file while they are analyzed";
} }
@ -375,7 +375,6 @@ class Filesystem
$this->ensureDirectoryExists($target); $this->ensureDirectoryExists($target);
$result = true; $result = true;
/** @var RecursiveDirectoryIterator $ri */
foreach ($ri as $file) { foreach ($ri as $file) {
$targetPath = $target . DIRECTORY_SEPARATOR . $ri->getSubPathname(); $targetPath = $target . DIRECTORY_SEPARATOR . $ri->getSubPathname();
if ($file->isDir()) { if ($file->isDir()) {
@ -451,8 +450,8 @@ class Filesystem
throw new \InvalidArgumentException(sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to)); throw new \InvalidArgumentException(sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to));
} }
$from = lcfirst($this->normalizePath($from)); $from = $this->normalizePath($from);
$to = lcfirst($this->normalizePath($to)); $to = $this->normalizePath($to);
if ($directories) { if ($directories) {
$from = rtrim($from, '/') . '/dummy_file'; $from = rtrim($from, '/') . '/dummy_file';
@ -463,7 +462,7 @@ class Filesystem
} }
$commonPath = $to; $commonPath = $to;
while (strpos($from.'/', $commonPath.'/') !== 0 && '/' !== $commonPath && !Preg::isMatch('{^[a-z]:/?$}i', $commonPath)) { while (strpos($from.'/', $commonPath.'/') !== 0 && '/' !== $commonPath && !Preg::isMatch('{^[A-Z]:/?$}i', $commonPath)) {
$commonPath = strtr(\dirname($commonPath), '\\', '/'); $commonPath = strtr(\dirname($commonPath), '\\', '/');
} }
@ -472,10 +471,15 @@ class Filesystem
} }
$commonPath = rtrim($commonPath, '/') . '/'; $commonPath = rtrim($commonPath, '/') . '/';
$sourcePathDepth = substr_count(substr($from, \strlen($commonPath)), '/'); $sourcePathDepth = substr_count((string) substr($from, \strlen($commonPath)), '/');
$commonPathCode = str_repeat('../', $sourcePathDepth); $commonPathCode = str_repeat('../', $sourcePathDepth);
return ($commonPathCode . substr($to, \strlen($commonPath))) ?: './'; $result = $commonPathCode . substr($to, \strlen($commonPath));
if (\strlen($result) === 0) {
return './';
}
return $result;
} }
/** /**
@ -494,15 +498,15 @@ class Filesystem
throw new \InvalidArgumentException(sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to)); throw new \InvalidArgumentException(sprintf('$from (%s) and $to (%s) must be absolute paths.', $from, $to));
} }
$from = lcfirst($this->normalizePath($from)); $from = $this->normalizePath($from);
$to = lcfirst($this->normalizePath($to)); $to = $this->normalizePath($to);
if ($from === $to) { if ($from === $to) {
return $directories ? '__DIR__' : '__FILE__'; return $directories ? '__DIR__' : '__FILE__';
} }
$commonPath = $to; $commonPath = $to;
while (strpos($from.'/', $commonPath.'/') !== 0 && '/' !== $commonPath && !Preg::isMatch('{^[a-z]:/?$}i', $commonPath) && '.' !== $commonPath) { while (strpos($from.'/', $commonPath.'/') !== 0 && '/' !== $commonPath && !Preg::isMatch('{^[A-Z]:/?$}i', $commonPath) && '.' !== $commonPath) {
$commonPath = strtr(\dirname($commonPath), '\\', '/'); $commonPath = strtr(\dirname($commonPath), '\\', '/');
} }
@ -512,17 +516,17 @@ class Filesystem
$commonPath = rtrim($commonPath, '/') . '/'; $commonPath = rtrim($commonPath, '/') . '/';
if (strpos($to, $from.'/') === 0) { if (strpos($to, $from.'/') === 0) {
return '__DIR__ . '.var_export(substr($to, \strlen($from)), true); return '__DIR__ . '.var_export((string) substr($to, \strlen($from)), true);
} }
$sourcePathDepth = substr_count(substr($from, \strlen($commonPath)), '/') + $directories; $sourcePathDepth = substr_count((string) substr($from, \strlen($commonPath)), '/') + (int) $directories;
if ($staticCode) { if ($staticCode) {
$commonPathCode = "__DIR__ . '".str_repeat('/..', $sourcePathDepth)."'"; $commonPathCode = "__DIR__ . '".str_repeat('/..', $sourcePathDepth)."'";
} else { } else {
$commonPathCode = str_repeat('dirname(', $sourcePathDepth).'__DIR__'.str_repeat(')', $sourcePathDepth); $commonPathCode = str_repeat('dirname(', $sourcePathDepth).'__DIR__'.str_repeat(')', $sourcePathDepth);
} }
$relTarget = substr($to, \strlen($commonPath)); $relTarget = (string) substr($to, \strlen($commonPath));
return $commonPathCode . (\strlen($relTarget) ? '.' . var_export('/' . $relTarget, true) : ''); return $commonPathCode . (\strlen($relTarget) > 0 ? '.' . var_export('/' . $relTarget, true) : '');
} }
/** /**
@ -553,7 +557,7 @@ class Filesystem
return $this->directorySize($path); return $this->directorySize($path);
} }
return filesize($path); return (int) filesize($path);
} }
/** /**
@ -589,16 +593,19 @@ class Filesystem
$up = false; $up = false;
foreach (explode('/', $path) as $chunk) { foreach (explode('/', $path) as $chunk) {
if ('..' === $chunk && ($absolute !== '' || $up)) { if ('..' === $chunk && (\strlen($absolute) > 0 || $up)) {
array_pop($parts); array_pop($parts);
$up = !(empty($parts) || '..' === end($parts)); $up = !(\count($parts) === 0 || '..' === end($parts));
} elseif ('.' !== $chunk && '' !== $chunk) { } elseif ('.' !== $chunk && '' !== $chunk) {
$parts[] = $chunk; $parts[] = $chunk;
$up = '..' !== $chunk; $up = '..' !== $chunk;
} }
} }
return $prefix.((string) $absolute).implode('/', $parts); // ensure c: is normalized to C:
$prefix = Preg::replaceCallback('{(^|://)[a-z]:$}i', function (array $m) { return strtoupper($m[0]); }, $prefix);
return $prefix.$absolute.implode('/', $parts);
} }
/** /**
@ -640,7 +647,7 @@ class Filesystem
$path = Preg::replace('{^(?:file:///([a-z]):?/)}i', 'file://$1:/', $path); $path = Preg::replace('{^(?:file:///([a-z]):?/)}i', 'file://$1:/', $path);
} }
return (string) Preg::replace('{^file://}i', '', $path); return Preg::replace('{^file://}i', '', $path);
} }
/** /**
@ -695,7 +702,7 @@ class Filesystem
*/ */
protected function getProcess() protected function getProcess()
{ {
if (!$this->processExecutor) { if (null === $this->processExecutor) {
$this->processExecutor = new ProcessExecutor(); $this->processExecutor = new ProcessExecutor();
} }
@ -789,7 +796,7 @@ class Filesystem
$resolved = rtrim($pathname, '/'); $resolved = rtrim($pathname, '/');
if (!\strlen($resolved)) { if (0 === \strlen($resolved)) {
return $pathname; return $pathname;
} }
@ -859,7 +866,7 @@ class Filesystem
$stat = lstat($junction); $stat = lstat($junction);
// S_ISDIR test (S_IFDIR is 0x4000, S_IFMT is 0xF000 bitmask) // S_ISDIR test (S_IFDIR is 0x4000, S_IFMT is 0xF000 bitmask)
return $stat ? 0x4000 !== ($stat['mode'] & 0xF000) : false; return is_array($stat) ? 0x4000 !== ($stat['mode'] & 0xF000) : false;
} }
/** /**
@ -889,8 +896,8 @@ class Filesystem
*/ */
public function filePutContentsIfModified(string $path, string $content) public function filePutContentsIfModified(string $path, string $content)
{ {
$currentContent = @file_get_contents($path); $currentContent = Silencer::call('file_get_contents', $path);
if (!$currentContent || ($currentContent != $content)) { if (false === $currentContent || $currentContent !== $content) {
return file_put_contents($path, $content); return file_put_contents($path, $content);
} }
@ -908,23 +915,20 @@ class Filesystem
public function safeCopy(string $source, string $target) public function safeCopy(string $source, string $target)
{ {
if (!file_exists($target) || !file_exists($source) || !$this->filesAreEqual($source, $target)) { if (!file_exists($target) || !file_exists($source) || !$this->filesAreEqual($source, $target)) {
$source = fopen($source, 'r'); $sourceHandle = fopen($source, 'r');
$target = fopen($target, 'w+'); assert($sourceHandle !== false, 'Could not open "'.$source.'" for reading.');
$targetHandle = fopen($target, 'w+');
assert($targetHandle !== false, 'Could not open "'.$target.'" for writing.');
stream_copy_to_stream($source, $target); stream_copy_to_stream($sourceHandle, $targetHandle);
fclose($source); fclose($sourceHandle);
fclose($target); fclose($targetHandle);
} }
} }
/** /**
* compare 2 files * compare 2 files
* https://stackoverflow.com/questions/3060125/can-i-use-file-get-contents-to-compare-two-files * https://stackoverflow.com/questions/3060125/can-i-use-file-get-contents-to-compare-two-files
*
* @param string $a
* @param string $b
*
* @return bool
*/ */
private function filesAreEqual(string $a, string $b): bool private function filesAreEqual(string $a, string $b): bool
{ {
@ -934,19 +938,21 @@ class Filesystem
} }
// Check if content is different // Check if content is different
$ah = fopen($a, 'rb'); $aHandle = fopen($a, 'rb');
$bh = fopen($b, 'rb'); assert($aHandle !== false, 'Could not open "'.$a.'" for reading.');
$bHandle = fopen($b, 'rb');
assert($bHandle !== false, 'Could not open "'.$b.'" for reading.');
$result = true; $result = true;
while (!feof($ah)) { while (!feof($aHandle)) {
if (fread($ah, 8192) != fread($bh, 8192)) { if (fread($aHandle, 8192) !== fread($bHandle, 8192)) {
$result = false; $result = false;
break; break;
} }
} }
fclose($ah); fclose($aHandle);
fclose($bh); fclose($bHandle);
return $result; return $result;
} }

@ -219,7 +219,7 @@ class RemoteFilesystem
*/ */
protected function get(string $originUrl, string $fileUrl, array $additionalOptions = array(), string $fileName = null, bool $progress = true) protected function get(string $originUrl, string $fileUrl, array $additionalOptions = array(), string $fileName = null, bool $progress = true)
{ {
$this->scheme = parse_url($fileUrl, PHP_URL_SCHEME); $this->scheme = parse_url(strtr($fileUrl, '\\', '/'), PHP_URL_SCHEME);
$this->bytesMax = 0; $this->bytesMax = 0;
$this->originUrl = $originUrl; $this->originUrl = $originUrl;
$this->fileUrl = $fileUrl; $this->fileUrl = $fileUrl;

@ -74,19 +74,19 @@ class FilesystemTest extends TestCase
array('/foo/bin/run', '/bar/bin/run', false, "'/bar/bin/run'"), array('/foo/bin/run', '/bar/bin/run', false, "'/bar/bin/run'"),
array('c:/bin/run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"), array('c:/bin/run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"),
array('c:\\bin\\run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"), array('c:\\bin\\run', 'c:/vendor/acme/bin/run', false, "dirname(__DIR__).'/vendor/acme/bin/run'"),
array('c:/bin/run', 'd:/vendor/acme/bin/run', false, "'d:/vendor/acme/bin/run'"), array('c:/bin/run', 'D:/vendor/acme/bin/run', false, "'D:/vendor/acme/bin/run'"),
array('c:\\bin\\run', 'd:/vendor/acme/bin/run', false, "'d:/vendor/acme/bin/run'"), array('c:\\bin\\run', 'd:/vendor/acme/bin/run', false, "'D:/vendor/acme/bin/run'"),
array('/foo/bar', '/foo/bar', true, "__DIR__"), array('/foo/bar', '/foo/bar', true, "__DIR__"),
array('/foo/bar/', '/foo/bar', true, "__DIR__"), array('/foo/bar/', '/foo/bar', true, "__DIR__"),
array('/foo/bar', '/foo/baz', true, "dirname(__DIR__).'/baz'"), array('/foo/bar', '/foo/baz', true, "dirname(__DIR__).'/baz'"),
array('/foo/bin/run', '/foo/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"), array('/foo/bin/run', '/foo/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"),
array('/foo/bin/run', '/bar/bin/run', true, "'/bar/bin/run'"), array('/foo/bin/run', '/bar/bin/run', true, "'/bar/bin/run'"),
array('/bin/run', '/bin/run', true, "__DIR__"), array('/bin/run', '/bin/run', true, "__DIR__"),
array('c:/bin/run', 'c:\\bin/run', true, "__DIR__"), array('c:/bin/run', 'C:\\bin/run', true, "__DIR__"),
array('c:/bin/run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"), array('c:/bin/run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"),
array('c:\\bin\\run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"), array('c:\\bin\\run', 'c:/vendor/acme/bin/run', true, "dirname(dirname(__DIR__)).'/vendor/acme/bin/run'"),
array('c:/bin/run', 'd:/vendor/acme/bin/run', true, "'d:/vendor/acme/bin/run'"), array('c:/bin/run', 'd:/vendor/acme/bin/run', true, "'D:/vendor/acme/bin/run'"),
array('c:\\bin\\run', 'd:/vendor/acme/bin/run', true, "'d:/vendor/acme/bin/run'"), array('c:\\bin\\run', 'd:/vendor/acme/bin/run', true, "'D:/vendor/acme/bin/run'"),
array('C:/Temp/test', 'C:\Temp', true, "dirname(__DIR__)"), array('C:/Temp/test', 'C:\Temp', true, "dirname(__DIR__)"),
array('C:/Temp', 'C:\Temp\test', true, "__DIR__ . '/test'"), array('C:/Temp', 'C:\Temp\test', true, "__DIR__ . '/test'"),
array('/tmp/test', '/tmp', true, "dirname(__DIR__)"), array('/tmp/test', '/tmp', true, "dirname(__DIR__)"),
@ -96,7 +96,7 @@ class FilesystemTest extends TestCase
array('/tmp/test/../vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"), array('/tmp/test/../vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"),
array('/tmp/test/.././vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"), array('/tmp/test/.././vendor', '/tmp/test', true, "dirname(__DIR__).'/test'"),
array('C:/Temp', 'c:\Temp\..\..\test', true, "dirname(__DIR__).'/test'"), array('C:/Temp', 'c:\Temp\..\..\test', true, "dirname(__DIR__).'/test'"),
array('C:/Temp/../..', 'd:\Temp\..\..\test', true, "'d:/test'"), array('C:/Temp/../..', 'd:\Temp\..\..\test', true, "'D:/test'"),
array('/foo/bar', '/foo/bar_vendor', true, "dirname(__DIR__).'/bar_vendor'"), array('/foo/bar', '/foo/bar_vendor', true, "dirname(__DIR__).'/bar_vendor'"),
array('/foo/bar_vendor', '/foo/bar', true, "dirname(__DIR__).'/bar'"), array('/foo/bar_vendor', '/foo/bar', true, "dirname(__DIR__).'/bar'"),
array('/foo/bar_vendor', '/foo/bar/src', true, "dirname(__DIR__).'/bar/src'"), array('/foo/bar_vendor', '/foo/bar/src', true, "dirname(__DIR__).'/bar/src'"),
@ -106,7 +106,7 @@ class FilesystemTest extends TestCase
array('/tmp/test/../vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true), array('/tmp/test/../vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true),
array('/tmp/test/.././vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true), array('/tmp/test/.././vendor', '/tmp/test', true, "__DIR__ . '/..'.'/test'", true),
array('C:/Temp', 'c:\Temp\..\..\test', true, "__DIR__ . '/..'.'/test'", true), array('C:/Temp', 'c:\Temp\..\..\test', true, "__DIR__ . '/..'.'/test'", true),
array('C:/Temp/../..', 'd:\Temp\..\..\test', true, "'d:/test'", true), array('C:/Temp/../..', 'd:\Temp\..\..\test', true, "'D:/test'", true),
array('/foo/bar', '/foo/bar_vendor', true, "__DIR__ . '/..'.'/bar_vendor'", true), array('/foo/bar', '/foo/bar_vendor', true, "__DIR__ . '/..'.'/bar_vendor'", true),
array('/foo/bar_vendor', '/foo/bar', true, "__DIR__ . '/..'.'/bar'", true), array('/foo/bar_vendor', '/foo/bar', true, "__DIR__ . '/..'.'/bar'", true),
array('/foo/bar_vendor', '/foo/bar/src', true, "__DIR__ . '/..'.'/bar/src'", true), array('/foo/bar_vendor', '/foo/bar/src', true, "__DIR__ . '/..'.'/bar/src'", true),
@ -141,11 +141,11 @@ class FilesystemTest extends TestCase
array('/foo/bin/run', '/foo/vendor/acme/bin/run', "../vendor/acme/bin/run"), array('/foo/bin/run', '/foo/vendor/acme/bin/run', "../vendor/acme/bin/run"),
array('/foo/bin/run', '/bar/bin/run', "/bar/bin/run"), array('/foo/bin/run', '/bar/bin/run', "/bar/bin/run"),
array('/foo/bin/run', '/bar/bin/run', "/bar/bin/run", true), array('/foo/bin/run', '/bar/bin/run', "/bar/bin/run", true),
array('c:/foo/bin/run', 'd:/bar/bin/run', "d:/bar/bin/run", true), array('c:/foo/bin/run', 'd:/bar/bin/run', "D:/bar/bin/run", true),
array('c:/bin/run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"), array('c:/bin/run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"),
array('c:\\bin\\run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"), array('c:\\bin\\run', 'c:/vendor/acme/bin/run', "../vendor/acme/bin/run"),
array('c:/bin/run', 'd:/vendor/acme/bin/run', "d:/vendor/acme/bin/run"), array('c:/bin/run', 'd:/vendor/acme/bin/run', "D:/vendor/acme/bin/run"),
array('c:\\bin\\run', 'd:/vendor/acme/bin/run', "d:/vendor/acme/bin/run"), array('c:\\bin\\run', 'd:/vendor/acme/bin/run', "D:/vendor/acme/bin/run"),
array('C:/Temp/test', 'C:\Temp', "./"), array('C:/Temp/test', 'C:\Temp', "./"),
array('/tmp/test', '/tmp', "./"), array('/tmp/test', '/tmp', "./"),
array('C:/Temp/test/sub', 'C:\Temp', "../"), array('C:/Temp/test/sub', 'C:\Temp', "../"),
@ -160,7 +160,7 @@ class FilesystemTest extends TestCase
array('/tmp/test/.././vendor', '/tmp/test', '../test', true), array('/tmp/test/.././vendor', '/tmp/test', '../test', true),
array('C:/Temp', 'c:\Temp\..\..\test', "../test", true), array('C:/Temp', 'c:\Temp\..\..\test', "../test", true),
array('C:/Temp/../..', 'c:\Temp\..\..\test', "./test", true), array('C:/Temp/../..', 'c:\Temp\..\..\test', "./test", true),
array('C:/Temp/../..', 'D:\Temp\..\..\test', "d:/test", true), array('C:/Temp/../..', 'D:\Temp\..\..\test', "D:/test", true),
array('/tmp', '/tmp/../../test', '/test', true), array('/tmp', '/tmp/../../test', '/test', true),
array('/foo/bar', '/foo/bar_vendor', '../bar_vendor', true), array('/foo/bar', '/foo/bar_vendor', '../bar_vendor', true),
array('/foo/bar_vendor', '/foo/bar', '../bar', true), array('/foo/bar_vendor', '/foo/bar', '../bar', true),
@ -217,24 +217,24 @@ class FilesystemTest extends TestCase
{ {
return array( return array(
array('../foo', '../foo'), array('../foo', '../foo'),
array('c:/foo/bar', 'c:/foo//bar'), array('C:/foo/bar', 'c:/foo//bar'),
array('C:/foo/bar', 'C:/foo/./bar'), array('C:/foo/bar', 'C:/foo/./bar'),
array('C:/foo/bar', 'C://foo//bar'), array('C:/foo/bar', 'C://foo//bar'),
array('C:/foo/bar', 'C:///foo//bar'), array('C:/foo/bar', 'C:///foo//bar'),
array('C:/bar', 'C:/foo/../bar'), array('C:/bar', 'C:/foo/../bar'),
array('/bar', '/foo/../bar/'), array('/bar', '/foo/../bar/'),
array('phar://c:/Foo', 'phar://c:/Foo/Bar/..'), array('phar://C:/Foo', 'phar://c:/Foo/Bar/..'),
array('phar://c:/Foo', 'phar://c:///Foo/Bar/..'), array('phar://C:/Foo', 'phar://c:///Foo/Bar/..'),
array('phar://c:/', 'phar://c:/Foo/Bar/../../../..'), array('phar://C:/', 'phar://c:/Foo/Bar/../../../..'),
array('/', '/Foo/Bar/../../../..'), array('/', '/Foo/Bar/../../../..'),
array('/', '/'), array('/', '/'),
array('/', '//'), array('/', '//'),
array('/', '///'), array('/', '///'),
array('/Foo', '///Foo'), array('/Foo', '///Foo'),
array('c:/', 'c:\\'), array('C:/', 'c:\\'),
array('../src', 'Foo/Bar/../../../src'), array('../src', 'Foo/Bar/../../../src'),
array('c:../b', 'c:.\\..\\a\\..\\b'), array('C:../b', 'c:.\\..\\a\\..\\b'),
array('phar://c:../Foo', 'phar://c:../Foo'), array('phar://C:../Foo', 'phar://c:../Foo'),
array('//foo/bar', '\\\\foo\\bar'), array('//foo/bar', '\\\\foo\\bar'),
); );
} }

Loading…
Cancel
Save