Browse Source

Make global exec execute commands in working directory

Chad Wade Day, Jr 5 years ago
parent
commit
917680e0d4
2 changed files with 27 additions and 1 deletions
  1. 9 1
      src/Composer/Command/ExecCommand.php
  2. 18 0
      src/Composer/Console/Application.php

+ 9 - 1
src/Composer/Command/ExecCommand.php

@@ -39,7 +39,7 @@ class ExecCommand extends BaseCommand
             ->setHelp(
                 <<<EOT
 Executes a vendored binary/script.
-                
+
 Read more at https://getcomposer.org/doc/03-cli.md#exec
 EOT
             )
@@ -92,6 +92,14 @@ EOT
             $output->setVerbosity(OutputInterface::VERBOSITY_QUIET);
         }
 
+        if (getcwd() !== $this->getApplication()->getWorkingDirectory()) {
+            try {
+                chdir($this->getApplication()->getWorkingDirectory());
+            } catch (\Exception $e) {
+                throw new \RuntimeException('Could not switch back to working directory "'.$this->getApplication()->getWorkingDirectory().'"', 0, $e);
+            }
+        }
+
         return $dispatcher->dispatchScript('__exec_command', true, $input->getArgument('args'));
     }
 }

+ 18 - 0
src/Composer/Console/Application.php

@@ -62,6 +62,12 @@ class Application extends BaseApplication
     private $hasPluginCommands = false;
     private $disablePluginsByDefault = false;
 
+    /**
+     * @var string Store the working directory so Composer
+     *             can switch back to it if there are issues
+     */
+    private $workingDirectory = '';
+
     public function __construct()
     {
         static $shutdownRegistered = false;
@@ -91,6 +97,8 @@ class Application extends BaseApplication
 
         $this->io = new NullIO();
 
+        $this->workingDirectory = getcwd();
+
         parent::__construct('Composer', Composer::getVersion());
     }
 
@@ -491,4 +499,14 @@ class Application extends BaseApplication
 
         return $commands;
     }
+
+    /**
+     * Get the working directoy
+     *
+     * @return string
+     */
+    public function getWorkingDirectory()
+    {
+        return $this->workingDirectory;
+    }
 }