diff --git a/src/Composer/Downloader/GitDownloader.php b/src/Composer/Downloader/GitDownloader.php index 54cdd4240..4371f9468 100644 --- a/src/Composer/Downloader/GitDownloader.php +++ b/src/Composer/Downloader/GitDownloader.php @@ -74,8 +74,8 @@ class GitDownloader implements DownloaderInterface private function enforceCleanDirectory($path) { - $this->process->execute(sprintf('cd %s && git status --porcelain', $path),$output); - if (implode('', $output)) { + $this->process->execute(sprintf('cd %s && git status --porcelain', $path), $output); + if (trim($output)) { throw new \RuntimeException('Source directory has uncommitted changes'); } } diff --git a/src/Composer/Downloader/HgDownloader.php b/src/Composer/Downloader/HgDownloader.php index d45711228..0dfcbeea6 100644 --- a/src/Composer/Downloader/HgDownloader.php +++ b/src/Composer/Downloader/HgDownloader.php @@ -75,7 +75,7 @@ class HgDownloader implements DownloaderInterface private function enforceCleanDirectory($path) { $this->process->execute(sprintf('cd %s && hg st', $path), $output); - if (implode('', $output)) { + if (trim($output)) { throw new \RuntimeException('Source directory has uncommitted changes'); } } diff --git a/src/Composer/Repository/Vcs/GitDriver.php b/src/Composer/Repository/Vcs/GitDriver.php index 2ca0bf90d..286cf762a 100644 --- a/src/Composer/Repository/Vcs/GitDriver.php +++ b/src/Composer/Repository/Vcs/GitDriver.php @@ -48,7 +48,7 @@ class GitDriver extends VcsDriver implements VcsDriverInterface if (null === $this->rootIdentifier) { $this->rootIdentifier = 'master'; $this->process->execute(sprintf('cd %s && git branch --no-color -r', escapeshellarg($this->tmpDir)), $output); - foreach ($output as $branch) { + foreach ($this->process->splitLines($output) as $branch) { if ($branch && preg_match('{/HEAD +-> +[^/]+/(\S+)}', $branch, $match)) { $this->rootIdentifier = $match[1]; break; @@ -91,11 +91,9 @@ class GitDriver extends VcsDriver implements VcsDriverInterface public function getComposerInformation($identifier) { if (!isset($this->infoCache[$identifier])) { - $this->process->execute(sprintf('cd %s && git show %s:composer.json', escapeshellarg($this->tmpDir), escapeshellarg($identifier)), $output); - $composer = implode("\n", $output); - unset($output); + $this->process->execute(sprintf('cd %s && git show %s:composer.json', escapeshellarg($this->tmpDir), escapeshellarg($identifier)), $composer); - if (!$composer) { + if (!trim($composer)) { throw new \UnexpectedValueException('Failed to retrieve composer information for identifier '.$identifier.' in '.$this->getUrl()); } @@ -119,6 +117,7 @@ class GitDriver extends VcsDriver implements VcsDriverInterface { if (null === $this->tags) { $this->process->execute(sprintf('cd %s && git tag', escapeshellarg($this->tmpDir)), $output); + $output = $this->process->splitLines($output); $this->tags = $output ? array_combine($output, $output) : array(); } @@ -134,7 +133,7 @@ class GitDriver extends VcsDriver implements VcsDriverInterface $branches = array(); $this->process->execute(sprintf('cd %s && git branch --no-color -rv', escapeshellarg($this->tmpDir)), $output); - foreach ($output as $branch) { + foreach ($this->process->splitLines($output) as $branch) { if ($branch && !preg_match('{^ *[^/]+/HEAD }', $branch)) { preg_match('{^ *[^/]+/(\S+) *([a-f0-9]+) .*$}', $branch, $match); $branches[$match[1]] = $match[2]; diff --git a/src/Composer/Repository/Vcs/HgDriver.php b/src/Composer/Repository/Vcs/HgDriver.php index e458eb499..2b8c4351c 100644 --- a/src/Composer/Repository/Vcs/HgDriver.php +++ b/src/Composer/Repository/Vcs/HgDriver.php @@ -58,6 +58,7 @@ class HgDriver extends VcsDriver implements VcsDriverInterface $tmpDir = escapeshellarg($this->tmpDir); if (null === $this->rootIdentifier) { $this->process->execute(sprintf('cd %s && hg tip --template "{node}"', $tmpDir), $output); + $output = $this->process->splitLines($output); $this->rootIdentifier = $output[0]; } @@ -96,11 +97,9 @@ class HgDriver extends VcsDriver implements VcsDriverInterface public function getComposerInformation($identifier) { if (!isset($this->infoCache[$identifier])) { - $this->process->execute(sprintf('cd %s && hg cat -r %s composer.json', escapeshellarg($this->tmpDir), escapeshellarg($identifier)), $output); - $composer = implode("\n", $output); - unset($output); + $this->process->execute(sprintf('cd %s && hg cat -r %s composer.json', escapeshellarg($this->tmpDir), escapeshellarg($identifier)), $composer); - if (!$composer) { + if (!trim($composer)) { throw new \UnexpectedValueException('Failed to retrieve composer information for identifier ' . $identifier . ' in ' . $this->getUrl()); } @@ -126,9 +125,10 @@ class HgDriver extends VcsDriver implements VcsDriverInterface $tags = array(); $this->process->execute(sprintf('cd %s && hg tags', escapeshellarg($this->tmpDir)), $output); - foreach ($output as $tag) { - if (preg_match('(^([^\s]+)\s+\d+:(.*)$)', $tag, $match)) + foreach ($this->process->splitLines($output) as $tag) { + if ($tag && preg_match('(^([^\s]+)\s+\d+:(.*)$)', $tag, $match)) { $tags[$match[1]] = $match[2]; + } } $this->tags = $tags; @@ -146,9 +146,10 @@ class HgDriver extends VcsDriver implements VcsDriverInterface $branches = array(); $this->process->execute(sprintf('cd %s && hg branches', escapeshellarg($this->tmpDir)), $output); - foreach ($output as $branch) { - if (preg_match('(^([^\s]+)\s+\d+:(.*)$)', $branch, $match)) + foreach ($this->process->splitLines($output) as $branch) { + if ($branch && preg_match('(^([^\s]+)\s+\d+:(.*)$)', $branch, $match)) { $branches[$match[1]] = $match[2]; + } } $this->branches = $branches; diff --git a/src/Composer/Repository/Vcs/SvnDriver.php b/src/Composer/Repository/Vcs/SvnDriver.php index 0059af85b..46b8d3a38 100644 --- a/src/Composer/Repository/Vcs/SvnDriver.php +++ b/src/Composer/Repository/Vcs/SvnDriver.php @@ -80,11 +80,9 @@ class SvnDriver extends VcsDriver implements VcsDriverInterface $rev = ''; } - $this->process->execute(sprintf('svn cat --non-interactive %s', escapeshellarg($this->baseUrl.$identifier.'composer.json'.$rev)),$output); - $composer = implode("\n", $output); - unset($output); + $this->process->execute(sprintf('svn cat --non-interactive %s', escapeshellarg($this->baseUrl.$identifier.'composer.json'.$rev)), $composer); - if (!$composer) { + if (!trim($composer)) { throw new \UnexpectedValueException('Failed to retrieve composer information for identifier '.$identifier.' in '.$this->getUrl()); } @@ -92,8 +90,8 @@ class SvnDriver extends VcsDriver implements VcsDriverInterface if (!isset($composer['time'])) { $this->process->execute(sprintf('svn info %s', escapeshellarg($this->baseUrl.$identifier.$rev)), $output); - foreach ($output as $line) { - if (preg_match('{^Last Changed Date: ([^(]+)}', $line, $match)) { + foreach ($this->process->splitLines($output) as $line) { + if ($line && preg_match('{^Last Changed Date: ([^(]+)}', $line, $match)) { $date = new \DateTime($match[1]); $composer['time'] = $date->format('Y-m-d H:i:s'); break; @@ -114,8 +112,10 @@ class SvnDriver extends VcsDriver implements VcsDriverInterface if (null === $this->tags) { $this->process->execute(sprintf('svn ls --non-interactive %s', escapeshellarg($this->baseUrl.'/tags')), $output); $this->tags = array(); - foreach ($output as $tag) { - $this->tags[rtrim($tag, '/')] = '/tags/'.$tag; + foreach ($this->process->splitLines($output) as $tag) { + if ($tag) { + $this->tags[rtrim($tag, '/')] = '/tags/'.$tag; + } } } @@ -131,7 +131,7 @@ class SvnDriver extends VcsDriver implements VcsDriverInterface $this->process->execute(sprintf('svn ls --verbose --non-interactive %s', escapeshellarg($this->baseUrl.'/')), $output); $this->branches = array(); - foreach ($output as $line) { + foreach ($this->process->splitLines($output) as $line) { preg_match('{^\s*(\S+).*?(\S+)\s*$}', $line, $match); if ($match[2] === 'trunk/') { $this->branches['trunk'] = '/trunk/@'.$match[1]; @@ -141,7 +141,7 @@ class SvnDriver extends VcsDriver implements VcsDriverInterface unset($output); $this->process->execute(sprintf('svn ls --verbose --non-interactive %s', escapeshellarg($this->baseUrl.'/branches')), $output); - foreach ($output as $line) { + foreach ($this->process->splitLines($output) as $line) { preg_match('{^\s*(\S+).*?(\S+)\s*$}', $line, $match); if ($match[2] === './') { continue; diff --git a/src/Composer/Util/ProcessExecutor.php b/src/Composer/Util/ProcessExecutor.php index 08bcc1e0e..e4c7ba811 100644 --- a/src/Composer/Util/ProcessExecutor.php +++ b/src/Composer/Util/ProcessExecutor.php @@ -28,19 +28,25 @@ class ProcessExecutor */ public function execute($command, &$output = null) { + $captureOutput = count(func_get_args()) > 1; $process = new Process($command); - $process->run(function($type, $buffer) use ($output) { - if (null === $output) { - return; + $process->run(function($type, $buffer) use ($captureOutput) { + if ($captureOutput) { + return; } echo $buffer; }); - if (null !== $output) { - $output = $process->getOutput(); + if ($captureOutput) { + $output = $process->getOutput(); } return $process->getExitCode(); } + + public function splitLines($output) + { + return ((string) $output === '') ? array() : preg_split('{\r?\n}', $output); + } } \ No newline at end of file