1414use Composer \Composer ;
1515use Composer \Config ;
1616use Composer \IO \IOInterface ;
17+ use Composer \Json \JsonFile ;
1718use Composer \Package \AliasPackage ;
1819use Composer \Package \PackageInterface ;
1920use Composer \Script \Event ;
21+ use Composer \Util \RemoteFilesystem ;
2022use Exception ;
2123use RuntimeException ;
2224use 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
@@ -535,6 +513,33 @@ 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+ return $ puliConfig ['config ' ]['factory ' ]['in ' ]['file ' ];
531+ break ;
532+ case 'factory.in.class ' :
533+ if (empty ($ puliConfig ) || empty ($ puliConfig ['config ' ]['factory ' ]['in ' ]['class ' ])) {
534+ return 'Puli \\GeneratedPuliFactory ' ;
535+ }
536+ return $ puliConfig ['config ' ]['factory ' ]['in ' ]['class ' ];
537+ break ;
538+ default :
539+ throw new \RuntimeException (sprintf ('Cannot extract key "%s" from config! ' , $ key ));
540+ }
541+ }
542+
538543 $ value = trim ($ this ->puliRunner ->run ('config %key% --parsed ' , array (
539544 'key ' => $ key ,
540545 )));
0 commit comments