1
0
Fork 0

cache only rendered composer information

As suggested we cache now only composer information and also the rendered version again. Perforce is using the same property cache as others and the `Util\Perforce::getComposerInformation()` is using the newly created methods.
pull/5862/head
Thomas Flori 2016-11-15 07:52:17 +01:00
parent ec27777341
commit 7896b1ffab
10 changed files with 66 additions and 214 deletions

View File

@ -54,7 +54,11 @@ abstract class BitbucketDriver extends VcsDriver
} }
if (!isset($this->infoCache[$identifier])) { 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 // specials for bitbucket
if (!isset($composer['support']['source'])) { if (!isset($composer['support']['source'])) {
@ -100,6 +104,10 @@ abstract class BitbucketDriver extends VcsDriver
} }
$this->infoCache[$identifier] = $composer; $this->infoCache[$identifier] = $composer;
if ($this->shouldCache($identifier)) {
$this->cache->write($identifier, json_encode($composer));
}
} }
return $this->infoCache[$identifier]; return $this->infoCache[$identifier];
@ -114,10 +122,6 @@ abstract class BitbucketDriver extends VcsDriver
return $this->fallbackDriver->getFileContent($file, $identifier); 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/' $resource = $this->getScheme() . '://api.bitbucket.org/1.0/repositories/'
. $this->owner . '/' . $this->repository . '/src/' . $identifier . '/' . $file; . $this->owner . '/' . $this->repository . '/src/' . $identifier . '/' . $file;
$fileData = JsonFile::parseJson($this->getContents($resource), $resource); $fileData = JsonFile::parseJson($this->getContents($resource), $resource);
@ -125,10 +129,6 @@ abstract class BitbucketDriver extends VcsDriver
return null; return null;
} }
if (preg_match('{[a-f0-9]{40}}i', $identifier)) {
$this->cache->write($identifier . ':' . $file, $fileData['data']);
}
return $fileData['data']; return $fileData['data'];
} }

View File

@ -12,12 +12,9 @@
namespace Composer\Repository\Vcs; namespace Composer\Repository\Vcs;
use Composer\Cache;
use Composer\Config; use Composer\Config;
use Composer\Downloader\TransportException;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;
use Composer\Util\Bitbucket;
/** /**
* @author Per Bernhardt <plb@webfactory.de> * @author Per Bernhardt <plb@webfactory.de>

View File

@ -124,10 +124,6 @@ class GitDriver extends VcsDriver
*/ */
public function getFileContent($file, $identifier) 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)); $resource = sprintf('%s:%s', ProcessExecutor::escape($identifier), ProcessExecutor::escape($file));
$this->process->execute(sprintf('git show %s', $resource), $content, $this->repoDir); $this->process->execute(sprintf('git show %s', $resource), $content, $this->repoDir);
@ -135,10 +131,6 @@ class GitDriver extends VcsDriver
return null; return null;
} }
if (preg_match('{[a-f0-9]{40}}i', $identifier)) {
$this->cache->write($identifier . ':' . $file, $content);
}
return $content; return $content;
} }

View File

@ -147,8 +147,11 @@ class GitHubDriver extends VcsDriver
} }
if (!isset($this->infoCache[$identifier])) { 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 // specials for github
if (!isset($composer['support']['source'])) { 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); $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; $this->infoCache[$identifier] = $composer;
} }
@ -174,10 +181,6 @@ class GitHubDriver extends VcsDriver
return $this->gitDriver->getFileContent($file, $identifier); 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; $notFoundRetries = 2;
while ($notFoundRetries) { while ($notFoundRetries) {
try { try {
@ -188,10 +191,6 @@ class GitHubDriver extends VcsDriver
throw new \RuntimeException('Could not retrieve ' . $file . ' for '.$identifier); 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; return $content;
} catch (TransportException $e) { } catch (TransportException $e) {
if (404 !== $e->getCode()) { if (404 !== $e->getCode()) {

View File

@ -32,8 +32,6 @@ class GitLabDriver extends VcsDriver
private $owner; private $owner;
private $repository; private $repository;
private $cache;
/** /**
* @var array Project data returned by GitLab API * @var array Project data returned by GitLab API
*/ */
@ -97,51 +95,6 @@ class GitLabDriver extends VcsDriver
$this->remoteFilesystem = $remoteFilesystem; $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} * {@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; $resource = $this->getApiUrl().'/repository/blobs/'.$identifier.'?filepath=' . $file;
try { try {
@ -170,10 +119,6 @@ class GitLabDriver extends VcsDriver
return null; return null;
} }
if ($isHash) {
$this->cache->write($identifier . ':' . $file, $content);
}
return $content; return $content;
} }
@ -256,20 +201,6 @@ class GitLabDriver extends VcsDriver
return $this->tags; 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 * @return string Base URL for GitLab API v3
*/ */

View File

@ -12,7 +12,6 @@
namespace Composer\Repository\Vcs; namespace Composer\Repository\Vcs;
use Composer\Cache;
use Composer\Config; use Composer\Config;
use Composer\Json\JsonFile; use Composer\Json\JsonFile;
use Composer\IO\IOInterface; use Composer\IO\IOInterface;

View File

@ -26,9 +26,6 @@ class PerforceDriver extends VcsDriver
protected $branch; protected $branch;
/** @var Perforce */ /** @var Perforce */
protected $perforce; protected $perforce;
protected $composerInfo;
protected $composerInfoIdentifier;
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */
@ -60,20 +57,6 @@ class PerforceDriver extends VcsDriver
$this->perforce = Perforce::create($repoConfig, $this->getUrl(), $repoDir, $this->process, $this->io); $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} * {@inheritdoc}
@ -155,10 +138,10 @@ class PerforceDriver extends VcsDriver
*/ */
public function hasComposerFile($identifier) public function hasComposerFile($identifier)
{ {
$this->composerInfo = $this->perforce->getComposerInformation('//' . $this->depot . '/' . $identifier); $composerInfo = $this->perforce->getComposerInformation('//' . $this->depot . '/' . $identifier);
$this->composerInfoIdentifier = $identifier; $composerInfoIdentifier = $identifier;
return !empty($this->composerInfo); return !empty($composerInfo);
} }
/** /**

View File

@ -116,53 +116,23 @@ class SvnDriver extends VcsDriver
} }
/** /**
* {@inheritDoc} * {@inheritdoc}
*/ */
public function getComposerInformation($identifier) 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])) { if (!isset($this->infoCache[$identifier])) {
preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match); if ($res = $this->cache->read($identifier.'.json')) {
if (!empty($match[2])) { return $this->infoCache[$identifier] = JsonFile::parseJson($res);
$path = $match[1];
$rev = $match[2];
} else {
$path = $identifier;
$rev = '';
} }
try { $composer = $this->getBaseComposerInformation($identifier);
$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;
}
}
}
$this->cache->write($identifier.'.json', json_encode($composer)); $this->cache->write($identifier.'.json', json_encode($composer));
$this->infoCache[$identifier] = $composer; $this->infoCache[$identifier] = $composer;
} }
return $this->infoCache[$identifier]; return $this->infoCache[$identifier];
} }
@ -174,10 +144,6 @@ class SvnDriver extends VcsDriver
{ {
$identifier = '/' . trim($identifier, '/') . '/'; $identifier = '/' . trim($identifier, '/') . '/';
if ($res = $this->cache->read($identifier . ':' . $file)) {
return $res;
}
preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match); preg_match('{^(.+?)(@\d+)?/$}', $identifier, $match);
if (!empty($match[2])) { if (!empty($match[2])) {
$path = $match[1]; $path = $match[1];
@ -197,8 +163,6 @@ class SvnDriver extends VcsDriver
throw new TransportException($e->getMessage()); throw new TransportException($e->getMessage());
} }
$this->cache->write($identifier . ':' . $file, $output);
return $output; return $output;
} }

View File

@ -12,6 +12,7 @@
namespace Composer\Repository\Vcs; namespace Composer\Repository\Vcs;
use Composer\Cache;
use Composer\Downloader\TransportException; use Composer\Downloader\TransportException;
use Composer\Config; use Composer\Config;
use Composer\Factory; use Composer\Factory;
@ -44,6 +45,8 @@ abstract class VcsDriver implements VcsDriverInterface
protected $remoteFilesystem; protected $remoteFilesystem;
/** @var array */ /** @var array */
protected $infoCache = array(); protected $infoCache = array();
/** @var Cache */
protected $cache;
/** /**
* Constructor. * Constructor.
@ -69,22 +72,31 @@ abstract class VcsDriver implements VcsDriverInterface
$this->remoteFilesystem = $remoteFilesystem ?: Factory::createRemoteFilesystem($this->io, $config); $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} * {@inheritdoc}
*/ */
public function getComposerInformation($identifier) public function getComposerInformation($identifier)
{ {
if (!isset($this->infoCache[$identifier])) { if (!isset($this->infoCache[$identifier])) {
$composerFileContent = $this->getFileContent('composer.json', $identifier); if ($this->shouldCache($identifier) && $res = $this->cache->read($identifier)) {
return $this->infoCache[$identifier] = JsonFile::parseJson($res);
if (!$composerFileContent) {
return null;
} }
$composer = JsonFile::parseJson($composerFileContent, $identifier . ':composer.json'); $composer = $this->getBaseComposerInformation($identifier);
if (empty($composer['time']) && $changeDate = $this->getChangeDate($identifier)) { if ($this->shouldCache($identifier)) {
$composer['time'] = $changeDate->format('Y-m-d H:i:s'); $this->cache->write($identifier, json_encode($composer));
} }
$this->infoCache[$identifier] = $composer; $this->infoCache[$identifier] = $composer;
@ -94,6 +106,23 @@ abstract class VcsDriver implements VcsDriverInterface
return $this->infoCache[$identifier]; 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} * {@inheritDoc}
*/ */

View File

@ -399,14 +399,13 @@ class Perforce
public function getComposerInformation($identifier) public function getComposerInformation($identifier)
{ {
$index = strpos($identifier, '@'); $composerFileContent = $this->getFileContent('composer.json', $identifier);
if ($index === false) {
$composerJson = $identifier. '/composer.json';
return $this->getComposerInformationFromPath($composerJson); if (!$composerFileContent) {
return;
} }
return $this->getComposerInformationFromLabel($identifier, $index); return json_decode($composerFileContent, true);
} }
public function getFileContent($file, $identifier) public function getFileContent($file, $identifier)
@ -450,47 +449,6 @@ class Perforce
return null; 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() public function getBranches()
{ {
$possibleBranches = array(); $possibleBranches = array();