friendica-addons/advancedcontentfilter/vendor/fxp/composer-asset-plugin/Repository/AssetRepositoryManager.php

246 lines
6.6 KiB
PHP

<?php
/*
* This file is part of the Fxp Composer Asset Plugin package.
*
* (c) François Pluchino <francois.pluchino@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Fxp\Composer\AssetPlugin\Repository;
use Composer\DependencyResolver\Pool;
use Composer\IO\IOInterface;
use Composer\Repository\RepositoryInterface;
use Composer\Repository\RepositoryManager;
use Fxp\Composer\AssetPlugin\Config\Config;
/**
* The asset repository manager.
*
* @author François Pluchino <francois.pluchino@gmail.com>
*/
class AssetRepositoryManager
{
/**
* @var IOInterface
*/
protected $io;
/**
* @var RepositoryManager
*/
protected $rm;
/**
* @var Config
*/
protected $config;
/**
* @var VcsPackageFilter
*/
protected $packageFilter;
/**
* @var Pool|null
*/
protected $pool;
/**
* @var ResolutionManager
*/
protected $resolutionManager;
/**
* @var RepositoryInterface[]
*/
protected $repositories = array();
/**
* @var array
*/
protected $poolRepositories = array();
/**
* Constructor.
*
* @param IOInterface $io The IO
* @param RepositoryManager $rm The repository manager
* @param Config $config The asset config
* @param VcsPackageFilter $packageFilter The package filter
*/
public function __construct(IOInterface $io, RepositoryManager $rm, Config $config, VcsPackageFilter $packageFilter)
{
$this->io = $io;
$this->rm = $rm;
$this->config = $config;
$this->packageFilter = $packageFilter;
}
/**
* Get the repository manager.
*
* @return RepositoryManager
*/
public function getRepositoryManager()
{
return $this->rm;
}
/**
* Get the asset config.
*
* @return Config
*/
public function getConfig()
{
return $this->config;
}
/**
* Set the pool.
*
* @param Pool $pool The pool
*
* @return self
*/
public function setPool(Pool $pool)
{
$this->pool = $pool;
foreach ($this->poolRepositories as $repo) {
$pool->addRepository($repo);
}
$this->poolRepositories = array();
return $this;
}
/**
* Set the dependency resolution manager.
*
* @param ResolutionManager $resolutionManager The dependency resolution manager
*/
public function setResolutionManager(ResolutionManager $resolutionManager)
{
$this->resolutionManager = $resolutionManager;
}
/**
* Solve the dependency resolutions.
*
* @param array $data
*
* @return array
*/
public function solveResolutions(array $data)
{
return null !== $this->resolutionManager
? $this->resolutionManager->solveResolutions($data)
: $data;
}
/**
* Adds asset vcs repositories.
*
* @param array $repositories The repositories
*
* @throws \UnexpectedValueException When config of repository is not an array
* @throws \UnexpectedValueException When the config of repository has not a type defined
* @throws \UnexpectedValueException When the config of repository has an invalid type
*/
public function addRepositories(array $repositories)
{
foreach ($repositories as $index => $repo) {
$this->validateRepositories($index, $repo);
if ('package' === $repo['type']) {
$name = $repo['package']['name'];
} else {
$name = is_int($index) ? preg_replace('{^https?://}i', '', $repo['url']) : $index;
$name = isset($repo['name']) ? $repo['name'] : $name;
$repo['asset-repository-manager'] = $this;
$repo['vcs-package-filter'] = $this->packageFilter;
}
$repoInstance = Util::addRepository($this->io, $this->rm, $this->repositories, $name, $repo, $this->pool);
if (null === $this->pool && $repoInstance instanceof RepositoryInterface) {
$this->poolRepositories[] = $repoInstance;
}
}
}
/**
* Validates the config of repositories.
*
* @param int|string $index The index
* @param mixed|array $repo The config repo
*
* @throws \UnexpectedValueException
*/
protected function validateRepositories($index, $repo)
{
if (!is_array($repo)) {
throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') should be an array, '.gettype($repo).' given');
}
if (!isset($repo['type'])) {
throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a type defined');
}
$this->validatePackageRepositories($index, $repo);
$this->validateVcsRepositories($index, $repo);
}
/**
* Validates the config of package repositories.
*
* @param int|string $index The index
* @param mixed|array $repo The config repo
*
* @throws \UnexpectedValueException
*/
protected function validatePackageRepositories($index, $repo)
{
if ('package' !== $repo['type']) {
return;
}
if (!isset($repo['package'])) {
throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a package definition"');
}
foreach (array('name', 'type', 'version', 'dist') as $key) {
if (!isset($repo['package'][$key])) {
throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have the "'.$key.'" key in the package definition"');
}
}
}
/**
* Validates the config of vcs repositories.
*
* @param int|string $index The index
* @param mixed|array $repo The config repo
*
* @throws \UnexpectedValueException
*/
protected function validateVcsRepositories($index, $repo)
{
if ('package' === $repo['type']) {
return;
}
if (false === strpos($repo['type'], '-')) {
throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a type defined in this way: "%asset-type%-%type%"');
}
if (!isset($repo['url'])) {
throw new \UnexpectedValueException('Repository '.$index.' ('.json_encode($repo).') must have a url defined');
}
}
}