Skip to content

Commit

Permalink
Trim warnings and deprecations from output when invoking PHP in `PhpB…
Browse files Browse the repository at this point in the history
…inaryPath`
  • Loading branch information
alexandre-daubois committed Dec 20, 2024
1 parent 33f911a commit 7162e1b
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 16 deletions.
50 changes: 34 additions & 16 deletions src/Platform/TargetPhp/PhpBinaryPath.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
use function dirname;
use function explode;
use function file_exists;
use function implode;
use function is_dir;
use function is_executable;
use function preg_match;
Expand Down Expand Up @@ -58,7 +59,7 @@ private static function assertValidLookingPhpBinary(string $phpBinaryPath): void

// This is somewhat of a rudimentary check that the target PHP really is a PHP instance; not sure why you
// WOULDN'T want to use a real PHP, but this should stop obvious hiccups at least (rather than for security)
$testOutput = Process::run([$phpBinaryPath, '-r', 'echo "PHP";']);
$testOutput = self::cleanWarningAndDeprecationsFromOutput(Process::run([$phpBinaryPath, '-r', 'echo "PHP";']));

if ($testOutput !== 'PHP') {
throw Exception\InvalidPhpBinaryPath::fromInvalidPhpBinary($phpBinaryPath);
Expand Down Expand Up @@ -116,7 +117,7 @@ public function extensionPath(): string
*/
public function extensions(): array
{
$extVersionsList = Process::run([
$extVersionsList = self::cleanWarningAndDeprecationsFromOutput(Process::run([
$this->phpBinaryPath,
'-r',
<<<'PHP'
Expand All @@ -139,7 +140,7 @@ static function ($k, $v) {
$extVersions
));
PHP,
]);
]));

$pairs = array_map(
static fn (string $row) => explode(':', $row),
Expand All @@ -154,11 +155,11 @@ static function ($k, $v) {

public function operatingSystem(): OperatingSystem
{
$winOrNot = Process::run([
$winOrNot = self::cleanWarningAndDeprecationsFromOutput(Process::run([
$this->phpBinaryPath,
'-r',
'echo \\defined(\'PHP_WINDOWS_VERSION_BUILD\') ? \'win\' : \'not\';',
]);
]));
Assert::stringNotEmpty($winOrNot, 'Could not determine PHP version');

return $winOrNot === 'win' ? OperatingSystem::Windows : OperatingSystem::NonWindows;
Expand All @@ -167,11 +168,11 @@ public function operatingSystem(): OperatingSystem
/** @return non-empty-string */
public function version(): string
{
$phpVersion = Process::run([
$phpVersion = self::cleanWarningAndDeprecationsFromOutput(Process::run([
$this->phpBinaryPath,
'-r',
'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION . "." . PHP_RELEASE_VERSION;',
]);
]));
Assert::stringNotEmpty($phpVersion, 'Could not determine PHP version');

// normalizing the version will throw an exception if it is not a valid version
Expand All @@ -183,11 +184,11 @@ public function version(): string
/** @return non-empty-string */
public function majorMinorVersion(): string
{
$phpVersion = Process::run([
$phpVersion = self::cleanWarningAndDeprecationsFromOutput(Process::run([
$this->phpBinaryPath,
'-r',
'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;',
]);
]));
Assert::stringNotEmpty($phpVersion, 'Could not determine PHP version');

// normalizing the version will throw an exception if it is not a valid version
Expand All @@ -198,23 +199,23 @@ public function majorMinorVersion(): string

public function machineType(): Architecture
{
$phpMachineType = Process::run([
$phpMachineType = self::cleanWarningAndDeprecationsFromOutput(Process::run([
$this->phpBinaryPath,
'-r',
'echo php_uname("m");',
]);
]));
Assert::stringNotEmpty($phpMachineType, 'Could not determine PHP machine type');

return Architecture::parseArchitecture($phpMachineType);
}

public function phpIntSize(): int
{
$phpIntSize = Process::run([
$phpIntSize = self::cleanWarningAndDeprecationsFromOutput(Process::run([
$this->phpBinaryPath,
'-r',
'echo PHP_INT_SIZE;',
]);
]));
Assert::stringNotEmpty($phpIntSize, 'Could not fetch PHP_INT_SIZE');
Assert::same($phpIntSize, (string) (int) $phpIntSize, 'PHP_INT_SIZE was not an integer processed %2$s from %s');

Expand All @@ -224,10 +225,12 @@ public function phpIntSize(): int
/** @return non-empty-string */
public function phpinfo(): string
{
$phpInfo = Process::run([
$phpInfo = self::cleanWarningAndDeprecationsFromOutput(Process::run([
$this->phpBinaryPath,
'-i',
]);
]));

var_dump(json_encode($phpInfo));

Assert::stringNotEmpty($phpInfo, sprintf('Could not run phpinfo using %s', $this->phpBinaryPath));

Expand All @@ -248,7 +251,7 @@ public function phpConfigPath(): string|null
/** @param non-empty-string $phpConfig */
public static function fromPhpConfigExecutable(string $phpConfig): self
{
$phpExecutable = Process::run([$phpConfig, '--php-binary']);
$phpExecutable = self::cleanWarningAndDeprecationsFromOutput(Process::run([$phpConfig, '--php-binary']));
Assert::stringNotEmpty($phpExecutable, 'Could not find path to PHP executable.');

self::assertValidLookingPhpBinary($phpExecutable);
Expand All @@ -273,4 +276,19 @@ public static function fromCurrentProcess(): self

return new self($phpExecutable, null);
}

private static function cleanWarningAndDeprecationsFromOutput(string $testOutput): string
{
$testOutput = explode("\n", $testOutput);

foreach ($testOutput as $key => $line) {
if (! preg_match('/^(Deprecated|Warning):/', $line)) {
continue;
}

unset($testOutput[$key]);
}

return implode("\n", $testOutput);
}
}
5 changes: 5 additions & 0 deletions test/unit/Platform/TargetPhp/PhpBinaryPathTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,11 @@ public function testOperatingSystem(): void
);
}

public function testOperatingSystemWithInvalidConfiguration(): void
{
$this->fail();
}

public function testMajorMinorVersion(): void
{
self::assertSame(
Expand Down

0 comments on commit 7162e1b

Please sign in to comment.