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 }
|