diff --git a/.travis.yml b/.travis.yml
index 2460a200c..3b1e2c4f4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -37,7 +37,7 @@ matrix:
- php: 7.4snapshot
before_install:
- # disable xdebug if available
+ # disable Xdebug if available
- phpenv config-rm xdebug.ini || echo "xdebug not available"
# disable default memory limit
- export INI=~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ade8d99cd..1daf5f097 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -252,7 +252,7 @@
* Fixed output inconsistencies
* Fixed unicode handling in `init` command for author names
* Fixed useless warning when doing partial updates/removes on packages that are not currently installed
- * Fixed xdebug disabling issue when combined with disable_functions and allow_url_fopen CLI overrides
+ * Fixed Xdebug disabling issue when combined with disable_functions and allow_url_fopen CLI overrides
### [1.4.1] - 2017-03-10
@@ -313,7 +313,7 @@
* Added `gitlab-token` auth config for GitLab private tokens
* Added `--strict` to the `outdated` command to return a non-zero exit code when there are outdated packages
* Added ability to call php scripts using the current php interpreter (instead of finding php in PATH by default) in script handlers via `@php ...`
- * Added `COMPOSER_ALLOW_XDEBUG` env var to circumvent the xdebug-disabling behavior
+ * Added `COMPOSER_ALLOW_XDEBUG` env var to circumvent the Xdebug-disabling behavior
* Added `COMPOSER_MIRROR_PATH_REPOS` env var to force mirroring of path repositories vs symlinking
* Added `COMPOSER_DEV_MODE` env var that is set by Composer to forward the dev mode to script handlers
* Fixed support for git 2.11
diff --git a/bin/composer b/bin/composer
index 3585787f2..b7ab5318b 100755
--- a/bin/composer
+++ b/bin/composer
@@ -13,7 +13,7 @@ use Composer\XdebugHandler\XdebugHandler;
error_reporting(-1);
-// Restart without xdebug
+// Restart without Xdebug
$xdebug = new XdebugHandler('Composer', '--ansi');
$xdebug->check();
unset($xdebug);
diff --git a/composer.json b/composer.json
index 725f211e1..d1f98a56a 100644
--- a/composer.json
+++ b/composer.json
@@ -31,10 +31,10 @@
"psr/log": "^1.0",
"seld/jsonlint": "^1.4",
"seld/phar-utils": "^1.0",
- "symfony/console": "^2.7 || ^3.0 || ^4.0",
- "symfony/filesystem": "^2.7 || ^3.0 || ^4.0",
- "symfony/finder": "^2.7 || ^3.0 || ^4.0",
- "symfony/process": "^2.7 || ^3.0 || ^4.0",
+ "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+ "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+ "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+ "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0",
"react/promise": "^1.2 || ^2.7"
},
"conflict": {
diff --git a/composer.lock b/composer.lock
index 6951fc994..dec364ac4 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": "280f5d5184039085b5f22236d267ae82",
+ "content-hash": "7fb7edae7611d2e07d946d75b9cf2c63",
"packages": [
{
"name": "composer/ca-bundle",
@@ -45,21 +45,7 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- }
- ],
"description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
- "keywords": [
- "cabundle",
- "cacert",
- "certificate",
- "ssl",
- "tls"
- ],
"time": "2019-08-30T08:44:50+00:00"
},
{
@@ -98,30 +84,7 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
"description": "Semver library that offers utilities, version constraint parsing and validation.",
- "keywords": [
- "semantic",
- "semver",
- "validation",
- "versioning"
- ],
"time": "2019-03-19T17:25:45+00:00"
},
{
@@ -159,51 +122,29 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
"description": "SPDX licenses list and validation library.",
- "keywords": [
- "license",
- "spdx",
- "validator"
- ],
"time": "2019-07-29T10:31:59+00:00"
},
{
"name": "composer/xdebug-handler",
- "version": "1.3.3",
+ "version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/composer/xdebug-handler.git",
- "reference": "46867cbf8ca9fb8d60c506895449eb799db1184f"
+ "reference": "cbe23383749496fe0f373345208b79568e4bc248"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/46867cbf8ca9fb8d60c506895449eb799db1184f",
- "reference": "46867cbf8ca9fb8d60c506895449eb799db1184f",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/cbe23383749496fe0f373345208b79568e4bc248",
+ "reference": "cbe23383749496fe0f373345208b79568e4bc248",
"shasum": ""
},
"require": {
- "php": "^5.3.2 || ^7.0",
+ "php": "^5.3.2 || ^7.0 || ^8.0",
"psr/log": "^1.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
},
"type": "library",
"autoload": {
@@ -221,32 +162,37 @@
"email": "john-stevenson@blueyonder.co.uk"
}
],
- "description": "Restarts a process without xdebug.",
+ "description": "Restarts a process without Xdebug.",
"keywords": [
"Xdebug",
"performance"
],
- "time": "2019-05-27T17:52:04+00:00"
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/1.4.0"
+ },
+ "time": "2019-11-06T16:40:04+00:00"
},
{
"name": "justinrainbow/json-schema",
- "version": "5.2.8",
+ "version": "5.2.9",
"source": {
"type": "git",
"url": "https://github.com/justinrainbow/json-schema.git",
- "reference": "dcb6e1006bb5fd1e392b4daa68932880f37550d4"
+ "reference": "44c6787311242a979fa15c704327c20e7221a0e4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/dcb6e1006bb5fd1e392b4daa68932880f37550d4",
- "reference": "dcb6e1006bb5fd1e392b4daa68932880f37550d4",
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4",
+ "reference": "44c6787311242a979fa15c704327c20e7221a0e4",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "~2.2.20",
+ "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
"json-schema/json-schema-test-suite": "1.2.0",
"phpunit/phpunit": "^4.8.35"
},
@@ -292,20 +238,24 @@
"json",
"schema"
],
- "time": "2019-01-14T23:55:14+00:00"
+ "support": {
+ "issues": "https://github.com/justinrainbow/json-schema/issues",
+ "source": "https://github.com/justinrainbow/json-schema/tree/5.2.9"
+ },
+ "time": "2019-09-25T14:49:45+00:00"
},
{
"name": "psr/log",
- "version": "1.1.0",
+ "version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
- "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
- "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
+ "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
"shasum": ""
},
"require": {
@@ -314,7 +264,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -339,7 +289,10 @@
"psr",
"psr-3"
],
- "time": "2018-11-20T15:27:04+00:00"
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/1.1.2"
+ },
+ "time": "2019-11-01T11:05:21+00:00"
},
{
"name": "react/promise",
@@ -376,27 +329,21 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com"
- }
- ],
"description": "A lightweight implementation of CommonJS Promises/A for PHP",
"time": "2016-03-07T13:46:50+00:00"
},
{
"name": "seld/jsonlint",
- "version": "1.7.1",
+ "version": "1.7.2",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/jsonlint.git",
- "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38"
+ "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/d15f59a67ff805a44c50ea0516d2341740f81a38",
- "reference": "d15f59a67ff805a44c50ea0516d2341740f81a38",
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19",
+ "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19",
"shasum": ""
},
"require": {
@@ -432,7 +379,11 @@
"parser",
"validator"
],
- "time": "2018-01-24T12:46:19+00:00"
+ "support": {
+ "issues": "https://github.com/Seldaek/jsonlint/issues",
+ "source": "https://github.com/Seldaek/jsonlint/tree/1.7.2"
+ },
+ "time": "2019-10-24T14:27:39+00:00"
},
{
"name": "seld/phar-utils",
@@ -466,21 +417,12 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be"
- }
- ],
"description": "PHAR file format utilities, for when PHP phars you up",
- "keywords": [
- "phra"
- ],
"time": "2015-10-13T18:44:15+00:00"
},
{
"name": "symfony/console",
- "version": "v2.8.50",
+ "version": "v2.8.52",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
@@ -537,6 +479,9 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v2.8.52"
+ },
"time": "2018-11-20T15:55:20+00:00"
},
{
@@ -594,11 +539,14 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/debug/tree/v2.8.50"
+ },
"time": "2018-11-11T11:18:13+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v2.8.50",
+ "version": "v2.8.52",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
@@ -644,11 +592,14 @@
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v2.8.52"
+ },
"time": "2018-11-11T11:18:13+00:00"
},
{
"name": "symfony/finder",
- "version": "v2.8.50",
+ "version": "v2.8.52",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
@@ -693,6 +644,9 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v2.8.50"
+ },
"time": "2018-11-11T11:18:13+00:00"
},
{
@@ -733,24 +687,8 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
"description": "Symfony polyfill for ctype functions",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
"time": "2019-08-06T08:03:45+00:00"
},
{
@@ -791,30 +729,13 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
"description": "Symfony polyfill for the Mbstring extension",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
"time": "2019-08-06T08:03:45+00:00"
},
{
"name": "symfony/process",
- "version": "v2.8.50",
+ "version": "v2.8.52",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
@@ -859,6 +780,9 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v2.8.50"
+ },
"time": "2018-11-11T11:18:13+00:00"
}
],
@@ -915,6 +839,10 @@
"constructor",
"instantiate"
],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/master"
+ },
"time": "2015-06-14T21:17:01+00:00"
},
{
@@ -958,12 +886,6 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Mike van Riel",
- "email": "mike.vanriel@naenius.com"
- }
- ],
"time": "2016-01-25T08:17:30+00:00"
},
{
@@ -1006,27 +928,8 @@
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
- },
- {
- "name": "Marcello Duarte",
- "email": "marcello.duarte@gmail.com"
- }
- ],
"description": "Highly opinionated mocking framework for PHP 5.3+",
"homepage": "https://github.com/phpspec/prophecy",
- "keywords": [
- "Double",
- "Dummy",
- "fake",
- "mock",
- "spy",
- "stub"
- ],
"time": "2019-10-03T11:07:50+00:00"
},
{
@@ -1089,6 +992,11 @@
"testing",
"xunit"
],
+ "support": {
+ "irc": "irc://irc.freenode.net/phpunit",
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/2.2"
+ },
"time": "2015-10-06T15:47:00+00:00"
},
{
@@ -1123,19 +1031,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
- }
- ],
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
- "keywords": [
- "filesystem",
- "iterator"
- ],
"time": "2017-11-27T13:52:08+00:00"
},
{
@@ -1165,18 +1062,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
"description": "Simple template engine.",
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
- "keywords": [
- "template"
- ],
"time": "2015-06-21T13:50:34+00:00"
},
{
@@ -1214,18 +1101,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
- }
- ],
"description": "Utility class for timing",
"homepage": "https://github.com/sebastianbergmann/php-timer/",
- "keywords": [
- "timer"
- ],
"time": "2017-02-26T11:10:40+00:00"
},
{
@@ -1264,17 +1141,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
"description": "Wrapper around PHP's tokenizer extension.",
"homepage": "https://github.com/sebastianbergmann/php-token-stream/",
- "keywords": [
- "tokenizer"
- ],
"time": "2017-12-04T08:55:13+00:00"
},
{
@@ -1347,6 +1215,10 @@
"testing",
"xunit"
],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/4.8.36"
+ },
"time": "2017-06-21T08:07:12+00:00"
},
{
@@ -1390,19 +1262,9 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
- "role": "lead"
- }
- ],
"description": "Mock Object library for PHPUnit",
"homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
- "keywords": [
- "mock",
- "xunit"
- ],
+ "abandoned": true,
"time": "2015-10-02T06:51:40+00:00"
},
{
@@ -1442,31 +1304,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Volker Dusch",
- "email": "github@wallbash.com"
- },
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
"description": "Provides the functionality to compare PHP values for equality",
"homepage": "http://www.github.com/sebastianbergmann/comparator",
- "keywords": [
- "comparator",
- "compare",
- "equality"
- ],
"time": "2017-01-29T09:50:25+00:00"
},
{
@@ -1504,21 +1343,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
- "keywords": [
- "diff"
- ],
"time": "2017-05-22T07:24:03+00:00"
},
{
@@ -1569,6 +1395,10 @@
"environment",
"hhvm"
],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/1.3"
+ },
"time": "2016-08-18T05:49:44+00:00"
},
{
@@ -1608,34 +1438,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Volker Dusch",
- "email": "github@wallbash.com"
- },
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
- }
- ],
"description": "Provides the functionality to export PHP variables for visualization",
"homepage": "http://www.github.com/sebastianbergmann/exporter",
- "keywords": [
- "export",
- "exporter"
- ],
"time": "2016-06-17T09:04:28+00:00"
},
{
@@ -1676,17 +1480,8 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
"description": "Snapshotting of global state",
"homepage": "http://www.github.com/sebastianbergmann/global-state",
- "keywords": [
- "global state"
- ],
"time": "2015-10-12T03:26:01+00:00"
},
{
@@ -1724,20 +1519,6 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
- }
- ],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
"time": "2016-10-03T07:41:43+00:00"
@@ -1766,20 +1547,13 @@
"license": [
"BSD-3-Clause"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
"time": "2015-06-21T13:59:46+00:00"
},
{
"name": "symfony/yaml",
- "version": "v2.8.50",
+ "version": "v2.8.52",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
@@ -1825,6 +1599,9 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v2.8.52"
+ },
"time": "2018-11-11T11:18:13+00:00"
}
],
diff --git a/doc/03-cli.md b/doc/03-cli.md
index 08beb716b..b2c4bc7b5 100644
--- a/doc/03-cli.md
+++ b/doc/03-cli.md
@@ -808,6 +808,10 @@ If set to 1, this env disables the warning about running commands as root/super
It also disables automatic clearing of sudo sessions, so you should really only set this
if you use Composer as super user at all times like in docker containers.
+### COMPOSER_ALLOW_XDEBUG
+
+If set to 1, this env allows running Composer when the Xdebug extension is enabled, without restarting PHP without it.
+
### COMPOSER_AUTH
The `COMPOSER_AUTH` var allows you to set up authentication as an environment variable.
@@ -833,6 +837,10 @@ By default it points to `$COMPOSER_HOME/cache` on \*nix and macOS, and
By setting this environmental value, you can set a path to a certificate bundle
file to be used during SSL/TLS peer verification.
+### COMPOSER_DISABLE_XDEBUG_WARN
+
+If set to 1, this env suppresses a warning when Composer is running with the Xdebug extension enabled.
+
### COMPOSER_DISCARD_CHANGES
This env var controls the [`discard-changes`](06-config.md#discard-changes) config option.
diff --git a/doc/06-config.md b/doc/06-config.md
index 6ffbea411..0f110a428 100644
--- a/doc/06-config.md
+++ b/doc/06-config.md
@@ -260,7 +260,7 @@ driver directly, Composer will still attempt to use GitHub's zip files.
Defaults to `true`. Composer allows repositories to define a notification URL,
so that they get notified whenever a package from that repository is installed.
-This option allows you to disable that behaviour.
+This option allows you to disable that behavior.
## discard-changes
diff --git a/doc/articles/troubleshooting.md b/doc/articles/troubleshooting.md
index 7a5725ec4..33471cd53 100644
--- a/doc/articles/troubleshooting.md
+++ b/doc/articles/troubleshooting.md
@@ -156,10 +156,10 @@ This issue can also happen on cPanel instances, when the shell fork bomb protect
## Xdebug impact on Composer
-To improve performance when the xdebug extension is enabled, Composer automatically restarts PHP without it.
+To improve performance when the Xdebug extension is enabled, Composer automatically restarts PHP without it.
You can override this behavior by using an environment variable: `COMPOSER_ALLOW_XDEBUG=1`.
-Composer will always show a warning if xdebug is being used, but you can override this with an environment variable:
+Composer will always show a warning if Xdebug is being used, but you can override this with an environment variable:
`COMPOSER_DISABLE_XDEBUG_WARN=1`. If you see this warning unexpectedly, then the restart process has failed:
please report this [issue](https://github.com/composer/composer/issues).
diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php
index c7ec2dad6..d9e7a4a56 100644
--- a/src/Composer/Console/Application.php
+++ b/src/Composer/Console/Application.php
@@ -205,7 +205,7 @@ class Application extends BaseApplication
}
if (extension_loaded('xdebug') && !getenv('COMPOSER_DISABLE_XDEBUG_WARN')) {
- $io->writeError('You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug');
+ $io->writeError('You are running composer with Xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug');
}
if (defined('COMPOSER_DEV_WARNING_TIME') && $commandName !== 'self-update' && $commandName !== 'selfupdate' && time() > COMPOSER_DEV_WARNING_TIME) {
diff --git a/src/Composer/Repository/ArrayRepository.php b/src/Composer/Repository/ArrayRepository.php
index 4f0409a60..c11c7fe68 100644
--- a/src/Composer/Repository/ArrayRepository.php
+++ b/src/Composer/Repository/ArrayRepository.php
@@ -28,6 +28,11 @@ class ArrayRepository extends BaseRepository
{
/** @var PackageInterface[] */
protected $packages;
+
+ /**
+ * @var PackageInterface[] indexed by package unique name and used to cache hasPackage calls
+ */
+ protected $packageMap;
public function __construct(array $packages = array())
{
@@ -121,15 +126,14 @@ class ArrayRepository extends BaseRepository
*/
public function hasPackage(PackageInterface $package)
{
- $packageId = $package->getUniqueName();
-
- foreach ($this->getPackages() as $repoPackage) {
- if ($packageId === $repoPackage->getUniqueName()) {
- return true;
+ if ($this->packageMap === null) {
+ $this->packageMap = array();
+ foreach ($this->getPackages() as $repoPackage) {
+ $this->packageMap[$repoPackage->getUniqueName()] = $repoPackage;
}
}
- return false;
+ return isset($this->packageMap[$package->getUniqueName()]);
}
/**
@@ -151,6 +155,9 @@ class ArrayRepository extends BaseRepository
$this->addPackage($aliasedPackage);
}
}
+
+ // invalidate package map cache
+ $this->packageMap = null;
}
protected function createAliasPackage(PackageInterface $package, $alias, $prettyAlias)
@@ -171,6 +178,9 @@ class ArrayRepository extends BaseRepository
if ($packageId === $repoPackage->getUniqueName()) {
array_splice($this->packages, $key, 1);
+ // invalidate package map cache
+ $this->packageMap = null;
+
return;
}
}
diff --git a/src/Composer/Repository/PlatformRepository.php b/src/Composer/Repository/PlatformRepository.php
index 3c7993511..897700707 100644
--- a/src/Composer/Repository/PlatformRepository.php
+++ b/src/Composer/Repository/PlatformRepository.php
@@ -125,7 +125,7 @@ class PlatformRepository extends ArrayRepository
$this->addExtension($name, $prettyVersion);
}
- // Check for xdebug in a restarted process
+ // Check for Xdebug in a restarted process
if (!in_array('xdebug', $loadedExtensions, true) && ($prettyVersion = XdebugHandler::getSkippedVersion())) {
$this->addExtension('xdebug', $prettyVersion);
}
diff --git a/src/Composer/Repository/Vcs/GitDriver.php b/src/Composer/Repository/Vcs/GitDriver.php
index 4a14974fb..cc6e3edb4 100644
--- a/src/Composer/Repository/Vcs/GitDriver.php
+++ b/src/Composer/Repository/Vcs/GitDriver.php
@@ -143,7 +143,7 @@ class GitDriver extends VcsDriver
public function getChangeDate($identifier)
{
$this->process->execute(sprintf(
- 'git log -1 --format=%%at %s',
+ 'git -c log.showSignature=false log -1 --format=%%at %s',
ProcessExecutor::escape($identifier)
), $output, $this->repoDir);
diff --git a/src/Composer/Util/Git.php b/src/Composer/Util/Git.php
index 39a66f898..798dd4a20 100644
--- a/src/Composer/Util/Git.php
+++ b/src/Composer/Util/Git.php
@@ -85,7 +85,9 @@ class Git
}
// failed to checkout, first check git accessibility
- $this->throwException('Failed to clone ' . $url . ' via ' . implode(', ', $protocols) . ' protocols, aborting.' . "\n\n" . implode("\n", $messages), $url);
+ if (!$this->io->hasAuthentication($match[1]) && !$this->io->isInteractive()) {
+ $this->throwException('Failed to clone ' . $url . ' via ' . implode(', ', $protocols) . ' protocols, aborting.' . "\n\n" . implode("\n", $messages), $url);
+ }
}
// if we have a private github url and the ssh protocol is disabled then we skip it and directly fallback to https
@@ -97,7 +99,7 @@ class Git
if ($bypassSshForGitHub || 0 !== $this->process->execute($command, $ignoredOutput, $cwd)) {
// private github repository without ssh key access, try https with auth
if (preg_match('{^git@' . self::getGitHubDomainsRegex($this->config) . ':(.+?)\.git$}i', $url, $match)
- || preg_match('{^(https?)://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match)
+ || preg_match('{^https?://' . self::getGitHubDomainsRegex($this->config) . '/(.*)}', $url, $match)
) {
if (!$this->io->hasAuthentication($match[1])) {
$gitHubUtil = new GitHub($this->io, $this->config, $this->process);
diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php
index d72a02981..00b2e7547 100644
--- a/src/Composer/Util/ProcessExecutor.php
+++ b/src/Composer/Util/ProcessExecutor.php
@@ -155,7 +155,7 @@ class ProcessExecutor
//@see https://bugs.php.net/bug.php?id=43784
//@see https://bugs.php.net/bug.php?id=49446
if ('\\' === DIRECTORY_SEPARATOR) {
- if ('' === $argument) {
+ if ((string) $argument === '') {
return escapeshellarg($argument);
}
diff --git a/tests/Composer/Test/ApplicationTest.php b/tests/Composer/Test/ApplicationTest.php
index 94128e737..18138d399 100644
--- a/tests/Composer/Test/ApplicationTest.php
+++ b/tests/Composer/Test/ApplicationTest.php
@@ -62,7 +62,7 @@ class ApplicationTest extends TestCase
$outputMock->expects($this->at($index++))
->method("write")
- ->with($this->equalTo('You are running composer with xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug'));
+ ->with($this->equalTo('You are running composer with Xdebug enabled. This has a major impact on runtime performance. See https://getcomposer.org/xdebug'));
}
$outputMock->expects($this->at($index++))
diff --git a/tests/Composer/Test/Downloader/GitDownloaderTest.php b/tests/Composer/Test/Downloader/GitDownloaderTest.php
index 36ae3c364..3784b732a 100644
--- a/tests/Composer/Test/Downloader/GitDownloaderTest.php
+++ b/tests/Composer/Test/Downloader/GitDownloaderTest.php
@@ -735,7 +735,7 @@ composer https://github.com/old/url (push)
$cmd = str_replace('cd ', 'cd /D ', $cmd);
$cmd = str_replace('composerPath', getcwd().'/composerPath', $cmd);
- return str_replace('""', '', strtr($cmd, "'", '"'));
+ return strtr($cmd, "'", '"');
}
return $cmd;
diff --git a/tests/Composer/Test/Util/GitTest.php b/tests/Composer/Test/Util/GitTest.php
new file mode 100644
index 000000000..7aa66be12
--- /dev/null
+++ b/tests/Composer/Test/Util/GitTest.php
@@ -0,0 +1,145 @@
+io = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
+ $this->config = $this->getMockBuilder('Composer\Config')->disableOriginalConstructor()->getMock();
+ $this->process = $this->getMockBuilder('Composer\Util\ProcessExecutor')->disableOriginalConstructor()->getMock();
+ $this->fs = $this->getMockBuilder('Composer\Util\Filesystem')->disableOriginalConstructor()->getMock();
+ $this->git = new Git($this->io, $this->config, $this->process, $this->fs);
+ }
+
+ /**
+ * @dataProvider publicGithubNoCredentialsProvider
+ */
+ public function testRunCommandPublicGitHubRepositoryNotInitialClone($protocol, $expectedUrl)
+ {
+ $that = $this;
+ $commandCallable = function ($url) use ($that, $expectedUrl) {
+ $that->assertSame($expectedUrl, $url);
+
+ return 'git command';
+ };
+
+ $this->mockConfig($protocol);
+
+ $this->process
+ ->expects($this->once())
+ ->method('execute')
+ ->with($this->equalTo('git command'))
+ ->willReturn(0);
+
+ $this->git->runCommand($commandCallable, 'https://github.com/acme/repo', null, true);
+ }
+
+ public function publicGithubNoCredentialsProvider()
+ {
+ return array(
+ array('ssh', 'git@github.com:acme/repo'),
+ array('https', 'https://github.com/acme/repo'),
+ );
+ }
+
+ /**
+ * @expectedException \RuntimeException
+ */
+ public function testRunCommandPrivateGitHubRepositoryNotInitialCloneNotInteractiveWithoutAuthentication()
+ {
+ $that = $this;
+ $commandCallable = function ($url) use ($that) {
+ $that->assertSame('https://github.com/acme/repo', $url);
+
+ return 'git command';
+ };
+
+ $this->mockConfig('https');
+
+ $this->process
+ ->method('execute')
+ ->willReturnMap(array(
+ array('git command', null, null, 1),
+ array('git --version', null, null, 0),
+ ));
+
+ $this->git->runCommand($commandCallable, 'https://github.com/acme/repo', null, true);
+ }
+
+ /**
+ * @dataProvider privateGithubWithCredentialsProvider
+ */
+ public function testRunCommandPrivateGitHubRepositoryNotInitialCloneNotInteractiveWithAuthentication($gitUrl, $protocol, $gitHubToken, $expectedUrl)
+ {
+ $commandCallable = function ($url) use ($expectedUrl) {
+ if ($url !== $expectedUrl) {
+ return 'git command failing';
+ }
+
+ return 'git command ok';
+ };
+
+ $this->mockConfig($protocol);
+
+ $this->process
+ ->method('execute')
+ ->willReturnMap(array(
+ array('git command failing', null, null, 1),
+ array('git command ok', null, null, 0),
+ ));
+
+ $this->io
+ ->method('isInteractive')
+ ->willReturn(false);
+
+ $this->io
+ ->method('hasAuthentication')
+ ->with($this->equalTo('github.com'))
+ ->willReturn(true);
+
+ $this->io
+ ->method('getAuthentication')
+ ->with($this->equalTo('github.com'))
+ ->willReturn(array('username' => 'token', 'password' => $gitHubToken));
+
+ $this->git->runCommand($commandCallable, $gitUrl, null, true);
+ }
+
+ public function privateGithubWithCredentialsProvider()
+ {
+ return array(
+ array('git@github.com:acme/repo.git', 'ssh', 'MY_GITHUB_TOKEN', 'https://token:MY_GITHUB_TOKEN@github.com/acme/repo.git'),
+ array('https://github.com/acme/repo', 'https', 'MY_GITHUB_TOKEN', 'https://token:MY_GITHUB_TOKEN@github.com/acme/repo.git'),
+ );
+ }
+
+ private function mockConfig($protocol)
+ {
+ $this->config
+ ->method('get')
+ ->willReturnMap(array(
+ array('github-domains', 0, array('github.com')),
+ array('github-protocols', 0, array($protocol)),
+ ));
+ }
+}