Skip to content

Commit ddd31e7

Browse files
committed
Make installation more robust
* Remove autoload.php generation * Make using the puli/cli in the same project work
1 parent 8b71670 commit ddd31e7

File tree

1 file changed

+46
-39
lines changed

1 file changed

+46
-39
lines changed

src/PuliPluginImpl.php

+46-39
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
use Composer\Composer;
1515
use Composer\Config;
1616
use Composer\IO\IOInterface;
17+
use Composer\Json\JsonFile;
1718
use Composer\Package\AliasPackage;
1819
use Composer\Package\PackageInterface;
1920
use Composer\Script\Event;
21+
use Composer\Util\RemoteFilesystem;
2022
use Exception;
2123
use RuntimeException;
2224
use Symfony\Component\Filesystem\Filesystem;
@@ -103,11 +105,6 @@ class PuliPluginImpl
103105
*/
104106
private $initialized = false;
105107

106-
/**
107-
* @var string
108-
*/
109-
private $autoloadFile;
110-
111108
public function __construct(Event $event, PuliRunner $puliRunner = null)
112109
{
113110
$this->composer = $event->getComposer();
@@ -116,38 +113,19 @@ public function __construct(Event $event, PuliRunner $puliRunner = null)
116113
$this->isDev = $event->isDevMode();
117114
$this->puliRunner = $puliRunner;
118115
$this->rootDir = Path::normalize(getcwd());
119-
120-
$vendorDir = $this->config->get('vendor-dir');
121-
122-
// On TravisCI, $vendorDir is a relative path. Probably an old Composer
123-
// build or something. Usually, $vendorDir should be absolute already.
124-
$vendorDir = Path::makeAbsolute($vendorDir, $this->rootDir);
125-
126-
$this->autoloadFile = $vendorDir.'/autoload.php';
127116
}
128117

129118
public function preAutoloadDump()
130119
{
131-
if (!$this->initialized) {
132-
$this->initialize();
133-
}
134-
135-
// This method is called twice. Run it only once.
120+
// This method is called multiple times. Run it only once.
136121
if (!$this->runPreAutoloadDump) {
137122
return;
138123
}
139124

140125
$this->runPreAutoloadDump = false;
141126

142-
try {
143-
$factoryClass = $this->getConfigKey('factory.in.class');
144-
$factoryFile = $this->getConfigKey('factory.in.file');
145-
} catch (PuliRunnerException $e) {
146-
$this->printWarning('Could not load Puli configuration', $e);
147-
148-
return;
149-
}
150-
127+
$factoryClass = $this->getConfigKey('factory.in.class');
128+
$factoryFile = $this->getConfigKey('factory.in.file');
151129
$factoryFile = Path::makeAbsolute($factoryFile, $this->rootDir);
152130

153131
$autoload = $this->composer->getPackage()->getAutoload();
@@ -178,7 +156,7 @@ public function postAutoloadDump()
178156
$this->initialize();
179157
}
180158

181-
// This method is called twice. Run it only once.
159+
// This method is called multiple times. Run it only once.
182160
if (!$this->runPostAutoloadDump) {
183161
return;
184162
}
@@ -193,8 +171,15 @@ public function postAutoloadDump()
193171
return;
194172
}
195173

196-
$this->insertFactoryClassConstant($this->autoloadFile, $factoryClass);
197-
$this->setBootstrapFile($this->autoloadFile);
174+
$vendorDir = $this->config->get('vendor-dir');
175+
176+
// On TravisCI, $vendorDir is a relative path. Probably an old Composer
177+
// build or something. Usually, $vendorDir should be absolute already.
178+
$vendorDir = Path::makeAbsolute($vendorDir, $this->rootDir);
179+
180+
$autoloadFile = $vendorDir.'/autoload.php';
181+
$this->insertFactoryClassConstant($autoloadFile, $factoryClass);
182+
$this->setBootstrapFile($autoloadFile);
198183
}
199184

200185
/**
@@ -206,7 +191,7 @@ public function postInstall()
206191
$this->initialize();
207192
}
208193

209-
// This method is called twice. Run it only once.
194+
// This method is called multiple times. Run it only once.
210195
if (!$this->runPostInstall) {
211196
return;
212197
}
@@ -251,13 +236,6 @@ public function postInstall()
251236

252237
private function initialize()
253238
{
254-
if (!file_exists($this->autoloadFile)) {
255-
$filesystem = new Filesystem();
256-
// Avoid problems if using the runner before autoload.php has been
257-
// generated
258-
$filesystem->dumpFile($this->autoloadFile, '');
259-
}
260-
261239
$this->initialized = true;
262240

263241
// Keep the manually set runner
@@ -518,7 +496,7 @@ private function setBootstrapFile($autoloadFile)
518496
/**
519497
* Loads Composer's currently installed packages.
520498
*
521-
* @return PackageInterface[] The installed packages indexed by their names.
499+
* @return PackageInterface[] The installed packages indexed by their names
522500
*/
523501
private function loadComposerPackages()
524502
{
@@ -535,6 +513,35 @@ private function loadComposerPackages()
535513

536514
private function getConfigKey($key)
537515
{
516+
if (null === $this->puliRunner) {
517+
$puliJsonPath = realpath(substr($this->config->get('vendor-dir'), 0, -strlen($this->config->get('vendor-dir', Config::RELATIVE_PATHS)))).DIRECTORY_SEPARATOR.'puli.json';
518+
if (file_exists($puliJsonPath)) {
519+
$puliJsonFile = new JsonFile($puliJsonPath, new RemoteFilesystem($this->io));
520+
$puliConfig = $puliJsonFile->read();
521+
if (empty($puliConfig['version']) || '1.0' !== $puliConfig['version']) {
522+
throw new \RuntimeException('Invalid configuration version schema!');
523+
}
524+
}
525+
switch ($key) {
526+
case 'factory.in.file':
527+
if (empty($puliConfig) || empty($puliConfig['config']['factory']['in']['file'])) {
528+
return '.puli/GeneratedPuliFactory';
529+
}
530+
531+
return $puliConfig['config']['factory']['in']['file'];
532+
break;
533+
case 'factory.in.class':
534+
if (empty($puliConfig) || empty($puliConfig['config']['factory']['in']['class'])) {
535+
return 'Puli\\GeneratedPuliFactory';
536+
}
537+
538+
return $puliConfig['config']['factory']['in']['class'];
539+
break;
540+
default:
541+
throw new \RuntimeException(sprintf('Cannot extract key "%s" from config!', $key));
542+
}
543+
}
544+
538545
$value = trim($this->puliRunner->run('config %key% --parsed', array(
539546
'key' => $key,
540547
)));

0 commit comments

Comments
 (0)