123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- <?php
- namespace Composer\Installers;
- use Composer\IO\IOInterface;
- use Composer\Composer;
- use Composer\Package\PackageInterface;
- abstract class BaseInstaller
- {
- protected $locations = array();
- protected $composer;
- protected $package;
- protected $io;
- /**
- * Initializes base installer.
- *
- * @param PackageInterface $package
- * @param Composer $composer
- * @param IOInterface $io
- */
- public function __construct(PackageInterface $package = null, Composer $composer = null, IOInterface $io = null)
- {
- $this->composer = $composer;
- $this->package = $package;
- $this->io = $io;
- }
- /**
- * Return the install path based on package type.
- *
- * @param PackageInterface $package
- * @param string $frameworkType
- * @return string
- */
- public function getInstallPath(PackageInterface $package, $frameworkType = '')
- {
- $type = $this->package->getType();
- $prettyName = $this->package->getPrettyName();
- if (strpos($prettyName, '/') !== false) {
- list($vendor, $name) = explode('/', $prettyName);
- } else {
- $vendor = '';
- $name = $prettyName;
- }
- $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type'));
- $extra = $package->getExtra();
- if (!empty($extra['installer-name'])) {
- $availableVars['name'] = $extra['installer-name'];
- }
- if ($this->composer->getPackage()) {
- $extra = $this->composer->getPackage()->getExtra();
- if (!empty($extra['installer-paths'])) {
- $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor);
- if ($customPath !== false) {
- return $this->templatePath($customPath, $availableVars);
- }
- }
- }
- $packageType = substr($type, strlen($frameworkType) + 1);
- $locations = $this->getLocations();
- if (!isset($locations[$packageType])) {
- throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type));
- }
- return $this->templatePath($locations[$packageType], $availableVars);
- }
- /**
- * For an installer to override to modify the vars per installer.
- *
- * @param array $vars
- * @return array
- */
- public function inflectPackageVars($vars)
- {
- return $vars;
- }
- /**
- * Gets the installer's locations
- *
- * @return array
- */
- public function getLocations()
- {
- return $this->locations;
- }
- /**
- * Replace vars in a path
- *
- * @param string $path
- * @param array $vars
- * @return string
- */
- protected function templatePath($path, array $vars = array())
- {
- if (strpos($path, '{') !== false) {
- extract($vars);
- preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches);
- if (!empty($matches[1])) {
- foreach ($matches[1] as $var) {
- $path = str_replace('{$' . $var . '}', $$var, $path);
- }
- }
- }
- return $path;
- }
- /**
- * Search through a passed paths array for a custom install path.
- *
- * @param array $paths
- * @param string $name
- * @param string $type
- * @param string $vendor = NULL
- * @return string
- */
- protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = NULL)
- {
- foreach ($paths as $path => $names) {
- if (in_array($name, $names) || in_array('type:' . $type, $names) || in_array('vendor:' . $vendor, $names)) {
- return $path;
- }
- }
- return false;
- }
- }
|