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: }