Skip to content

Commit 177e95d

Browse files
committed
Add Support for composer's config.vendor-dir setting
1 parent 39eb04e commit 177e95d

File tree

7 files changed

+43
-12
lines changed

7 files changed

+43
-12
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## Release 1.28.0
4+
* Add support for composer's `vendor-dir` setting when building autoloader based on composer.json and custom vendor directory location
5+
36
## Release 1.27.2
47
* Fix/Avoid deprecation notices in PHP 8.2
58

composer/bin/phpab

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,5 @@ foreach ($files as $file) {
5959
require __DIR__ . '/../../src/autoload.php';
6060

6161
$factory = new \TheSeer\Autoload\Factory();
62-
$factory->getCLI()->run();
62+
$factory->getCLI()->run($_SERVER);
6363
exit(0);

phpab.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@
5151
require __DIR__ . '/src/autoload.php';
5252

5353
$factory = new \TheSeer\Autoload\Factory();
54-
$factory->getCLI()->run();
54+
$factory->getCLI()->run($_SERVER);
5555
exit(0);

src/CLI.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public function __construct(Factory $factory) {
7373
*
7474
* @return void
7575
*/
76-
public function run() {
76+
public function run(array $env) {
7777

7878
try {
7979

@@ -93,7 +93,7 @@ public function run() {
9393
exit(CLI::RC_OK);
9494
}
9595

96-
$config = $this->configure($input);
96+
$config = $this->configure($env, $input);
9797
$this->factory->setConfig($config);
9898
if (!$config->isQuietMode()) {
9999
$this->showVersion();
@@ -140,7 +140,7 @@ public function run() {
140140
*
141141
* @return \TheSeer\Autoload\Config
142142
*/
143-
private function configure(\ezcConsoleInput $input) {
143+
private function configure(array $env, \ezcConsoleInput $input) {
144144
$config = new Config($input->getArguments());
145145
if ($input->getOption('quiet')->value) {
146146
$config->setQuietMode(TRUE);
@@ -262,6 +262,14 @@ private function configure(\ezcConsoleInput $input) {
262262
$config->setTrusting(FALSE);
263263
}
264264

265+
if (isset($env['HOME'])) {
266+
$config->setHomeDirectory($env['HOME']);
267+
} elseif (isset($env['HOMEDRIVE']) && isset($env['HOMEPATH'])) {
268+
$config->setHomeDirectory($env['HOMEDRIVE'] . $env['HOMEPATH']);
269+
} else {
270+
$config->setHomeDirectory('/');
271+
}
272+
265273
return $config;
266274
}
267275

src/ComposerIterator.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class ComposerIterator implements \Iterator {
1212

1313
private $pos = 0;
1414

15-
public function __construct(\SplFileInfo $composerFile) {
15+
public function __construct(\SplFileInfo $composerFile, $homeDirectory) {
1616
if (!$composerFile->isFile() || !$composerFile->isReadable()) {
1717
throw new ComposerIteratorException(
1818
sprintf('Composer file "%s" not found or not readable', $composerFile->getPathname()),
@@ -21,12 +21,22 @@ public function __construct(\SplFileInfo $composerFile) {
2121
}
2222
$composerDir = dirname($composerFile->getRealPath());
2323
$composerData = json_decode(file_get_contents($composerFile->getRealPath()), true);
24+
25+
$vendorDir = $composerDir . '/vendor';
26+
if (isset($composerData['config']['vendor-dir'])) {
27+
$vendorDir = preg_replace(
28+
'/($HOME|~)/',
29+
$homeDirectory,
30+
$composerData['config']['vendor-dir']
31+
);
32+
}
33+
2434
if (isset($composerData['require'])) {
2535
foreach($composerData['require'] as $require => $version) {
2636
if ($require === 'php' || strpos($require, 'ext-') === 0) {
2737
continue;
2838
}
29-
$this->processRequire($composerDir, $require);
39+
$this->processRequire($vendorDir, $require);
3040
}
3141
}
3242
if (isset($composerData['autoload'])) {
@@ -66,7 +76,8 @@ private function processRequire($basedir, $require) {
6676
}
6777
$this->seen[$require] = true;
6878

69-
$requireDir = $basedir . '/vendor/' . $require;
79+
$requireDir = $basedir . '/' . $require;
80+
7081
$jsonFile = $this->findComposerJson($requireDir);
7182
if ($jsonFile === null) {
7283
return;
@@ -168,7 +179,6 @@ public function valid() {
168179
public function rewind() {
169180
$this->pos = 0;
170181
}
171-
172182
}
173183

174184
class ComposerIteratorException extends \Exception {

src/Config.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class Config {
7373
private $prepend = false;
7474
private $exceptions = true;
7575

76+
private $homeDirectory = '';
77+
7678
public function __construct(Array $directories) {
7779
$this->directories = $directories;
7880
$this->php = (PHP_OS === 'WIN' ? 'C:\php\php.exe' : '/usr/bin/php');
@@ -82,6 +84,14 @@ public function setBaseDirectory($baseDirectory) {
8284
$this->baseDirectory = $baseDirectory;
8385
}
8486

87+
public function setHomeDirectory($homeDir) {
88+
$this->homeDirectory = $homeDir;
89+
}
90+
91+
public function getHomeDirectory(): string {
92+
return $this->homeDirectory;
93+
}
94+
8595
public function getBaseDirectory() {
8696
if ($this->baseDirectory !== NULL) {
8797
return realpath($this->baseDirectory);
@@ -391,7 +401,7 @@ public function getDirectories() {
391401
$list = array();
392402
foreach($this->directories as $dir) {
393403
if (is_file($dir) && basename($dir) == 'composer.json') {
394-
foreach(new ComposerIterator(new \SplFileInfo($dir)) as $d) {
404+
foreach(new ComposerIterator(new \SplFileInfo($dir), $this->getHomeDirectory()) as $d) {
395405
$list[] = $d;
396406
}
397407
} else {

tests/ComposerIteratorTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
class ComposerIteratorTest extends TestCase {
77

88
public function testRecursionIsHandledProperly() {
9-
$iterator = new ComposerIterator(new \SplFileInfo(__DIR__ . '/_data/recursion/composer.json'));
9+
$iterator = new ComposerIterator(new \SplFileInfo(__DIR__ . '/_data/recursion/composer.json'), array());
1010
$expected = array(
1111
__DIR__ . '/_data/recursion/vendor/foo/bar',
1212
__DIR__ . '/_data/recursion/vendor/bar/foo'
@@ -17,7 +17,7 @@ public function testRecursionIsHandledProperly() {
1717
}
1818

1919
public function testPSR14ArrayIsSupported() {
20-
$iterator = new ComposerIterator(new \SplFileInfo(__DIR__ . '/_data/composer-array-issue-98/composer.json'));
20+
$iterator = new ComposerIterator(new \SplFileInfo(__DIR__ . '/_data/composer-array-issue-98/composer.json'), array());
2121
$expected = array(
2222
__DIR__ . '/_data/composer-array-issue-98/../src',
2323
__DIR__ . '/_data/composer-array-issue-98/modules',

0 commit comments

Comments
 (0)