Chris@0: filesystem = $filesystem; Chris@0: $this->replace = $replace; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getName() { Chris@0: return 'dcg_dumper'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Dumps the generated code to file system. Chris@0: * Chris@0: * @param \Symfony\Component\Console\Input\InputInterface $input Chris@0: * Input instance. Chris@0: * @param \Symfony\Component\Console\Output\OutputInterface $output Chris@0: * Output instance. Chris@0: * Chris@0: * @return array Chris@0: * List of created or updated files. Chris@0: */ Chris@0: public function dump(InputInterface $input, OutputInterface $output) { Chris@0: $this->input = $input; Chris@0: $this->output = $output; Chris@0: $formatter_style = new OutputFormatterStyle('black', 'cyan', []); Chris@0: $this->output->getFormatter()->setStyle('title', $formatter_style); Chris@0: Chris@0: $interactive = $input->isInteractive(); Chris@0: Chris@0: // NULL means we should ask user for confirmation. Chris@0: if ($this->replace !== NULL) { Chris@0: $input->setInteractive(FALSE); Chris@0: } Chris@0: Chris@0: /** @var \DrupalCodeGenerator\Command\GeneratorInterface $command */ Chris@0: $command = $this->getHelperSet()->getCommand(); Chris@0: Chris@0: $dumped_files = $this->doDump($command->getAssets(), $command->getDirectory()); Chris@0: Chris@0: $input->setInteractive($interactive); Chris@0: return $dumped_files; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Dumps assets. Chris@0: * Chris@0: * @param \DrupalCodeGenerator\Asset[] $assets Chris@0: * Files to dump. Chris@0: * @param string $directory Chris@0: * Directory where to dump the assets. Chris@0: * Chris@0: * @return array Chris@0: * List of created or updated assets. Chris@0: */ Chris@0: protected function doDump(array $assets, $directory) { Chris@0: $dumped_files = []; Chris@0: Chris@0: foreach ($assets as $asset) { Chris@0: Chris@0: $content = $asset->getContent(); Chris@0: $path = $asset->getPath(); Chris@0: Chris@0: $file_path = "$directory/$path"; Chris@0: if ($this->filesystem->exists($file_path) && !$asset->isDirectory()) { Chris@0: $action = $asset->getAction(); Chris@0: if ($action == 'replace') { Chris@0: $question_text = sprintf('The file %s already exists. Would you like to replace it? [Yes]:', $file_path); Chris@0: if (!$this->confirm($question_text)) { Chris@0: continue; Chris@0: } Chris@0: } Chris@0: else { Chris@0: $original_content = file_get_contents($file_path); Chris@0: if ($action == 'append') { Chris@0: $header_size = $asset->getHeaderSize(); Chris@0: // Do not remove header if original file is empty. Chris@0: if ($original_content && $header_size > 0) { Chris@0: $content = Utils::removeHeader($content, $header_size); Chris@0: } Chris@0: $content = $original_content . "\n" . $content; Chris@0: } Chris@0: elseif (is_callable($action)) { Chris@0: $content = $action($original_content, $content); Chris@0: } Chris@0: else { Chris@0: throw new \LogicException("Unsupported action: $action."); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: // Default mode for all parent directories is 0777. It can be modified by Chris@0: // changing umask. Chris@0: $mode = $asset->getMode(); Chris@0: Chris@0: // Save data to file system. Chris@0: if ($asset->isDirectory()) { Chris@0: $this->filesystem->mkdir([$file_path], $mode); Chris@0: } Chris@0: else { Chris@0: $this->filesystem->dumpFile($file_path, $content); Chris@0: $this->filesystem->chmod($file_path, $mode); Chris@0: } Chris@0: Chris@0: $dumped_files[] = $asset->getPath(); Chris@0: } Chris@0: Chris@0: return $dumped_files; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Asks a user for confirmation. Chris@0: * Chris@0: * @param string $question_text Chris@0: * The question to ask to the user. Chris@0: * Chris@0: * @return bool Chris@0: * User confirmation. Chris@0: */ Chris@0: protected function confirm($question_text) { Chris@0: $question_text = "\n $question_text\n ➤ "; Chris@0: // If the input is not interactive print the question with default answer. Chris@0: if ($this->replace !== NULL) { Chris@0: $this->output->writeln($question_text . ($this->replace ? 'Yes' : 'No')); Chris@0: } Chris@0: $question = new ConfirmationQuestion($question_text, $this->replace !== FALSE); Chris@0: /** @var \Symfony\Component\Console\Helper\QuestionHelper $question_helper */ Chris@0: $question_helper = $this->getHelperSet()->get('question'); Chris@0: return $question_helper->ask($this->input, $this->output, $question); Chris@0: } Chris@0: Chris@0: }