Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Cli/Command/AddOnUpgrade.php
<?php

namespace XF\Cli\Command;

use
Symfony\Component\Console\Command\Command;
use
Symfony\Component\Console\Helper\QuestionHelper;
use
Symfony\Component\Console\Input\InputArgument;
use
Symfony\Component\Console\Input\InputInterface;
use
Symfony\Component\Console\Input\InputOption;
use
Symfony\Component\Console\Output\OutputInterface;
use
Symfony\Component\Console\Question\ConfirmationQuestion;

class
AddOnUpgrade extends Command
{
    use
AddOnActionTrait, JobRunnerTrait;

    protected function
configure()
    {
       
$this
           
->setName('xf:addon-upgrade')
            ->
setAliases(['xf-addon:upgrade'])
            ->
setDescription('Upgrades the specified add-on')
            ->
addArgument(
               
'id',
               
InputArgument::REQUIRED,
               
'Add-On ID or path to add-on zip file'
           
)
            ->
addOption(
               
'force',
               
'f',
               
InputOption::VALUE_NONE,
               
'Skip verifying that the add-on is upgradeable'
           
)
            ->
addOption(
               
'skip-unavailable',
               
's',
               
InputOption::VALUE_NONE,
               
'Skip add-on if not installed, cannot be upgraded, or is disabled.'
           
);
    }

    protected function
execute(InputInterface $input, OutputInterface $output)
    {
       
$id = $input->getArgument('id');
       
$force = $input->getOption('force');
       
$skipUnavailable = $input->getOption('skip-unavailable');

        if (
$this->isAZipFile($id))
        {
           
$id = $this->validateAndExtractAddOnZip($id, $error);
            if (!
$id)
            {
               
$output->writeln('<error>' . $error . '</error>');
                return
1;
            }
        }

       
$addOn = $this->checkInstalledAddOn($id, $error);
        if (!
$addOn)
        {
            if (
$skipUnavailable)
            {
                return
0;
            }
            else
            {
               
$output->writeln('<error>' . $error . '</error>');
                return
1;
            }
        }

        if (!
$addOn->canUpgrade())
        {
            if (
$skipUnavailable)
            {
                return
0;
            }
            else if (!
$force)
            {
               
$output->writeln("<error>" . \XF::phrase('this_add_on_cannot_be_upgraded') . "</error>");
                return
1;
            }
        }

        if (!
$addOn->isActive() && $skipUnavailable)
        {
            return
0;
        }

        if (!
$this->verifyAddOnAction($input, $output, $addOn))
        {
            return
1;
        }

       
/** @var QuestionHelper $helper */
       
$helper = $this->getHelper('question');

       
$phrase = \XF::phrase('upgrading_x_from_y_to_z', [
           
'title' => $addOn->title,
           
'old' => $addOn->version_string,
           
'new' => $addOn->json_version_string
       
]);

       
$output->writeln($phrase->render() . '...');

       
$question = new ConfirmationQuestion(
           
"<question>Confirm upgrade? (y/n)</question>"
       
);
       
$response = $helper->ask($input, $output, $question);
        if (!
$response)
        {
            return
1;
        }

       
// make sure any errors get logged here
       
\XF::app()->error()->setIgnorePendingUpgrade(true);

       
$addOn->preUpgrade();

       
$this->runSubAction($output, $addOn, 'upgrade');
       
$this->runSubAction($output, $addOn, 'import');
       
$this->runSubAction($output, $addOn, 'post-upgrade');

        return
0;
    }
}