AglInstaller.php
11 years ago
AnnotateCmsInstaller.php
11 years ago
BaseInstaller.php
11 years ago
CakePHPInstaller.php
11 years ago
CodeIgniterInstaller.php
11 years ago
CroogoInstaller.php
11 years ago
DrupalInstaller.php
11 years ago
FuelInstaller.php
11 years ago
Installer.php
11 years ago
JoomlaInstaller.php
11 years ago
KohanaInstaller.php
11 years ago
LaravelInstaller.php
11 years ago
LithiumInstaller.php
11 years ago
MODULEWorkInstaller.php
11 years ago
MagentoInstaller.php
11 years ago
MakoInstaller.php
11 years ago
MediaWikiInstaller.php
11 years ago
OxidInstaller.php
11 years ago
PPIInstaller.php
11 years ago
PhpBBInstaller.php
11 years ago
SilverStripeInstaller.php
11 years ago
Symfony1Installer.php
11 years ago
TYPO3CmsInstaller.php
11 years ago
TYPO3FlowInstaller.php
11 years ago
WordPressInstaller.php
11 years ago
ZendInstaller.php
11 years ago
BaseInstaller.php
131 lines
| 1 | <?php |
| 2 | namespace Composer\Installers; |
| 3 | |
| 4 | use Composer\Composer; |
| 5 | use Composer\Package\PackageInterface; |
| 6 | |
| 7 | abstract class BaseInstaller |
| 8 | { |
| 9 | protected $locations = array(); |
| 10 | protected $composer; |
| 11 | protected $package; |
| 12 | |
| 13 | /** |
| 14 | * Initializes base installer. |
| 15 | * |
| 16 | * @param PackageInterface $package |
| 17 | * @param Composer $composer |
| 18 | */ |
| 19 | public function __construct(PackageInterface $package = null, Composer $composer = null) |
| 20 | { |
| 21 | $this->composer = $composer; |
| 22 | $this->package = $package; |
| 23 | } |
| 24 | |
| 25 | /** |
| 26 | * Return the install path based on package type. |
| 27 | * |
| 28 | * @param PackageInterface $package |
| 29 | * @param string $frameworkType |
| 30 | * @return string |
| 31 | */ |
| 32 | public function getInstallPath(PackageInterface $package, $frameworkType = '') |
| 33 | { |
| 34 | $type = $this->package->getType(); |
| 35 | |
| 36 | $prettyName = $this->package->getPrettyName(); |
| 37 | if (strpos($prettyName, '/') !== false) { |
| 38 | list($vendor, $name) = explode('/', $prettyName); |
| 39 | } else { |
| 40 | $vendor = ''; |
| 41 | $name = $prettyName; |
| 42 | } |
| 43 | |
| 44 | $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type')); |
| 45 | |
| 46 | $extra = $package->getExtra(); |
| 47 | if (!empty($extra['installer-name'])) { |
| 48 | $availableVars['name'] = $extra['installer-name']; |
| 49 | } |
| 50 | |
| 51 | if ($this->composer->getPackage()) { |
| 52 | $extra = $this->composer->getPackage()->getExtra(); |
| 53 | if (!empty($extra['installer-paths'])) { |
| 54 | $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type); |
| 55 | if ($customPath !== false) { |
| 56 | return $this->templatePath($customPath, $availableVars); |
| 57 | } |
| 58 | } |
| 59 | } |
| 60 | |
| 61 | $packageType = substr($type, strlen($frameworkType) + 1); |
| 62 | if (!isset($this->locations[$packageType])) { |
| 63 | throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type)); |
| 64 | } |
| 65 | |
| 66 | return $this->templatePath($this->locations[$packageType], $availableVars); |
| 67 | } |
| 68 | |
| 69 | /** |
| 70 | * For an installer to override to modify the vars per installer. |
| 71 | * |
| 72 | * @param array $vars |
| 73 | * @return array |
| 74 | */ |
| 75 | public function inflectPackageVars($vars) |
| 76 | { |
| 77 | return $vars; |
| 78 | } |
| 79 | |
| 80 | /** |
| 81 | * Gets the installer's locations |
| 82 | * |
| 83 | * @return array |
| 84 | */ |
| 85 | public function getLocations() |
| 86 | { |
| 87 | return $this->locations; |
| 88 | } |
| 89 | |
| 90 | /** |
| 91 | * Replace vars in a path |
| 92 | * |
| 93 | * @param string $path |
| 94 | * @param array $vars |
| 95 | * @return string |
| 96 | */ |
| 97 | protected function templatePath($path, array $vars = array()) |
| 98 | { |
| 99 | if (strpos($path, '{') !== false) { |
| 100 | extract($vars); |
| 101 | preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches); |
| 102 | if (!empty($matches[1])) { |
| 103 | foreach ($matches[1] as $var) { |
| 104 | $path = str_replace('{$' . $var . '}', $$var, $path); |
| 105 | } |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | return $path; |
| 110 | } |
| 111 | |
| 112 | /** |
| 113 | * Search through a passed paths array for a custom install path. |
| 114 | * |
| 115 | * @param array $paths |
| 116 | * @param string $name |
| 117 | * @param string $type |
| 118 | * @return string |
| 119 | */ |
| 120 | protected function mapCustomInstallPaths(array $paths, $name, $type) |
| 121 | { |
| 122 | foreach ($paths as $path => $names) { |
| 123 | if (in_array($name, $names) || in_array('type:' . $type, $names)) { |
| 124 | return $path; |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | return false; |
| 129 | } |
| 130 | } |
| 131 |