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])) {
$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'];
}

View File

@ -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 <plb@webfactory.de>

View File

@ -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;
}

View File

@ -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()) {

View File

@ -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
*/

View File

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

View File

@ -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);
}
/**

View File

@ -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;
}

View File

@ -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}
*/

View File

@ -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();