diff --git a/doc/articles/aliases.md b/doc/articles/aliases.md index 617551b61..98a6d1335 100644 --- a/doc/articles/aliases.md +++ b/doc/articles/aliases.md @@ -92,13 +92,14 @@ Add this to your project's root `composer.json`: That will fetch the `dev-bugfix` version of `monolog/monolog` from your GitHub and alias it to `1.0.x-dev`. -> **Note:** If a package with inline aliases is required, the alias (right of -> the `as`) is used as the version constraint. The part left of the `as` is -> discarded. As a consequence, if A requires B and B requires `monolog/monolog` -> version `dev-bugfix as 1.0.x-dev`, installing A will make B require -> `1.0.x-dev`, which may exist as a branch alias or an actual `1.0` branch. If -> it does not, it must be re-inline-aliased in A's `composer.json`. +> **Note:** Inline aliasing is a root-only feature. If a package with inline +> aliases is required, the alias (right of the `as`) is used as the version +> constraint. The part left of the `as` is discarded. As a consequence, if +> A requires B and B requires `monolog/monolog` version `dev-bugfix as 1.0.x-dev`, +> installing A will make B require `1.0.x-dev`, which may exist as a branch +> alias or an actual `1.0` branch. If it does not, it must be +> inline-aliased again in A's `composer.json`. > **Note:** Inline aliasing should be avoided, especially for published -> packages. If you found a bug, try and get your fix merged upstream. This -> helps to avoid issues for users of your package. +> packages/libraries. If you found a bug, try and get your fix merged upstream. +> This helps to avoid issues for users of your package. diff --git a/src/Composer/Command/ShowCommand.php b/src/Composer/Command/ShowCommand.php index ec0261acc..168b0f285 100644 --- a/src/Composer/Command/ShowCommand.php +++ b/src/Composer/Command/ShowCommand.php @@ -329,23 +329,17 @@ EOT ksort($packages[$type]); $nameLength = $versionLength = $latestLength = 0; - foreach ($packages[$type] as $package) { - if (is_object($package)) { - $nameLength = max($nameLength, strlen($package->getPrettyName())); - if ($showVersion) { - $versionLength = max($versionLength, strlen($package->getFullPrettyVersion())); - if ($showLatest) { - $latestPackage = $this->findLatestPackage($package, $composer, $phpVersion, $showMinorOnly); - if ($latestPackage === false) { - continue; - } - $latestPackages[$package->getPrettyName()] = $latestPackage; - $latestLength = max($latestLength, strlen($latestPackage->getFullPrettyVersion())); + if ($showLatest && $showVersion) { + foreach ($packages[$type] as $package) { + if (is_object($package)) { + $latestPackage = $this->findLatestPackage($package, $composer, $phpVersion, $showMinorOnly); + if ($latestPackage === false) { + continue; } + + $latestPackages[$package->getPrettyName()] = $latestPackage; } - } else { - $nameLength = max($nameLength, strlen($package)); } } @@ -357,11 +351,6 @@ EOT $hasOutdatedPackages = false; $viewData[$type] = array(); - $viewMetaData[$type] = array( - 'nameLength' => $nameLength, - 'versionLength' => $versionLength, - 'latestLength' => $latestLength, - ); foreach ($packages[$type] as $package) { $packageViewData = array(); if (is_object($package)) { @@ -376,12 +365,15 @@ EOT } $packageViewData['name'] = $package->getPrettyName(); + $nameLength = max($nameLength, strlen($package->getPrettyName())); if ($writeVersion) { $packageViewData['version'] = $package->getFullPrettyVersion(); + $versionLength = max($versionLength, strlen($package->getFullPrettyVersion())); } if ($writeLatest && $latestPackage) { $packageViewData['latest'] = $latestPackage->getFullPrettyVersion(); $packageViewData['latest-status'] = $this->getUpdateStatus($latestPackage, $package); + $latestLength = max($latestLength, strlen($latestPackage->getFullPrettyVersion())); } if ($writeDescription) { $packageViewData['description'] = $package->getDescription(); @@ -403,9 +395,15 @@ EOT } } else { $packageViewData['name'] = $package; + $nameLength = max($nameLength, strlen($package)); } $viewData[$type][] = $packageViewData; } + $viewMetaData[$type] = array( + 'nameLength' => $nameLength, + 'versionLength' => $versionLength, + 'latestLength' => $latestLength, + ); if ($input->getOption('strict') && $hasOutdatedPackages) { $exitCode = 1; break; diff --git a/src/Composer/Downloader/FossilDownloader.php b/src/Composer/Downloader/FossilDownloader.php index 6dd4c0c42..135e973e0 100644 --- a/src/Composer/Downloader/FossilDownloader.php +++ b/src/Composer/Downloader/FossilDownloader.php @@ -36,7 +36,7 @@ class FossilDownloader extends VcsDownloader if (0 !== $this->process->execute($command, $ignoredOutput)) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } - $command = sprintf('fossil open %s', ProcessExecutor::escape($repoFile)); + $command = sprintf('fossil open %s --nested', ProcessExecutor::escape($repoFile)); if (0 !== $this->process->execute($command, $ignoredOutput, realpath($path))) { throw new \RuntimeException('Failed to execute ' . $command . "\n\n" . $this->process->getErrorOutput()); } diff --git a/src/Composer/EventDispatcher/EventDispatcher.php b/src/Composer/EventDispatcher/EventDispatcher.php index 2a180614c..7f7a2cd86 100644 --- a/src/Composer/EventDispatcher/EventDispatcher.php +++ b/src/Composer/EventDispatcher/EventDispatcher.php @@ -166,7 +166,12 @@ class EventDispatcher $return = 0; foreach ($listeners as $callable) { - if (!is_string($callable) && is_callable($callable)) { + if (!is_string($callable)) { + if (!is_callable($callable)) { + $className = is_object($callable[0]) ? get_class($callable[0]) : $callable[0]; + + throw new \RuntimeException('Subscriber '.$className.'::'.$callable[1].' for event '.$event->getName().' is not callable, make sure the function is defined and public'); + } $event = $this->checkListenerExpectedEvent($callable, $event); $return = false === call_user_func($callable, $event) ? 1 : 0; } elseif ($this->isComposerScript($callable)) { diff --git a/src/Composer/Repository/Vcs/FossilDriver.php b/src/Composer/Repository/Vcs/FossilDriver.php index 7af97ad3e..0b689e7bf 100644 --- a/src/Composer/Repository/Vcs/FossilDriver.php +++ b/src/Composer/Repository/Vcs/FossilDriver.php @@ -96,7 +96,7 @@ class FossilDriver extends VcsDriver throw new \RuntimeException('Failed to clone '.$this->url.' to repository ' . $this->repoFile . "\n\n" .$output); } - if (0 !== $this->process->execute(sprintf('fossil open %s', ProcessExecutor::escape($this->repoFile)), $output, $this->checkoutDir)) { + if (0 !== $this->process->execute(sprintf('fossil open %s --nested', ProcessExecutor::escape($this->repoFile)), $output, $this->checkoutDir)) { $output = $this->process->getErrorOutput(); throw new \RuntimeException('Failed to open repository '.$this->repoFile.' in ' . $this->checkoutDir . "\n\n" .$output); diff --git a/tests/Composer/Test/Downloader/FossilDownloaderTest.php b/tests/Composer/Test/Downloader/FossilDownloaderTest.php index 2e1de934d..961686bef 100644 --- a/tests/Composer/Test/Downloader/FossilDownloaderTest.php +++ b/tests/Composer/Test/Downloader/FossilDownloaderTest.php @@ -76,7 +76,7 @@ class FossilDownloaderTest extends TestCase ->with($this->equalTo($expectedFossilCommand)) ->will($this->returnValue(0)); - $expectedFossilCommand = $this->getCmd('fossil open \'repo.fossil\''); + $expectedFossilCommand = $this->getCmd('fossil open \'repo.fossil\' --nested'); $processExecutor->expects($this->at(1)) ->method('execute') ->with($this->equalTo($expectedFossilCommand))