1
0
Fork 0

Merge branch 'simplify-output'

pull/5636/merge
Jordi Boggiano 2016-12-11 16:24:01 +01:00
commit 4d77ffcb4a
13 changed files with 79 additions and 54 deletions

View File

@ -28,14 +28,14 @@ abstract class ArchiveDownloader extends FileDownloader
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function download(PackageInterface $package, $path) public function download(PackageInterface $package, $path, $output = true)
{ {
$temporaryDir = $this->config->get('vendor-dir').'/composer/'.substr(md5(uniqid('', true)), 0, 8); $temporaryDir = $this->config->get('vendor-dir').'/composer/'.substr(md5(uniqid('', true)), 0, 8);
$retries = 3; $retries = 3;
while ($retries--) { while ($retries--) {
$fileName = parent::download($package, $path); $fileName = parent::download($package, $path, $output);
$this->io->writeError(' Extracting archive', true, IOInterface::VERBOSE); $this->io->writeError(' Extracting archive', false, IOInterface::VERBOSE);
try { try {
$this->filesystem->ensureDirectoryExists($temporaryDir); $this->filesystem->ensureDirectoryExists($temporaryDir);
@ -76,6 +76,7 @@ abstract class ArchiveDownloader extends FileDownloader
// retry downloading if we have an invalid zip file // retry downloading if we have an invalid zip file
if ($retries && $e instanceof \UnexpectedValueException && class_exists('ZipArchive') && $e->getCode() === \ZipArchive::ER_NOZIP) { if ($retries && $e instanceof \UnexpectedValueException && class_exists('ZipArchive') && $e->getCode() === \ZipArchive::ER_NOZIP) {
$this->io->writeError('');
if ($this->io->isDebug()) { if ($this->io->isDebug()) {
$this->io->writeError(' Invalid zip file ('.$e->getMessage().'), retrying...'); $this->io->writeError(' Invalid zip file ('.$e->getMessage().'), retrying...');
} else { } else {
@ -91,7 +92,9 @@ abstract class ArchiveDownloader extends FileDownloader
break; break;
} }
$this->io->writeError(''); if ($output) {
$this->io->writeError('');
}
} }
/** /**

View File

@ -77,13 +77,15 @@ class FileDownloader implements DownloaderInterface
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function download(PackageInterface $package, $path) public function download(PackageInterface $package, $path, $output = true)
{ {
if (!$package->getDistUrl()) { if (!$package->getDistUrl()) {
throw new \InvalidArgumentException('The given package is missing url information'); throw new \InvalidArgumentException('The given package is missing url information');
} }
$this->io->writeError(" - Installing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); if ($output) {
$this->io->writeError(" - Installing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)", false);
}
$urls = $package->getDistUrls(); $urls = $package->getDistUrls();
while ($url = array_shift($urls)) { while ($url = array_shift($urls)) {
@ -95,7 +97,7 @@ class FileDownloader implements DownloaderInterface
$this->io->writeError('Failed: ['.get_class($e).'] '.$e->getCode().': '.$e->getMessage()); $this->io->writeError('Failed: ['.get_class($e).'] '.$e->getCode().': '.$e->getMessage());
} elseif (count($urls)) { } elseif (count($urls)) {
$this->io->writeError(''); $this->io->writeError('');
$this->io->writeError(' Failed, trying the next URL ('.$e->getCode().': '.$e->getMessage().')'); $this->io->writeError(' Failed, trying the next URL ('.$e->getCode().': '.$e->getMessage().')', false);
} }
if (!count($urls)) { if (!count($urls)) {
@ -104,7 +106,9 @@ class FileDownloader implements DownloaderInterface
} }
} }
$this->io->writeError(''); if ($output) {
$this->io->writeError('');
}
} }
protected function doDownload(PackageInterface $package, $path, $url) protected function doDownload(PackageInterface $package, $path, $url)
@ -129,7 +133,7 @@ class FileDownloader implements DownloaderInterface
// download if we don't have it in cache or the cache is invalidated // download if we don't have it in cache or the cache is invalidated
if (!$this->cache || ($checksum && $checksum !== $this->cache->sha1($cacheKey)) || !$this->cache->copyTo($cacheKey, $fileName)) { if (!$this->cache || ($checksum && $checksum !== $this->cache->sha1($cacheKey)) || !$this->cache->copyTo($cacheKey, $fileName)) {
if (!$this->outputProgress) { if (!$this->outputProgress) {
$this->io->writeError(' Downloading'); $this->io->writeError(' Downloading', false);
} }
// try to download 3 times then fail hard // try to download 3 times then fail hard
@ -143,6 +147,7 @@ class FileDownloader implements DownloaderInterface
if ((0 !== $e->getCode() && !in_array($e->getCode(), array(500, 502, 503, 504))) || !$retries) { if ((0 !== $e->getCode() && !in_array($e->getCode(), array(500, 502, 503, 504))) || !$retries) {
throw $e; throw $e;
} }
$this->io->writeError('');
$this->io->writeError(' Download failed, retrying...', true, IOInterface::VERBOSE); $this->io->writeError(' Download failed, retrying...', true, IOInterface::VERBOSE);
usleep(500000); usleep(500000);
} }
@ -153,7 +158,7 @@ class FileDownloader implements DownloaderInterface
$this->cache->copyFrom($cacheKey, $fileName); $this->cache->copyFrom($cacheKey, $fileName);
} }
} else { } else {
$this->io->writeError(' Loading from cache'); $this->io->writeError(' Loading from cache', false);
} }
if (!file_exists($fileName)) { if (!file_exists($fileName)) {
@ -197,16 +202,26 @@ class FileDownloader implements DownloaderInterface
*/ */
public function update(PackageInterface $initial, PackageInterface $target, $path) public function update(PackageInterface $initial, PackageInterface $target, $path)
{ {
$this->remove($initial, $path); $name = $target->getName();
$this->download($target, $path); $from = $initial->getPrettyVersion();
$to = $target->getPrettyVersion();
$this->io->writeError(" - Updating <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>)", false);
$this->remove($initial, $path, false);
$this->download($target, $path, false);
$this->io->writeError('');
} }
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function remove(PackageInterface $package, $path) public function remove(PackageInterface $package, $path, $output = true)
{ {
$this->io->writeError(" - Removing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); if ($output) {
$this->io->writeError(" - Removing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)");
}
if (!$this->filesystem->removeDirectory($path)) { if (!$this->filesystem->removeDirectory($path)) {
throw new \RuntimeException('Could not completely delete '.$path.', aborting.'); throw new \RuntimeException('Could not completely delete '.$path.', aborting.');
} }

View File

@ -31,7 +31,7 @@ class FossilDownloader extends VcsDownloader
$url = ProcessExecutor::escape($url); $url = ProcessExecutor::escape($url);
$ref = ProcessExecutor::escape($package->getSourceReference()); $ref = ProcessExecutor::escape($package->getSourceReference());
$repoFile = $path . '.fossil'; $repoFile = $path . '.fossil';
$this->io->writeError(" Cloning ".$package->getSourceReference()); $this->io->writeError(" Cloning ".$package->getSourceReference());
$command = sprintf('fossil clone %s %s', $url, ProcessExecutor::escape($repoFile)); $command = sprintf('fossil clone %s %s', $url, ProcessExecutor::escape($repoFile));
if (0 !== $this->process->execute($command, $ignoredOutput)) { if (0 !== $this->process->execute($command, $ignoredOutput)) {
throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
@ -56,7 +56,7 @@ class FossilDownloader extends VcsDownloader
$url = ProcessExecutor::escape($url); $url = ProcessExecutor::escape($url);
$ref = ProcessExecutor::escape($target->getSourceReference()); $ref = ProcessExecutor::escape($target->getSourceReference());
$this->io->writeError(" Updating to ".$target->getSourceReference()); $this->io->writeError(" Updating to ".$target->getSourceReference());
if (!$this->hasMetadataRepository($path)) { if (!$this->hasMetadataRepository($path)) {
throw new \RuntimeException('The .fslckout file is missing from '.$path.', see https://getcomposer.org/commit-deps for more information'); throw new \RuntimeException('The .fslckout file is missing from '.$path.', see https://getcomposer.org/commit-deps for more information');

View File

@ -49,14 +49,15 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface
// --dissociate option is only available since git 2.3.0-rc0 // --dissociate option is only available since git 2.3.0-rc0
$gitVersion = $this->gitUtil->getVersion(); $gitVersion = $this->gitUtil->getVersion();
$msg = " Cloning ".$ref; $msg = " Cloning ".$ref;
if ($gitVersion && version_compare($gitVersion, '2.3.0-rc0', '>=')) { if ($gitVersion && version_compare($gitVersion, '2.3.0-rc0', '>=')) {
$this->io->writeError('', true, IOInterface::DEBUG);
$this->io->writeError(sprintf(' Cloning to cache at %s', ProcessExecutor::escape($cachePath)), true, IOInterface::DEBUG); $this->io->writeError(sprintf(' Cloning to cache at %s', ProcessExecutor::escape($cachePath)), true, IOInterface::DEBUG);
try { try {
$this->gitUtil->syncMirror($url, $cachePath); $this->gitUtil->syncMirror($url, $cachePath);
if (is_dir($cachePath)) { if (is_dir($cachePath)) {
$cacheOptions = sprintf('--dissociate --reference %s ', ProcessExecutor::escape($cachePath)); $cacheOptions = sprintf('--dissociate --reference %s ', ProcessExecutor::escape($cachePath));
$msg = " Cloning ".$ref.' from cache'; $msg = " Cloning ".$ref.' from cache';
} }
} catch (\RuntimeException $e) {} } catch (\RuntimeException $e) {}
} }
@ -104,7 +105,7 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface
} }
$ref = $target->getSourceReference(); $ref = $target->getSourceReference();
$this->io->writeError(" Checking out ".$ref); $this->io->writeError(" Checking out ".$ref);
$command = 'git remote set-url composer %s && git rev-parse --quiet --verify %s^{commit} || (git fetch composer && git fetch --tags composer)'; $command = 'git remote set-url composer %s && git rev-parse --quiet --verify %s^{commit} || (git fetch composer && git fetch --tags composer)';
$commandCallable = function ($url) use ($command, $ref) { $commandCallable = function ($url) use ($command, $ref) {

View File

@ -30,7 +30,7 @@ class HgDownloader extends VcsDownloader
$url = ProcessExecutor::escape($url); $url = ProcessExecutor::escape($url);
$ref = ProcessExecutor::escape($package->getSourceReference()); $ref = ProcessExecutor::escape($package->getSourceReference());
$this->io->writeError(" Cloning ".$package->getSourceReference()); $this->io->writeError(" Cloning ".$package->getSourceReference());
$command = sprintf('hg clone %s %s', $url, ProcessExecutor::escape($path)); $command = sprintf('hg clone %s %s', $url, ProcessExecutor::escape($path));
if (0 !== $this->process->execute($command, $ignoredOutput)) { if (0 !== $this->process->execute($command, $ignoredOutput)) {
throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput());
@ -51,7 +51,7 @@ class HgDownloader extends VcsDownloader
$url = ProcessExecutor::escape($url); $url = ProcessExecutor::escape($url);
$ref = ProcessExecutor::escape($target->getSourceReference()); $ref = ProcessExecutor::escape($target->getSourceReference());
$this->io->writeError(" Updating to ".$target->getSourceReference()); $this->io->writeError(" Updating to ".$target->getSourceReference());
if (!$this->hasMetadataRepository($path)) { if (!$this->hasMetadataRepository($path)) {
throw new \RuntimeException('The .hg directory is missing from '.$path.', see https://getcomposer.org/commit-deps for more information'); throw new \RuntimeException('The .hg directory is missing from '.$path.', see https://getcomposer.org/commit-deps for more information');

View File

@ -35,7 +35,7 @@ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInter
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function download(PackageInterface $package, $path) public function download(PackageInterface $package, $path, $output = true)
{ {
$url = $package->getDistUrl(); $url = $package->getDistUrl();
$realUrl = realpath($url); $realUrl = realpath($url);
@ -75,18 +75,21 @@ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInter
$fileSystem = new Filesystem(); $fileSystem = new Filesystem();
$this->filesystem->removeDirectory($path); $this->filesystem->removeDirectory($path);
$this->io->writeError(sprintf( if ($output) {
' - Installing <info>%s</info> (<comment>%s</comment>)', $this->io->writeError(sprintf(
$package->getName(), ' - Installing <info>%s</info> (<comment>%s</comment>)',
$package->getFullPrettyVersion() $package->getName(),
)); $package->getFullPrettyVersion()
), false);
}
$isFallback = false;
if (self::STRATEGY_SYMLINK == $currentStrategy) { if (self::STRATEGY_SYMLINK == $currentStrategy) {
try { try {
if (Platform::isWindows()) { if (Platform::isWindows()) {
// Implement symlinks as NTFS junctions on Windows // Implement symlinks as NTFS junctions on Windows
$this->filesystem->junction($realUrl, $path); $this->filesystem->junction($realUrl, $path);
$this->io->writeError(sprintf(' Junctioned from %s', $url)); $this->io->writeError(sprintf(' Junctioned from %s', $url), false);
} else { } else {
$absolutePath = $path; $absolutePath = $path;
if (!$this->filesystem->isAbsolutePath($absolutePath)) { if (!$this->filesystem->isAbsolutePath($absolutePath)) {
@ -95,12 +98,14 @@ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInter
$shortestPath = $this->filesystem->findShortestPath($absolutePath, $realUrl); $shortestPath = $this->filesystem->findShortestPath($absolutePath, $realUrl);
$path = rtrim($path, "/"); $path = rtrim($path, "/");
$fileSystem->symlink($shortestPath, $path); $fileSystem->symlink($shortestPath, $path);
$this->io->writeError(sprintf(' Symlinked from %s', $url)); $this->io->writeError(sprintf(' Symlinked from %s', $url), false);
} }
} catch (IOException $e) { } catch (IOException $e) {
if (in_array(self::STRATEGY_MIRROR, $allowedStrategies)) { if (in_array(self::STRATEGY_MIRROR, $allowedStrategies)) {
$this->io->writeError('');
$this->io->writeError(' <error>Symlink failed, fallback to use mirroring!</error>'); $this->io->writeError(' <error>Symlink failed, fallback to use mirroring!</error>');
$currentStrategy = self::STRATEGY_MIRROR; $currentStrategy = self::STRATEGY_MIRROR;
$isFallback = true;
} else { } else {
throw new \RuntimeException(sprintf('Symlink from "%s" to "%s" failed!', $realUrl, $path)); throw new \RuntimeException(sprintf('Symlink from "%s" to "%s" failed!', $realUrl, $path));
} }
@ -110,7 +115,7 @@ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInter
// Fallback if symlink failed or if symlink is not allowed for the package // Fallback if symlink failed or if symlink is not allowed for the package
if (self::STRATEGY_MIRROR == $currentStrategy) { if (self::STRATEGY_MIRROR == $currentStrategy) {
$fileSystem->mirror($realUrl, $path); $fileSystem->mirror($realUrl, $path);
$this->io->writeError(sprintf(' Mirrored from %s', $url)); $this->io->writeError(sprintf('%s Mirrored from %s', $isFallback ? ' ' : '', $url), false);
} }
$this->io->writeError(''); $this->io->writeError('');
@ -119,7 +124,7 @@ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInter
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function remove(PackageInterface $package, $path) public function remove(PackageInterface $package, $path, $output = true)
{ {
/** /**
* For junctions don't blindly rely on Filesystem::removeDirectory as it may be overzealous. If a process * For junctions don't blindly rely on Filesystem::removeDirectory as it may be overzealous. If a process
@ -127,9 +132,11 @@ class PathDownloader extends FileDownloader implements VcsCapableDownloaderInter
* is disastrous within a junction. So in that case we have no other real choice but to fail hard. * is disastrous within a junction. So in that case we have no other real choice but to fail hard.
*/ */
if (Platform::isWindows() && $this->filesystem->isJunction($path)) { if (Platform::isWindows() && $this->filesystem->isJunction($path)) {
$this->io->writeError(" - Removing junction for <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); if ($output) {
$this->io->writeError(" - Removing junction for <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)");
}
if (!$this->filesystem->removeJunction($path)) { if (!$this->filesystem->removeJunction($path)) {
$this->io->writeError("<warn>Could not remove junction at " . $path . " - is another process locking it?</warn>"); $this->io->writeError(" <warn>Could not remove junction at " . $path . " - is another process locking it?</warn>");
throw new \RuntimeException('Could not reliably remove junction for package ' . $package->getName()); throw new \RuntimeException('Could not reliably remove junction for package ' . $package->getName());
} }
} else { } else {

View File

@ -32,7 +32,7 @@ class PerforceDownloader extends VcsDownloader
$ref = $package->getSourceReference(); $ref = $package->getSourceReference();
$label = $this->getLabelFromSourceReference($ref); $label = $this->getLabelFromSourceReference($ref);
$this->io->writeError(' Cloning ' . $ref); $this->io->writeError(' Cloning ' . $ref);
$this->initPerforce($package, $path, $url); $this->initPerforce($package, $path, $url);
$this->perforce->setStream($ref); $this->perforce->setStream($ref);
$this->perforce->p4Login(); $this->perforce->p4Login();

View File

@ -40,7 +40,7 @@ class SvnDownloader extends VcsDownloader
} }
} }
$this->io->writeError(" Checking out ".$package->getSourceReference()); $this->io->writeError(" Checking out ".$package->getSourceReference());
$this->execute($url, "svn co", sprintf("%s/%s", $url, $ref), null, $path); $this->execute($url, "svn co", sprintf("%s/%s", $url, $ref), null, $path);
} }
@ -63,7 +63,7 @@ class SvnDownloader extends VcsDownloader
} }
} }
$this->io->writeError(" Checking out " . $ref); $this->io->writeError(" Checking out " . $ref);
$this->execute($url, "svn switch" . $flags, sprintf("%s/%s", $url, $ref), $path); $this->execute($url, "svn switch" . $flags, sprintf("%s/%s", $url, $ref), $path);
} }

View File

@ -60,7 +60,7 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa
throw new \InvalidArgumentException('Package '.$package->getPrettyName().' is missing reference information'); throw new \InvalidArgumentException('Package '.$package->getPrettyName().' is missing reference information');
} }
$this->io->writeError(" - Installing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)"); $this->io->writeError(" - Installing <info>" . $package->getName() . "</info> (<comment>" . $package->getFullPrettyVersion() . "</comment>)", false);
$this->filesystem->emptyDirectory($path); $this->filesystem->emptyDirectory($path);
$urls = $package->getSourceUrls(); $urls = $package->getSourceUrls();
@ -104,8 +104,6 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa
} }
} }
} }
$this->io->writeError('');
} }
/** /**
@ -132,7 +130,7 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa
$to = $target->getFullPrettyVersion(); $to = $target->getFullPrettyVersion();
} }
$this->io->writeError(" - Updating <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>)"); $this->io->writeError(" - Updating <info>" . $name . "</info> (<comment>" . $from . "</comment> => <comment>" . $to . "</comment>)", false);
$this->cleanChanges($initial, $path, true); $this->cleanChanges($initial, $path, true);
$urls = $target->getSourceUrls(); $urls = $target->getSourceUrls();
@ -189,8 +187,6 @@ abstract class VcsDownloader implements DownloaderInterface, ChangeReportInterfa
if (!$urls && $exception) { if (!$urls && $exception) {
throw $exception; throw $exception;
} }
$this->io->writeError('');
} }
/** /**

View File

@ -41,7 +41,7 @@ class ZipDownloader extends ArchiveDownloader
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
public function download(PackageInterface $package, $path) public function download(PackageInterface $package, $path, $output = true)
{ {
if (null === self::$hasSystemUnzip) { if (null === self::$hasSystemUnzip) {
$finder = new ExecutableFinder; $finder = new ExecutableFinder;
@ -56,7 +56,7 @@ class ZipDownloader extends ArchiveDownloader
throw new \RuntimeException($error); throw new \RuntimeException($error);
} }
return parent::download($package, $path); return parent::download($package, $path, $output);
} }
protected function extract($file, $path) protected function extract($file, $path)

View File

@ -577,10 +577,8 @@ class Installer
// output non-alias ops when not executing operations (i.e. dry run), output alias ops in debug verbosity // output non-alias ops when not executing operations (i.e. dry run), output alias ops in debug verbosity
if (!$this->executeOperations && false === strpos($operation->getJobType(), 'Alias')) { if (!$this->executeOperations && false === strpos($operation->getJobType(), 'Alias')) {
$this->io->writeError(' - ' . $operation); $this->io->writeError(' - ' . $operation);
$this->io->writeError('');
} elseif ($this->io->isDebug() && false !== strpos($operation->getJobType(), 'Alias')) { } elseif ($this->io->isDebug() && false !== strpos($operation->getJobType(), 'Alias')) {
$this->io->writeError(' - ' . $operation); $this->io->writeError(' - ' . $operation);
$this->io->writeError('');
} }
$this->installationManager->execute($localRepo, $operation); $this->installationManager->execute($localRepo, $operation);

View File

@ -276,7 +276,7 @@ class RemoteFilesystem
} }
if ($this->progress && !$isRedirect) { if ($this->progress && !$isRedirect) {
$this->io->writeError(" Downloading: <comment>Connecting...</comment>", false); $this->io->writeError(" Downloading: <comment>Connecting...</comment>", false);
} }
$errorMessage = ''; $errorMessage = '';
@ -325,6 +325,7 @@ class RemoteFilesystem
if (isset($e) && !$this->retry) { if (isset($e) && !$this->retry) {
if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) { if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) {
$this->degradedMode = true; $this->degradedMode = true;
$this->io->writeError('');
$this->io->writeError(array( $this->io->writeError(array(
'<error>'.$e->getMessage().'</error>', '<error>'.$e->getMessage().'</error>',
'<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>', '<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>',
@ -366,7 +367,7 @@ class RemoteFilesystem
if ($statusCode && $statusCode >= 400 && $statusCode <= 599) { if ($statusCode && $statusCode >= 400 && $statusCode <= 599) {
if (!$this->retry) { if (!$this->retry) {
if ($this->progress && !$this->retry && !$isRedirect) { if ($this->progress && !$this->retry && !$isRedirect) {
$this->io->overwriteError(" Downloading: <error>Failed</error>"); $this->io->overwriteError(" Downloading: <error>Failed</error>", false);
} }
$e = new TransportException('The "'.$this->fileUrl.'" file could not be downloaded ('.$http_response_header[0].')', $statusCode); $e = new TransportException('The "'.$this->fileUrl.'" file could not be downloaded ('.$http_response_header[0].')', $statusCode);
@ -379,7 +380,7 @@ class RemoteFilesystem
} }
if ($this->progress && !$this->retry && !$isRedirect) { if ($this->progress && !$this->retry && !$isRedirect) {
$this->io->overwriteError(" Downloading: ".($result === false ? '<error>Failed</error>' : '<comment>100%</comment>')); $this->io->overwriteError(" Downloading: ".($result === false ? '<error>Failed</error>' : '<comment>100%</comment>'), false);
} }
// decode gzip // decode gzip
@ -405,6 +406,7 @@ class RemoteFilesystem
$this->degradedMode = true; $this->degradedMode = true;
$this->io->writeError(array( $this->io->writeError(array(
'',
'<error>Failed to decode response: '.$e->getMessage().'</error>', '<error>Failed to decode response: '.$e->getMessage().'</error>',
'<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>', '<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>',
)); ));
@ -461,6 +463,7 @@ class RemoteFilesystem
$this->retry = true; $this->retry = true;
} }
} else { } else {
$this->io->writeError('');
$this->io->writeError(sprintf( $this->io->writeError(sprintf(
'<error>Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.</error>', '<error>Your version of PHP, %s, is affected by CVE-2013-6420 and cannot safely perform certificate validation, we strongly suggest you upgrade.</error>',
PHP_VERSION PHP_VERSION
@ -490,6 +493,7 @@ class RemoteFilesystem
if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) { if (!$this->degradedMode && false !== strpos($e->getMessage(), 'Operation timed out')) {
$this->degradedMode = true; $this->degradedMode = true;
$this->io->writeError('');
$this->io->writeError(array( $this->io->writeError(array(
'<error>'.$e->getMessage().'</error>', '<error>'.$e->getMessage().'</error>',
'<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>', '<error>Retrying with degraded mode, check https://getcomposer.org/doc/articles/troubleshooting.md#degraded-mode for more info</error>',
@ -563,7 +567,7 @@ class RemoteFilesystem
if ((0 === $progression % 5) && 100 !== $progression && $progression !== $this->lastProgress) { if ((0 === $progression % 5) && 100 !== $progression && $progression !== $this->lastProgress) {
$this->lastProgress = $progression; $this->lastProgress = $progression;
$this->io->overwriteError(" Downloading: <comment>$progression%</comment>", false); $this->io->overwriteError(" Downloading: <comment>$progression%</comment>", false);
} }
} }
break; break;
@ -638,7 +642,8 @@ class RemoteFilesystem
throw new TransportException("Invalid credentials for '" . $this->fileUrl . "', aborting.", $httpStatus); throw new TransportException("Invalid credentials for '" . $this->fileUrl . "', aborting.", $httpStatus);
} }
$this->io->overwriteError(' Authentication required (<info>'.parse_url($this->fileUrl, PHP_URL_HOST).'</info>):'); $this->io->overwriteError('');
$this->io->writeError(' Authentication required (<info>'.parse_url($this->fileUrl, PHP_URL_HOST).'</info>):');
$username = $this->io->ask(' Username: '); $username = $this->io->ask(' Username: ');
$password = $this->io->askAndHideAnswer(' Password: '); $password = $this->io->askAndHideAnswer(' Password: ');
$this->io->setAuthentication($this->originUrl, $username, $password); $this->io->setAuthentication($this->originUrl, $username, $password);
@ -681,6 +686,7 @@ class RemoteFilesystem
// Handle subjectAltName on lesser PHP's. // Handle subjectAltName on lesser PHP's.
$certMap = $this->peerCertificateMap[$urlAuthority]; $certMap = $this->peerCertificateMap[$urlAuthority];
$this->io->writeError('', true, IOInterface::DEBUG);
$this->io->writeError(sprintf( $this->io->writeError(sprintf(
'Using <info>%s</info> as CN for subjectAltName enabled host <info>%s</info>', 'Using <info>%s</info> as CN for subjectAltName enabled host <info>%s</info>',
$certMap['cn'], $certMap['cn'],
@ -766,6 +772,7 @@ class RemoteFilesystem
if (!empty($targetUrl)) { if (!empty($targetUrl)) {
$this->redirects++; $this->redirects++;
$this->io->writeError('', true, IOInterface::DEBUG);
$this->io->writeError(sprintf('Following redirect (%u) %s', $this->redirects, $targetUrl), true, IOInterface::DEBUG); $this->io->writeError(sprintf('Following redirect (%u) %s', $this->redirects, $targetUrl), true, IOInterface::DEBUG);
$additionalOptions['redirects'] = $this->redirects; $additionalOptions['redirects'] = $this->redirects;

View File

@ -2,9 +2,7 @@
create-project seld/jsonlint %testDir% 1.0.0 --prefer-source -n create-project seld/jsonlint %testDir% 1.0.0 --prefer-source -n
--EXPECT-ERROR-- --EXPECT-ERROR--
Installing seld/jsonlint (1.0.0) Installing seld/jsonlint (1.0.0)
- Installing seld/jsonlint (1.0.0) - Installing seld/jsonlint (1.0.0) Cloning 3b4bc2a96ff5d3fe6866bfe9dd0c845246705791
Cloning 3b4bc2a96ff5d3fe6866bfe9dd0c845246705791
Created project in %testDir% Created project in %testDir%
Loading composer repositories with package information Loading composer repositories with package information
Updating dependencies (including require-dev) Updating dependencies (including require-dev)