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
parent
ec27777341
commit
7896b1ffab
|
@ -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'];
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
|
||||
namespace Composer\Repository\Vcs;
|
||||
|
||||
use Composer\Cache;
|
||||
use Composer\Config;
|
||||
use Composer\Json\JsonFile;
|
||||
use Composer\IO\IOInterface;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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}
|
||||
*/
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue