From 6e1a0b0c4d67c82d6ba82b0b1636b52f2a9bf583 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 3 Jul 2014 13:39:04 +0200 Subject: [PATCH] deployment.php: refactoring to class CliRunner --- Deployment/deployment.php | 139 +----------------------- Deployment/libs/CliRunner.php | 197 ++++++++++++++++++++++++++++++++++ 2 files changed, 200 insertions(+), 136 deletions(-) create mode 100644 Deployment/libs/CliRunner.php diff --git a/Deployment/deployment.php b/Deployment/deployment.php index dc73ff31..35a21a29 100644 --- a/Deployment/deployment.php +++ b/Deployment/deployment.php @@ -7,141 +7,8 @@ require __DIR__ . '/libs/Deployer.php'; require __DIR__ . '/libs/Preprocessor.php'; require __DIR__ . '/libs/CommandLine.php'; +require __DIR__ . '/libs/CliRunner.php'; - -$cmd = new CommandLine(" -FTP deployment v1.5.1 ---------------------- -Usage: - deployment.php [-t | --test] - -Options: - -t | --test Run in test-mode. - -", [ - 'config' => [CommandLine::REALPATH => TRUE], -]); - -if ($cmd->isEmpty()) { - $cmd->help(); - exit; -} - -$options = $cmd->parse(); - -if (pathinfo($options['config'], PATHINFO_EXTENSION) == 'php') { - $config = include $options['config']; -} else { - $config = parse_ini_file($options['config'], TRUE); -} - -$config += [ - 'log' => preg_replace('#\.\w+$#', '.log', $options['config']), - 'tempdir' => sys_get_temp_dir() . '/deployment', - 'colors' => (PHP_SAPI === 'cli' && ((function_exists('posix_isatty') && posix_isatty(STDOUT)) - || getenv('ConEmuANSI') === 'ON' || getenv('ANSICON') !== FALSE)), -]; - -$logger = new Logger($config['log']); -$logger->useColors = (bool) $config['colors']; - - -if (!is_dir($tempDir = $config['tempdir'])) { - $this->logger->log("Creating temporary directory $tempDir"); - mkdir($tempDir); -} - - -// configure PHP -set_time_limit(0); -date_default_timezone_set('Europe/Prague'); -set_error_handler(function($severity, $message, $file, $line) use ($logger) { - if (($severity & error_reporting()) === $severity) { - $logger->log("Error: $message in $file on $line", 'light-red'); - exit; - } - return FALSE; -}); -set_exception_handler(function($e) use ($logger) { - $logger->log("Error: {$e->getMessage()}\n\n$e", 'light-red'); -}); - - -function toArray($val, $lines = FALSE) -{ - return is_array($val) ? array_filter($val) : preg_split($lines ? '#\s*\n\s*#' : '#\s+#', $val, -1, PREG_SPLIT_NO_EMPTY); -} - - -// start deploy -$time = time(); -$logger->log("Started at " . date('[Y/m/d H:i]')); -$logger->log("Config file is $options[config]"); - -if (isset($config['remote']) && is_string($config['remote'])) { - $config = ['' => $config]; -} - -foreach ($config as $section => $cfg) { - if (!is_array($cfg)) { - continue; - } - - $logger->log("\nDeploying $section"); - - $cfg = array_change_key_case($cfg, CASE_LOWER) + [ - 'local' => dirname($options['config']), - 'passivemode' => TRUE, - 'ignore' => '', - 'allowdelete' => TRUE, - 'purge' => '', - 'before' => '', - 'after' => '', - 'preprocess' => TRUE, - ]; - - if (empty($cfg['remote']) || !parse_url($cfg['remote'])) { - throw new Exception("Missing or invalid 'remote' URL in config."); - } - - $server = parse_url($cfg['remote'], PHP_URL_SCHEME) === 'sftp' - ? new SshServer($cfg['remote']) - : new FtpServer($cfg['remote'], (bool) $cfg['passivemode']); - - $deployment = new Deployer($server, $cfg['local'], $logger); - - if ($cfg['preprocess']) { - $deployment->preprocessMasks = $cfg['preprocess'] == 1 ? ['*.js', '*.css'] : toArray($cfg['preprocess']); // intentionally == - $preprocessor = new Preprocessor($logger); - $deployment->addFilter('js', [$preprocessor, 'expandApacheImports']); - $deployment->addFilter('js', [$preprocessor, 'compress'], TRUE); - $deployment->addFilter('css', [$preprocessor, 'expandApacheImports']); - $deployment->addFilter('css', [$preprocessor, 'expandCssImports']); - $deployment->addFilter('css', [$preprocessor, 'compress'], TRUE); - } - - $deployment->ignoreMasks = array_merge( - ['*.bak', '.svn' , '.git*', 'Thumbs.db', '.DS_Store'], - toArray($cfg['ignore']) - ); - $deployment->deploymentFile = empty($cfg['deploymentfile']) ? $deployment->deploymentFile : $cfg['deploymentfile']; - $deployment->testMode = !empty($cfg['test']) || $options['--test']; - $deployment->allowDelete = $cfg['allowdelete']; - $deployment->toPurge = toArray($cfg['purge'], TRUE); - $deployment->runBefore = toArray($cfg['before'], TRUE); - $deployment->runAfter = toArray($cfg['after'], TRUE); - $deployment->tempDir = $tempDir; - - if ($deployment->testMode) { - $logger->log('Test mode'); - } - if (!$deployment->allowDelete) { - $logger->log('Deleting disabled'); - } - - $deployment->deploy(); -} - -$time = time() - $time; -$logger->log("\nFinished at " . date('[Y/m/d H:i]') . " (in $time seconds)", 'light-green'); +$runner = new CliRunner; +die($runner->run()); diff --git a/Deployment/libs/CliRunner.php b/Deployment/libs/CliRunner.php new file mode 100644 index 00000000..27bb496a --- /dev/null +++ b/Deployment/libs/CliRunner.php @@ -0,0 +1,197 @@ +logger = new Logger('php://memory'); + $this->setupPhp(); + + $config = $this->loadConfig(); + if (!$config) { + return 1; + } + + $config += [ + 'log' => preg_replace('#\.\w+$#', '.log', $this->configFile), + 'tempdir' => sys_get_temp_dir() . '/deployment', + 'colors' => (PHP_SAPI === 'cli' && ((function_exists('posix_isatty') && posix_isatty(STDOUT)) + || getenv('ConEmuANSI') === 'ON' || getenv('ANSICON') !== FALSE)), + ]; + + $this->logger = new Logger($config['log']); + $this->logger->useColors = (bool) $config['colors']; + + if (!is_dir($tempDir = $config['tempdir'])) { + $this->logger->log("Creating temporary directory $tempDir"); + mkdir($tempDir); + } + + $time = time(); + $this->logger->log("Started at " . date('[Y/m/d H:i]')); + $this->logger->log("Config file is $this->configFile"); + + if (isset($config['remote']) && is_string($config['remote'])) { + $config = ['' => $config]; + } + + foreach ($config as $section => $cfg) { + if (!is_array($cfg)) { + continue; + } + + $this->logger->log("\nDeploying $section"); + + $deployment = $this->createDeployer($cfg); + $deployment->tempDir = $tempDir; + + if ($deployment->testMode) { + $this->logger->log('Test mode'); + } + if (!$deployment->allowDelete) { + $this->logger->log('Deleting disabled'); + } + $deployment->deploy(); + } + + $time = time() - $time; + $this->logger->log("\nFinished at " . date('[Y/m/d H:i]') . " (in $time seconds)", 'light-green'); + } + + + /** @return Deployer */ + private function createDeployer($config) + { + $config = array_change_key_case($config, CASE_LOWER) + [ + 'local' => dirname($this->configFile), + 'passivemode' => TRUE, + 'ignore' => '', + 'allowdelete' => TRUE, + 'purge' => '', + 'before' => '', + 'after' => '', + 'preprocess' => TRUE, + ]; + + if (empty($config['remote']) || !parse_url($config['remote'])) { + throw new Exception("Missing or invalid 'remote' URL in config."); + } + + $server = parse_url($config['remote'], PHP_URL_SCHEME) === 'sftp' + ? new SshServer($config['remote']) + : new FtpServer($config['remote'], (bool) $config['passivemode']); + + $deployment = new Deployer($server, $config['local'], $this->logger); + + if ($config['preprocess']) { + $deployment->preprocessMasks = $config['preprocess'] == 1 ? ['*.js', '*.css'] : self::toArray($config['preprocess']); // intentionally == + $preprocessor = new Preprocessor($this->logger); + $deployment->addFilter('js', [$preprocessor, 'expandApacheImports']); + $deployment->addFilter('js', [$preprocessor, 'compress'], TRUE); + $deployment->addFilter('css', [$preprocessor, 'expandApacheImports']); + $deployment->addFilter('css', [$preprocessor, 'expandCssImports']); + $deployment->addFilter('css', [$preprocessor, 'compress'], TRUE); + } + + $deployment->ignoreMasks = array_merge( + ['*.bak', '.svn' , '.git*', 'Thumbs.db', '.DS_Store'], + self::toArray($config['ignore']) + ); + $deployment->deploymentFile = empty($config['deploymentfile']) ? $deployment->deploymentFile : $config['deploymentfile']; + $deployment->allowDelete = $config['allowdelete']; + $deployment->toPurge = self::toArray($config['purge'], TRUE); + $deployment->runBefore = self::toArray($config['before'], TRUE); + $deployment->runAfter = self::toArray($config['after'], TRUE); + $deployment->testMode = !empty($config['test']) || $this->testMode; + + return $deployment; + } + + + /** @return void */ + private function setupPhp() + { + set_time_limit(0); + date_default_timezone_set('Europe/Prague'); + + set_error_handler(function($severity, $message, $file, $line) { + if (($severity & error_reporting()) === $severity) { + $this->logger->log("Error: $message in $file on $line", 'light-red'); + exit; + } + return FALSE; + }); + set_exception_handler(function($e) { + $this->logger->log("Error: {$e->getMessage()}\n\n$e", 'light-red'); + }); + } + + + /** @return array */ + private function loadConfig() + { + $cmd = new CommandLine(<< [-t | --test] + +Options: + -t | --test Run in test-mode. + +XX + , [ + 'config' => [CommandLine::REALPATH => TRUE], + ]); + + if ($cmd->isEmpty()) { + $cmd->help(); + return; + } + + $options = $cmd->parse(); + $this->testMode = (bool) $options['--test']; + $this->configFile = $options['config']; + + if (pathinfo($options['config'], PATHINFO_EXTENSION) == 'php') { + return include $options['config']; + } else { + return parse_ini_file($options['config'], TRUE); + } + } + + + /** @return array */ + public static function toArray($val, $lines = FALSE) + { + return is_array($val) + ? array_filter($val) + : preg_split($lines ? '#\s*\n\s*#' : '#\s+#', $val, -1, PREG_SPLIT_NO_EMPTY); + } + +}