protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $extractHelper = $this->getHelper('extract'); /* @var $extractHelper ExtractHelper */ if (!$input->getArgument('application')) { $appName = basename($input->getArgument('archive')); $input->setArgument('application', preg_replace('/\\.(zip|rar|(tar(\\.(gz|bz2|xz|Z))?))$/i', '', $appName)); } $application = Application::create($configHelper->getConfiguration(), $input->getArgument('application')); if (!is_dir($application->getPath())) { FsUtil::mkdir($application->getPath(), true); $output->writeln(sprintf('Created directory <info>%s</info>', $application->getPath()), OutputInterface::VERBOSITY_VERY_VERBOSE); } NotEmptyException::assert($application->getPath()); $appDir = $application->getPath(); $configHelper->getConfiguration()->removeApplication($application->getName()); // Clean up application again, so application:add further down does not complain. if (strpos($input->getArgument('archive'), '://') !== false) { // This is an url $outputFile = $extractHelper->downloadFile($input->getArgument('archive'), $output); $extractHelper->extractArchive($outputFile, $appDir, $output); $this->getApplication()->find('application:add')->run(new ArrayInput(['application' => $input->getArgument('application'), '--archive-url' => $input->getArgument('archive')]), $output); } else { $extractHelper->extractArchive($input->getArgument('archive'), $application->getPath(), $output); $this->getApplication()->find('application:add')->run(new ArrayInput(['application' => $input->getArgument('application')]), $output); } if ($input->getOption('override')) { $input1 = new ArrayInput(['application' => $input->getArgument('application'), 'config-file' => $input->getOption('override')]); if ($input->getOption('override-type')) { $input1->setOption('type', $input->getOption('override-type')); } $this->getApplication()->find('application:override')->run($input1, $output); } if (!$input->getOption('no-scripts')) { /* * Run post-extract script */ return $this->getApplication()->find('application:execute')->run(new ArrayInput(['script' => 'post-extract', 'application' => $input->getArgument('application')]), $output); } return 0; }
protected function execute(InputInterface $input, OutputInterface $output) { $configHelper = $this->getHelper('configuration'); /* @var $configHelper GlobalConfigurationHelper */ $processHelper = $this->getHelper('process'); /* @var $processHelper ProcessHelper */ $questionHelper = $this->getHelper('question'); /* @var $questionHelper QuestionHelper */ if (!$input->getArgument('application')) { $input->setArgument('application', basename($input->getArgument('repository'), '.git')); } try { $repositoryConfiguration = $configHelper->getConfiguration()->getRepositoryConfiguration($input->getArgument('repository')); } catch (NoSuchRepositoryException $ex) { $repositoryConfiguration = null; } $repositoryParts = Util::parseRepositoryUrl($input->getArgument('repository')); if (!Util::isSshRepositoryUrl($repositoryParts)) { $input->setOption('no-deploy-key', true); } $application = Application::create($configHelper->getConfiguration(), $input->getArgument('application')); if (!is_dir($application->getPath())) { FsUtil::mkdir($application->getPath(), true); $output->writeln(sprintf('Created directory <info>%s</info>', $application->getPath()), OutputInterface::VERBOSITY_VERY_VERBOSE); } NotEmptyException::assert($application->getPath()); if (!$repositoryConfiguration && !$input->getOption('no-deploy-key')) { $output->writeln('You do not have a deploy key configured for this repository.', OutputInterface::VERBOSITY_VERBOSE); $repositoryConfiguration = new RepositoryConfiguration(); $repositoryConfiguration->setSshAlias(sha1($input->getArgument('repository')) . '-' . basename($input->getArgument('application'))); /* * Generate a new deploy key, link it to the repository and print it. */ $keyFile = $configHelper->getConfiguration()->getSshDirectory() . '/id_rsa-' . $repositoryConfiguration->getSshAlias(); try { $this->getApplication()->find('repository:generate-key')->run(new ArrayInput(['key' => $keyFile, '--comment' => 'clic-deploy-key-' . $repositoryConfiguration->getSshAlias() . '@' . gethostname(), '--target-repository' => $input->getArgument('repository'), '--print-public-key' => true]), $output); $repositoryConfiguration = $configHelper->getConfiguration()->getRepositoryConfiguration($input->getArgument('repository')); } catch (FileExistsException $ex) { $repositoryConfiguration->setIdentityFile($ex->getFilename()); $output->writeln(sprintf('Key <info>%s</info> already exists. Not generating a new one.', $ex->getFilename())); } /* * Ask to add it as a deploy key to the repo */ $output->writeln('<comment>Please set the public key printed above as a deploy key for the repository</comment>'); while (!$questionHelper->ask($input, $output, new ConfirmationQuestion('Is the deploy key uploaded?'))) { } } if ($repositoryConfiguration && !$input->getOption('no-deploy-key')) { /* * If there is a configuration now, save it */ $configHelper->getConfiguration()->setRepositoryConfiguration($input->getArgument('repository'), $repositoryConfiguration); $configHelper->getConfiguration()->write(); } else { $repositoryConfiguration = null; } /* * Run a git clone for the application */ $gitClone = ProcessBuilder::create(['git', 'clone', Util::replaceRepositoryUrl($repositoryParts, $repositoryConfiguration), $application->getPath()])->setTimeout(null)->getProcess(); $processHelper->mustRun($output, $gitClone, null, null, OutputInterface::VERBOSITY_NORMAL, OutputInterface::VERBOSITY_NORMAL); $configHelper->getConfiguration()->removeApplication($application->getName()); // Clean up application again, so application:add further down does not complain. $this->getApplication()->find('application:add')->run(new ArrayInput(['application' => $input->getArgument('application'), '--remote' => $input->getArgument('repository')]), $output); if ($input->getOption('override')) { $input1 = new ArrayInput(['application' => $input->getArgument('application'), 'config-file' => $input->getOption('override')]); if ($input->getOption('override-type')) { $input1->setOption('type', $input->getOption('override-type')); } $this->getApplication()->find('application:override')->run($input1, $output); } if (!$input->getOption('no-scripts')) { /* * Run post-clone script */ return $this->getApplication()->find('application:execute')->run(new ArrayInput(['script' => 'post-clone', 'application' => $input->getArgument('application')]), $output); } return 0; }