Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 22 additions & 17 deletions src/Installing/Ini/RemoveIniEntryWithFileGetContents.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
use function file_exists;
use function file_get_contents;
use function in_array;
use function is_array;
use function is_dir;
use function preg_replace;
use function scandir;
use function sprintf;
Expand All @@ -38,25 +40,28 @@ public function __invoke(Package $package, TargetPlatform $targetPlatform, Outpu
}

$additionalIniDirectory = $targetPlatform->phpBinaryPath->additionalIniDirectory();
if ($additionalIniDirectory !== null) {
$allIniFiles = array_merge(
array_map(
static function (string $path) use ($additionalIniDirectory): string {
return $additionalIniDirectory . DIRECTORY_SEPARATOR . $path;
},
array_filter(
scandir($additionalIniDirectory),
static function (string $path) use ($additionalIniDirectory): bool {
if (in_array($path, ['.', '..'])) {
return false;
}

return file_exists($additionalIniDirectory . DIRECTORY_SEPARATOR . $path);
if ($additionalIniDirectory !== null && file_exists($additionalIniDirectory) && is_dir($additionalIniDirectory)) {
$filenames = scandir($additionalIniDirectory);
if (is_array($filenames)) {
$allIniFiles = array_merge(
array_map(
static function (string $path) use ($additionalIniDirectory): string {
return $additionalIniDirectory . DIRECTORY_SEPARATOR . $path;
},
array_filter(
$filenames,
static function (string $path) use ($additionalIniDirectory): bool {
if (in_array($path, ['.', '..'])) {
return false;
}

return file_exists($additionalIniDirectory . DIRECTORY_SEPARATOR . $path);
},
),
),
),
$allIniFiles,
);
$allIniFiles,
);
}
}

// Make sure all symlinks are resolved
Expand Down
40 changes: 40 additions & 0 deletions test/unit/Installing/Ini/RemoveIniEntryWithFileGetContentsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,46 @@ public function testRelevantIniFilesHaveExtensionRemoved(ExtensionType $extensio
);
}

#[DataProvider('extensionTypeProvider')]
public function testNonExistentAdditionalIniDirectoryDoesNotCrash(ExtensionType $extensionType): void
{
$phpBinaryPath = $this->createMock(PhpBinaryPath::class);
$phpBinaryPath
->method('loadedIniConfigurationFile')
->willReturn(null);
$phpBinaryPath
->method('additionalIniDirectory')
->willReturn('/this/path/should/not/exist/for/testing');

$package = new Package(
$this->createMock(CompletePackageInterface::class),
$extensionType,
ExtensionName::normaliseFromString('foobar'),
'foobar/foobar',
'1.2.3',
null,
);

$targetPlatform = new TargetPlatform(
OperatingSystem::NonWindows,
OperatingSystemFamily::Linux,
$phpBinaryPath,
Architecture::x86_64,
ThreadSafetyMode::ThreadSafe,
1,
null,
);

self::assertSame(
[],
(new RemoveIniEntryWithFileGetContents())(
$package,
$targetPlatform,
$this->createMock(OutputInterface::class),
),
);
}

#[RequiresOperatingSystemFamily('Linux')]
public function testSymlinkedIniFilesAreResolved(): void
{
Expand Down
Loading