From 3c7b775b3e8134dbe3753c6983df02659fb5d770 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Fri, 6 Dec 2019 11:06:46 +0100 Subject: [PATCH] [Process] change the syntax of portable prepared command lines --- src/Symfony/Component/Process/Process.php | 6 +++--- .../Component/Process/Tests/ProcessTest.php | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php index b71d4dadb5f3f..d1775b797f2b8 100644 --- a/src/Symfony/Component/Process/Process.php +++ b/src/Symfony/Component/Process/Process.php @@ -1643,12 +1643,12 @@ private function escapeArgument(?string $argument): string private function replacePlaceholders(string $commandline, array $env) { - return preg_replace_callback('/"\$([_a-zA-Z]++[_a-zA-Z0-9]*+)"/', function ($matches) use ($commandline, $env) { + return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) { if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) { - throw new InvalidArgumentException(sprintf('Command line is missing a value for key %s: %s.', $matches[0], $commandline)); + throw new InvalidArgumentException(sprintf('Command line is missing a value for parameter "%s": %s.', $matches[1], $commandline)); } - return '\\' === \DIRECTORY_SEPARATOR ? $this->escapeArgument($env[$matches[1]]) : $matches[0]; + return $this->escapeArgument($env[$matches[1]]); }, $commandline); } diff --git a/src/Symfony/Component/Process/Tests/ProcessTest.php b/src/Symfony/Component/Process/Tests/ProcessTest.php index b29e1ec1e9a69..b2138d6864ce4 100644 --- a/src/Symfony/Component/Process/Tests/ProcessTest.php +++ b/src/Symfony/Component/Process/Tests/ProcessTest.php @@ -1463,7 +1463,7 @@ public function provideEscapeArgument() public function testPreparedCommand() { - $p = Process::fromShellCommandline('echo "$abc"DEF'); + $p = Process::fromShellCommandline('echo "${:abc}"DEF'); $p->run(null, ['abc' => 'ABC']); $this->assertSame('ABCDEF', rtrim($p->getOutput())); @@ -1471,7 +1471,7 @@ public function testPreparedCommand() public function testPreparedCommandMulti() { - $p = Process::fromShellCommandline('echo "$abc""$def"'); + $p = Process::fromShellCommandline('echo "${:abc}""${:def}"'); $p->run(null, ['abc' => 'ABC', 'def' => 'DEF']); $this->assertSame('ABCDEF', rtrim($p->getOutput())); @@ -1479,7 +1479,7 @@ public function testPreparedCommandMulti() public function testPreparedCommandWithQuoteInIt() { - $p = Process::fromShellCommandline('php -r "$code" "$def"'); + $p = Process::fromShellCommandline('php -r "${:code}" "${:def}"'); $p->run(null, ['code' => 'echo $argv[1];', 'def' => '"DEF"']); $this->assertSame('"DEF"', rtrim($p->getOutput())); @@ -1488,16 +1488,16 @@ public function testPreparedCommandWithQuoteInIt() public function testPreparedCommandWithMissingValue() { $this->expectException('Symfony\Component\Process\Exception\InvalidArgumentException'); - $this->expectExceptionMessage('Command line is missing a value for key "$abc": echo "$abc".'); - $p = Process::fromShellCommandline('echo "$abc"'); + $this->expectExceptionMessage('Command line is missing a value for parameter "abc": echo "${:abc}".'); + $p = Process::fromShellCommandline('echo "${:abc}"'); $p->run(null, ['bcd' => 'BCD']); } public function testPreparedCommandWithNoValues() { $this->expectException('Symfony\Component\Process\Exception\InvalidArgumentException'); - $this->expectExceptionMessage('Command line is missing a value for key "$abc": echo "$abc".'); - $p = Process::fromShellCommandline('echo "$abc"'); + $this->expectExceptionMessage('Command line is missing a value for parameter "abc": echo "${:abc}".'); + $p = Process::fromShellCommandline('echo "${:abc}"'); $p->run(null, []); }