diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index dd8a7d873..53d2b3ca9 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -71,6 +71,10 @@ class GitDownloader extends VcsDownloader implements DvcsDownloaderInterface if ($this->gitUtil->fetchRefOrSyncMirror($url, $cachePath, $ref) && is_dir($cachePath)) { $this->cachedPackages[$package->getId()][$ref] = true; } + } else { + if (null === GitUtil::getVersion($this->process)) { + throw new \RuntimeException('git was not found in your PATH, skipping source download'); + } } } diff --git a/src/Composer/Downloader/HgDownloader.php b/src/Composer/Downloader/HgDownloader.php index 59ced0193..737dd8758 100644 --- a/src/Composer/Downloader/HgDownloader.php +++ b/src/Composer/Downloader/HgDownloader.php @@ -26,6 +26,9 @@ class HgDownloader extends VcsDownloader */ protected function doDownload(PackageInterface $package, $path, $url, PackageInterface $prevPackage = null) { + if (null === HgUtils::getVersion($this->process)) { + throw new \RuntimeException('hg was not found in your PATH, skipping source download'); + } } /** diff --git a/src/Composer/Downloader/SvnDownloader.php b/src/Composer/Downloader/SvnDownloader.php index 2f253b4bd..80454f855 100644 --- a/src/Composer/Downloader/SvnDownloader.php +++ b/src/Composer/Downloader/SvnDownloader.php @@ -30,6 +30,11 @@ class SvnDownloader extends VcsDownloader */ protected function doDownload(PackageInterface $package, $path, $url, PackageInterface $prevPackage = null) { + SvnUtil::cleanEnv(); + $util = new SvnUtil($url, $this->io, $this->config, $this->process); + if (null === $util->binaryVersion()) { + throw new \RuntimeException('svn was not found in your PATH, skipping source download'); + } } /** diff --git a/src/Composer/Util/Git.php b/src/Composer/Util/Git.php index 28d051245..dd95f2062 100644 --- a/src/Composer/Util/Git.php +++ b/src/Composer/Util/Git.php @@ -403,15 +403,12 @@ class Git /** * Retrieves the current git version. * - * @return string|null The git version number. + * @return string|null The git version number, if present. */ public static function getVersion(ProcessExecutor $process) { if (false === self::$version) { self::$version = null; - if (!$process) { - $process = new ProcessExecutor; - } if (0 === $process->execute('git --version', $output) && preg_match('/^git version (\d+(?:\.\d+)+)/m', $output, $matches)) { self::$version = $matches[1]; } diff --git a/src/Composer/Util/Hg.php b/src/Composer/Util/Hg.php index d0b7fe79f..ecd01b144 100644 --- a/src/Composer/Util/Hg.php +++ b/src/Composer/Util/Hg.php @@ -74,10 +74,27 @@ class Hg private function throwException($message, $url) { - if (0 !== $this->process->execute('hg --version', $ignoredOutput)) { + if (null === self::getVersion($this->process)) { throw new \RuntimeException(Url::sanitize('Failed to clone ' . $url . ', hg was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput())); } throw new \RuntimeException(Url::sanitize($message)); } + + /** + * Retrieves the current hg version. + * + * @return string|null The hg version number, if present. + */ + public static function getVersion(ProcessExecutor $process) + { + if (false === self::$version) { + self::$version = null; + if (0 === $this->process->execute('hg --version', $output) && preg_match('/version (\d+(?:\.\d+)+)/m', $output, $matches)) { + self::$version = $matches[1]; + } + } + + return self::$version; + } }