diff --git a/src/Runtime/Runtime.php b/src/Runtime/Runtime.php index e03cc48..a9b2c24 100644 --- a/src/Runtime/Runtime.php +++ b/src/Runtime/Runtime.php @@ -229,6 +229,26 @@ class Runtime return $default; } + /** + * Shortcut to get the the configuration option for a specific environment and merge it with + * the global one (environment specific overrides the global one if present). + * + * @param $key + * @param array $defaultEnv + * + * @return array + */ + public function getMergedOption($key, $defaultEnv = []) + { + $userGlobalOptions = $this->getConfigOption($key, $defaultEnv); + $userEnvOptions = $this->getEnvOption($key, $defaultEnv); + + return array_merge( + (is_array($userGlobalOptions) ? $userGlobalOptions : []), + (is_array($userEnvOptions) ? $userEnvOptions : []) + ); + } + /** * Overwrites an Environment Configuration Option * diff --git a/src/Task/BuiltIn/Composer/DumpAutoloadTask.php b/src/Task/BuiltIn/Composer/DumpAutoloadTask.php index b778413..9078283 100644 --- a/src/Task/BuiltIn/Composer/DumpAutoloadTask.php +++ b/src/Task/BuiltIn/Composer/DumpAutoloadTask.php @@ -43,10 +43,9 @@ class DumpAutoloadTask extends AbstractTask protected function getOptions() { - $userOptions = $this->runtime->getConfigOption('composer', []); $options = array_merge( ['path' => 'composer', 'flags' => '--optimize'], - (is_array($userOptions) ? $userOptions : []), + $this->runtime->getMergedOption('composer'), $this->options ); diff --git a/src/Task/BuiltIn/Composer/InstallTask.php b/src/Task/BuiltIn/Composer/InstallTask.php index ce97361..7a63672 100644 --- a/src/Task/BuiltIn/Composer/InstallTask.php +++ b/src/Task/BuiltIn/Composer/InstallTask.php @@ -43,10 +43,9 @@ class InstallTask extends AbstractTask protected function getOptions() { - $userOptions = $this->runtime->getConfigOption('composer', []); $options = array_merge( ['path' => 'composer', 'flags' => '--optimize-autoloader'], - (is_array($userOptions) ? $userOptions : []), + $this->runtime->getMergedOption('composer'), $this->options ); diff --git a/src/Task/BuiltIn/Symfony/AsseticDumpTask.php b/src/Task/BuiltIn/Symfony/AsseticDumpTask.php index 4c4404c..3f23d19 100644 --- a/src/Task/BuiltIn/Symfony/AsseticDumpTask.php +++ b/src/Task/BuiltIn/Symfony/AsseticDumpTask.php @@ -43,12 +43,9 @@ class AsseticDumpTask extends AbstractTask protected function getOptions() { - $userGlobalOptions = $this->runtime->getConfigOption('symfony', []); - $userEnvOptions = $this->runtime->getEnvOption('symfony', []); $options = array_merge( ['console' => 'bin/console', 'env' => 'dev', 'flags' => ''], - (is_array($userGlobalOptions) ? $userGlobalOptions : []), - (is_array($userEnvOptions) ? $userEnvOptions : []), + $this->runtime->getMergedOption('symfony'), $this->options ); diff --git a/src/Task/BuiltIn/Symfony/AssetsInstallTask.php b/src/Task/BuiltIn/Symfony/AssetsInstallTask.php index a6a63c4..001d100 100644 --- a/src/Task/BuiltIn/Symfony/AssetsInstallTask.php +++ b/src/Task/BuiltIn/Symfony/AssetsInstallTask.php @@ -43,12 +43,9 @@ class AssetsInstallTask extends AbstractTask protected function getOptions() { - $userGlobalOptions = $this->runtime->getConfigOption('symfony', []); - $userEnvOptions = $this->runtime->getEnvOption('symfony', []); $options = array_merge( ['console' => 'bin/console', 'env' => 'dev', 'target' => 'web', 'flags' => '--symlink --relative'], - (is_array($userGlobalOptions) ? $userGlobalOptions : []), - (is_array($userEnvOptions) ? $userEnvOptions : []), + $this->runtime->getMergedOption('symfony'), $this->options ); diff --git a/src/Task/BuiltIn/Symfony/CacheClearTask.php b/src/Task/BuiltIn/Symfony/CacheClearTask.php index bd5b77a..a0b6475 100644 --- a/src/Task/BuiltIn/Symfony/CacheClearTask.php +++ b/src/Task/BuiltIn/Symfony/CacheClearTask.php @@ -43,12 +43,9 @@ class CacheClearTask extends AbstractTask protected function getOptions() { - $userGlobalOptions = $this->runtime->getConfigOption('symfony', []); - $userEnvOptions = $this->runtime->getEnvOption('symfony', []); $options = array_merge( ['console' => 'bin/console', 'env' => 'dev', 'flags' => ''], - (is_array($userGlobalOptions) ? $userGlobalOptions : []), - (is_array($userEnvOptions) ? $userEnvOptions : []), + $this->runtime->getMergedOption('symfony'), $this->options ); diff --git a/src/Task/BuiltIn/Symfony/CacheWarmupTask.php b/src/Task/BuiltIn/Symfony/CacheWarmupTask.php index a2e30f0..8584beb 100644 --- a/src/Task/BuiltIn/Symfony/CacheWarmupTask.php +++ b/src/Task/BuiltIn/Symfony/CacheWarmupTask.php @@ -43,12 +43,9 @@ class CacheWarmupTask extends AbstractTask protected function getOptions() { - $userGlobalOptions = $this->runtime->getConfigOption('symfony', []); - $userEnvOptions = $this->runtime->getEnvOption('symfony', []); $options = array_merge( ['console' => 'bin/console', 'env' => 'dev', 'flags' => ''], - (is_array($userGlobalOptions) ? $userGlobalOptions : []), - (is_array($userEnvOptions) ? $userEnvOptions : []), + $this->runtime->getMergedOption('symfony'), $this->options ); diff --git a/tests/Command/BuiltIn/DeployCommandMiscTasksTest.php b/tests/Command/BuiltIn/DeployCommandMiscTasksTest.php index 4d5efd6..a4beb90 100644 --- a/tests/Command/BuiltIn/DeployCommandMiscTasksTest.php +++ b/tests/Command/BuiltIn/DeployCommandMiscTasksTest.php @@ -80,6 +80,36 @@ class DeployCommandMiscTasksTest extends TestCase $this->assertEquals(0, $tester->getStatusCode()); } + public function testComposerEnvFlags() + { + $application = new MageApplicationMockup(__DIR__ . '/../../Resources/composer-env.yml'); + + /** @var AbstractCommand $command */ + $command = $application->find('deploy'); + $this->assertTrue($command instanceof DeployCommand); + + $tester = new CommandTester($command); + $tester->execute(['command' => $command->getName(), 'environment' => 'test']); + + $ranCommands = $application->getRuntime()->getRanCommands(); + + $testCase = array( + 0 => '/usr/foobar/composer install --prefer-source', + 1 => '/usr/foobar/composer dump-autoload --no-scripts', + 2 => 'rsync -e "ssh -p 22 -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" -avz --exclude=.git --exclude=./var/cache/* --exclude=./var/log/* --exclude=./web/app_dev.php ./ tester@testhost:/var/www/test', + ); + + // Check total of Executed Commands + $this->assertEquals(count($testCase), count($ranCommands)); + + // Check Generated Commands + foreach ($testCase as $index => $command) { + $this->assertEquals($command, $ranCommands[$index]); + } + + $this->assertEquals(0, $tester->getStatusCode()); + } + public function testInvalidTaskName() { $application = new MageApplicationMockup(__DIR__ . '/../../Resources/invalid-task.yml'); diff --git a/tests/Resources/composer-env.yml b/tests/Resources/composer-env.yml new file mode 100644 index 0000000..2421fdf --- /dev/null +++ b/tests/Resources/composer-env.yml @@ -0,0 +1,19 @@ +magephp: + log_dir: /tmp + composer: + path: /usr/bin/composer.phar + environments: + test: + composer: + path: /usr/foobar/composer + user: tester + host_path: /var/www/test + exclude: + - ./var/cache/* + - ./var/log/* + - ./web/app_dev.php + hosts: + - testhost + pre-deploy: + - composer/install: { flags: '--prefer-source' } + - composer/dump-autoload: { flags: '--no-scripts' }