diff --git a/lib/Extension.php b/lib/Extension.php index 9e35e0b..973be70 100644 --- a/lib/Extension.php +++ b/lib/Extension.php @@ -39,8 +39,11 @@ public function configure(ArrayNodeDefinition $builder) $builder ->prototype('array') ->children() - ->enumNode('type')->values(['local', 'remote', 'docker'])->defaultValue('local')->end() + ->enumNode('type')->values(['local', 'remote', 'docker', 'vagrant'])->defaultValue('local')->end() ->scalarNode('base_dir')->defaultNull()->end() + ->arrayNode('env') + ->prototype('scalar')->end() + ->end() ->scalarNode('ssh_command')->defaultValue('ssh')->end() ->scalarNode('scp_command')->defaultValue('scp')->end() ->scalarNode('ssh_options')->defaultNull()->end() @@ -49,6 +52,7 @@ public function configure(ArrayNodeDefinition $builder) ->scalarNode('docker_command')->defaultValue('docker')->end() ->scalarNode('docker_options')->defaultNull()->end() ->scalarNode('docker_containername')->defaultNull()->end() + ->scalarNode('vagrant_cwd')->defaultNull()->end() ->end() ->end(); } diff --git a/lib/ShellContext.php b/lib/ShellContext.php index 1312bdc..8b358b3 100644 --- a/lib/ShellContext.php +++ b/lib/ShellContext.php @@ -48,6 +48,8 @@ public function initializeFeatureFilePath(ScenarioScope $scope) */ public function iRun($command, $server = 'default') { + $server = str_replace('-', '_', $server); + if (!isset($this->config[$server])) { throw new \Exception(sprintf('Configuration not found for server "%s"', $server)); } @@ -177,6 +179,10 @@ private function createProcess($command, array $serverConfig) $process = $this->createDockerProcess($command, $serverConfig); break; + case 'vagrant': + $process = $this->createVagrantProcess($command, $serverConfig); + break; + default: $process = $this->createLocalProcess($command, $serverConfig); break; @@ -189,6 +195,21 @@ private function createProcess($command, array $serverConfig) return $process; } + /** + * @param string $command + * @param array $nv + * + * @return string + */ + private function prefixEnvToCommand($command, $env) + { + $prefix = ''; + foreach ($env as $key => $value) { + $prefix .= sprintf("%s=%s ", $key, escapeshellarg($value)); + } + return $prefix . $command; + } + /** * @param string $command * @param array $serverConfig @@ -197,6 +218,10 @@ private function createProcess($command, array $serverConfig) */ private function createLocalProcess($command, array $serverConfig) { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + return new Process($command, $serverConfig['base_dir']); } @@ -208,6 +233,10 @@ private function createLocalProcess($command, array $serverConfig) */ private function createRemoteProcess($command, array $serverConfig) { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + if ($serverConfig['base_dir']) { $command = sprintf('cd %s ; %s', $serverConfig['base_dir'], $command); } @@ -223,6 +252,34 @@ private function createRemoteProcess($command, array $serverConfig) return new Process($command); } + /** + * @param string $command + * @param array $serverConfig + * + * @return Process + */ + private function createVagrantProcess($command, array $serverConfig) + { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + + if ($serverConfig['base_dir']) { + $command = sprintf('cd %s ; %s', $serverConfig['base_dir'], $command); + } + + $command = sprintf( + 'vagrant ssh -- %s', + escapeshellarg($command) + ); + + if ($serverConfig['vagrant_cwd']) { + return new Process($command, $serverConfig['vagrant_cwd']); + } else { + return new Process($command); + } + } + /** * @param string $command * @param array $serverConfig @@ -231,6 +288,10 @@ private function createRemoteProcess($command, array $serverConfig) */ private function createDockerProcess($command, array $serverConfig) { + if ($serverConfig['env']) { + $command = $this->prefixEnvToCommand($command, $serverConfig['env']); + } + if ($serverConfig['base_dir']) { $command = sprintf('cd %s ; %s', $serverConfig['base_dir'], $command); }