Merge remote-tracking branch 'origin/master' into 2.0

main
Jordi Boggiano 6 years ago
commit 2e0f31106a

@ -23,13 +23,14 @@ php:
- 7.0 - 7.0
- 7.1 - 7.1
- 7.2 - 7.2
- 7.3
- nightly - nightly
matrix: matrix:
include: include:
- php: 5.3 - php: 5.3
dist: precise dist: precise
- php: 7.2 - php: 7.3
env: deps=high env: deps=high
fast_finish: true fast_finish: true
allow_failures: allow_failures:
@ -59,7 +60,7 @@ before_script:
script: script:
# run test suite directories in parallel using GNU parallel # run test suite directories in parallel using GNU parallel
- ls -d tests/Composer/Test/* | parallel --gnu --keep-order 'echo "Running {} tests"; ./vendor/bin/phpunit -c tests/complete.phpunit.xml --colors=always {} || (echo -e "\e[41mFAILED\e[0m {}" && exit 1);' - ls -d tests/Composer/Test/* | grep -v TestCase.php | parallel --gnu --keep-order 'echo "Running {} tests"; ./vendor/bin/phpunit -c tests/complete.phpunit.xml --colors=always {} || (echo -e "\e[41mFAILED\e[0m {}" && exit 1);'
before_deploy: before_deploy:
- php -d phar.readonly=0 bin/compile - php -d phar.readonly=0 bin/compile
@ -72,4 +73,4 @@ deploy:
on: on:
tags: true tags: true
repo: composer/composer repo: composer/composer
php: '7.1' php: '7.2'

@ -1,3 +1,12 @@
### [1.7.3] 2018-11-01
* Fixed handling of replace/conflict rules. This may affect dependency resolution in some edge cases.
* Fixed Bitbucket API support and migrated all calls to API v2 as v1 is deprecated
* Fixed support for lib-openssl 1.1.1 having only lowercase algorithm names
* Fixed escaping of URLs in Perforce and Svn drivers
* Fixed `show` command not respecting `--path` when a single package name was given
* Fixed regression in 1.7.2's handling of metapackages
### [1.7.2] 2018-08-16 ### [1.7.2] 2018-08-16
* Fixed reporting of authentication/rate limiting issues for GitHub API access * Fixed reporting of authentication/rate limiting issues for GitHub API access
@ -687,6 +696,7 @@
* Initial release * Initial release
[1.7.3]: https://github.com/composer/composer/compare/1.7.2...1.7.3
[1.7.2]: https://github.com/composer/composer/compare/1.7.1...1.7.2 [1.7.2]: https://github.com/composer/composer/compare/1.7.1...1.7.2
[1.7.1]: https://github.com/composer/composer/compare/1.7.0...1.7.1 [1.7.1]: https://github.com/composer/composer/compare/1.7.0...1.7.1
[1.7.0]: https://github.com/composer/composer/compare/1.7.0-RC...1.7.0 [1.7.0]: https://github.com/composer/composer/compare/1.7.0-RC...1.7.0

10
composer.lock generated

@ -8,16 +8,16 @@
"packages": [ "packages": [
{ {
"name": "composer/ca-bundle", "name": "composer/ca-bundle",
"version": "1.1.2", "version": "1.1.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/ca-bundle.git", "url": "https://github.com/composer/ca-bundle.git",
"reference": "46afded9720f40b9dc63542af4e3e43a1177acb0" "reference": "8afa52cd417f4ec417b4bfe86b68106538a87660"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/ca-bundle/zipball/46afded9720f40b9dc63542af4e3e43a1177acb0", "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8afa52cd417f4ec417b4bfe86b68106538a87660",
"reference": "46afded9720f40b9dc63542af4e3e43a1177acb0", "reference": "8afa52cd417f4ec417b4bfe86b68106538a87660",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -60,7 +60,7 @@
"ssl", "ssl",
"tls" "tls"
], ],
"time": "2018-08-08T08:57:40+00:00" "time": "2018-10-18T06:09:13+00:00"
}, },
{ {
"name": "composer/semver", "name": "composer/semver",

@ -40,9 +40,9 @@ To install packages from sources instead of simple zip archives, you will need
git, svn, fossil or hg depending on how the package is version-controlled. git, svn, fossil or hg depending on how the package is version-controlled.
Composer is multi-platform and we strive to make it run equally well on Windows, Composer is multi-platform and we strive to make it run equally well on Windows,
Linux and OSX. Linux and macOS.
## Installation - Linux / Unix / OSX ## Installation - Linux / Unix / macOS
### Downloading the Composer Executable ### Downloading the Composer Executable
@ -100,7 +100,7 @@ Linux distributions.
> **Note:** If the above fails due to permissions, you may need to run it again > **Note:** If the above fails due to permissions, you may need to run it again
> with sudo. > with sudo.
> **Note:** On some versions of OSX the `/usr` directory does not exist by > **Note:** On some versions of macOS the `/usr` directory does not exist by
> default. If you receive the error "/usr/local/bin/composer: No such file or > default. If you receive the error "/usr/local/bin/composer: No such file or
> directory" then you must create the directory manually before proceeding: > directory" then you must create the directory manually before proceeding:
> `mkdir -p /usr/local/bin`. > `mkdir -p /usr/local/bin`.

@ -856,9 +856,9 @@ is a hidden, global (per-user on the machine) directory that is shared between
all projects. all projects.
By default it points to `C:\Users\<user>\AppData\Roaming\Composer` on Windows By default it points to `C:\Users\<user>\AppData\Roaming\Composer` on Windows
and `/Users/<user>/.composer` on OSX. On *nix systems that follow the [XDG Base and `/Users/<user>/.composer` on macOS. On \*nix systems that follow the [XDG Base
Directory Specifications](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html), Directory Specifications](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html),
it points to `$XDG_CONFIG_HOME/composer`. On other *nix systems, it points to it points to `$XDG_CONFIG_HOME/composer`. On other \*nix systems, it points to
`/home/<user>/.composer`. `/home/<user>/.composer`.
#### COMPOSER_HOME/config.json #### COMPOSER_HOME/config.json
@ -878,7 +878,7 @@ configuration in the project's `composer.json` always wins.
The `COMPOSER_CACHE_DIR` var allows you to change the Composer cache directory, The `COMPOSER_CACHE_DIR` var allows you to change the Composer cache directory,
which is also configurable via the [`cache-dir`](06-config.md#cache-dir) option. which is also configurable via the [`cache-dir`](06-config.md#cache-dir) option.
By default it points to `$COMPOSER_HOME/cache` on \*nix and OSX, and By default it points to `$COMPOSER_HOME/cache` on \*nix and macOS, and
`C:\Users\<user>\AppData\Local\Composer` (or `%LOCALAPPDATA%/Composer`) on Windows. `C:\Users\<user>\AppData\Local\Composer` (or `%LOCALAPPDATA%/Composer`) on Windows.
### COMPOSER_PROCESS_TIMEOUT ### COMPOSER_PROCESS_TIMEOUT

@ -657,7 +657,7 @@ be explicitly defined in the package's `composer.json` file. If the version
cannot be resolved by these means, it is assumed to be `dev-master`. cannot be resolved by these means, it is assumed to be `dev-master`.
The local package will be symlinked if possible, in which case the output in The local package will be symlinked if possible, in which case the output in
the console will read `Symlinked from ../../packages/my-package`. If symlinking the console will read `Symlinking from ../../packages/my-package`. If symlinking
is _not_ possible the package will be copied. In that case, the console will is _not_ possible the package will be copied. In that case, the console will
output `Mirrored from ../../packages/my-package`. output `Mirrored from ../../packages/my-package`.

@ -11,7 +11,7 @@ An alternative is to use this script which only works with UNIX utilities:
EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)" EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")" ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")"
if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]
then then

@ -15,7 +15,7 @@ associated with inline VCS repositories.
There are three ways the dependency solver could work with custom repositories: There are three ways the dependency solver could work with custom repositories:
- Fetch the repositories of root package, get all the packages from the defined - Fetch the repositories of root package, get all the packages from the defined
repositories, resolve requirements. This is the current state and it works well repositories, then resolve requirements. This is the current state and it works well
except for the limitation of not loading repositories recursively. except for the limitation of not loading repositories recursively.
- Fetch the repositories of root package, while initializing packages from the - Fetch the repositories of root package, while initializing packages from the

@ -279,7 +279,7 @@ class ClassLoader
*/ */
public function setApcuPrefix($apcuPrefix) public function setApcuPrefix($apcuPrefix)
{ {
$this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
} }
/** /**

@ -33,7 +33,7 @@ use Symfony\Component\Console\Command\Command;
abstract class BaseCommand extends Command abstract class BaseCommand extends Command
{ {
/** /**
* @var Composer * @var Composer|null
*/ */
private $composer; private $composer;

@ -119,8 +119,9 @@ EOT
$io->write('Checking github.com rate limit: ', false); $io->write('Checking github.com rate limit: ', false);
try { try {
$rate = $this->getGithubRateLimit('github.com'); $rate = $this->getGithubRateLimit('github.com');
$this->outputResult(true); if (!is_array($rate)) {
if (10 > $rate['remaining']) { $this->outputResult($rate);
} elseif (10 > $rate['remaining']) {
$io->write('<warning>WARNING</warning>'); $io->write('<warning>WARNING</warning>');
$io->write(sprintf( $io->write(sprintf(
'<comment>Github has a rate limit on their API. ' '<comment>Github has a rate limit on their API. '
@ -131,6 +132,8 @@ EOT
$rate['remaining'], $rate['remaining'],
$rate['limit'] $rate['limit']
)); ));
} else {
$this->outputResult(true);
} }
} catch (\Exception $e) { } catch (\Exception $e) {
if ($e instanceof TransportException && $e->getCode() === 401) { if ($e instanceof TransportException && $e->getCode() === 401) {
@ -207,6 +210,11 @@ EOT
private function checkHttp($proto, Config $config) private function checkHttp($proto, Config $config)
{ {
$result = $this->checkConnectivity();
if ($result !== true) {
return $result;
}
$disableTls = false; $disableTls = false;
$result = array(); $result = array();
if ($proto === 'https' && $config->get('disable-tls') === true) { if ($proto === 'https' && $config->get('disable-tls') === true) {
@ -238,6 +246,11 @@ EOT
private function checkHttpProxy() private function checkHttpProxy()
{ {
$result = $this->checkConnectivity();
if ($result !== true) {
return $result;
}
$protocol = extension_loaded('openssl') ? 'https' : 'http'; $protocol = extension_loaded('openssl') ? 'https' : 'http';
try { try {
$json = json_decode($this->rfs->getContents('packagist.org', $protocol . '://repo.packagist.org/packages.json', false), true); $json = json_decode($this->rfs->getContents('packagist.org', $protocol . '://repo.packagist.org/packages.json', false), true);
@ -265,6 +278,11 @@ EOT
*/ */
private function checkHttpProxyFullUriRequestParam() private function checkHttpProxyFullUriRequestParam()
{ {
$result = $this->checkConnectivity();
if ($result !== true) {
return $result;
}
$url = 'http://repo.packagist.org/packages.json'; $url = 'http://repo.packagist.org/packages.json';
try { try {
$this->rfs->getContents('packagist.org', $url, false); $this->rfs->getContents('packagist.org', $url, false);
@ -290,6 +308,11 @@ EOT
*/ */
private function checkHttpsProxyFullUriRequestParam() private function checkHttpsProxyFullUriRequestParam()
{ {
$result = $this->checkConnectivity();
if ($result !== true) {
return $result;
}
if (!extension_loaded('openssl')) { if (!extension_loaded('openssl')) {
return 'You need the openssl extension installed for this check'; return 'You need the openssl extension installed for this check';
} }
@ -312,6 +335,11 @@ EOT
private function checkGithubOauth($domain, $token) private function checkGithubOauth($domain, $token)
{ {
$result = $this->checkConnectivity();
if ($result !== true) {
return $result;
}
$this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic'); $this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic');
try { try {
$url = $domain === 'github.com' ? 'https://api.'.$domain.'/' : 'https://'.$domain.'/api/v3/'; $url = $domain === 'github.com' ? 'https://api.'.$domain.'/' : 'https://'.$domain.'/api/v3/';
@ -332,10 +360,15 @@ EOT
* @param string $domain * @param string $domain
* @param string $token * @param string $token
* @throws TransportException * @throws TransportException
* @return array * @return array|string
*/ */
private function getGithubRateLimit($domain, $token = null) private function getGithubRateLimit($domain, $token = null)
{ {
$result = $this->checkConnectivity();
if ($result !== true) {
return $result;
}
if ($token) { if ($token) {
$this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic'); $this->getIO()->setAuthentication($domain, $token, 'x-oauth-basic');
} }
@ -390,6 +423,11 @@ EOT
private function checkVersion($config) private function checkVersion($config)
{ {
$result = $this->checkConnectivity();
if ($result !== true) {
return $result;
}
$versionsUtil = new Versions($config, $this->rfs); $versionsUtil = new Versions($config, $this->rfs);
$latest = $versionsUtil->getLatest(); $latest = $versionsUtil->getLatest();
@ -413,6 +451,7 @@ EOT
} }
$hadError = false; $hadError = false;
$hadWarning = false;
if ($result instanceof \Exception) { if ($result instanceof \Exception) {
$result = '<error>['.get_class($result).'] '.$result->getMessage().'</error>'; $result = '<error>['.get_class($result).'] '.$result->getMessage().'</error>';
} }
@ -427,16 +466,18 @@ EOT
foreach ($result as $message) { foreach ($result as $message) {
if (false !== strpos($message, '<error>')) { if (false !== strpos($message, '<error>')) {
$hadError = true; $hadError = true;
} elseif (false !== strpos($message, '<warning>')) {
$hadWarning = true;
} }
} }
} }
if ($hadError) { if ($hadError) {
$io->write('<error>FAIL</error>'); $io->write('<error>FAIL</error>');
$this->exitCode = 2; $this->exitCode = max($this->exitCode, 2);
} else { } elseif ($hadWarning) {
$io->write('<warning>WARNING</warning>'); $io->write('<warning>WARNING</warning>');
$this->exitCode = 1; $this->exitCode = max($this->exitCode, 1);
} }
if ($result) { if ($result) {
@ -481,7 +522,7 @@ EOT
$errors['iconv_mbstring'] = true; $errors['iconv_mbstring'] = true;
} }
if (!ini_get('allow_url_fopen')) { if (!filter_var(ini_get('allow_url_fopen'), FILTER_VALIDATE_BOOLEAN)) {
$errors['allow_url_fopen'] = true; $errors['allow_url_fopen'] = true;
} }
@ -505,7 +546,7 @@ EOT
$warnings['openssl_version'] = true; $warnings['openssl_version'] = true;
} }
if (!defined('HHVM_VERSION') && !extension_loaded('apcu') && ini_get('apc.enable_cli')) { if (!defined('HHVM_VERSION') && !extension_loaded('apcu') && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN)) {
$warnings['apc_cli'] = true; $warnings['apc_cli'] = true;
} }
@ -528,7 +569,7 @@ EOT
} }
} }
if (ini_get('xdebug.profiler_enabled')) { if (filter_var(ini_get('xdebug.profiler_enabled'), FILTER_VALIDATE_BOOLEAN)) {
$warnings['xdebug_profile'] = true; $warnings['xdebug_profile'] = true;
} elseif (extension_loaded('xdebug')) { } elseif (extension_loaded('xdebug')) {
$warnings['xdebug_loaded'] = true; $warnings['xdebug_loaded'] = true;
@ -668,4 +709,20 @@ EOT
return !$warnings && !$errors ? true : $output; return !$warnings && !$errors ? true : $output;
} }
/**
* Check if allow_url_fopen is ON
*
* @return bool|string
*/
private function checkConnectivity()
{
if (!ini_get('allow_url_fopen')) {
$result = '<info>Skipped because allow_url_fopen is missing.</info>';
return $result;
}
return true;
}
} }

@ -36,6 +36,7 @@ class OutdatedCommand extends ShowCommand
new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'),
new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'),
new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'), new InputOption('format', 'f', InputOption::VALUE_REQUIRED, 'Format of the output: text or json', 'text'),
new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.'),
)) ))
->setHelp( ->setHelp(
<<<EOT <<<EOT
@ -77,6 +78,7 @@ EOT
$args['--minor-only'] = true; $args['--minor-only'] = true;
} }
$args['--format'] = $input->getOption('format'); $args['--format'] = $input->getOption('format');
$args['--ignore'] = $input->getOption('ignore');
$input = new ArrayInput($args); $input = new ArrayInput($args);

@ -220,7 +220,7 @@ TAGSPUBKEY
$pubkeyid = openssl_pkey_get_public($sigFile); $pubkeyid = openssl_pkey_get_public($sigFile);
$algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384'; $algo = defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'SHA384';
if (!in_array('SHA384', openssl_get_md_methods())) { if (!in_array('sha384', array_map('strtolower', openssl_get_md_methods()))) {
throw new \RuntimeException('SHA384 is not supported by your openssl extension, could not verify the phar file integrity'); throw new \RuntimeException('SHA384 is not supported by your openssl extension, could not verify the phar file integrity');
} }
$signature = json_decode($signature, true); $signature = json_decode($signature, true);

@ -74,6 +74,7 @@ class ShowCommand extends BaseCommand
new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'), new InputOption('tree', 't', InputOption::VALUE_NONE, 'List the dependencies as a tree'),
new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'), new InputOption('latest', 'l', InputOption::VALUE_NONE, 'Show the latest version'),
new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'), new InputOption('outdated', 'o', InputOption::VALUE_NONE, 'Show the latest version but only for packages that are outdated'),
new InputOption('ignore', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore specified package(s). Use it with the --outdated option if you don\'t want to be informed about new versions of some packages.'),
new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'), new InputOption('minor-only', 'm', InputOption::VALUE_NONE, 'Show only packages that have minor SemVer-compatible updates. Use with the --outdated option.'),
new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'), new InputOption('direct', 'D', InputOption::VALUE_NONE, 'Shows only packages that are directly required by the root package'),
new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'), new InputOption('strict', null, InputOption::VALUE_NONE, 'Return a non-zero exit code when there are outdated packages'),
@ -105,6 +106,8 @@ EOT
if ($input->getOption('outdated')) { if ($input->getOption('outdated')) {
$input->setOption('latest', true); $input->setOption('latest', true);
} elseif ($input->getOption('ignore')) {
$io->writeError('<warning>You are using the option "ignore" for action other than "outdated", it will be ignored.</warning>');
} }
if ($input->getOption('direct') && ($input->getOption('all') || $input->getOption('available') || $input->getOption('platform'))) { if ($input->getOption('direct') && ($input->getOption('all') || $input->getOption('available') || $input->getOption('platform'))) {
@ -219,6 +222,12 @@ EOT
if ($input->getOption('outdated') && $input->getOption('strict') && $latestPackage && $latestPackage->getFullPrettyVersion() !== $package->getFullPrettyVersion() && !$latestPackage->isAbandoned()) { if ($input->getOption('outdated') && $input->getOption('strict') && $latestPackage && $latestPackage->getFullPrettyVersion() !== $package->getFullPrettyVersion() && !$latestPackage->isAbandoned()) {
$exitCode = 1; $exitCode = 1;
} }
if ($input->getOption('path')) {
$io->write($package->getName(), false);
$io->write(' ' . strtok(realpath($composer->getInstallationManager()->getInstallPath($package)), "\r\n"));
return $exitCode;
}
$this->printMeta($package, $versions, $installedRepo, $latestPackage ?: null); $this->printMeta($package, $versions, $installedRepo, $latestPackage ?: null);
$this->printLinks($package, 'requires'); $this->printLinks($package, 'requires');
$this->printLinks($package, 'devRequires', 'requires (dev)'); $this->printLinks($package, 'devRequires', 'requires (dev)');
@ -333,6 +342,7 @@ EOT
$showAllTypes = $input->getOption('all'); $showAllTypes = $input->getOption('all');
$showLatest = $input->getOption('latest'); $showLatest = $input->getOption('latest');
$showMinorOnly = $input->getOption('minor-only'); $showMinorOnly = $input->getOption('minor-only');
$ignoredPackages = array_map('strtolower', $input->getOption('ignore'));
$indent = $showAllTypes ? ' ' : ''; $indent = $showAllTypes ? ' ' : '';
$latestPackages = array(); $latestPackages = array();
$exitCode = 0; $exitCode = 0;
@ -372,7 +382,11 @@ EOT
if ($showLatest && isset($latestPackages[$package->getPrettyName()])) { if ($showLatest && isset($latestPackages[$package->getPrettyName()])) {
$latestPackage = $latestPackages[$package->getPrettyName()]; $latestPackage = $latestPackages[$package->getPrettyName()];
} }
if ($input->getOption('outdated') && $latestPackage && $latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && !$latestPackage->isAbandoned()) {
// Determine if Composer is checking outdated dependencies and if current package should trigger non-default exit code
$packageIsUpToDate = $latestPackage && $latestPackage->getFullPrettyVersion() === $package->getFullPrettyVersion() && !$latestPackage->isAbandoned();
$packageIsIgnored = \in_array($package->getPrettyName(), $ignoredPackages, true);
if ($input->getOption('outdated') && ($packageIsUpToDate || $packageIsIgnored)) {
continue; continue;
} elseif ($input->getOption('outdated') || $input->getOption('strict')) { } elseif ($input->getOption('outdated') || $input->getOption('strict')) {
$hasOutdatedPackages = true; $hasOutdatedPackages = true;
@ -573,6 +587,9 @@ EOT
$this->printLicenses($package); $this->printLicenses($package);
$io->write('<info>source</info> : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference())); $io->write('<info>source</info> : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference()));
$io->write('<info>dist</info> : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getDistType(), $package->getDistUrl(), $package->getDistReference())); $io->write('<info>dist</info> : ' . sprintf('[%s] <comment>%s</comment> %s', $package->getDistType(), $package->getDistUrl(), $package->getDistReference()));
if ($installedRepo->hasPackage($package)) {
$io->write('<info>path</info> : ' . sprintf('%s', realpath($this->getComposer()->getInstallationManager()->getInstallPath($package))));
}
$io->write('<info>names</info> : ' . implode(', ', $package->getNames())); $io->write('<info>names</info> : ' . implode(', ', $package->getNames()));
if ($latestPackage->isAbandoned()) { if ($latestPackage->isAbandoned()) {
@ -716,7 +733,7 @@ EOT
/** /**
* Display the tree * Display the tree
* *
* @param $arrayTree * @param array $arrayTree
*/ */
protected function displayPackageTree(array $arrayTree) protected function displayPackageTree(array $arrayTree)
{ {
@ -761,7 +778,7 @@ EOT
/** /**
* Generate the package tree * Generate the package tree
* *
* @param PackageInterface|string $package * @param PackageInterface $package
* @param RepositoryInterface $installedRepo * @param RepositoryInterface $installedRepo
* @param RepositoryInterface $distantRepos * @param RepositoryInterface $distantRepos
* @return array * @return array
@ -771,38 +788,36 @@ EOT
RepositoryInterface $installedRepo, RepositoryInterface $installedRepo,
RepositoryInterface $distantRepos RepositoryInterface $distantRepos
) { ) {
if (is_object($package)) { $requires = $package->getRequires();
$requires = $package->getRequires(); ksort($requires);
ksort($requires); $children = array();
$children = array(); foreach ($requires as $requireName => $require) {
foreach ($requires as $requireName => $require) { $packagesInTree = array($package->getName(), $requireName);
$packagesInTree = array($package->getName(), $requireName);
$treeChildDesc = array(
'name' => $requireName,
'version' => $require->getPrettyConstraint(),
);
$deepChildren = $this->addTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree); $treeChildDesc = array(
'name' => $requireName,
'version' => $require->getPrettyConstraint(),
);
if ($deepChildren) { $deepChildren = $this->addTree($requireName, $require, $installedRepo, $distantRepos, $packagesInTree);
$treeChildDesc['requires'] = $deepChildren;
}
$children[] = $treeChildDesc; if ($deepChildren) {
$treeChildDesc['requires'] = $deepChildren;
} }
$tree = array(
'name' => $package->getPrettyName(),
'version' => $package->getPrettyVersion(),
'description' => $package->getDescription(),
);
if ($children) { $children[] = $treeChildDesc;
$tree['requires'] = $children; }
} $tree = array(
'name' => $package->getPrettyName(),
'version' => $package->getPrettyVersion(),
'description' => $package->getDescription(),
);
return $tree; if ($children) {
$tree['requires'] = $children;
} }
return $tree;
} }
/** /**

@ -255,7 +255,7 @@ class Compiler
*/ */
// Avoid APC causing random fatal errors per https://github.com/composer/composer/issues/264 // Avoid APC causing random fatal errors per https://github.com/composer/composer/issues/264
if (extension_loaded('apc') && ini_get('apc.enable_cli') && ini_get('apc.cache_by_default')) { if (extension_loaded('apc') && filter_var(ini_get('apc.enable_cli'), FILTER_VALIDATE_BOOLEAN) && filter_var(ini_get('apc.cache_by_default'), FILTER_VALIDATE_BOOLEAN)) {
if (version_compare(phpversion('apc'), '3.0.12', '>=')) { if (version_compare(phpversion('apc'), '3.0.12', '>=')) {
ini_set('apc.cache_by_default', 0); ini_set('apc.cache_by_default', 0);
} else { } else {

@ -16,6 +16,7 @@ use Composer\IO\NullIO;
use Composer\Util\Platform; use Composer\Util\Platform;
use Composer\Util\Silencer; use Composer\Util\Silencer;
use Symfony\Component\Console\Application as BaseApplication; use Symfony\Component\Console\Application as BaseApplication;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
@ -125,6 +126,9 @@ class Application extends BaseApplication
if ($name = $this->getCommandName($input)) { if ($name = $this->getCommandName($input)) {
try { try {
$commandName = $this->find($name)->getName(); $commandName = $this->find($name)->getName();
} catch (CommandNotFoundException $e) {
// we'll check command validity again later after plugins are loaded
$commandName = false;
} catch (\InvalidArgumentException $e) { } catch (\InvalidArgumentException $e) {
} }
} }

@ -49,7 +49,7 @@ class RuleSetGenerator
* reason for generating this rule * reason for generating this rule
* @param mixed $reasonData Any data, e.g. the requirement name, * @param mixed $reasonData Any data, e.g. the requirement name,
* that goes with the reason * that goes with the reason
* @return Rule The generated rule or null if tautological * @return Rule|null The generated rule or null if tautological
*/ */
protected function createRequireRule(PackageInterface $package, array $providers, $reason, $reasonData = null) protected function createRequireRule(PackageInterface $package, array $providers, $reason, $reasonData = null)
{ {
@ -116,7 +116,7 @@ class RuleSetGenerator
* reason for generating this rule * reason for generating this rule
* @param mixed $reasonData Any data, e.g. the package name, that * @param mixed $reasonData Any data, e.g. the package name, that
* goes with the reason * goes with the reason
* @return Rule The generated rule * @return Rule|null The generated rule
*/ */
protected function createRule2Literals(PackageInterface $issuer, PackageInterface $provider, $reason, $reasonData = null) protected function createRule2Literals(PackageInterface $issuer, PackageInterface $provider, $reason, $reasonData = null)
{ {

@ -127,9 +127,9 @@ class RuleWatchGraph
* *
* The rule node's watched literals are updated accordingly. * The rule node's watched literals are updated accordingly.
* *
* @param $fromLiteral mixed A literal the node used to watch * @param int $fromLiteral A literal the node used to watch
* @param $toLiteral mixed A literal the node should watch now * @param int $toLiteral A literal the node should watch now
* @param $node mixed The rule node to be moved * @param RuleWatchNode $node The rule node to be moved
*/ */
protected function moveWatch($fromLiteral, $toLiteral, $node) protected function moveWatch($fromLiteral, $toLiteral, $node)
{ {

@ -433,7 +433,7 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface
} }
/** /**
* @param $path * @param string $path
* @throws \RuntimeException * @throws \RuntimeException
*/ */
protected function discardChanges($path) protected function discardChanges($path)
@ -447,7 +447,7 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface
} }
/** /**
* @param $path * @param string $path
* @throws \RuntimeException * @throws \RuntimeException
*/ */
protected function stashChanges($path) protected function stashChanges($path)
@ -461,7 +461,7 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface
} }
/** /**
* @param $path * @param string $path
* @throws \RuntimeException * @throws \RuntimeException
*/ */
protected function viewDiff($path) protected function viewDiff($path)

@ -73,8 +73,8 @@ class PearPackageExtractor
* Perform copy actions on files * Perform copy actions on files
* *
* @param array $files array of copy actions ('from', 'to') with relative paths * @param array $files array of copy actions ('from', 'to') with relative paths
* @param $source string path to source dir. * @param string $source path to source dir.
* @param $target string path to destination dir * @param string $target path to destination dir
* @param array $roles array [role => roleRoot] relative root for files having that role * @param array $roles array [role => roleRoot] relative root for files having that role
* @param array $vars list of values can be used for replacement tasks * @param array $vars list of values can be used for replacement tasks
*/ */
@ -135,7 +135,7 @@ class PearPackageExtractor
*/ */
private function buildCopyActions($source, array $roles, $vars) private function buildCopyActions($source, array $roles, $vars)
{ {
/** @var $package \SimpleXmlElement */ /** @var \SimpleXmlElement $package */
$package = simplexml_load_string(file_get_contents($this->combine($source, 'package.xml'))); $package = simplexml_load_string(file_get_contents($this->combine($source, 'package.xml')));
if (false === $package) { if (false === $package) {
throw new \RuntimeException('Package definition file is not valid.'); throw new \RuntimeException('Package definition file is not valid.');

@ -69,7 +69,8 @@ class ZipDownloader extends ArchiveDownloader
if (!self::$isWindows && !self::$hasSystemUnzip) { if (!self::$isWindows && !self::$hasSystemUnzip) {
$this->io->writeError("<warning>As there is no 'unzip' command installed zip files are being unpacked using the PHP zip extension.</warning>"); $this->io->writeError("<warning>As there is no 'unzip' command installed zip files are being unpacked using the PHP zip extension.</warning>");
$this->io->writeError("<warning>This may cause invalid reports of corrupted archives. Installing 'unzip' may remediate them.</warning>"); $this->io->writeError("<warning>This may cause invalid reports of corrupted archives. Besides, any UNIX permissions (e.g. executable) defined in the archives will be lost.</warning>");
$this->io->writeError("<warning>Installing 'unzip' may remediate them.</warning>");
} }
} }

@ -264,7 +264,7 @@ class EventDispatcher
$finder = new PhpExecutableFinder(); $finder = new PhpExecutableFinder();
$phpPath = $finder->find(); $phpPath = $finder->find();
if (!$phpPath) { if (!$phpPath) {
throw new \RuntimeException('Failed to locate PHP binary to execute '.$scriptName); throw new \RuntimeException('Failed to locate PHP binary to execute '.$phpPath);
} }
$allowUrlFOpenFlag = ' -d allow_url_fopen=' . ProcessExecutor::escape(ini_get('allow_url_fopen')); $allowUrlFOpenFlag = ' -d allow_url_fopen=' . ProcessExecutor::escape(ini_get('allow_url_fopen'));

@ -588,7 +588,7 @@ class Factory
$disableTls = false; $disableTls = false;
if ($config && $config->get('disable-tls') === true) { if ($config && $config->get('disable-tls') === true) {
if (!$warned) { if (!$warned) {
$io->write('<warning>You are running Composer with SSL/TLS protection disabled.</warning>'); $io->writeError('<warning>You are running Composer with SSL/TLS protection disabled.</warning>');
} }
$warned = true; $warned = true;
$disableTls = true; $disableTls = true;

@ -614,14 +614,14 @@ class Installer
} }
} }
if ($this->executeOperations || $this->writeLock) {
$localRepo->write();
}
$event = 'Composer\Installer\PackageEvents::POST_PACKAGE_'.strtoupper($jobType); $event = 'Composer\Installer\PackageEvents::POST_PACKAGE_'.strtoupper($jobType);
if (defined($event) && $this->runScripts) { if (defined($event) && $this->runScripts) {
$this->eventDispatcher->dispatchPackageEvent(constant($event), $this->devMode, $policy, $repositorySet, $installedRepo, $request, $operations, $operation); $this->eventDispatcher->dispatchPackageEvent(constant($event), $this->devMode, $policy, $repositorySet, $installedRepo, $request, $operations, $operation);
} }
if ($this->executeOperations || $this->writeLock) {
$localRepo->write();
}
} }
if ($this->executeOperations) { if ($this->executeOperations) {

@ -64,7 +64,7 @@ class GitExcludeFilter extends BaseExcludeFilter
* *
* @param string $line A line from .gitattributes * @param string $line A line from .gitattributes
* *
* @return array An exclude pattern for filter() * @return array|null An exclude pattern for filter()
*/ */
public function parseGitAttributesLine($line) public function parseGitAttributesLine($line)
{ {

@ -54,7 +54,7 @@ class HgExcludeFilter extends BaseExcludeFilter
* *
* @param string $line A line from .hgignore * @param string $line A line from .hgignore
* *
* @return array An exclude pattern for filter() * @return array|null An exclude pattern for filter()
*/ */
public function parseHgIgnoreLine($line) public function parseHgIgnoreLine($line)
{ {

@ -37,7 +37,7 @@ class ZipArchiver implements ArchiverInterface
if ($res === true) { if ($res === true) {
$files = new ArchivableFilesFinder($sources, $excludes, $ignoreFilters); $files = new ArchivableFilesFinder($sources, $excludes, $ignoreFilters);
foreach ($files as $file) { foreach ($files as $file) {
/** @var $file \SplFileInfo */ /** @var \SplFileInfo $file */
$filepath = strtr($file->getPath()."/".$file->getFilename(), '\\', '/'); $filepath = strtr($file->getPath()."/".$file->getFilename(), '\\', '/');
$localname = str_replace($sources.'/', '', $filepath); $localname = str_replace($sources.'/', '', $filepath);
if ($file->isDir()) { if ($file->isDir()) {

@ -70,6 +70,7 @@ class Comparer
if (!is_array($source)) { if (!is_array($source)) {
return; return;
} }
chdir($currentDirectory);
chdir($this->update); chdir($this->update);
$destination = $this->doTree('.', $destination); $destination = $this->doTree('.', $destination);
if (!is_array($destination)) { if (!is_array($destination)) {

@ -84,7 +84,7 @@ class ArtifactRepository extends ArrayRepository implements ConfigurableReposito
* Find a file by name, returning the one that has the shortest path. * Find a file by name, returning the one that has the shortest path.
* *
* @param \ZipArchive $zip * @param \ZipArchive $zip
* @param $filename * @param string $filename
* @return bool|int * @return bool|int
*/ */
private function locateFile(\ZipArchive $zip, $filename) private function locateFile(\ZipArchive $zip, $filename)
@ -126,7 +126,9 @@ class ArtifactRepository extends ArrayRepository implements ConfigurableReposito
private function getComposerInformation(\SplFileInfo $file) private function getComposerInformation(\SplFileInfo $file)
{ {
$zip = new \ZipArchive(); $zip = new \ZipArchive();
$zip->open($file->getPathname()); if ($zip->open($file->getPathname()) !== true) {
return false;
}
if (0 == $zip->numFiles) { if (0 == $zip->numFiles) {
$zip->close(); $zip->close();

@ -44,8 +44,8 @@ abstract class BaseChannelReader
/** /**
* Read content from remote filesystem. * Read content from remote filesystem.
* *
* @param $origin string server * @param string $origin server
* @param $path string relative path to content * @param string $path relative path to content
* @throws \UnexpectedValueException * @throws \UnexpectedValueException
* @return \SimpleXMLElement * @return \SimpleXMLElement
*/ */
@ -63,8 +63,8 @@ abstract class BaseChannelReader
/** /**
* Read xml content from remote filesystem * Read xml content from remote filesystem
* *
* @param $origin string server * @param string $origin server
* @param $path string relative path to content * @param string $path relative path to content
* @throws \UnexpectedValueException * @throws \UnexpectedValueException
* @return \SimpleXMLElement * @return \SimpleXMLElement
*/ */

@ -44,7 +44,7 @@ class ChannelReader extends BaseChannelReader
/** /**
* Reads PEAR channel through REST interface and builds list of packages * Reads PEAR channel through REST interface and builds list of packages
* *
* @param $url string PEAR Channel url * @param string $url PEAR Channel url
* @throws \UnexpectedValueException * @throws \UnexpectedValueException
* @return ChannelInfo * @return ChannelInfo
*/ */
@ -70,8 +70,8 @@ class ChannelReader extends BaseChannelReader
/** /**
* Reads channel supported REST interfaces and selects one of them * Reads channel supported REST interfaces and selects one of them
* *
* @param $channelXml \SimpleXMLElement * @param \SimpleXMLElement $channelXml
* @param $supportedVersions string[] supported PEAR REST protocols * @param string[] $supportedVersions supported PEAR REST protocols
* @return array|null hash with selected version and baseUrl * @return array|null hash with selected version and baseUrl
*/ */
private function selectRestVersion($channelXml, $supportedVersions) private function selectRestVersion($channelXml, $supportedVersions)

@ -39,7 +39,7 @@ class ChannelRest10Reader extends BaseChannelReader
/** /**
* Reads package descriptions using PEAR Rest 1.0 interface * Reads package descriptions using PEAR Rest 1.0 interface
* *
* @param $baseUrl string base Url interface * @param string $baseUrl base Url interface
* *
* @return PackageInfo[] * @return PackageInfo[]
*/ */
@ -52,7 +52,7 @@ class ChannelRest10Reader extends BaseChannelReader
* Read list of packages from * Read list of packages from
* {baseUrl}/p/packages.xml * {baseUrl}/p/packages.xml
* *
* @param $baseUrl string * @param string $baseUrl
* @return PackageInfo[] * @return PackageInfo[]
*/ */
private function readPackages($baseUrl) private function readPackages($baseUrl)
@ -75,8 +75,8 @@ class ChannelRest10Reader extends BaseChannelReader
* Read package info from * Read package info from
* {baseUrl}/p/{package}/info.xml * {baseUrl}/p/{package}/info.xml
* *
* @param $baseUrl string * @param string $baseUrl
* @param $packageName string * @param string $packageName
* @return PackageInfo * @return PackageInfo
*/ */
private function readPackage($baseUrl, $packageName) private function readPackage($baseUrl, $packageName)
@ -105,8 +105,8 @@ class ChannelRest10Reader extends BaseChannelReader
* Read package releases from * Read package releases from
* {baseUrl}/p/{package}/allreleases.xml * {baseUrl}/p/{package}/allreleases.xml
* *
* @param $baseUrl string * @param string $baseUrl
* @param $packageName string * @param string $packageName
* @throws \Composer\Downloader\TransportException|\Exception * @throws \Composer\Downloader\TransportException|\Exception
* @return ReleaseInfo[] hash array with keys as version numbers * @return ReleaseInfo[] hash array with keys as version numbers
*/ */
@ -146,9 +146,9 @@ class ChannelRest10Reader extends BaseChannelReader
* Read package dependencies from * Read package dependencies from
* {baseUrl}/p/{package}/deps.{version}.txt * {baseUrl}/p/{package}/deps.{version}.txt
* *
* @param $baseUrl string * @param string $baseUrl
* @param $packageName string * @param string $packageName
* @param $version string * @param string $version
* @return DependencyInfo[] * @return DependencyInfo[]
*/ */
private function readPackageReleaseDependencies($baseUrl, $packageName, $version) private function readPackageReleaseDependencies($baseUrl, $packageName, $version)

@ -35,7 +35,7 @@ class ChannelRest11Reader extends BaseChannelReader
/** /**
* Reads package descriptions using PEAR Rest 1.1 interface * Reads package descriptions using PEAR Rest 1.1 interface
* *
* @param $baseUrl string base Url interface * @param string $baseUrl base Url interface
* *
* @return PackageInfo[] * @return PackageInfo[]
*/ */
@ -48,7 +48,7 @@ class ChannelRest11Reader extends BaseChannelReader
* Read list of channel categories from * Read list of channel categories from
* {baseUrl}/c/categories.xml * {baseUrl}/c/categories.xml
* *
* @param $baseUrl string * @param string $baseUrl
* @return PackageInfo[] * @return PackageInfo[]
*/ */
private function readChannelPackages($baseUrl) private function readChannelPackages($baseUrl)
@ -70,8 +70,8 @@ class ChannelRest11Reader extends BaseChannelReader
* Read packages from * Read packages from
* {baseUrl}/c/{category}/packagesinfo.xml * {baseUrl}/c/{category}/packagesinfo.xml
* *
* @param $baseUrl string * @param string $baseUrl
* @param $categoryName string * @param string $categoryName
* @return PackageInfo[] * @return PackageInfo[]
*/ */
private function readCategoryPackages($baseUrl, $categoryName) private function readCategoryPackages($baseUrl, $categoryName)
@ -92,7 +92,7 @@ class ChannelRest11Reader extends BaseChannelReader
/** /**
* Parses package node. * Parses package node.
* *
* @param $packageInfo \SimpleXMLElement xml element describing package * @param \SimpleXMLElement $packageInfo xml element describing package
* @return PackageInfo * @return PackageInfo
*/ */
private function parsePackage($packageInfo) private function parsePackage($packageInfo)

@ -22,7 +22,7 @@ class PackageDependencyParser
/** /**
* Builds dependency information. It detects used package.xml format. * Builds dependency information. It detects used package.xml format.
* *
* @param $depArray array * @param array $depArray
* @return DependencyInfo * @return DependencyInfo
*/ */
public function buildDependencyInfo($depArray) public function buildDependencyInfo($depArray)
@ -46,7 +46,7 @@ class PackageDependencyParser
* { type="php|os|sapi|ext|pkg" rel="has|not|eq|ge|gt|le|lt" optional="yes" * { type="php|os|sapi|ext|pkg" rel="has|not|eq|ge|gt|le|lt" optional="yes"
* channel="channelName" name="extName|packageName" } * channel="channelName" name="extName|packageName" }
* *
* @param $depArray array Dependency data in package.xml 1.0 format * @param array $depArray Dependency data in package.xml 1.0 format
* @return DependencyConstraint[] * @return DependencyConstraint[]
*/ */
private function buildDependency10Info($depArray) private function buildDependency10Info($depArray)
@ -115,7 +115,7 @@ class PackageDependencyParser
/** /**
* Builds dependency information from package.xml 2.0 format * Builds dependency information from package.xml 2.0 format
* *
* @param $depArray array Dependency data in package.xml 1.0 format * @param array $depArray Dependency data in package.xml 1.0 format
* @return DependencyInfo * @return DependencyInfo
*/ */
private function buildDependency20Info($depArray) private function buildDependency20Info($depArray)
@ -187,8 +187,8 @@ class PackageDependencyParser
/** /**
* Builds dependency constraint of 'extension' type * Builds dependency constraint of 'extension' type
* *
* @param $depItem array dependency constraint or array of dependency constraints * @param array $depItem dependency constraint or array of dependency constraints
* @param $depType string target type of building constraint. * @param string $depType target type of building constraint.
* @return DependencyConstraint[] * @return DependencyConstraint[]
*/ */
private function buildDepExtensionConstraints($depItem, $depType) private function buildDepExtensionConstraints($depItem, $depType)
@ -217,8 +217,8 @@ class PackageDependencyParser
/** /**
* Builds dependency constraint of 'package' type * Builds dependency constraint of 'package' type
* *
* @param $depItem array dependency constraint or array of dependency constraints * @param array $depItem dependency constraint or array of dependency constraints
* @param $depType string target type of building constraint. * @param string $depType target type of building constraint.
* @return DependencyConstraint[] * @return DependencyConstraint[]
*/ */
private function buildDepPackageConstraints($depItem, $depType) private function buildDepPackageConstraints($depItem, $depType)
@ -287,7 +287,7 @@ class PackageDependencyParser
/** /**
* Softened version parser * Softened version parser
* *
* @param $version * @param string $version
* @return null|string * @return null|string
*/ */
private function parseVersion($version) private function parseVersion($version)

@ -236,7 +236,12 @@ class PlatformRepository extends ArrayRepository
// Skip if overridden // Skip if overridden
if (isset($this->overrides[$package->getName()])) { if (isset($this->overrides[$package->getName()])) {
$overrider = $this->findPackage($package->getName(), '*'); $overrider = $this->findPackage($package->getName(), '*');
$overrider->setDescription($overrider->getDescription().' (actual: '.$package->getPrettyVersion().')'); if ($package->getVersion() === $overrider->getVersion()) {
$actualText = 'same as actual';
} else {
$actualText = 'actual: '.$package->getPrettyVersion();
}
$overrider->setDescription($overrider->getDescription().' ('.$actualText.')');
return; return;
} }
@ -244,7 +249,12 @@ class PlatformRepository extends ArrayRepository
// Skip if PHP is overridden and we are adding a php-* package // Skip if PHP is overridden and we are adding a php-* package
if (isset($this->overrides['php']) && 0 === strpos($package->getName(), 'php-')) { if (isset($this->overrides['php']) && 0 === strpos($package->getName(), 'php-')) {
$overrider = $this->addOverriddenPackage($this->overrides['php'], $package->getPrettyName()); $overrider = $this->addOverriddenPackage($this->overrides['php'], $package->getPrettyName());
$overrider->setDescription($overrider->getDescription().' (actual: '.$package->getPrettyVersion().')'); if ($package->getVersion() === $overrider->getVersion()) {
$actualText = 'same as actual';
} else {
$actualText = 'actual: '.$package->getPrettyVersion();
}
$overrider->setDescription($overrider->getDescription().' ('.$actualText.')');
return; return;
} }

@ -81,11 +81,4 @@ interface RepositoryInterface extends \Countable
* @return array[] an array of array('name' => '...', 'description' => '...') * @return array[] an array of array('name' => '...', 'description' => '...')
*/ */
public function search($query, $mode = 0); public function search($query, $mode = 0);
/**
* Removes a package from the registered packages list.
*
* @param PackageInterface $package
*/
public function removePackage(PackageInterface $package);
} }

@ -189,8 +189,15 @@ abstract class BitbucketDriver extends VcsDriver
return $this->fallbackDriver->getFileContent($file, $identifier); return $this->fallbackDriver->getFileContent($file, $identifier);
} }
if (strpos($identifier, '/') !== false) {
$branches = $this->getBranches();
if (isset($branches[$identifier])) {
$identifier = $branches[$identifier];
}
}
$resource = sprintf( $resource = sprintf(
'https://api.bitbucket.org/1.0/repositories/%s/%s/raw/%s/%s', 'https://api.bitbucket.org/2.0/repositories/%s/%s/src/%s/%s',
$this->owner, $this->owner,
$this->repository, $this->repository,
$identifier, $identifier,
@ -421,11 +428,16 @@ abstract class BitbucketDriver extends VcsDriver
protected function getMainBranchData() protected function getMainBranchData()
{ {
$resource = sprintf( $resource = sprintf(
'https://api.bitbucket.org/1.0/repositories/%s/%s/main-branch', 'https://api.bitbucket.org/2.0/repositories/%s/%s?fields=mainbranch',
$this->owner, $this->owner,
$this->repository $this->repository
); );
return JsonFile::parseJson($this->getContentsWithOAuthCredentials($resource), $resource); $data = JsonFile::parseJson($this->getContentsWithOAuthCredentials($resource), $resource);
if (isset($data['mainbranch'])) {
return $data['mainbranch'];
}
return null;
} }
} }

@ -41,8 +41,10 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
private $drivers; private $drivers;
/** @var VcsDriverInterface */ /** @var VcsDriverInterface */
private $driver; private $driver;
/** @var VersionCacheInterface */
private $versionCache;
public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $dispatcher = null, array $drivers = null) public function __construct(array $repoConfig, IOInterface $io, Config $config, EventDispatcher $dispatcher = null, array $drivers = null, VersionCacheInterface $versionCache = null)
{ {
parent::__construct(); parent::__construct();
$this->drivers = $drivers ?: array( $this->drivers = $drivers ?: array(
@ -64,6 +66,7 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
$this->verbose = $io->isVeryVerbose(); $this->verbose = $io->isVeryVerbose();
$this->config = $config; $this->config = $config;
$this->repoConfig = $repoConfig; $this->repoConfig = $repoConfig;
$this->versionCache = $versionCache;
} }
public function getRepoConfig() public function getRepoConfig()
@ -152,6 +155,13 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
// strip the release- prefix from tags if present // strip the release- prefix from tags if present
$tag = str_replace('release-', '', $tag); $tag = str_replace('release-', '', $tag);
$cachedPackage = $this->getCachedPackageVersion($tag, $identifier, $verbose);
if ($cachedPackage) {
$this->addPackage($cachedPackage);
continue;
}
if (!$parsedTag = $this->validateTag($tag)) { if (!$parsedTag = $this->validateTag($tag)) {
if ($verbose) { if ($verbose) {
$this->io->writeError('<warning>Skipped tag '.$tag.', invalid tag name</warning>'); $this->io->writeError('<warning>Skipped tag '.$tag.', invalid tag name</warning>');
@ -188,7 +198,8 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
continue; continue;
} }
if ($existingPackage = $this->findPackage($data['name'], $data['version_normalized'])) { $tagPackageName = isset($data['name']) ? $data['name'] : $this->packageName;
if ($existingPackage = $this->findPackage($tagPackageName, $data['version_normalized'])) {
if ($verbose) { if ($verbose) {
$this->io->writeError('<warning>Skipped tag '.$tag.', it conflicts with an another tag ('.$existingPackage->getPrettyVersion().') as both resolve to '.$data['version_normalized'].' internally</warning>'); $this->io->writeError('<warning>Skipped tag '.$tag.', it conflicts with an another tag ('.$existingPackage->getPrettyVersion().') as both resolve to '.$data['version_normalized'].' internally</warning>');
} }
@ -235,6 +246,21 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
continue; continue;
} }
// make sure branch packages have a dev flag
if ('dev-' === substr($parsedBranch, 0, 4) || '9999999-dev' === $parsedBranch) {
$version = 'dev-' . $branch;
} else {
$prefix = substr($branch, 0, 1) === 'v' ? 'v' : '';
$version = $prefix . preg_replace('{(\.9{7})+}', '.x', $parsedBranch);
}
$cachedPackage = $this->getCachedPackageVersion($version, $identifier, $verbose);
if ($cachedPackage) {
$this->addPackage($cachedPackage);
continue;
}
try { try {
if (!$data = $driver->getComposerInformation($identifier)) { if (!$data = $driver->getComposerInformation($identifier)) {
if ($verbose) { if ($verbose) {
@ -244,17 +270,9 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
} }
// branches are always auto-versioned, read value from branch name // branches are always auto-versioned, read value from branch name
$data['version'] = $branch; $data['version'] = $version;
$data['version_normalized'] = $parsedBranch; $data['version_normalized'] = $parsedBranch;
// make sure branch packages have a dev flag
if ('dev-' === substr($parsedBranch, 0, 4) || '9999999-dev' === $parsedBranch) {
$data['version'] = 'dev-' . $data['version'];
} else {
$prefix = substr($branch, 0, 1) === 'v' ? 'v' : '';
$data['version'] = $prefix . preg_replace('{(\.9{7})+}', '.x', $parsedBranch);
}
if ($verbose) { if ($verbose) {
$this->io->writeError('Importing branch '.$branch.' ('.$data['version'].')'); $this->io->writeError('Importing branch '.$branch.' ('.$data['version'].')');
} }
@ -294,7 +312,8 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
protected function preProcess(VcsDriverInterface $driver, array $data, $identifier) protected function preProcess(VcsDriverInterface $driver, array $data, $identifier)
{ {
// keep the name of the main identifier for all packages // keep the name of the main identifier for all packages
$data['name'] = $this->packageName ?: $data['name']; $dataPackageName = isset($data['name']) ? $data['name'] : null;
$data['name'] = $this->packageName ?: $dataPackageName;
if (!isset($data['dist'])) { if (!isset($data['dist'])) {
$data['dist'] = $driver->getDist($identifier); $data['dist'] = $driver->getDist($identifier);
@ -325,4 +344,34 @@ class VcsRepository extends ArrayRepository implements ConfigurableRepositoryInt
return false; return false;
} }
private function getCachedPackageVersion($version, $identifier, $verbose)
{
if (!$this->versionCache) {
return;
}
$cachedPackage = $this->versionCache->getVersionPackage($version, $identifier);
if ($cachedPackage) {
$msg = 'Found cached composer.json of <info>' . ($this->packageName ?: $this->url) . '</info> (<comment>' . $version . '</comment>)';
if ($verbose) {
$this->io->writeError($msg);
} else {
$this->io->overwriteError($msg, false);
}
if ($existingPackage = $this->findPackage($cachedPackage['name'], $cachedPackage['version_normalized'])) {
if ($verbose) {
$this->io->writeError('<warning>Skipped cached version '.$version.', it conflicts with an another tag ('.$existingPackage->getPrettyVersion().') as both resolve to '.$cachedPackage['version_normalized'].' internally</warning>');
}
$cachedPackage = null;
}
}
if ($cachedPackage) {
return $this->loader->load($cachedPackage);
}
return null;
}
} }

@ -0,0 +1,23 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Repository;
interface VersionCacheInterface
{
/**
* @param string $version
* @param string $identifier
* @return array Package version data
*/
public function getVersionPackage($version, $identifier);
}

@ -41,7 +41,7 @@ class ErrorHandler
return; return;
} }
if (ini_get('xdebug.scream')) { if (filter_var(ini_get('xdebug.scream'), FILTER_VALIDATE_BOOLEAN)) {
$message .= "\n\nWarning: You have xdebug.scream enabled, the warning above may be". $message .= "\n\nWarning: You have xdebug.scream enabled, the warning above may be".
"\na legitimately suppressed error that you were not supposed to see."; "\na legitimately suppressed error that you were not supposed to see.";
} }

@ -264,8 +264,8 @@ class Filesystem
/** /**
* Copies a file or directory from $source to $target. * Copies a file or directory from $source to $target.
* *
* @param $source * @param string $source
* @param $target * @param string $target
* @return bool * @return bool
*/ */
public function copy($source, $target) public function copy($source, $target)

@ -35,7 +35,7 @@ class NoProxyPattern
* *
* @param string $url * @param string $url
* *
* @return true if the URL matches one of the rules. * @return bool true if the URL matches one of the rules.
*/ */
public function test($url) public function test($url)
{ {

@ -485,8 +485,7 @@ class Perforce
$resArray = explode(PHP_EOL, $result); $resArray = explode(PHP_EOL, $result);
$tags = array(); $tags = array();
foreach ($resArray as $line) { foreach ($resArray as $line) {
$index = strpos($line, 'Label'); if (strpos($line, 'Label') !== false) {
if (!($index === false)) {
$fields = explode(' ', $line); $fields = explode(' ', $line);
$tags[$fields[1]] = $this->getStream() . '@' . $fields[1]; $tags[$fields[1]] = $this->getStream() . '@' . $fields[1];
} }
@ -502,8 +501,7 @@ class Perforce
$result = $this->commandResult; $result = $this->commandResult;
$resArray = explode(PHP_EOL, $result); $resArray = explode(PHP_EOL, $result);
foreach ($resArray as $line) { foreach ($resArray as $line) {
$index = strpos($line, 'Depot'); if (strpos($line, 'Depot') !== false) {
if (!($index === false)) {
$fields = explode(' ', $line); $fields = explode(' ', $line);
if (strcmp($this->p4Depot, $fields[1]) === 0) { if (strcmp($this->p4Depot, $fields[1]) === 0) {
$this->p4DepotType = $fields[3]; $this->p4DepotType = $fields[3];
@ -517,7 +515,7 @@ class Perforce
} }
/** /**
* @param $reference * @param string $reference
* @return mixed|null * @return mixed|null
*/ */
protected function getChangeList($reference) protected function getChangeList($reference)
@ -539,8 +537,8 @@ class Perforce
} }
/** /**
* @param $fromReference * @param string $fromReference
* @param $toReference * @param string $toReference
* @return mixed|null * @return mixed|null
*/ */
public function getCommitLogs($fromReference, $toReference) public function getCommitLogs($fromReference, $toReference)

@ -60,7 +60,7 @@ class ProcessExecutor
$cwd = realpath(getcwd()); $cwd = realpath(getcwd());
} }
$this->captureOutput = count(func_get_args()) > 1; $this->captureOutput = func_num_args() > 1;
$this->errorOutput = null; $this->errorOutput = null;
$process = new Process($command, $cwd, null, null, static::getTimeout()); $process = new Process($command, $cwd, null, null, static::getTimeout());
@ -131,15 +131,11 @@ class ProcessExecutor
*/ */
public static function escape($argument) public static function escape($argument)
{ {
if (method_exists('Symfony\Component\Process\ProcessUtils', 'escapeArgument')) {
return ProcessUtils::escapeArgument($argument);
}
return self::escapeArgument($argument); return self::escapeArgument($argument);
} }
/** /**
* Copy of ProcessUtils::escapeArgument() that is removed in Symfony 4. * Copy of ProcessUtils::escapeArgument() that is deprecated in Symfony 3.3 and removed in Symfony 4.
* *
* @param string $argument * @param string $argument
* *

@ -114,13 +114,18 @@ class RemoteFilesystem
/** /**
* Merges new options * Merges new options
* *
* @return array $options * @param array $options
*/ */
public function setOptions(array $options) public function setOptions(array $options)
{ {
$this->options = array_replace_recursive($this->options, $options); $this->options = array_replace_recursive($this->options, $options);
} }
/**
* Check is disable TLS.
*
* @return bool
*/
public function isTlsDisabled() public function isTlsDisabled()
{ {
return $this->disableTls === true; return $this->disableTls === true;
@ -364,7 +369,7 @@ class RemoteFilesystem
} }
$result = false; $result = false;
} }
if ($errorMessage && !ini_get('allow_url_fopen')) { if ($errorMessage && !filter_var(ini_get('allow_url_fopen'), FILTER_VALIDATE_BOOLEAN)) {
$errorMessage = 'allow_url_fopen must be enabled in php.ini ('.$errorMessage.')'; $errorMessage = 'allow_url_fopen must be enabled in php.ini ('.$errorMessage.')';
} }
restore_error_handler(); restore_error_handler();
@ -385,15 +390,18 @@ class RemoteFilesystem
$statusCode = null; $statusCode = null;
$contentType = null; $contentType = null;
$locationHeader = null;
if (!empty($http_response_header[0])) { if (!empty($http_response_header[0])) {
$statusCode = $this->findStatusCode($http_response_header); $statusCode = $this->findStatusCode($http_response_header);
$contentType = $this->findHeaderValue($http_response_header, 'content-type'); $contentType = $this->findHeaderValue($http_response_header, 'content-type');
$locationHeader = $this->findHeaderValue($http_response_header, 'location');
} }
// check for bitbucket login page asking to authenticate // check for bitbucket login page asking to authenticate
if ($originUrl === 'bitbucket.org' if ($originUrl === 'bitbucket.org'
&& !$this->isPublicBitBucketDownload($fileUrl) && !$this->isPublicBitBucketDownload($fileUrl)
&& substr($fileUrl, -4) === '.zip' && substr($fileUrl, -4) === '.zip'
&& (!$locationHeader || substr($locationHeader, -4) !== '.zip')
&& $contentType && preg_match('{^text/html\b}i', $contentType) && $contentType && preg_match('{^text/html\b}i', $contentType)
) { ) {
$result = false; $result = false;

@ -160,7 +160,7 @@ final class StreamContextFactory
* This method fixes the array by moving the content-type header to the end * This method fixes the array by moving the content-type header to the end
* *
* @link https://bugs.php.net/bug.php?id=61548 * @link https://bugs.php.net/bug.php?id=61548
* @param $header * @param string|array $header
* @return array * @return array
*/ */
private static function fixHttpHeaderField($header) private static function fixHttpHeaderField($header)

@ -164,7 +164,7 @@ final class TlsHelper
* *
* @param string $certName CN/SAN * @param string $certName CN/SAN
* *
* @return callable|null * @return callable|void
*/ */
private static function certNameMatcher($certName) private static function certNameMatcher($certName)
{ {

@ -12,7 +12,7 @@
namespace Composer\Test; namespace Composer\Test;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\Finder;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;

@ -13,7 +13,7 @@
namespace Composer\Test; namespace Composer\Test;
use Composer\Console\Application; use Composer\Console\Application;
use Composer\TestCase; use Composer\Test\TestCase;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
class ApplicationTest extends TestCase class ApplicationTest extends TestCase

@ -17,7 +17,7 @@ use Composer\Package\Link;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Package\AliasPackage; use Composer\Package\AliasPackage;
use Composer\Package\Package; use Composer\Package\Package;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Script\ScriptEvents; use Composer\Script\ScriptEvents;
use Composer\Repository\InstalledRepositoryInterface; use Composer\Repository\InstalledRepositoryInterface;
use Composer\Installer\InstallationManager; use Composer\Installer\InstallationManager;

@ -19,7 +19,7 @@
namespace Composer\Test\Autoload; namespace Composer\Test\Autoload;
use Composer\Autoload\ClassMapGenerator; use Composer\Autoload\ClassMapGenerator;
use Composer\TestCase; use Composer\Test\TestCase;
use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\Finder;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;

@ -12,7 +12,7 @@
namespace Composer\Test; namespace Composer\Test;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
class CacheTest extends TestCase class CacheTest extends TestCase

@ -13,7 +13,7 @@
namespace Composer\Test\Command; namespace Composer\Test\Command;
use Composer\Command\InitCommand; use Composer\Command\InitCommand;
use Composer\TestCase; use Composer\Test\TestCase;
class InitCommandTest extends TestCase class InitCommandTest extends TestCase
{ {

@ -15,7 +15,7 @@ namespace Composer\Test\Command;
use Composer\Composer; use Composer\Composer;
use Composer\Config; use Composer\Config;
use Composer\Script\Event as ScriptEvent; use Composer\Script\Event as ScriptEvent;
use Composer\TestCase; use Composer\Test\TestCase;
class RunScriptCommandTest extends TestCase class RunScriptCommandTest extends TestCase
{ {

@ -13,7 +13,7 @@
namespace Composer\Test; namespace Composer\Test;
use Composer\Composer; use Composer\Composer;
use Composer\TestCase; use Composer\Test\TestCase;
class ComposerTest extends TestCase class ComposerTest extends TestCase
{ {

@ -10,11 +10,11 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Composer\Test\Json; namespace Composer\Test\Config;
use Composer\Config\JsonConfigSource; use Composer\Config\JsonConfigSource;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
class JsonConfigSourceTest extends TestCase class JsonConfigSourceTest extends TestCase

@ -13,7 +13,7 @@
namespace Composer\Test; namespace Composer\Test;
use Composer\Config; use Composer\Config;
use PHPUnit\Framework\TestCase; use Composer\Test\TestCase;
class ConfigTest extends TestCase class ConfigTest extends TestCase
{ {

@ -13,7 +13,7 @@
namespace Composer\Test; namespace Composer\Test;
use Composer\Config; use Composer\Config;
use PHPUnit\Framework\TestCase; use Composer\Test\TestCase;
class DefaultConfigTest extends TestCase class DefaultConfigTest extends TestCase
{ {

@ -20,8 +20,7 @@ use Composer\Package\Link;
use Composer\Package\AliasPackage; use Composer\Package\AliasPackage;
use Composer\Repository\RepositorySet; use Composer\Repository\RepositorySet;
use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\Constraint;
use Composer\TestCase; use Composer\Test\TestCase;
use http\Env\Request;
class DefaultPolicyTest extends TestCase class DefaultPolicyTest extends TestCase
{ {

@ -15,7 +15,7 @@ namespace Composer\Test\DependencyResolver;
use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Pool;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
use Composer\TestCase; use Composer\Test\TestCase;
class PoolTest extends TestCase class PoolTest extends TestCase
{ {

@ -14,7 +14,7 @@ namespace Composer\Test\DependencyResolver;
use Composer\DependencyResolver\Request; use Composer\DependencyResolver\Request;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\TestCase; use Composer\Test\TestCase;
class RequestTest extends TestCase class RequestTest extends TestCase
{ {

@ -18,7 +18,7 @@ use Composer\DependencyResolver\RuleSet;
use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Pool;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\TestCase; use Composer\Test\TestCase;
class RuleSetTest extends TestCase class RuleSetTest extends TestCase
{ {

@ -18,7 +18,7 @@ use Composer\DependencyResolver\RuleSet;
use Composer\DependencyResolver\Pool; use Composer\DependencyResolver\Pool;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\TestCase; use Composer\Test\TestCase;
class RuleTest extends TestCase class RuleTest extends TestCase
{ {

@ -22,7 +22,7 @@ use Composer\DependencyResolver\SolverProblemsException;
use Composer\Package\Link; use Composer\Package\Link;
use Composer\Repository\InstalledArrayRepository; use Composer\Repository\InstalledArrayRepository;
use Composer\Repository\RepositorySet; use Composer\Repository\RepositorySet;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Semver\Constraint\MultiConstraint; use Composer\Semver\Constraint\MultiConstraint;
class SolverTest extends TestCase class SolverTest extends TestCase

@ -13,7 +13,7 @@
namespace Composer\Test\Downloader; namespace Composer\Test\Downloader;
use Composer\Downloader\FileDownloader; use Composer\Downloader\FileDownloader;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
class FileDownloaderTest extends TestCase class FileDownloaderTest extends TestCase

@ -13,7 +13,7 @@
namespace Composer\Test\Downloader; namespace Composer\Test\Downloader;
use Composer\Downloader\FossilDownloader; use Composer\Downloader\FossilDownloader;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\Platform; use Composer\Util\Platform;

@ -14,7 +14,7 @@ namespace Composer\Test\Downloader;
use Composer\Downloader\GitDownloader; use Composer\Downloader\GitDownloader;
use Composer\Config; use Composer\Config;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\Platform; use Composer\Util\Platform;

@ -13,7 +13,7 @@
namespace Composer\Test\Downloader; namespace Composer\Test\Downloader;
use Composer\Downloader\HgDownloader; use Composer\Downloader\HgDownloader;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\Platform; use Composer\Util\Platform;

@ -13,7 +13,7 @@
namespace Composer\Test\Downloader; namespace Composer\Test\Downloader;
use Composer\Downloader\PearPackageExtractor; use Composer\Downloader\PearPackageExtractor;
use Composer\TestCase; use Composer\Test\TestCase;
class PearPackageExtractorTest extends TestCase class PearPackageExtractorTest extends TestCase
{ {

@ -16,7 +16,7 @@ use Composer\Downloader\PerforceDownloader;
use Composer\Config; use Composer\Config;
use Composer\Repository\VcsRepository; use Composer\Repository\VcsRepository;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
/** /**

@ -13,7 +13,7 @@
namespace Composer\Test\Downloader; namespace Composer\Test\Downloader;
use Composer\Downloader\XzDownloader; use Composer\Downloader\XzDownloader;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\Platform; use Composer\Util\Platform;
use Composer\Util\RemoteFilesystem; use Composer\Util\RemoteFilesystem;

@ -14,7 +14,7 @@ namespace Composer\Test\Downloader;
use Composer\Downloader\ZipDownloader; use Composer\Downloader\ZipDownloader;
use Composer\Package\PackageInterface; use Composer\Package\PackageInterface;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
class ZipDownloaderTest extends TestCase class ZipDownloaderTest extends TestCase
@ -24,6 +24,8 @@ class ZipDownloaderTest extends TestCase
*/ */
private $testDir; private $testDir;
private $prophet; private $prophet;
private $io;
private $config;
public function setUp() public function setUp()
{ {
@ -46,9 +48,9 @@ class ZipDownloaderTest extends TestCase
$reflectedProperty = $reflectionClass->getProperty($name); $reflectedProperty = $reflectionClass->getProperty($name);
$reflectedProperty->setAccessible(true); $reflectedProperty->setAccessible(true);
if ($obj === null) { if ($obj === null) {
$reflectedProperty = $reflectedProperty->setValue($value); $reflectedProperty->setValue($value);
} else { } else {
$reflectedProperty = $reflectedProperty->setValue($obj, $value); $reflectedProperty->setValue($obj, $value);
} }
} }

@ -17,7 +17,7 @@ use Composer\EventDispatcher\EventDispatcher;
use Composer\Installer\InstallerEvents; use Composer\Installer\InstallerEvents;
use Composer\Config; use Composer\Config;
use Composer\Composer; use Composer\Composer;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\IO\BufferIO; use Composer\IO\BufferIO;
use Composer\Script\ScriptEvents; use Composer\Script\ScriptEvents;
use Composer\Script\Event as ScriptEvent; use Composer\Script\Event as ScriptEvent;

@ -0,0 +1,40 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Test;
use Composer\Factory;
class FactoryTest extends TestCase
{
/**
* @group TLS
*/
public function testDefaultValuesAreAsExpected()
{
$ioMock = $this->getMockBuilder('Composer\IO\IOInterface')->getMock();
$ioMock->expects($this->once())
->method("writeError")
->with($this->equalTo('<warning>You are running Composer with SSL/TLS protection disabled.</warning>'));
$config = $this
->getMockBuilder('Composer\Config')
->getMock();
$config->method('get')
->with($this->equalTo('disable-tls'))
->will($this->returnValue(true));
Factory::createRemoteFilesystem($ioMock, $config);
}
}

@ -13,7 +13,7 @@
namespace Composer\Test\IO; namespace Composer\Test\IO;
use Composer\IO\ConsoleIO; use Composer\IO\ConsoleIO;
use Composer\TestCase; use Composer\Test\TestCase;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
class ConsoleIOTest extends TestCase class ConsoleIOTest extends TestCase

@ -13,7 +13,7 @@
namespace Composer\Test\IO; namespace Composer\Test\IO;
use Composer\IO\NullIO; use Composer\IO\NullIO;
use Composer\TestCase; use Composer\Test\TestCase;
class NullIOTest extends TestCase class NullIOTest extends TestCase
{ {

@ -14,7 +14,7 @@ namespace Composer\Test\Installer;
use Composer\Installer\LibraryInstaller; use Composer\Installer\LibraryInstaller;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Composer; use Composer\Composer;
use Composer\Config; use Composer\Config;

@ -30,7 +30,6 @@ use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\StreamOutput; use Symfony\Component\Console\Output\StreamOutput;
use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatter;
use Composer\TestCase;
class InstallerTest extends TestCase class InstallerTest extends TestCase
{ {

@ -19,7 +19,7 @@ use Composer\Repository\RepositoryManager;
use Composer\Repository\WritableRepositoryInterface; use Composer\Repository\WritableRepositoryInterface;
use Composer\Installer; use Composer\Installer;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\TestCase; use Composer\Test\TestCase;
class FactoryMock extends Factory class FactoryMock extends Factory
{ {

@ -13,7 +13,7 @@
namespace Composer\Test\Package\Archiver; namespace Composer\Test\Package\Archiver;
use Composer\Package\Archiver\ArchivableFilesFinder; use Composer\Package\Archiver\ArchivableFilesFinder;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;

@ -12,7 +12,7 @@
namespace Composer\Test\Package\Archiver; namespace Composer\Test\Package\Archiver;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\ProcessExecutor; use Composer\Util\ProcessExecutor;
use Composer\Package\Package; use Composer\Package\Package;

@ -14,7 +14,7 @@ namespace Composer\Test\Package;
use Composer\Package\Package; use Composer\Package\Package;
use Composer\Semver\VersionParser; use Composer\Semver\VersionParser;
use Composer\TestCase; use Composer\Test\TestCase;
class CompletePackageTest extends TestCase class CompletePackageTest extends TestCase
{ {

@ -14,7 +14,7 @@ namespace Composer\Test\Package;
use Composer\Package\Link; use Composer\Package\Link;
use Composer\Package\RootAliasPackage; use Composer\Package\RootAliasPackage;
use Composer\TestCase; use Composer\Test\TestCase;
use Prophecy\Argument; use Prophecy\Argument;
class RootAliasPackageTest extends TestCase class RootAliasPackageTest extends TestCase

@ -10,7 +10,7 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Composer\Test\Installer; namespace Composer\Test\Plugin;
use Composer\Composer; use Composer\Composer;
use Composer\Config; use Composer\Config;
@ -20,7 +20,7 @@ use Composer\Package\Loader\JsonLoader;
use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ArrayLoader;
use Composer\Plugin\PluginManager; use Composer\Plugin\PluginManager;
use Composer\Autoload\AutoloadGenerator; use Composer\Autoload\AutoloadGenerator;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
class PluginInstallerTest extends TestCase class PluginInstallerTest extends TestCase

@ -10,7 +10,7 @@
* file that was distributed with this source code. * file that was distributed with this source code.
*/ */
namespace Composer\Question\Test; namespace Composer\Test\Question;
use Composer\Question\StrictConfirmationQuestion; use Composer\Question\StrictConfirmationQuestion;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;

@ -14,7 +14,7 @@ namespace Composer\Test\Repository;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositoryInterface;
use Composer\TestCase; use Composer\Test\TestCase;
class ArrayRepositoryTest extends TestCase class ArrayRepositoryTest extends TestCase
{ {

@ -13,7 +13,7 @@
namespace Composer\Test\Repository; namespace Composer\Test\Repository;
use Composer\Repository\ArtifactRepository; use Composer\Repository\ArtifactRepository;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\IO\NullIO; use Composer\IO\NullIO;
use Composer\Config; use Composer\Config;
use Composer\Package\BasePackage; use Composer\Package\BasePackage;
@ -42,7 +42,7 @@ class ArtifactRepositoryTest extends TestCase
); );
$coordinates = array('type' => 'artifact', 'url' => __DIR__ . '/Fixtures/artifacts'); $coordinates = array('type' => 'artifact', 'url' => __DIR__ . '/Fixtures/artifacts');
$repo = new ArtifactRepository($coordinates, new NullIO(), new Config()); $repo = new ArtifactRepository($coordinates, new NullIO());
$foundPackages = array_map(function (BasePackage $package) { $foundPackages = array_map(function (BasePackage $package) {
return "{$package->getPrettyName()}-{$package->getPrettyVersion()}"; return "{$package->getPrettyName()}-{$package->getPrettyVersion()}";
@ -58,7 +58,7 @@ class ArtifactRepositoryTest extends TestCase
{ {
$absolutePath = __DIR__ . '/Fixtures/artifacts'; $absolutePath = __DIR__ . '/Fixtures/artifacts';
$coordinates = array('type' => 'artifact', 'url' => $absolutePath); $coordinates = array('type' => 'artifact', 'url' => $absolutePath);
$repo = new ArtifactRepository($coordinates, new NullIO(), new Config()); $repo = new ArtifactRepository($coordinates, new NullIO());
foreach ($repo->getPackages() as $package) { foreach ($repo->getPackages() as $package) {
$this->assertSame(strpos($package->getDistUrl(), strtr($absolutePath, '\\', '/')), 0); $this->assertSame(strpos($package->getDistUrl(), strtr($absolutePath, '\\', '/')), 0);
@ -69,7 +69,7 @@ class ArtifactRepositoryTest extends TestCase
{ {
$relativePath = 'tests/Composer/Test/Repository/Fixtures/artifacts'; $relativePath = 'tests/Composer/Test/Repository/Fixtures/artifacts';
$coordinates = array('type' => 'artifact', 'url' => $relativePath); $coordinates = array('type' => 'artifact', 'url' => $relativePath);
$repo = new ArtifactRepository($coordinates, new NullIO(), new Config()); $repo = new ArtifactRepository($coordinates, new NullIO());
foreach ($repo->getPackages() as $package) { foreach ($repo->getPackages() as $package) {
$this->assertSame(strpos($package->getDistUrl(), $relativePath), 0); $this->assertSame(strpos($package->getDistUrl(), $relativePath), 0);

@ -16,7 +16,7 @@ use Composer\IO\NullIO;
use Composer\Repository\ComposerRepository; use Composer\Repository\ComposerRepository;
use Composer\Repository\RepositoryInterface; use Composer\Repository\RepositoryInterface;
use Composer\Test\Mock\FactoryMock; use Composer\Test\Mock\FactoryMock;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ArrayLoader;
use Composer\Semver\VersionParser; use Composer\Semver\VersionParser;

@ -14,7 +14,7 @@ namespace Composer\Test\Repository;
use Composer\Repository\CompositeRepository; use Composer\Repository\CompositeRepository;
use Composer\Repository\ArrayRepository; use Composer\Repository\ArrayRepository;
use Composer\TestCase; use Composer\Test\TestCase;
class CompositeRepositoryTest extends TestCase class CompositeRepositoryTest extends TestCase
{ {

@ -13,7 +13,7 @@
namespace Composer\Test\Repository; namespace Composer\Test\Repository;
use Composer\Repository\FilesystemRepository; use Composer\Repository\FilesystemRepository;
use Composer\TestCase; use Composer\Test\TestCase;
class FilesystemRepositoryTest extends TestCase class FilesystemRepositoryTest extends TestCase
{ {

@ -15,7 +15,7 @@ namespace Composer\Test\Repository;
use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\ArrayLoader;
use Composer\Repository\PathRepository; use Composer\Repository\PathRepository;
use Composer\Semver\VersionParser; use Composer\Semver\VersionParser;
use Composer\TestCase; use Composer\Test\TestCase;
class PathRepositoryTest extends TestCase class PathRepositoryTest extends TestCase
{ {
@ -25,11 +25,10 @@ class PathRepositoryTest extends TestCase
->getMock(); ->getMock();
$config = new \Composer\Config(); $config = new \Composer\Config();
$loader = new ArrayLoader(new VersionParser());
$versionGuesser = null; $versionGuesser = null;
$repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'with-version')); $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'with-version'));
$repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config, $loader); $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config);
$repository->getPackages(); $repository->getPackages();
$this->assertEquals(1, $repository->count()); $this->assertEquals(1, $repository->count());
@ -42,11 +41,10 @@ class PathRepositoryTest extends TestCase
->getMock(); ->getMock();
$config = new \Composer\Config(); $config = new \Composer\Config();
$loader = new ArrayLoader(new VersionParser());
$versionGuesser = null; $versionGuesser = null;
$repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'without-version')); $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', 'without-version'));
$repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config, $loader); $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config);
$packages = $repository->getPackages(); $packages = $repository->getPackages();
$this->assertEquals(1, $repository->count()); $this->assertEquals(1, $repository->count());
@ -64,11 +62,10 @@ class PathRepositoryTest extends TestCase
->getMock(); ->getMock();
$config = new \Composer\Config(); $config = new \Composer\Config();
$loader = new ArrayLoader(new VersionParser());
$versionGuesser = null; $versionGuesser = null;
$repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*')); $repositoryUrl = implode(DIRECTORY_SEPARATOR, array(__DIR__, 'Fixtures', 'path', '*'));
$repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config, $loader); $repository = new PathRepository(array('url' => $repositoryUrl), $ioInterface, $config);
$packages = $repository->getPackages(); $packages = $repository->getPackages();
$names = array(); $names = array();
@ -93,7 +90,6 @@ class PathRepositoryTest extends TestCase
->getMock(); ->getMock();
$config = new \Composer\Config(); $config = new \Composer\Config();
$loader = new ArrayLoader(new VersionParser());
$versionGuesser = null; $versionGuesser = null;
// realpath() does not fully expand the paths // realpath() does not fully expand the paths
@ -103,7 +99,7 @@ class PathRepositoryTest extends TestCase
// PHP Bug https://bugs.php.net/bug.php?id=73797 // PHP Bug https://bugs.php.net/bug.php?id=73797
$relativeUrl = ltrim(substr($repositoryUrl, strlen(realpath(realpath(getcwd())))), DIRECTORY_SEPARATOR); $relativeUrl = ltrim(substr($repositoryUrl, strlen(realpath(realpath(getcwd())))), DIRECTORY_SEPARATOR);
$repository = new PathRepository(array('url' => $relativeUrl), $ioInterface, $config, $loader); $repository = new PathRepository(array('url' => $relativeUrl), $ioInterface, $config);
$packages = $repository->getPackages(); $packages = $repository->getPackages();
$this->assertEquals(1, $repository->count()); $this->assertEquals(1, $repository->count());

@ -17,7 +17,7 @@ use Composer\Repository\Pear\DependencyConstraint;
use Composer\Repository\Pear\DependencyInfo; use Composer\Repository\Pear\DependencyInfo;
use Composer\Repository\Pear\PackageInfo; use Composer\Repository\Pear\PackageInfo;
use Composer\Repository\Pear\ReleaseInfo; use Composer\Repository\Pear\ReleaseInfo;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Semver\VersionParser; use Composer\Semver\VersionParser;
use Composer\Semver\Constraint\Constraint; use Composer\Semver\Constraint\Constraint;
use Composer\Package\Link; use Composer\Package\Link;

@ -12,7 +12,7 @@
namespace Composer\Test\Repository\Pear; namespace Composer\Test\Repository\Pear;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Test\Mock\RemoteFilesystemMock; use Composer\Test\Mock\RemoteFilesystemMock;
class ChannelRest10ReaderTest extends TestCase class ChannelRest10ReaderTest extends TestCase
@ -31,7 +31,7 @@ class ChannelRest10ReaderTest extends TestCase
$reader = new \Composer\Repository\Pear\ChannelRest10Reader($rfs); $reader = new \Composer\Repository\Pear\ChannelRest10Reader($rfs);
/** @var $packages \Composer\Package\PackageInterface[] */ /** @var \Composer\Package\PackageInterface[] $packages */
$packages = $reader->read('http://test.loc/rest10'); $packages = $reader->read('http://test.loc/rest10');
$this->assertCount(2, $packages); $this->assertCount(2, $packages);

@ -12,7 +12,7 @@
namespace Composer\Test\Repository\Pear; namespace Composer\Test\Repository\Pear;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Test\Mock\RemoteFilesystemMock; use Composer\Test\Mock\RemoteFilesystemMock;
class ChannelRest11ReaderTest extends TestCase class ChannelRest11ReaderTest extends TestCase
@ -27,7 +27,7 @@ class ChannelRest11ReaderTest extends TestCase
$reader = new \Composer\Repository\Pear\ChannelRest11Reader($rfs); $reader = new \Composer\Repository\Pear\ChannelRest11Reader($rfs);
/** @var $packages \Composer\Package\PackageInterface[] */ /** @var \Composer\Package\PackageInterface[] $packages */
$packages = $reader->read('http://test.loc/rest11'); $packages = $reader->read('http://test.loc/rest11');
$this->assertCount(3, $packages); $this->assertCount(3, $packages);

@ -14,7 +14,7 @@ namespace Composer\Test\Repository\Pear;
use Composer\Repository\Pear\DependencyConstraint; use Composer\Repository\Pear\DependencyConstraint;
use Composer\Repository\Pear\PackageDependencyParser; use Composer\Repository\Pear\PackageDependencyParser;
use Composer\TestCase; use Composer\Test\TestCase;
class PackageDependencyParserTest extends TestCase class PackageDependencyParserTest extends TestCase
{ {

@ -13,7 +13,7 @@
namespace Composer\Test\Repository; namespace Composer\Test\Repository;
use Composer\Repository\PearRepository; use Composer\Repository\PearRepository;
use Composer\TestCase; use Composer\Test\TestCase;
/** /**
* @group legacy * @group legacy

@ -13,7 +13,7 @@
namespace Composer\Test\Repository; namespace Composer\Test\Repository;
use Composer\Repository\RepositoryFactory; use Composer\Repository\RepositoryFactory;
use Composer\TestCase; use Composer\Test\TestCase;
class RepositoryFactoryTest extends TestCase class RepositoryFactoryTest extends TestCase
{ {

@ -13,7 +13,7 @@
namespace Composer\Test\Repository; namespace Composer\Test\Repository;
use Composer\Repository\RepositoryManager; use Composer\Repository\RepositoryManager;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
class RepositoryManagerTest extends TestCase class RepositoryManagerTest extends TestCase

@ -14,7 +14,7 @@ namespace Composer\Test\Repository\Vcs;
use Composer\Repository\Vcs\FossilDriver; use Composer\Repository\Vcs\FossilDriver;
use Composer\Config; use Composer\Config;
use Composer\TestCase; use Composer\Test\TestCase;
use Composer\Util\Filesystem; use Composer\Util\Filesystem;
use Composer\Util\Platform; use Composer\Util\Platform;

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save