Add local cache to dist downloads
parent
c0e75e5d24
commit
fb3a43b2f0
|
@ -13,6 +13,7 @@
|
|||
namespace Composer;
|
||||
|
||||
use Composer\IO\IOInterface;
|
||||
use Composer\Util\Filesystem;
|
||||
|
||||
/**
|
||||
* Reads/writes to a filesystem cache
|
||||
|
@ -24,11 +25,15 @@ class Cache
|
|||
private $io;
|
||||
private $root;
|
||||
private $enabled = true;
|
||||
private $whitelist;
|
||||
private $filesystem;
|
||||
|
||||
public function __construct(IOInterface $io, $cacheDir)
|
||||
public function __construct(IOInterface $io, $cacheDir, $whitelist = 'a-z0-9.', Filesystem $filesystem = null)
|
||||
{
|
||||
$this->io = $io;
|
||||
$this->root = rtrim($cacheDir, '/\\') . '/';
|
||||
$this->whitelist = $whitelist;
|
||||
$this->filesystem = $filesystem ?: new Filesystem();
|
||||
|
||||
if (!is_dir($this->root)) {
|
||||
if (!@mkdir($this->root, 0777, true)) {
|
||||
|
@ -44,7 +49,7 @@ class Cache
|
|||
|
||||
public function read($file)
|
||||
{
|
||||
$file = preg_replace('{[^a-z0-9.]}i', '-', $file);
|
||||
$file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file);
|
||||
if ($this->enabled && file_exists($this->root . $file)) {
|
||||
return file_get_contents($this->root . $file);
|
||||
}
|
||||
|
@ -53,14 +58,37 @@ class Cache
|
|||
public function write($file, $contents)
|
||||
{
|
||||
if ($this->enabled) {
|
||||
$file = preg_replace('{[^a-z0-9.]}i', '-', $file);
|
||||
$file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file);
|
||||
file_put_contents($this->root . $file, $contents);
|
||||
}
|
||||
}
|
||||
|
||||
public function copyFrom($file, $source)
|
||||
{
|
||||
if ($this->enabled) {
|
||||
$file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file);
|
||||
$this->filesystem->ensureDirectoryExists(dirname($this->root . $file));
|
||||
copy($source, $this->root . $file);
|
||||
}
|
||||
}
|
||||
|
||||
public function copyTo($file, $target)
|
||||
{
|
||||
$file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file);
|
||||
if ($this->enabled && file_exists($this->root . $file)) {
|
||||
touch($this->root . $file);
|
||||
return copy($this->root . $file, $target);
|
||||
}
|
||||
}
|
||||
|
||||
public function gc($expire)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
public function sha1($file)
|
||||
{
|
||||
$file = preg_replace('{[^a-z0-9.]}i', '-', $file);
|
||||
$file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file);
|
||||
if ($this->enabled && file_exists($this->root . $file)) {
|
||||
return sha1_file($this->root . $file);
|
||||
}
|
||||
|
@ -68,7 +96,7 @@ class Cache
|
|||
|
||||
public function sha256($file)
|
||||
{
|
||||
$file = preg_replace('{[^a-z0-9.]}i', '-', $file);
|
||||
$file = preg_replace('{[^'.$this->whitelist.']}i', '-', $file);
|
||||
if ($this->enabled && file_exists($this->root . $file)) {
|
||||
return hash_file('sha256', $this->root . $file);
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
namespace Composer\Downloader;
|
||||
|
||||
use Composer\Config;
|
||||
use Composer\Cache;
|
||||
use Composer\IO\IOInterface;
|
||||
use Composer\Package\PackageInterface;
|
||||
use Composer\Package\Version\VersionParser;
|
||||
|
@ -33,6 +34,7 @@ class FileDownloader implements DownloaderInterface
|
|||
protected $config;
|
||||
protected $rfs;
|
||||
protected $filesystem;
|
||||
protected $cache;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
|
@ -48,6 +50,11 @@ class FileDownloader implements DownloaderInterface
|
|||
$this->config = $config;
|
||||
$this->rfs = $rfs ?: new RemoteFilesystem($io);
|
||||
$this->filesystem = $filesystem ?: new Filesystem();
|
||||
$this->cache = new Cache($this->io, $config->get('home').'/cache.files/', 'a-z0-9_./');
|
||||
|
||||
if (!rand(0, 50)) {
|
||||
$this->cache->gc($config->get('cache-ttl') ?: 86400 * 30);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -78,7 +85,10 @@ class FileDownloader implements DownloaderInterface
|
|||
|
||||
try {
|
||||
try {
|
||||
$this->rfs->copy(parse_url($processUrl, PHP_URL_HOST), $processUrl, $fileName);
|
||||
if (!$this->cache->copyTo($package->getName().'/'.$package->getVersion().'-'.$package->getDistReference().'.'.$package->getDistType(), $fileName)) {
|
||||
$this->rfs->copy(parse_url($processUrl, PHP_URL_HOST), $processUrl, $fileName);
|
||||
$this->cache->copyFrom($package->getName().'/'.$package->getVersion().'-'.$package->getDistReference().'.'.$package->getDistType(), $fileName);
|
||||
}
|
||||
} catch (TransportException $e) {
|
||||
if (404 === $e->getCode() && 'github.com' === parse_url($processUrl, PHP_URL_HOST)) {
|
||||
$message = "\n".'Could not fetch '.$processUrl.', enter your GitHub credentials to access private repos';
|
||||
|
|
Loading…
Reference in New Issue