diff --git a/src/Composer/Command/SelfUpdateCommand.php b/src/Composer/Command/SelfUpdateCommand.php index 6ca01120c..1bf2e57d4 100644 --- a/src/Composer/Command/SelfUpdateCommand.php +++ b/src/Composer/Command/SelfUpdateCommand.php @@ -23,6 +23,7 @@ use Composer\SelfUpdate\Versions; use Composer\IO\IOInterface; use Composer\Downloader\FilesystemException; use Composer\Downloader\TransportException; +use Phar; use Symfony\Component\Console\Input\InputInterface; use Composer\Console\Input\InputOption; use Composer\Console\Input\InputArgument; @@ -116,9 +117,9 @@ EOT $cacheDir = $config->get('cache-dir'); $rollbackDir = $config->get('data-dir'); $home = $config->get('home'); - $localFilename = realpath($_SERVER['argv'][0]); - if (false === $localFilename) { - $localFilename = $_SERVER['argv'][0]; + $localFilename = Phar::running(false); + if ('' === $localFilename) { + throw new \RuntimeException('Could not determine the location of the composer.phar file as it appears you are not running this code from a phar archive.'); } if ($input->getOption('update-keys')) { diff --git a/tests/Composer/Test/AllFunctionalTest.php b/tests/Composer/Test/AllFunctionalTest.php index 1ef22001d..f0de9d7c3 100644 --- a/tests/Composer/Test/AllFunctionalTest.php +++ b/tests/Composer/Test/AllFunctionalTest.php @@ -96,6 +96,7 @@ class AllFunctionalTest extends TestCase self::assertFileExists(self::$pharPath); copy(self::$pharPath, __DIR__.'/../../composer-test.phar'); + chmod(__DIR__.'/../../composer-test.phar', 0777); } /** diff --git a/tests/Composer/Test/Command/SelfUpdateCommandTest.php b/tests/Composer/Test/Command/SelfUpdateCommandTest.php index d919dc9d6..3d2341c61 100644 --- a/tests/Composer/Test/Command/SelfUpdateCommandTest.php +++ b/tests/Composer/Test/Command/SelfUpdateCommandTest.php @@ -14,6 +14,7 @@ namespace Composer\Test\Command; use Composer\Composer; use Composer\Test\TestCase; +use Symfony\Component\Process\Process; /** * @group slow @@ -24,23 +25,15 @@ class SelfUpdateCommandTest extends TestCase /** * @var string */ - private $prevArgv; + private $phar; public function setUp(): void { parent::setUp(); - $this->prevArgv = $_SERVER['argv'][0]; $dir = $this->initTempComposer(); copy(__DIR__.'/../../../composer-test.phar', $dir.'/composer.phar'); - $_SERVER['argv'][0] = $dir.'/composer.phar'; - } - - public function tearDown(): void - { - parent::tearDown(); - - $_SERVER['argv'][0] = $this->prevArgv; + $this->phar = $dir.'/composer.phar'; } public function testSuccessfulUpdate(): void @@ -49,20 +42,20 @@ class SelfUpdateCommandTest extends TestCase $this->markTestSkipped('On releases this test can fail to upgrade as we are already on latest version'); } - $appTester = $this->getApplicationTester(); - $appTester->run(['command' => 'self-update']); + $appTester = new Process([PHP_BINARY, $this->phar, 'self-update']); + $status = $appTester->run(); + self::assertSame(0, $status, $appTester->getErrorOutput()); - $appTester->assertCommandIsSuccessful(); - self::assertStringContainsString('Upgrading to version', $appTester->getDisplay()); + self::assertStringContainsString('Upgrading to version', $appTester->getOutput()); } public function testUpdateToSpecificVersion(): void { - $appTester = $this->getApplicationTester(); - $appTester->run(['command' => 'self-update', 'version' => '2.4.0']); + $appTester = new Process([PHP_BINARY, $this->phar, 'self-update', '2.4.0']); + $status = $appTester->run(); + self::assertSame(0, $status, $appTester->getErrorOutput()); - $appTester->assertCommandIsSuccessful(); - self::assertStringContainsString('Upgrading to version 2.4.0', $appTester->getDisplay()); + self::assertStringContainsString('Upgrading to version 2.4.0', $appTester->getOutput()); } public function testUpdateWithInvalidOptionThrowsException(): void @@ -83,12 +76,12 @@ class SelfUpdateCommandTest extends TestCase $this->markTestSkipped('On releases this test can fail to upgrade as we are already on latest version'); } - $appTester = $this->getApplicationTester(); - $appTester->run(['command' => 'self-update', $option => true]); - $appTester->assertCommandIsSuccessful(); + $appTester = new Process([PHP_BINARY, $this->phar, 'self-update', $option]); + $status = $appTester->run(); + self::assertSame(0, $status, $appTester->getErrorOutput()); - self::assertStringContainsString('Upgrading to version', $appTester->getDisplay()); - self::assertStringContainsString($expectedOutput, $appTester->getDisplay()); + self::assertStringContainsString('Upgrading to version', $appTester->getOutput()); + self::assertStringContainsString($expectedOutput, $appTester->getOutput()); } /**