From 7f39e7fdfb4b682bf338f0a118238cd5018208fe Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Wed, 3 Jul 2019 14:11:11 +0200 Subject: [PATCH 1/8] bugfix pri onAfter a onBefore --- composer.json | 2 +- src/Runner.php | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 71e1320..ff7e1b6 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ ], "require": { "php": ">=7.1", - "nette/di": "~2.4.13", + "nette/di": "~3.0.0", "dg/ftp-deployment": "~3.0.1" }, "require-dev": { diff --git a/src/Runner.php b/src/Runner.php index 158e29a..47d0a5f 100644 --- a/src/Runner.php +++ b/src/Runner.php @@ -135,7 +135,9 @@ public function createDeployer(Config $config, Section $section): Deployer $deployment->runBefore = $bc[0]; $deployment->runBefore[] = function ($server, $logger, $deployer) use ($bc, $config, $section): void { foreach ($bc[1] as $c) { - call_user_func_array([$c, 'onBefore'], [$config, $section, $server, $logger, $deployer]); + // bugfix + //call_user_func_array([$c, 'onBefore'], [$config, $section, $server, $logger, $deployer]); + call_user_func_array($c, [$config, $section, $server, $logger, $deployer]); } }; @@ -147,7 +149,9 @@ public function createDeployer(Config $config, Section $section): Deployer $deployment->runAfter = $ac[0]; $deployment->runAfter[] = function ($server, $logger, $deployer) use ($ac, $config, $section): void { foreach ($ac[1] as $c) { - call_user_func_array([$c, 'onAfter'], [$config, $section, $server, $logger, $deployer]); + // bugfix + //call_user_func_array([$c, 'onAfter'], [$config, $section, $server, $logger, $deployer]); + call_user_func_array($c, [$config, $section, $server, $logger, $deployer]); } }; From b40377ddfced522026164a49f4fd4e36d645c83b Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Tue, 16 Jul 2019 00:06:29 +0200 Subject: [PATCH 2/8] nette 3.0 compatibility --- src/Config/Section.php | 4 +- src/DI/DeployerExtension.php | 89 ++++++++++++++++++++++-------------- src/Runner.php | 34 ++++++-------- 3 files changed, 70 insertions(+), 57 deletions(-) diff --git a/src/Config/Section.php b/src/Config/Section.php index a6b9224..e7c57bb 100644 --- a/src/Config/Section.php +++ b/src/Config/Section.php @@ -249,7 +249,7 @@ public function setTestMode(bool $testMode): void public function getFilePermissions(): ?int { - return empty($this->filePermissions) ? null : octdec($this->filePermissions); + return ($this->filePermissions === '') ? null : octdec($this->filePermissions); } public function setFilePermissions(string $mask): void @@ -259,7 +259,7 @@ public function setFilePermissions(string $mask): void public function getDirPermissions(): ?int { - return empty($this->dirPermissions) ? null : octdec($this->dirPermissions); + return ($this->dirPermissions === '') ? null : octdec($this->dirPermissions); } public function setDirPermissions(string $mask): void diff --git a/src/DI/DeployerExtension.php b/src/DI/DeployerExtension.php index 98a566c..cd6f0d4 100644 --- a/src/DI/DeployerExtension.php +++ b/src/DI/DeployerExtension.php @@ -6,8 +6,12 @@ use Contributte\Deployer\Config\ConfigFactory; use Contributte\Deployer\Manager; use Contributte\Deployer\Runner; +use Nette; use Nette\DI\CompilerExtension; use Nette\DI\Statement; +use Nette\Schema\Expect; +use Nette\Schema\Schema; +use Nette\Schema\Processor; /** * Deployer Extension @@ -15,35 +19,49 @@ final class DeployerExtension extends CompilerExtension { - /** @var mixed[] */ - private $defaults = [ - 'config' => [ - 'mode' => Config::MODE_TEST, - 'logFile' => '%appDir/../log/deploy.log', - 'tempDir' => '%appDir/../temp', - 'colors' => null, - ], - 'sections' => [], - 'userdata' => [], - 'plugins' => [], - ]; + /** + * @return Schema + */ + public function getConfigSchema() : Schema { + return Expect::structure([ + "config" => Expect::structure([ + 'mode' => Expect::string(Config::MODE_TEST), + 'logFile' => Expect::string('%appDir/../log/deploy.log'), + 'tempDir' => Expect::string('%appDir/../temp'), + 'colors' => Expect::bool(), + ]), + "sections" => Expect::array(), + "userdata" => Expect::array(), + "plugins" => Expect::array() + ]); + } - /** @var mixed[] */ - private $sectionDefaults = [ - 'testMode' => true, - 'deployFile' => null, - 'remote' => null, - 'local' => '%appDir', - 'ignore' => [], - 'allowdelete' => true, - 'before' => [], - 'after' => [], - 'purge' => [], - 'preprocess' => false, - 'passiveMode' => false, - 'filePermissions' => '', - 'dirPermissions' => '', - ]; + /** + * Validates section config + * @param array $data + * + * @return array + */ + public function validateSectionConfig(array $data): array { + $schema = Expect::structure([ + "remote" => Expect::string()->required(), + "local" => Expect::string()->required(), + "deployFile" => Expect::string(".dep"), + "ignore" => Expect::array(), + "purge" => Expect::array(), + "after" => Expect::array(), + "before" => Expect::array(), + "testMode" => Expect::bool(false), + "preprocess" => Expect::bool(false), + "allowdelete" => Expect::bool(true), + "passiveMode" => Expect::bool(false), + 'filePermissions' => Expect::string(""), + 'dirPermissions' => Expect::string(""), + ]); + + $processor = new Processor(); + return (array) $processor->process($schema,$data); + } /** * Processes configuration data. Intended to be overridden by descendant. @@ -51,7 +69,8 @@ final class DeployerExtension extends CompilerExtension public function loadConfiguration(): void { // Validate config - $config = $this->validateConfig($this->defaults); + $config = (array) $this->config; + $config["config"] = (array) $this->config->config; // Get builder $builder = $this->getContainerBuilder(); @@ -60,15 +79,15 @@ public function loadConfiguration(): void foreach ($config['sections'] as $name => $section) { // Validate and merge section - $config['sections'][$name] = $this->validateConfig($this->sectionDefaults, $section); + $config["sections"][$name] = $this->validateSectionConfig($section); } // Add deploy manager $builder->addDefinition($this->prefix('manager')) - ->setFactory(Manager::class, [ - new Statement(Runner::class), - new Statement(ConfigFactory::class, [$config]), - ]); + ->setFactory(Manager::class, [ + new Statement(Runner::class), + new Statement(ConfigFactory::class, [$config]), + ]); } -} +} \ No newline at end of file diff --git a/src/Runner.php b/src/Runner.php index 47d0a5f..61d93d4 100644 --- a/src/Runner.php +++ b/src/Runner.php @@ -128,30 +128,24 @@ public function createDeployer(Config $config, Section $section): Deployer $deployment->testMode = $section->isTestMode(); // Before callbacks - $bc = [[], []]; - foreach ($section->getBeforeCallbacks() as $cb) { - $bc[is_callable($cb)][] = $cb; - } - $deployment->runBefore = $bc[0]; - $deployment->runBefore[] = function ($server, $logger, $deployer) use ($bc, $config, $section): void { - foreach ($bc[1] as $c) { - // bugfix - //call_user_func_array([$c, 'onBefore'], [$config, $section, $server, $logger, $deployer]); - call_user_func_array($c, [$config, $section, $server, $logger, $deployer]); + $deployment->runBefore[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { + foreach ($section->getBeforeCallbacks() as $ac){ + if(is_callable($ac)){ + call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); + } else { + $logger->log("Before callback '".get_class($ac[0])."::$ac[1]' not exists.","red"); + } } }; // After callbacks - $ac = [[], []]; - foreach ($section->getAfterCallbacks() as $cb) { - $ac[is_callable($cb)][] = $cb; - } - $deployment->runAfter = $ac[0]; - $deployment->runAfter[] = function ($server, $logger, $deployer) use ($ac, $config, $section): void { - foreach ($ac[1] as $c) { - // bugfix - //call_user_func_array([$c, 'onAfter'], [$config, $section, $server, $logger, $deployer]); - call_user_func_array($c, [$config, $section, $server, $logger, $deployer]); + $deployment->runAfter[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { + foreach ($section->getAfterCallbacks() as $ac){ + if(is_callable($ac)){ + call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); + } else { + $logger->log("After callback '".get_class($ac[0])."::$ac[1]' not exists.","red"); + } } }; From 19ead41706dbb5f4234233a2a5424069f9d25bd6 Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Tue, 16 Jul 2019 00:21:18 +0200 Subject: [PATCH 3/8] codesniffer fix errors --- src/DI/DeployerExtension.php | 52 +++++++++++++++++------------------- src/Runner.php | 14 +++++----- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/DI/DeployerExtension.php b/src/DI/DeployerExtension.php index cd6f0d4..07ff9cb 100644 --- a/src/DI/DeployerExtension.php +++ b/src/DI/DeployerExtension.php @@ -6,12 +6,11 @@ use Contributte\Deployer\Config\ConfigFactory; use Contributte\Deployer\Manager; use Contributte\Deployer\Runner; -use Nette; use Nette\DI\CompilerExtension; use Nette\DI\Statement; use Nette\Schema\Expect; -use Nette\Schema\Schema; use Nette\Schema\Processor; +use Nette\Schema\Schema; /** * Deployer Extension @@ -19,20 +18,18 @@ final class DeployerExtension extends CompilerExtension { - /** - * @return Schema - */ - public function getConfigSchema() : Schema { + public function getConfigSchema() : Schema + { return Expect::structure([ - "config" => Expect::structure([ + 'config' => Expect::structure([ 'mode' => Expect::string(Config::MODE_TEST), 'logFile' => Expect::string('%appDir/../log/deploy.log'), 'tempDir' => Expect::string('%appDir/../temp'), 'colors' => Expect::bool(), ]), - "sections" => Expect::array(), - "userdata" => Expect::array(), - "plugins" => Expect::array() + 'sections' => Expect::array(), + 'userdata' => Expect::array(), + 'plugins' => Expect::array() ]); } @@ -42,21 +39,22 @@ public function getConfigSchema() : Schema { * * @return array */ - public function validateSectionConfig(array $data): array { + public function validateSectionConfig(array $data): array + { $schema = Expect::structure([ - "remote" => Expect::string()->required(), - "local" => Expect::string()->required(), - "deployFile" => Expect::string(".dep"), - "ignore" => Expect::array(), - "purge" => Expect::array(), - "after" => Expect::array(), - "before" => Expect::array(), - "testMode" => Expect::bool(false), - "preprocess" => Expect::bool(false), - "allowdelete" => Expect::bool(true), - "passiveMode" => Expect::bool(false), - 'filePermissions' => Expect::string(""), - 'dirPermissions' => Expect::string(""), + 'remote' => Expect::string()->required(), + 'local' => Expect::string()->required(), + 'deployFile' => Expect::string('.dep'), + 'ignore' => Expect::array(), + 'purge' => Expect::array(), + 'after' => Expect::array(), + 'before' => Expect::array(), + 'testMode' => Expect::bool(false), + 'preprocess' => Expect::bool(false), + 'allowdelete' => Expect::bool(true), + 'passiveMode' => Expect::bool(false), + 'filePermissions' => Expect::string(''), + 'dirPermissions' => Expect::string(''), ]); $processor = new Processor(); @@ -70,7 +68,7 @@ public function loadConfiguration(): void { // Validate config $config = (array) $this->config; - $config["config"] = (array) $this->config->config; + $config['config'] = (array) $this->config->config; // Get builder $builder = $this->getContainerBuilder(); @@ -79,7 +77,7 @@ public function loadConfiguration(): void foreach ($config['sections'] as $name => $section) { // Validate and merge section - $config["sections"][$name] = $this->validateSectionConfig($section); + $config['sections'][$name] = $this->validateSectionConfig($section); } // Add deploy manager @@ -90,4 +88,4 @@ public function loadConfiguration(): void ]); } -} \ No newline at end of file +} diff --git a/src/Runner.php b/src/Runner.php index 61d93d4..b8bde90 100644 --- a/src/Runner.php +++ b/src/Runner.php @@ -129,22 +129,22 @@ public function createDeployer(Config $config, Section $section): Deployer // Before callbacks $deployment->runBefore[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { - foreach ($section->getBeforeCallbacks() as $ac){ - if(is_callable($ac)){ - call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); + foreach ($section->getBeforeCallbacks() as $bc) { + if(is_callable($bc)) { + call_user_func_array($bc, [$config, $section, $server, $logger, $deployer]); } else { - $logger->log("Before callback '".get_class($ac[0])."::$ac[1]' not exists.","red"); + $logger->log('Before callback \'' . get_class($bc[0]) . '::' . $bc[1] . '\' not exists.','red'); } } }; // After callbacks $deployment->runAfter[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { - foreach ($section->getAfterCallbacks() as $ac){ - if(is_callable($ac)){ + foreach ($section->getAfterCallbacks() as $ac) { + if(is_callable($ac)) { call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); } else { - $logger->log("After callback '".get_class($ac[0])."::$ac[1]' not exists.","red"); + $logger->log('After callback \'' . get_class($ac[0]) . '::' . $ac[1] . '\' not exists.','red'); } } }; From c183d359b7c2e700fe982e3df33edcbb882cf133 Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Tue, 16 Jul 2019 00:47:50 +0200 Subject: [PATCH 4/8] squizlabs/php_codesniffer run --- src/DI/DeployerExtension.php | 135 +++++++++------- src/Runner.php | 305 +++++++++++++++++++---------------- 2 files changed, 236 insertions(+), 204 deletions(-) diff --git a/src/DI/DeployerExtension.php b/src/DI/DeployerExtension.php index 07ff9cb..501d59a 100644 --- a/src/DI/DeployerExtension.php +++ b/src/DI/DeployerExtension.php @@ -18,74 +18,85 @@ final class DeployerExtension extends CompilerExtension { - public function getConfigSchema() : Schema - { - return Expect::structure([ - 'config' => Expect::structure([ - 'mode' => Expect::string(Config::MODE_TEST), - 'logFile' => Expect::string('%appDir/../log/deploy.log'), - 'tempDir' => Expect::string('%appDir/../temp'), - 'colors' => Expect::bool(), - ]), - 'sections' => Expect::array(), - 'userdata' => Expect::array(), - 'plugins' => Expect::array() - ]); - } + public function getConfigSchema() : Schema + { + return Expect::structure( + [ + 'config' => Expect::structure( + [ + 'mode' => Expect::string(Config::MODE_TEST), + 'logFile' => Expect::string('%appDir/../log/deploy.log'), + 'tempDir' => Expect::string('%appDir/../temp'), + 'colors' => Expect::bool(), + ] + ), + 'sections' => Expect::array(), + 'userdata' => Expect::array(), + 'plugins' => Expect::array() + ] + ); + } - /** - * Validates section config - * @param array $data - * - * @return array - */ - public function validateSectionConfig(array $data): array - { - $schema = Expect::structure([ - 'remote' => Expect::string()->required(), - 'local' => Expect::string()->required(), - 'deployFile' => Expect::string('.dep'), - 'ignore' => Expect::array(), - 'purge' => Expect::array(), - 'after' => Expect::array(), - 'before' => Expect::array(), - 'testMode' => Expect::bool(false), - 'preprocess' => Expect::bool(false), - 'allowdelete' => Expect::bool(true), - 'passiveMode' => Expect::bool(false), - 'filePermissions' => Expect::string(''), - 'dirPermissions' => Expect::string(''), - ]); + /** + * Validates section config + * + * @param array $data Config array of section + * + * @return array + */ + public function validateSectionConfig(array $data): array + { + $schema = Expect::structure( + [ + 'remote' => Expect::string()->required(), + 'local' => Expect::string()->required(), + 'deployFile' => Expect::string('.dep'), + 'ignore' => Expect::array(), + 'purge' => Expect::array(), + 'after' => Expect::array(), + 'before' => Expect::array(), + 'testMode' => Expect::bool(false), + 'preprocess' => Expect::bool(false), + 'allowdelete' => Expect::bool(true), + 'passiveMode' => Expect::bool(false), + 'filePermissions' => Expect::string(''), + 'dirPermissions' => Expect::string(''), + ] + ); - $processor = new Processor(); - return (array) $processor->process($schema,$data); - } + $processor = new Processor(); + return (array) $processor->process($schema, $data); + } - /** - * Processes configuration data. Intended to be overridden by descendant. - */ - public function loadConfiguration(): void - { - // Validate config - $config = (array) $this->config; - $config['config'] = (array) $this->config->config; + /** + * Processes configuration data. Intended to be overridden by descendant. + * + * @return void + */ + public function loadConfiguration(): void + { + // Validate config + $config = (array) $this->config; + $config['config'] = (array) $this->config->config; - // Get builder - $builder = $this->getContainerBuilder(); + // Get builder + $builder = $this->getContainerBuilder(); - // Process sections - foreach ($config['sections'] as $name => $section) { + // Process sections + foreach ($config['sections'] as $name => $section) { - // Validate and merge section - $config['sections'][$name] = $this->validateSectionConfig($section); - } + // Validate and merge section + $config['sections'][$name] = $this->validateSectionConfig($section); + } - // Add deploy manager - $builder->addDefinition($this->prefix('manager')) - ->setFactory(Manager::class, [ - new Statement(Runner::class), - new Statement(ConfigFactory::class, [$config]), - ]); - } + // Add deploy manager + $builder->addDefinition($this->prefix('manager')) + ->setFactory( + Manager::class, [ + new Statement(Runner::class), + new Statement(ConfigFactory::class, [$config]), + ] + ); + } } diff --git a/src/Runner.php b/src/Runner.php index b8bde90..531e30c 100644 --- a/src/Runner.php +++ b/src/Runner.php @@ -16,147 +16,168 @@ class Runner { - /** @var Logger */ - private $logger; - - public function run(Config $config): void - { - // Create logger - $logFile = $config->getLogFile(); - $this->logger = $logFile !== null ? new Logger($logFile) : new StdOutLogger(); - $this->logger->useColors = $config->useColors(); - - // Create temp dir - if (!is_dir($tempDir = (string) $config->getTempDir())) { - $this->logger->log(sprintf('Creating temporary directory %s', $tempDir)); - @mkdir($tempDir, 0777, true); - } - - // Start time - $time = time(); - $this->logger->log('Started at ' . date('[Y/m/d H:i]')); - - // Get sections and get sections names - $sections = $config->getSections(); - $sectionNames = array_map(function (Section $s) { - return $s->getName(); - }, $sections); - - // Show info - $this->logger->log(sprintf('Found sections: %d (%s)', count($sectionNames), implode(',', $sectionNames))); - - // Process all sections - foreach ($sections as $section) { - // Show info - $this->logger->log(sprintf('\nDeploying section [%s]', $section->getName())); - - // Create deployer - $deployment = $this->createDeployer($config, $section); - $deployment->tempDir = $tempDir; - - // Detect mode -> generate - if ($config->getMode() === 'generate') { - $this->logger->log('Scanning files'); - $localFiles = $deployment->collectPaths(); - $this->logger->log('Saved ' . $deployment->writeDeploymentFile($localFiles)); - continue; - } - - // Show info - if ($deployment->testMode) { - $this->logger->log('Test mode'); - } else { - $this->logger->log('Live mode'); - } - - if (!$deployment->allowDelete) { - $this->logger->log('Deleting disabled'); - } - - // Deploy - $deployment->deploy(); - } - - // Show elapsed time - $time = time() - $time; - $this->logger->log(sprintf('\nFinished at %s (in %s seconds)', date('[Y/m/d H:i]'), $time), 'lime'); - } - - /** - * @throws DeployException - */ - public function createDeployer(Config $config, Section $section): Deployer - { - // Validate section remote - if (!(bool) parse_url((string) $section->getRemote())) { - throw new DeployException("Missing or invalid 'remote' URL in config."); - } - - // Create *Server - $server = $this->createServer($section); - - // Permissions - $server->filePermissions = $section->getFilePermissions(); - $server->dirPermissions = $section->getDirPermissions(); - - // Create deployer - $deployment = new Deployer($server, (string) $section->getLocal(), $this->logger); - - // Set-up preprocessing - if ($section->isPreprocess() === true) { - $masks = $section->getPreprocessMasks(); - $deployment->preprocessMasks = $masks === [] ? ['*.js', '*.css'] : $masks; - $preprocessor = new Preprocessor($this->logger); - $deployment->addFilter('js', [$preprocessor, 'expandApacheImports']); - $deployment->addFilter('js', [$preprocessor, 'compressJs'], true); - $deployment->addFilter('css', [$preprocessor, 'expandApacheImports']); - $deployment->addFilter('css', [$preprocessor, 'expandCssImports']); - $deployment->addFilter('css', [$preprocessor, 'compressCss'], true); - } - - // Merge ignore masks - $deployment->ignoreMasks = array_merge( - ['*.bak', '.svn', '.git*', 'Thumbs.db', '.DS_Store', '.idea'], - $section->getIgnoreMasks() - ); - - // Basic settings - $deployFile = (string) $section->getDeployFile(); - $deployment->deploymentFile = $deployFile === '' ? $deployment->deploymentFile : $deployFile; - $deployment->allowDelete = $section->isAllowDelete(); - $deployment->toPurge = $section->getPurges(); - $deployment->testMode = $section->isTestMode(); - - // Before callbacks - $deployment->runBefore[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { - foreach ($section->getBeforeCallbacks() as $bc) { - if(is_callable($bc)) { - call_user_func_array($bc, [$config, $section, $server, $logger, $deployer]); - } else { - $logger->log('Before callback \'' . get_class($bc[0]) . '::' . $bc[1] . '\' not exists.','red'); - } - } - }; - - // After callbacks - $deployment->runAfter[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { - foreach ($section->getAfterCallbacks() as $ac) { - if(is_callable($ac)) { - call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); - } else { - $logger->log('After callback \'' . get_class($ac[0]) . '::' . $ac[1] . '\' not exists.','red'); - } - } - }; - - return $deployment; - } - - protected function createServer(Section $section): Server - { - return parse_url((string) $section->getRemote(), PHP_URL_SCHEME) === 'sftp' - ? new SshServer((string) $section->getRemote()) - : new FtpServer((string) $section->getRemote(), $section->isPassiveMode()); - } + /** + * + * + * @var Logger + */ + private $logger; + + /** + * @param Config $config + * + * @return void + */ + public function run(Config $config): void + { + // Create logger + $logFile = $config->getLogFile(); + $this->logger = $logFile !== null ? new Logger($logFile) : new StdOutLogger(); + $this->logger->useColors = $config->useColors(); + + // Create temp dir + if (!is_dir($tempDir = (string) $config->getTempDir())) { + $this->logger->log(sprintf('Creating temporary directory %s', $tempDir)); + @mkdir($tempDir, 0777, true); + } + + // Start time + $time = time(); + $this->logger->log('Started at ' . date('[Y/m/d H:i]')); + + // Get sections and get sections names + $sections = $config->getSections(); + $sectionNames = array_map( + function (Section $s) { + return $s->getName(); + }, $sections + ); + + // Show info + $this->logger->log(sprintf('Found sections: %d (%s)', count($sectionNames), implode(',', $sectionNames))); + + // Process all sections + foreach ($sections as $section) { + // Show info + $this->logger->log(sprintf('\nDeploying section [%s]', $section->getName())); + + // Create deployer + $deployment = $this->createDeployer($config, $section); + $deployment->tempDir = $tempDir; + + // Detect mode -> generate + if ($config->getMode() === 'generate') { + $this->logger->log('Scanning files'); + $localFiles = $deployment->collectPaths(); + $this->logger->log('Saved ' . $deployment->writeDeploymentFile($localFiles)); + continue; + } + + // Show info + if ($deployment->testMode) { + $this->logger->log('Test mode'); + } else { + $this->logger->log('Live mode'); + } + + if (!$deployment->allowDelete) { + $this->logger->log('Deleting disabled'); + } + + // Deploy + $deployment->deploy(); + } + + // Show elapsed time + $time = time() - $time; + $this->logger->log(sprintf('\nFinished at %s (in %s seconds)', date('[Y/m/d H:i]'), $time), 'lime'); + } + + /** + * @param Config $config + * @param Section $section + * + * @return Deployer + * @throws DeployException + */ + public function createDeployer(Config $config, Section $section): Deployer + { + // Validate section remote + if (!(bool) parse_url((string) $section->getRemote())) { + throw new DeployException("Missing or invalid 'remote' URL in config."); + } + + // Create *Server + $server = $this->createServer($section); + + // Permissions + $server->filePermissions = $section->getFilePermissions(); + $server->dirPermissions = $section->getDirPermissions(); + + // Create deployer + $deployment = new Deployer($server, (string) $section->getLocal(), $this->logger); + + // Set-up preprocessing + if ($section->isPreprocess() === true) { + $masks = $section->getPreprocessMasks(); + $deployment->preprocessMasks = $masks === [] ? ['*.js', '*.css'] : $masks; + $preprocessor = new Preprocessor($this->logger); + $deployment->addFilter('js', [$preprocessor, 'expandApacheImports']); + $deployment->addFilter('js', [$preprocessor, 'compressJs'], true); + $deployment->addFilter('css', [$preprocessor, 'expandApacheImports']); + $deployment->addFilter('css', [$preprocessor, 'expandCssImports']); + $deployment->addFilter('css', [$preprocessor, 'compressCss'], true); + } + + // Merge ignore masks + $deployment->ignoreMasks = array_merge( + ['*.bak', '.svn', '.git*', 'Thumbs.db', '.DS_Store', '.idea'], + $section->getIgnoreMasks() + ); + + // Basic settings + $deployFile = (string) $section->getDeployFile(); + $deployment->deploymentFile = $deployFile === '' ? $deployment->deploymentFile : $deployFile; + $deployment->allowDelete = $section->isAllowDelete(); + $deployment->toPurge = $section->getPurges(); + $deployment->testMode = $section->isTestMode(); + + // Before callbacks + $deployment->runBefore[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { + foreach ($section->getBeforeCallbacks() as $bc) { + if(is_callable($bc)) { + call_user_func_array($bc, [$config, $section, $server, $logger, $deployer]); + } else { + $logger->log('Before callback \'' . get_class($bc[0]) . '::' . $bc[1] . '\' not exists.', 'red'); + } + } + }; + + // After callbacks + $deployment->runAfter[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { + foreach ($section->getAfterCallbacks() as $ac) { + if(is_callable($ac)) { + call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); + } else { + $logger->log('After callback \'' . get_class($ac[0]) . '::' . $ac[1] . '\' not exists.', 'red'); + } + } + }; + + return $deployment; + } + + /** + * @param Section $section + * + * @return Server + * @throws \Exception + */ + protected function createServer(Section $section): Server + { + return parse_url((string) $section->getRemote(), PHP_URL_SCHEME) === 'sftp' + ? new SshServer((string) $section->getRemote()) + : new FtpServer((string) $section->getRemote(), $section->isPassiveMode()); + } } From 119dd2545f50f586d8cabbd4d839efb3a5eb84ab Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Tue, 16 Jul 2019 10:20:33 +0200 Subject: [PATCH 5/8] runer code standard fix --- src/Runner.php | 322 ++++++++++++++++++++++++------------------------- 1 file changed, 159 insertions(+), 163 deletions(-) diff --git a/src/Runner.php b/src/Runner.php index 531e30c..ecad6c1 100644 --- a/src/Runner.php +++ b/src/Runner.php @@ -16,168 +16,164 @@ class Runner { - /** - * - * - * @var Logger - */ - private $logger; - - /** - * @param Config $config - * - * @return void - */ - public function run(Config $config): void - { - // Create logger - $logFile = $config->getLogFile(); - $this->logger = $logFile !== null ? new Logger($logFile) : new StdOutLogger(); - $this->logger->useColors = $config->useColors(); - - // Create temp dir - if (!is_dir($tempDir = (string) $config->getTempDir())) { - $this->logger->log(sprintf('Creating temporary directory %s', $tempDir)); - @mkdir($tempDir, 0777, true); - } - - // Start time - $time = time(); - $this->logger->log('Started at ' . date('[Y/m/d H:i]')); - - // Get sections and get sections names - $sections = $config->getSections(); - $sectionNames = array_map( - function (Section $s) { - return $s->getName(); - }, $sections - ); - - // Show info - $this->logger->log(sprintf('Found sections: %d (%s)', count($sectionNames), implode(',', $sectionNames))); - - // Process all sections - foreach ($sections as $section) { - // Show info - $this->logger->log(sprintf('\nDeploying section [%s]', $section->getName())); - - // Create deployer - $deployment = $this->createDeployer($config, $section); - $deployment->tempDir = $tempDir; - - // Detect mode -> generate - if ($config->getMode() === 'generate') { - $this->logger->log('Scanning files'); - $localFiles = $deployment->collectPaths(); - $this->logger->log('Saved ' . $deployment->writeDeploymentFile($localFiles)); - continue; - } - - // Show info - if ($deployment->testMode) { - $this->logger->log('Test mode'); - } else { - $this->logger->log('Live mode'); - } - - if (!$deployment->allowDelete) { - $this->logger->log('Deleting disabled'); - } - - // Deploy - $deployment->deploy(); - } - - // Show elapsed time - $time = time() - $time; - $this->logger->log(sprintf('\nFinished at %s (in %s seconds)', date('[Y/m/d H:i]'), $time), 'lime'); - } - - /** - * @param Config $config - * @param Section $section - * - * @return Deployer - * @throws DeployException - */ - public function createDeployer(Config $config, Section $section): Deployer - { - // Validate section remote - if (!(bool) parse_url((string) $section->getRemote())) { - throw new DeployException("Missing or invalid 'remote' URL in config."); - } - - // Create *Server - $server = $this->createServer($section); - - // Permissions - $server->filePermissions = $section->getFilePermissions(); - $server->dirPermissions = $section->getDirPermissions(); - - // Create deployer - $deployment = new Deployer($server, (string) $section->getLocal(), $this->logger); - - // Set-up preprocessing - if ($section->isPreprocess() === true) { - $masks = $section->getPreprocessMasks(); - $deployment->preprocessMasks = $masks === [] ? ['*.js', '*.css'] : $masks; - $preprocessor = new Preprocessor($this->logger); - $deployment->addFilter('js', [$preprocessor, 'expandApacheImports']); - $deployment->addFilter('js', [$preprocessor, 'compressJs'], true); - $deployment->addFilter('css', [$preprocessor, 'expandApacheImports']); - $deployment->addFilter('css', [$preprocessor, 'expandCssImports']); - $deployment->addFilter('css', [$preprocessor, 'compressCss'], true); - } - - // Merge ignore masks - $deployment->ignoreMasks = array_merge( - ['*.bak', '.svn', '.git*', 'Thumbs.db', '.DS_Store', '.idea'], - $section->getIgnoreMasks() - ); - - // Basic settings - $deployFile = (string) $section->getDeployFile(); - $deployment->deploymentFile = $deployFile === '' ? $deployment->deploymentFile : $deployFile; - $deployment->allowDelete = $section->isAllowDelete(); - $deployment->toPurge = $section->getPurges(); - $deployment->testMode = $section->isTestMode(); - - // Before callbacks - $deployment->runBefore[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { - foreach ($section->getBeforeCallbacks() as $bc) { - if(is_callable($bc)) { - call_user_func_array($bc, [$config, $section, $server, $logger, $deployer]); - } else { - $logger->log('Before callback \'' . get_class($bc[0]) . '::' . $bc[1] . '\' not exists.', 'red'); - } - } - }; - - // After callbacks - $deployment->runAfter[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { - foreach ($section->getAfterCallbacks() as $ac) { - if(is_callable($ac)) { - call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); - } else { - $logger->log('After callback \'' . get_class($ac[0]) . '::' . $ac[1] . '\' not exists.', 'red'); - } - } - }; - - return $deployment; - } - - /** - * @param Section $section - * - * @return Server - * @throws \Exception - */ - protected function createServer(Section $section): Server - { - return parse_url((string) $section->getRemote(), PHP_URL_SCHEME) === 'sftp' - ? new SshServer((string) $section->getRemote()) - : new FtpServer((string) $section->getRemote(), $section->isPassiveMode()); - } + /** @var Logger */ + private $logger; + + /** + * @param Config $config + * + * @throws \Exception + */ + public function run(Config $config): void + { + // Create logger + $logFile = $config->getLogFile(); + $this->logger = $logFile !== null ? new Logger($logFile) : new StdOutLogger(); + $this->logger->useColors = $config->useColors(); + + // Create temp dir + if (!is_dir($tempDir = (string) $config->getTempDir())) { + $this->logger->log(sprintf('Creating temporary directory %s', $tempDir)); + @mkdir($tempDir, 0777, true); + } + + // Start time + $time = time(); + $this->logger->log('Started at ' . date('[Y/m/d H:i]')); + + // Get sections and get sections names + $sections = $config->getSections(); + $sectionNames = array_map( + function (Section $s) { + return $s->getName(); + }, $sections + ); + + // Show info + $this->logger->log(sprintf('Found sections: %d (%s)', count($sectionNames), implode(',', $sectionNames))); + + // Process all sections + foreach ($sections as $section) { + // Show info + $this->logger->log(sprintf('\nDeploying section [%s]', $section->getName())); + + // Create deployer + $deployment = $this->createDeployer($config, $section); + $deployment->tempDir = $tempDir; + + // Detect mode -> generate + if ($config->getMode() === 'generate') { + $this->logger->log('Scanning files'); + $localFiles = $deployment->collectPaths(); + $this->logger->log('Saved ' . $deployment->writeDeploymentFile($localFiles)); + continue; + } + + // Show info + if ($deployment->testMode) { + $this->logger->log('Test mode'); + } else { + $this->logger->log('Live mode'); + } + + if (!$deployment->allowDelete) { + $this->logger->log('Deleting disabled'); + } + + // Deploy + $deployment->deploy(); + } + + // Show elapsed time + $time = time() - $time; + $this->logger->log(sprintf('\nFinished at %s (in %s seconds)', date('[Y/m/d H:i]'), $time), 'lime'); + } + + /** + * @param Config $config + * @param Section $section + * + * @return Deployer + * @throws \Exception + */ + public function createDeployer(Config $config, Section $section): Deployer + { + // Validate section remote + if (!(bool) parse_url((string) $section->getRemote())) { + throw new DeployException("Missing or invalid 'remote' URL in config."); + } + + // Create *Server + $server = $this->createServer($section); + + // Permissions + $server->filePermissions = $section->getFilePermissions(); + $server->dirPermissions = $section->getDirPermissions(); + + // Create deployer + $deployment = new Deployer($server, (string) $section->getLocal(), $this->logger); + + // Set-up preprocessing + if ($section->isPreprocess() === true) { + $masks = $section->getPreprocessMasks(); + $deployment->preprocessMasks = $masks === [] ? ['*.js', '*.css'] : $masks; + $preprocessor = new Preprocessor($this->logger); + $deployment->addFilter('js', [$preprocessor, 'expandApacheImports']); + $deployment->addFilter('js', [$preprocessor, 'compressJs'], true); + $deployment->addFilter('css', [$preprocessor, 'expandApacheImports']); + $deployment->addFilter('css', [$preprocessor, 'expandCssImports']); + $deployment->addFilter('css', [$preprocessor, 'compressCss'], true); + } + + // Merge ignore masks + $deployment->ignoreMasks = array_merge( + ['*.bak', '.svn', '.git*', 'Thumbs.db', '.DS_Store', '.idea'], + $section->getIgnoreMasks() + ); + + // Basic settings + $deployFile = (string) $section->getDeployFile(); + $deployment->deploymentFile = $deployFile === '' ? $deployment->deploymentFile : $deployFile; + $deployment->allowDelete = $section->isAllowDelete(); + $deployment->toPurge = $section->getPurges(); + $deployment->testMode = $section->isTestMode(); + + // Before callbacks + $deployment->runBefore[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { + foreach ($section->getBeforeCallbacks() as $bc) { + if(is_callable($bc)) { + call_user_func_array($bc, [$config, $section, $server, $logger, $deployer]); + } else { + $logger->log('Before callback \'' . get_class($bc[0]) . '::' . $bc[1] . '\' not exists.', 'red'); + } + } + }; + + // After callbacks + $deployment->runAfter[] = function (Server $server, Logger $logger, Deployer $deployer) use ($config, $section): void { + foreach ($section->getAfterCallbacks() as $ac) { + if(is_callable($ac)) { + call_user_func_array($ac, [$config, $section, $server, $logger, $deployer]); + } else { + $logger->log('After callback \'' . get_class($ac[0]) . '::' . $ac[1] . '\' not exists.', 'red'); + } + } + }; + + return $deployment; + } + + /** + * @param Section $section + * + * @return Server + * @throws \Exception + */ + protected function createServer(Section $section): Server + { + return parse_url((string) $section->getRemote(), PHP_URL_SCHEME) === 'sftp' + ? new SshServer((string) $section->getRemote()) + : new FtpServer((string) $section->getRemote(), $section->isPassiveMode()); + } } From 666dc42f90eb8376280f9365420d8ebd4a6ec8dc Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Thu, 4 Nov 2021 12:23:25 +0100 Subject: [PATCH 6/8] update --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index ff7e1b6..8a61467 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,8 @@ "require-dev": { "ninjify/qa": "^0.8.0", "ninjify/nunjuck": "^0.2.0", - "mockery/mockery": "~1.1.0" + "mockery/mockery": "~1.1.0", + "squizlabs/php_codesniffer": "3.*" }, "autoload": { "psr-4": { From 96162c7d3fc3a64e01da95d5da6c7386cf5e02fe Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Sat, 28 Jan 2023 15:04:08 +0100 Subject: [PATCH 7/8] stable version for old projects --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 8a61467..1c9b4e4 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { - "name": "contributte/deployer-extension", - "description": "Ftp-Deployment Extension for Nette", + "name": "kubomikita/deployer-extension", + "description": "Fork of Ftp-Deployment Extension for Nette", "type": "library", "license": "BSD-3-Clause", "homepage": "https://github.com/contributte/deployer-extension", From 7c39627edc68b2409653648c4929f34be66f1ec7 Mon Sep 17 00:00:00 2001 From: Jakub Mikita Date: Tue, 7 Feb 2023 21:20:09 +0100 Subject: [PATCH 8/8] update dependencies --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 1c9b4e4..3dbf33c 100644 --- a/composer.json +++ b/composer.json @@ -12,8 +12,8 @@ ], "require": { "php": ">=7.1", - "nette/di": "~3.0.0", - "dg/ftp-deployment": "~3.0.1" + "nette/di": "^3.0.2", + "dg/ftp-deployment": "^3.3.1" }, "require-dev": { "ninjify/qa": "^0.8.0",