diff --git a/src/Composer/Command/ExecCommand.php b/src/Composer/Command/ExecCommand.php index c9184c707..d6e49b4f9 100644 --- a/src/Composer/Command/ExecCommand.php +++ b/src/Composer/Command/ExecCommand.php @@ -39,7 +39,7 @@ class ExecCommand extends BaseCommand ->setHelp( <<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')); } } diff --git a/src/Composer/Console/Application.php b/src/Composer/Console/Application.php index 15167af9c..65bb07f62 100644 --- a/src/Composer/Console/Application.php +++ b/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; + } }