Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Command; | |
use Mautic\CoreBundle\Exception\UpdateFailedException; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Helper\ProgressBarHelper; | |
use Mautic\CoreBundle\Update\StepProvider; | |
use Symfony\Component\Console\Command\Command; | |
use Symfony\Component\Console\Helper\ProgressBar; | |
use Symfony\Component\Console\Helper\SymfonyQuestionHelper; | |
use Symfony\Component\Console\Input\InputInterface; | |
use Symfony\Component\Console\Input\InputOption; | |
use Symfony\Component\Console\Output\OutputInterface; | |
use Symfony\Component\Console\Question\ConfirmationQuestion; | |
use Symfony\Contracts\Translation\TranslatorInterface; | |
/** | |
* CLI Command to update the application. | |
*/ | |
class ApplyUpdatesCommand extends Command | |
{ | |
public function __construct( | |
private TranslatorInterface $translator, | |
private StepProvider $stepProvider, | |
private CoreParametersHelper $coreParametersHelper | |
) { | |
parent::__construct(); | |
} | |
protected function configure() | |
{ | |
$this->setName('mautic:update:apply') | |
->setDefinition( | |
[ | |
new InputOption( | |
'force', null, InputOption::VALUE_NONE, | |
'Bypasses the verification check.' | |
), | |
new InputOption( | |
'update-package', | |
'p', InputOption::VALUE_OPTIONAL, 'Optional full path to the update package to apply.' | |
), | |
new InputOption( | |
'finish', null, InputOption::VALUE_NONE, | |
'Finalize the upgrade.' | |
), | |
] | |
) | |
->setHelp( | |
<<<'EOT' | |
The <info>%command.name%</info> command updates the Mautic application. | |
<info>php %command.full_name%</info> | |
You can optionally specify to bypass the verification check with the --force option: | |
<info>php %command.full_name% --force</info> | |
To force install a local package, pass the full path to the package as follows: | |
<info>php %command.full_name% --update-package=/path/to/updatepackage.zip</info> | |
EOT | |
); | |
} | |
protected function execute(InputInterface $input, OutputInterface $output): int | |
{ | |
/** @var array<string, mixed> $options */ | |
$options = $input->getOptions(); | |
// Start a progress bar, don't give a max number of steps because it is conditional | |
$progressBar = ProgressBarHelper::init($output); | |
$progressBar->setFormat('Step %current% [%bar%] <info>%message%</info>'); | |
// Define this just in case | |
if (!defined('MAUTIC_ENV')) { | |
define('MAUTIC_ENV', $options['env'] ?? 'prod'); | |
} | |
if (true === $this->coreParametersHelper->get('composer_updates', false)) { | |
$output->writeln('<error>'.$this->translator->trans('mautic.core.command.update.composer').'</error>'); | |
return Command::FAILURE; | |
} | |
try { | |
if (empty($options['finish'])) { | |
$returnCode = $this->startUpgrade($input, $output, $progressBar); | |
$output->writeln( | |
"\n\n<warning>".$this->translator->trans('mautic.core.command.update.finalize_instructions').'</warning>' | |
); | |
// Must hard exit here to prevent Symfony from trying to use the kernel while in the same PHP process | |
exit($returnCode); | |
} | |
return $this->finishUpgrade($input, $output, $progressBar); | |
} catch (UpdateFailedException $exception) { | |
$output->writeln( | |
"\n\n<error>".$exception->getMessage().'</error>' | |
); | |
} | |
return Command::FAILURE; | |
} | |
/** | |
* @throws UpdateFailedException | |
*/ | |
private function startUpgrade(InputInterface $input, OutputInterface $output, ProgressBar $progressBar): int | |
{ | |
if (!$input->getOption('force')) { | |
/** @var SymfonyQuestionHelper $helper */ | |
$helper = $this->getHelperSet()->get('question'); | |
$question = new ConfirmationQuestion($this->translator->trans('mautic.core.update.confirm_application_update').' ', false); | |
if (!$helper->ask($input, $output, $question)) { | |
throw new UpdateFailedException($this->translator->trans('mautic.core.update.aborted')); | |
} | |
} | |
foreach ($this->stepProvider->getInitialSteps() as $step) { | |
$step->execute($progressBar, $input, $output); | |
} | |
return 0; | |
} | |
/** | |
* @throws UpdateFailedException | |
*/ | |
private function finishUpgrade(InputInterface $input, OutputInterface $output, ProgressBar $progressBar): int | |
{ | |
foreach ($this->stepProvider->getFinalSteps() as $step) { | |
$step->execute($progressBar, $input, $output); | |
} | |
return 0; | |
} | |
protected static $defaultDescription = 'Updates the Mautic application'; | |
} | |