diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8f525a97f..7f161bd79 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -41,7 +41,7 @@ To achieve this, you need to acquire the Composer source code: 2. Download the [`composer.phar`](https://getcomposer.org/composer.phar) executable 3. Run Composer to get the dependencies: `cd composer && php ../composer.phar install` -You can run the test suite by executing `vendor/bin/phpunit` when inside the +You can run the test suite by executing `vendor/bin/simple-phpunit` when inside the composer directory, and run Composer by executing the `bin/composer`. To test your modified Composer code against another project, run `php /path/to/composer/bin/composer` inside that project's directory. diff --git a/composer.json b/composer.json index 45a28aba7..7705678ac 100644 --- a/composer.json +++ b/composer.json @@ -32,14 +32,14 @@ "psr/log": "^1.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", - "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", "react/promise": "^1.2 || ^2.7" }, "require-dev": { - "symfony/phpunit-bridge": "^4.2 || ^5.0", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0", "phpspec/prophecy": "^1.10" }, "suggest": { diff --git a/composer.lock b/composer.lock index 447827707..b17aa8895 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9ca39897cc82c83aa794920b6c2f0a60", + "content-hash": "bff3f5b355e45125612dff36a8f71737", "packages": [ { "name": "composer/ca-bundle", diff --git a/res/composer-schema.json b/res/composer-schema.json index 7aa8fbd1a..c5e3376ee 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -1,6 +1,6 @@ { "$schema": "https://json-schema.org/draft-04/schema#", - "name": "Package", + "title": "Package", "type": "object", "additionalProperties": false, "required": [ "name", "description" ], @@ -42,7 +42,7 @@ "version": { "type": "string", "description": "Package version, see https://getcomposer.org/doc/04-schema.md#version for more info on valid schemes.", - "pattern": "^v?\\d+(((\\.\\d+)?\\.\\d+)?\\.\\d+)?|^dev-" + "pattern": "^v?\\d+(\\.\\d+){0,3}|^dev-" }, "time": { "type": "string", @@ -397,7 +397,7 @@ "minimum-stability": { "type": ["string"], "description": "The minimum stability the packages must have to be install-able. Possible values are: dev, alpha, beta, RC, stable.", - "pattern": "^dev|alpha|beta|rc|RC|stable$" + "enum": ["dev", "alpha", "beta", "rc", "RC", "stable"] }, "prefer-stable": { "type": ["boolean"], diff --git a/src/Composer/Installer/BinaryInstaller.php b/src/Composer/Installer/BinaryInstaller.php index 4ce134b94..afb1608dc 100644 --- a/src/Composer/Installer/BinaryInstaller.php +++ b/src/Composer/Installer/BinaryInstaller.php @@ -53,6 +53,9 @@ class BinaryInstaller if (!$binaries) { return; } + + Platform::workaroundFilesystemIssues(); + foreach ($binaries as $bin) { $binPath = $installPath.'/'.$bin; if (!file_exists($binPath)) { diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php index 5ba2e57eb..1922e6c1b 100644 --- a/src/Composer/Util/ProcessExecutor.php +++ b/src/Composer/Util/ProcessExecutor.php @@ -251,16 +251,32 @@ class ProcessExecutor throw new \RuntimeException('The given CWD for the process does not exist: '.$cwd); } - // TODO in v3, commands should be passed in as arrays of cmd + args - if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) { - $process = Process::fromShellCommandline($command, $cwd, null, null, static::getTimeout()); - } else { - $process = new Process($command, $cwd, null, null, static::getTimeout()); + try { + // TODO in v3, commands should be passed in as arrays of cmd + args + if (method_exists('Symfony\Component\Process\Process', 'fromShellCommandline')) { + $process = Process::fromShellCommandline($command, $cwd, null, null, static::getTimeout()); + } else { + $process = new Process($command, $cwd, null, null, static::getTimeout()); + } + } catch (\Exception $e) { + call_user_func($job['reject'], $e); + return; + } catch (\Throwable $e) { + call_user_func($job['reject'], $e); + return; } $job['process'] = $process; - $process->start(); + try { + $process->start(); + } catch (\Exception $e) { + call_user_func($job['reject'], $e); + return; + } catch (\Throwable $e) { + call_user_func($job['reject'], $e); + return; + } } public function wait($index = null) diff --git a/tests/Composer/Test/Json/ComposerSchemaTest.php b/tests/Composer/Test/Json/ComposerSchemaTest.php index 687c1137a..0eece664c 100644 --- a/tests/Composer/Test/Json/ComposerSchemaTest.php +++ b/tests/Composer/Test/Json/ComposerSchemaTest.php @@ -71,25 +71,23 @@ class ComposerSchemaTest extends TestCase public function testMinimumStabilityValues() { - $json = '{ "name": "vendor/package", "description": "generic description", "minimum-stability": "" }'; - $this->assertEquals(array( + $expectedError = array( array( 'property' => 'minimum-stability', - 'message' => 'Does not match the regex pattern ^dev|alpha|beta|rc|RC|stable$', - 'constraint' => 'pattern', - 'pattern' => '^dev|alpha|beta|rc|RC|stable$', + 'message' => 'Does not have a value in the enumeration ["dev","alpha","beta","rc","RC","stable"]', + 'constraint' => 'enum', + 'enum' => array('dev', 'alpha', 'beta', 'rc', 'RC', 'stable'), ), - ), $this->check($json), 'empty string'); + ); + + $json = '{ "name": "vendor/package", "description": "generic description", "minimum-stability": "" }'; + $this->assertEquals($expectedError, $this->check($json), 'empty string'); $json = '{ "name": "vendor/package", "description": "generic description", "minimum-stability": "dummy" }'; - $this->assertEquals(array( - array( - 'property' => 'minimum-stability', - 'message' => 'Does not match the regex pattern ^dev|alpha|beta|rc|RC|stable$', - 'constraint' => 'pattern', - 'pattern' => '^dev|alpha|beta|rc|RC|stable$', - ), - ), $this->check($json), 'dummy'); + $this->assertEquals($expectedError, $this->check($json), 'dummy'); + + $json = '{ "name": "vendor/package", "description": "generic description", "minimum-stability": "devz" }'; + $this->assertEquals($expectedError, $this->check($json), 'devz'); $json = '{ "name": "vendor/package", "description": "generic description", "minimum-stability": "dev" }'; $this->assertTrue($this->check($json), 'dev');