annotate vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Composer\Installers;
Chris@0 4
Chris@0 5 use Composer\Util\Filesystem;
Chris@0 6
Chris@0 7 /**
Chris@0 8 * Installer for Bitrix Framework. Supported types of extensions:
Chris@0 9 * - `bitrix-d7-module` — copy the module to directory `bitrix/modules/<vendor>.<name>`.
Chris@0 10 * - `bitrix-d7-component` — copy the component to directory `bitrix/components/<vendor>/<name>`.
Chris@0 11 * - `bitrix-d7-template` — copy the template to directory `bitrix/templates/<vendor>_<name>`.
Chris@0 12 *
Chris@0 13 * You can set custom path to directory with Bitrix kernel in `composer.json`:
Chris@0 14 *
Chris@0 15 * ```json
Chris@0 16 * {
Chris@0 17 * "extra": {
Chris@0 18 * "bitrix-dir": "s1/bitrix"
Chris@0 19 * }
Chris@0 20 * }
Chris@0 21 * ```
Chris@0 22 *
Chris@0 23 * @author Nik Samokhvalov <nik@samokhvalov.info>
Chris@0 24 * @author Denis Kulichkin <onexhovia@gmail.com>
Chris@0 25 */
Chris@0 26 class BitrixInstaller extends BaseInstaller
Chris@0 27 {
Chris@0 28 protected $locations = array(
Chris@0 29 'module' => '{$bitrix_dir}/modules/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken)
Chris@0 30 'component' => '{$bitrix_dir}/components/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken)
Chris@0 31 'theme' => '{$bitrix_dir}/templates/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken)
Chris@0 32 'd7-module' => '{$bitrix_dir}/modules/{$vendor}.{$name}/',
Chris@0 33 'd7-component' => '{$bitrix_dir}/components/{$vendor}/{$name}/',
Chris@0 34 'd7-template' => '{$bitrix_dir}/templates/{$vendor}_{$name}/',
Chris@0 35 );
Chris@0 36
Chris@0 37 /**
Chris@0 38 * @var array Storage for informations about duplicates at all the time of installation packages.
Chris@0 39 */
Chris@0 40 private static $checkedDuplicates = array();
Chris@0 41
Chris@0 42 /**
Chris@0 43 * {@inheritdoc}
Chris@0 44 */
Chris@0 45 public function inflectPackageVars($vars)
Chris@0 46 {
Chris@0 47 if ($this->composer->getPackage()) {
Chris@0 48 $extra = $this->composer->getPackage()->getExtra();
Chris@0 49
Chris@0 50 if (isset($extra['bitrix-dir'])) {
Chris@0 51 $vars['bitrix_dir'] = $extra['bitrix-dir'];
Chris@0 52 }
Chris@0 53 }
Chris@0 54
Chris@0 55 if (!isset($vars['bitrix_dir'])) {
Chris@0 56 $vars['bitrix_dir'] = 'bitrix';
Chris@0 57 }
Chris@0 58
Chris@0 59 return parent::inflectPackageVars($vars);
Chris@0 60 }
Chris@0 61
Chris@0 62 /**
Chris@0 63 * {@inheritdoc}
Chris@0 64 */
Chris@0 65 protected function templatePath($path, array $vars = array())
Chris@0 66 {
Chris@0 67 $templatePath = parent::templatePath($path, $vars);
Chris@0 68 $this->checkDuplicates($templatePath, $vars);
Chris@0 69
Chris@0 70 return $templatePath;
Chris@0 71 }
Chris@0 72
Chris@0 73 /**
Chris@0 74 * Duplicates search packages.
Chris@0 75 *
Chris@0 76 * @param string $path
Chris@0 77 * @param array $vars
Chris@0 78 */
Chris@0 79 protected function checkDuplicates($path, array $vars = array())
Chris@0 80 {
Chris@0 81 $packageType = substr($vars['type'], strlen('bitrix') + 1);
Chris@0 82 $localDir = explode('/', $vars['bitrix_dir']);
Chris@0 83 array_pop($localDir);
Chris@0 84 $localDir[] = 'local';
Chris@0 85 $localDir = implode('/', $localDir);
Chris@0 86
Chris@0 87 $oldPath = str_replace(
Chris@0 88 array('{$bitrix_dir}', '{$name}'),
Chris@0 89 array($localDir, $vars['name']),
Chris@0 90 $this->locations[$packageType]
Chris@0 91 );
Chris@0 92
Chris@0 93 if (in_array($oldPath, static::$checkedDuplicates)) {
Chris@0 94 return;
Chris@0 95 }
Chris@0 96
Chris@0 97 if ($oldPath !== $path && file_exists($oldPath) && $this->io && $this->io->isInteractive()) {
Chris@0 98
Chris@0 99 $this->io->writeError(' <error>Duplication of packages:</error>');
Chris@0 100 $this->io->writeError(' <info>Package ' . $oldPath . ' will be called instead package ' . $path . '</info>');
Chris@0 101
Chris@0 102 while (true) {
Chris@0 103 switch ($this->io->ask(' <info>Delete ' . $oldPath . ' [y,n,?]?</info> ', '?')) {
Chris@0 104 case 'y':
Chris@0 105 $fs = new Filesystem();
Chris@0 106 $fs->removeDirectory($oldPath);
Chris@0 107 break 2;
Chris@0 108
Chris@0 109 case 'n':
Chris@0 110 break 2;
Chris@0 111
Chris@0 112 case '?':
Chris@0 113 default:
Chris@0 114 $this->io->writeError(array(
Chris@0 115 ' y - delete package ' . $oldPath . ' and to continue with the installation',
Chris@0 116 ' n - don\'t delete and to continue with the installation',
Chris@0 117 ));
Chris@0 118 $this->io->writeError(' ? - print help');
Chris@0 119 break;
Chris@0 120 }
Chris@0 121 }
Chris@0 122 }
Chris@0 123
Chris@0 124 static::$checkedDuplicates[] = $oldPath;
Chris@0 125 }
Chris@0 126 }