diff --git a/src/Composer/Repository/Vcs/BitbucketDriver.php b/src/Composer/Repository/Vcs/BitbucketDriver.php index e09fe8ae7..a1d9a8e26 100644 --- a/src/Composer/Repository/Vcs/BitbucketDriver.php +++ b/src/Composer/Repository/Vcs/BitbucketDriver.php @@ -54,7 +54,11 @@ abstract class BitbucketDriver extends VcsDriver } if (!isset($this->infoCache[$identifier])) { - $composer = parent::getComposerInformation($identifier); + if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) { + return $this->infoCache[$identifier] = JsonFile::parseJson($res); + } + + $composer = $this->getBaseComposerInformation($identifier); // specials for bitbucket if (!isset($composer['support']['source'])) { @@ -100,6 +104,10 @@ abstract class BitbucketDriver extends VcsDriver } $this->infoCache[$identifier] = $composer; + + if ($this->shouldCache($identifier)) { + $this->cache->write($identifier, json_encode($composer)); + } } return $this->infoCache[$identifier]; @@ -114,10 +122,6 @@ abstract class BitbucketDriver extends VcsDriver return $this->fallbackDriver->getFileContent($file, $identifier); } - if (preg_match('{[a-f0-9]{40}}i', $identifier) && $res = $this->cache->read($identifier . ':' . $file)) { - return $res; - } - $resource = $this->getScheme() . '://api.bitbucket.org/1.0/repositories/' . $this->owner . '/' . $this->repository . '/src/' . $identifier . '/' . $file; $fileData = JsonFile::parseJson($this->getContents($resource), $resource); @@ -125,10 +129,6 @@ abstract class BitbucketDriver extends VcsDriver return null; } - if (preg_match('{[a-f0-9]{40}}i', $identifier)) { - $this->cache->write($identifier . ':' . $file, $fileData['data']); - } - return $fileData['data']; } diff --git a/src/Composer/Repository/Vcs/GitBitbucketDriver.php b/src/Composer/Repository/Vcs/GitBitbucketDriver.php index ff92e2820..2874fe77d 100644 --- a/src/Composer/Repository/Vcs/GitBitbucketDriver.php +++ b/src/Composer/Repository/Vcs/GitBitbucketDriver.php @@ -12,12 +12,9 @@ namespace Composer\Repository\Vcs; -use Composer\Cache; use Composer\Config; -use Composer\Downloader\TransportException; use Composer\Json\JsonFile; use Composer\IO\IOInterface; -use Composer\Util\Bitbucket; /** * @author Per Bernhardt diff --git a/src/Composer/Repository/Vcs/GitDriver.php b/src/Composer/Repository/Vcs/GitDriver.php index a93447c73..7093ce94d 100644 --- a/src/Composer/Repository/Vcs/GitDriver.php +++ b/src/Composer/Repository/Vcs/GitDriver.php @@ -124,10 +124,6 @@ class GitDriver extends VcsDriver */ public function getFileContent($file, $identifier) { - if (preg_match('{[a-f0-9]{40}}i', $identifier) && $res = $this->cache->read($identifier . ':' . $file)) { - return $res; - } - $resource = sprintf('%s:%s', ProcessExecutor::escape($identifier), ProcessExecutor::escape($file)); $this->process->execute(sprintf('git show %s', $resource), $content, $this->repoDir); @@ -135,10 +131,6 @@ class GitDriver extends VcsDriver return null; } - if (preg_match('{[a-f0-9]{40}}i', $identifier)) { - $this->cache->write($identifier . ':' . $file, $content); - } - return $content; } diff --git a/src/Composer/Repository/Vcs/GitHubDriver.php b/src/Composer/Repository/Vcs/GitHubDriver.php index 04ac5d7cd..b33b99916 100644 --- a/src/Composer/Repository/Vcs/GitHubDriver.php +++ b/src/Composer/Repository/Vcs/GitHubDriver.php @@ -147,8 +147,11 @@ class GitHubDriver extends VcsDriver } if (!isset($this->infoCache[$identifier])) { + if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) { + return $this->infoCache[$identifier] = JsonFile::parseJson($res); + } - $composer = parent::getComposerInformation($identifier); + $composer = $this->getBaseComposerInformation($identifier); // specials for github if (!isset($composer['support']['source'])) { @@ -159,6 +162,10 @@ class GitHubDriver extends VcsDriver $composer['support']['issues'] = sprintf('https://%s/%s/%s/issues', $this->originUrl, $this->owner, $this->repository); } + if ($this->shouldCache($identifier)) { + $this->cache->write($identifier, json_encode($composer)); + } + $this->infoCache[$identifier] = $composer; } @@ -174,10 +181,6 @@ class GitHubDriver extends VcsDriver return $this->gitDriver->getFileContent($file, $identifier); } - if (preg_match('{[a-f0-9]{40}}i', $identifier) && $res = $this->cache->read($identifier . ':' . $file)) { - return $res; - } - $notFoundRetries = 2; while ($notFoundRetries) { try { @@ -188,10 +191,6 @@ class GitHubDriver extends VcsDriver throw new \RuntimeException('Could not retrieve ' . $file . ' for '.$identifier); } - if ($content && preg_match('{[a-f0-9]{40}}i', $identifier)) { - $this->cache->write($identifier . ':' . $file, $content); - } - return $content; } catch (TransportException $e) { if (404 !== $e->getCode()) { diff --git a/src/Composer/Repository/Vcs/GitLabDriver.php b/src/Composer/Repository/Vcs/GitLabDriver.php index 0f932cf91..5f3538869 100644 --- a/src/Composer/Repository/Vcs/GitLabDriver.php +++ b/src/Composer/Repository/Vcs/GitLabDriver.php @@ -32,8 +32,6 @@ class GitLabDriver extends VcsDriver private $owner; private $repository; - private $cache; - /** * @var array Project data returned by GitLab API */ @@ -97,51 +95,6 @@ class GitLabDriver extends VcsDriver $this->remoteFilesystem = $remoteFilesystem; } - /** - * Fetches the composer.json file from the project by a identifier. - * - * if specific keys arent present it will try and infer them by default values. - * - * {@inheritDoc} - */ - public function getComposerInformation($identifier) - { - // Convert the root identifier to a cachable commit id - if (!preg_match('{[a-f0-9]{40}}i', $identifier)) { - $branches = $this->getBranches(); - if (isset($branches[$identifier])) { - $identifier = $branches[$identifier]; - } - } - - if (isset($this->infoCache[$identifier])) { - return $this->infoCache[$identifier]; - } - - if (preg_match('{[a-f0-9]{40}}i', $identifier) && $res = $this->cache->read($identifier)) { - return $this->infoCache[$identifier] = JsonFile::parseJson($res, $res); - } - - try { - $composer = $this->fetchComposerFile($identifier); - } catch (TransportException $e) { - if ($e->getCode() !== 404) { - throw $e; - } - $composer = false; - } - - if ($composer && !isset($composer['time']) && isset($this->commits[$identifier])) { - $composer['time'] = $this->commits[$identifier]['committed_date']; - } - - if (preg_match('{[a-f0-9]{40}}i', $identifier)) { - $this->cache->write($identifier, json_encode($composer)); - } - - return $this->infoCache[$identifier] = $composer; - } - /** * {@inheritdoc} */ @@ -155,10 +108,6 @@ class GitLabDriver extends VcsDriver } } - if ($isHash = preg_match('{[a-f0-9]{40}}i', $identifier) && $res = $this->cache->read($identifier . ':' . $file)) { - return $res; - } - $resource = $this->getApiUrl().'/repository/blobs/'.$identifier.'?filepath=' . $file; try { @@ -170,10 +119,6 @@ class GitLabDriver extends VcsDriver return null; } - if ($isHash) { - $this->cache->write($identifier . ':' . $file, $content); - } - return $content; } @@ -256,20 +201,6 @@ class GitLabDriver extends VcsDriver return $this->tags; } - /** - * Fetches composer.json file from the repository through api. - * - * @param string $identifier - * - * @return array - */ - protected function fetchComposerFile($identifier) - { - $resource = $this->getApiUrl().'/repository/blobs/'.$identifier.'?filepath=composer.json'; - - return JsonFile::parseJson($this->getContents($resource), $resource); - } - /** * @return string Base URL for GitLab API v3 */ diff --git a/src/Composer/Repository/Vcs/HgBitbucketDriver.php b/src/Composer/Repository/Vcs/HgBitbucketDriver.php index 7ccbc5def..c456121c0 100644 --- a/src/Composer/Repository/Vcs/HgBitbucketDriver.php +++ b/src/Composer/Repository/Vcs/HgBitbucketDriver.php @@ -12,7 +12,6 @@ namespace Composer\Repository\Vcs; -use Composer\Cache; use Composer\Config; use Composer\Json\JsonFile; use Composer\IO\IOInterface; diff --git a/src/Composer/Repository/Vcs/PerforceDriver.php b/src/Composer/Repository/Vcs/PerforceDriver.php index a4de5af05..7aaa6efb4 100644 --- a/src/Composer/Repository/Vcs/PerforceDriver.php +++ b/src/Composer/Repository/Vcs/PerforceDriver.php @@ -26,9 +26,6 @@ class PerforceDriver extends VcsDriver protected $branch; /** @var Perforce */ protected $perforce; - protected $composerInfo; - protected $composerInfoIdentifier; - /** * {@inheritDoc} */ @@ -60,20 +57,6 @@ class PerforceDriver extends VcsDriver $this->perforce = Perforce::create($repoConfig, $this->getUrl(), $repoDir, $this->process, $this->io); } - /** - * {@inheritDoc} - */ - public function getComposerInformation($identifier) - { - if (!empty($this->composerInfoIdentifier)) { - if (strcmp($identifier, $this->composerInfoIdentifier) === 0) { - return $this->composerInfo; - } - } - $composer_info = $this->perforce->getComposerInformation($identifier); - - return $composer_info; - } /** * {@inheritdoc} @@ -155,10 +138,10 @@ class PerforceDriver extends VcsDriver */ public function hasComposerFile($identifier) { - $this->composerInfo = $this->perforce->getComposerInformation('//' . $this->depot . '/' . $identifier); - $this->composerInfoIdentifier = $identifier; + $composerInfo = $this->perforce->getComposerInformation('//' . $this->depot . '/' . $identifier); + $composerInfoIdentifier = $identifier; - return !empty($this->composerInfo); + return !empty($composerInfo); } /** diff --git a/src/Composer/Repository/Vcs/SvnDriver.php b/src/Composer/Repository/Vcs/SvnDriver.php index 91623b602..f2d6a4754 100644 --- a/src/Composer/Repository/Vcs/SvnDriver.php +++ b/src/Composer/Repository/Vcs/SvnDriver.php @@ -116,53 +116,23 @@ class SvnDriver extends VcsDriver } /** - * {@inheritDoc} + * {@inheritdoc} */ public function getComposerInformation($identifier) { - $identifier = '/' . trim($identifier, '/') . '/'; - - if ($res = $this->cache->read($identifier.'.json')) { - $this->infoCache[$identifier] = JsonFile::parseJson($res); - } - if (!isset($this->infoCache[$identifier])) { - preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match); - if (!empty($match[2])) { - $path = $match[1]; - $rev = $match[2]; - } else { - $path = $identifier; - $rev = ''; + if ($res = $this->cache->read($identifier.'.json')) { + return $this->infoCache[$identifier] = JsonFile::parseJson($res); } - try { - $resource = $path.'composer.json'; - $output = $this->execute('svn cat', $this->baseUrl . $resource . $rev); - if (!trim($output)) { - return; - } - } catch (\RuntimeException $e) { - throw new TransportException($e->getMessage()); - } - - $composer = JsonFile::parseJson($output, $this->baseUrl . $resource . $rev); - - if (empty($composer['time'])) { - $output = $this->execute('svn info', $this->baseUrl . $path . $rev); - foreach ($this->process->splitLines($output) as $line) { - if ($line && preg_match('{^Last Changed Date: ([^(]+)}', $line, $match)) { - $date = new \DateTime($match[1], new \DateTimeZone('UTC')); - $composer['time'] = $date->format('Y-m-d H:i:s'); - break; - } - } - } + $composer = $this->getBaseComposerInformation($identifier); $this->cache->write($identifier.'.json', json_encode($composer)); + $this->infoCache[$identifier] = $composer; } + return $this->infoCache[$identifier]; } @@ -174,10 +144,6 @@ class SvnDriver extends VcsDriver { $identifier = '/' . trim($identifier, '/') . '/'; - if ($res = $this->cache->read($identifier . ':' . $file)) { - return $res; - } - preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match); if (!empty($match[2])) { $path = $match[1]; @@ -197,8 +163,6 @@ class SvnDriver extends VcsDriver throw new TransportException($e->getMessage()); } - $this->cache->write($identifier . ':' . $file, $output); - return $output; } diff --git a/src/Composer/Repository/Vcs/VcsDriver.php b/src/Composer/Repository/Vcs/VcsDriver.php index 6276b5168..c72a6c6a8 100644 --- a/src/Composer/Repository/Vcs/VcsDriver.php +++ b/src/Composer/Repository/Vcs/VcsDriver.php @@ -12,6 +12,7 @@ namespace Composer\Repository\Vcs; +use Composer\Cache; use Composer\Downloader\TransportException; use Composer\Config; use Composer\Factory; @@ -44,6 +45,8 @@ abstract class VcsDriver implements VcsDriverInterface protected $remoteFilesystem; /** @var array */ protected $infoCache = array(); + /** @var Cache */ + protected $cache; /** * Constructor. @@ -69,22 +72,31 @@ abstract class VcsDriver implements VcsDriverInterface $this->remoteFilesystem = $remoteFilesystem ?: Factory::createRemoteFilesystem($this->io, $config); } + /** + * Returns whether or not the given $identifier should be cached or not. + * + * @param string $identifier + * @return boolean + */ + protected function shouldCache($identifier) + { + return $this->cache && preg_match('{[a-f0-9]{40}}i', $identifier); + } + /** * {@inheritdoc} */ public function getComposerInformation($identifier) { if (!isset($this->infoCache[$identifier])) { - $composerFileContent = $this->getFileContent('composer.json', $identifier); - - if (!$composerFileContent) { - return null; + if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) { + return $this->infoCache[$identifier] = JsonFile::parseJson($res); } - $composer = JsonFile::parseJson($composerFileContent, $identifier . ':composer.json'); + $composer = $this->getBaseComposerInformation($identifier); - if (empty($composer['time']) && $changeDate = $this->getChangeDate($identifier)) { - $composer['time'] = $changeDate->format('Y-m-d H:i:s'); + if ($this->shouldCache($identifier)) { + $this->cache->write($identifier, json_encode($composer)); } $this->infoCache[$identifier] = $composer; @@ -94,6 +106,23 @@ abstract class VcsDriver implements VcsDriverInterface return $this->infoCache[$identifier]; } + protected function getBaseComposerInformation($identifier) + { + $composerFileContent = $this->getFileContent('composer.json', $identifier); + + if (!$composerFileContent) { + return null; + } + + $composer = JsonFile::parseJson($composerFileContent, $identifier . ':composer.json'); + + if (empty($composer['time']) && $changeDate = $this->getChangeDate($identifier)) { + $composer['time'] = $changeDate->format('Y-m-d H:i:s'); + } + + return $composer; + } + /** * {@inheritDoc} */ diff --git a/src/Composer/Util/Perforce.php b/src/Composer/Util/Perforce.php index f955c10db..f3c20fce3 100644 --- a/src/Composer/Util/Perforce.php +++ b/src/Composer/Util/Perforce.php @@ -399,14 +399,13 @@ class Perforce public function getComposerInformation($identifier) { - $index = strpos($identifier, '@'); - if ($index === false) { - $composerJson = $identifier. '/composer.json'; + $composerFileContent = $this->getFileContent('composer.json', $identifier); - return $this->getComposerInformationFromPath($composerJson); + if (!$composerFileContent) { + return; } - return $this->getComposerInformationFromLabel($identifier, $index); + return json_decode($composerFileContent, true); } public function getFileContent($file, $identifier) @@ -450,47 +449,6 @@ class Perforce return null; } - public function getComposerInformationFromPath($composerJson) - { - $command = $this->generateP4Command(' print ' . $composerJson); - $this->executeCommand($command); - $result = $this->commandResult; - $index = strpos($result, '{'); - if ($index === false) { - return ''; - } - if ($index >= 0) { - $rawData = substr($result, $index); - $composer_info = json_decode($rawData, true); - - return $composer_info; - } - - return ''; - } - - public function getComposerInformationFromLabel($identifier, $index) - { - $composerJsonPath = substr($identifier, 0, $index) . '/composer.json' . substr($identifier, $index); - $command = $this->generateP4Command(' files ' . $composerJsonPath, false); - $this->executeCommand($command); - $result = $this->commandResult; - $index2 = strpos($result, 'no such file(s).'); - if ($index2 === false) { - $index3 = strpos($result, 'change'); - if (!($index3 === false)) { - $phrase = trim(substr($result, $index3)); - $fields = explode(' ', $phrase); - $id = $fields[1]; - $composerJson = substr($identifier, 0, $index) . '/composer.json@' . $id; - - return $this->getComposerInformationFromPath($composerJson); - } - } - - return ""; - } - public function getBranches() { $possibleBranches = array();