CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=gram-support-uninstall-cli-rca
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=3c1f44eb83c66ec4258fe2c23525c894f82f1309bcb63501cb73e660ca6a3a63
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=0
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934
SANITIZED_OUTPUT_SHA256=d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934
OUTPUT_BEGIN
SUPPORT064_BEGIN
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
SUPPORT064_QGA_STATE={"exitcode":0,"state":"COMPLETE"}
SUPPORT064_VM211={"addon_list":{"matched_lines":["  Add-on ID      Title                      Version         Active  "],"rc":0,"stderr":""},"command_id":"SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064","decision":"UNINSTALL_CLI_RCA_CAPTURED","guest":"newfi-staging","holds":[],"identity_ok":true,"scope":"READ_ONLY_NO_MUTATION","source_evidence":[{"file":"src/XF/Cli/Command/AddOn/AbstractSetupStep.php","matches":[{"line":103,"text":""},{"line":104,"text":"\tprotected function runStep(AbstractSetup $setup, OutputInterface $output, $stepType, $step, $version = null, array $params = [])"},{"line":105,"text":"\t{"},{"line":106,"text":"\t\t$method = $stepType;"},{"line":107,"text":""},{"line":108,"text":"\t\tswitch ($method)"},{"line":109,"text":"\t\t{"},{"line":110,"text":"\t\t\tcase 'install':"},{"line":111,"text":"\t\t\tcase 'uninstall':"},{"line":112,"text":"\t\t\t\tif ($step)"},{"line":113,"text":"\t\t\t\t{"},{"line":114,"text":"\t\t\t\t\t$method .= 'Step' . $step;"},{"line":115,"text":"\t\t\t\t}"},{"line":116,"text":"\t\t\t\tbreak;"},{"line":117,"text":""},{"line":118,"text":"\t\t\tcase 'upgrade':"},{"line":119,"text":"\t\t\t\tif ($version && $step)"},{"line":120,"text":"\t\t\t\t{"},{"line":121,"text":"\t\t\t\t\t$method .= $version . 'Step' . $step;"},{"line":122,"text":"\t\t\t\t}"},{"line":123,"text":"\t\t\t\tbreak;"},{"line":124,"text":"\t\t}"},{"line":125,"text":""},{"line":126,"text":"\t\tif (!method_exists($setup, $method))"},{"line":127,"text":"\t\t{"},{"line":128,"text":"\t\t\t$this->clearStatus($output, \"<error>Setup class does not have a $method() method.</error>\");"}],"sha256":"86ac6e9eda2202a75f3566a6bf20b14b5cc5171a823e0a23de0e66d0e8c0a8b7"},{"file":"src/XF/Cli/Command/AddOn/Create.php","matches":[{"line":219,"text":"\t\t\t{"},{"line":220,"text":"\t\t\t\t$setupContent = <<< SETUP"},{"line":221,"text":"<?php"},{"line":222,"text":""},{"line":223,"text":"namespace {$addOnObj->prepareAddOnIdForClass()};"},{"line":224,"text":""},{"line":225,"text":"use XF\\AddOn\\AbstractSetup;"},{"line":226,"text":"use XF\\AddOn\\StepRunnerInstallTrait;"},{"line":227,"text":"use XF\\AddOn\\StepRunnerUninstallTrait;"},{"line":228,"text":"use XF\\AddOn\\StepRunnerUpgradeTrait;"},{"line":229,"text":""},{"line":230,"text":"class Setup extends AbstractSetup"},{"line":231,"text":"{"},{"line":232,"text":"\tuse StepRunnerInstallTrait;"},{"line":233,"text":"\tuse StepRunnerUpgradeTrait;"},{"line":234,"text":"\tuse StepRunnerUninstallTrait;"},{"line":235,"text":"}"},{"line":236,"text":"SETUP;"},{"line":237,"text":""},{"line":238,"text":"\t\t\t}"},{"line":239,"text":"\t\t\telse"},{"line":240,"text":"\t\t\t{"},{"line":241,"text":"\t\t\t\t$setupContent = <<< SETUP"},{"line":242,"text":"<?php"},{"line":243,"text":""},{"line":244,"text":"namespace {$addOnObj->prepareAddOnIdForClass()};"},{"line":245,"text":""},{"line":246,"text":"use XF\\AddOn\\AbstractSetup;"},{"line":247,"text":""},{"line":248,"text":"class Setup extends AbstractSetup"},{"line":249,"text":"{"},{"line":250,"text":"\tpublic function install(array \\$stepParams = [])"},{"line":251,"text":"\t{"},{"line":252,"text":"\t\t// TODO: Implement install() method."},{"line":253,"text":"\t}"},{"line":254,"text":""},{"line":255,"text":"\tpublic function upgrade(array \\$stepParams = [])"},{"line":256,"text":"\t{"},{"line":257,"text":"\t\t// TODO: Implement upgrade() method."},{"line":258,"text":"\t}"},{"line":259,"text":""},{"line":260,"text":"\tpublic function uninstall(array \\$stepParams = [])"},{"line":261,"text":"\t{"},{"line":262,"text":"\t\t// TODO: Implement uninstall() method."},{"line":263,"text":"\t}"},{"line":264,"text":"}"},{"line":265,"text":"SETUP;"},{"line":266,"text":"\t\t\t}"},{"line":267,"text":""},{"line":268,"text":"\t\t\t$output->writeln(\"\");"},{"line":269,"text":""},{"line":270,"text":"\t\t\t$written = File::writeFile($setupPath, $setupContent, false);"},{"line":271,"text":"\t\t\tif ($written)"},{"line":272,"text":"\t\t\t{"},{"line":273,"text":"\t\t\t\t$output->writeln(\"The Setup.php file was successfully written out to $setupPath\");"},{"line":274,"text":"\t\t\t}"},{"line":275,"text":"\t\t\telse"},{"line":276,"text":"\t\t\t{"},{"line":277,"text":"\t\t\t\t$output->writeln(\"The Setup.php file could not be written out to $setupPath\");"},{"line":278,"text":"\t\t\t}"},{"line":279,"text":"\t\t}"}],"sha256":"4ff8f77caa12327158b9a6ba6ed2ffe85b959011279be5a70a8b3e77f75204f5"},{"file":"src/XF/Cli/Command/AddOn/UninstallStep.php","matches":[{"line":1,"text":"<?php"},{"line":2,"text":""},{"line":3,"text":"namespace XF\\Cli\\Command\\AddOn;"},{"line":4,"text":""},{"line":5,"text":"use Symfony\\Component\\Console\\Input\\InputArgument;"},{"line":6,"text":""},{"line":7,"text":"class UninstallStep extends AbstractSetupStep"},{"line":8,"text":"{"},{"line":9,"text":"\tprotected function getStepType()"},{"line":10,"text":"\t{"},{"line":11,"text":"\t\treturn 'uninstall';"},{"line":12,"text":"\t}"},{"line":13,"text":""},{"line":14,"text":"\tprotected function getCommandArguments()"},{"line":15,"text":"\t{"},{"line":16,"text":"\t\t$this->addArgument("},{"line":17,"text":"\t\t\t'step',"},{"line":18,"text":"\t\t\tInputArgument::REQUIRED,"},{"line":19,"text":"\t\t\t'The step number to run.'"},{"line":20,"text":"\t\t);"},{"line":21,"text":"\t}"},{"line":22,"text":"}"}],"sha256":"d69b287acd3ea5c02bf23492e1bdef465fb75f22f00b45acdb4ffafe547260e5"},{"file":"src/XF/Cli/Command/AddOnSubAction.php","matches":[{"line":79,"text":"\t\t\t\t\t$this->performAddOnAction($input, $output, $addOn, \\XF::phrase('upgrading'), 'upgrade');"},{"line":80,"text":"\t\t\t\t\tbreak;"},{"line":81,"text":""},{"line":82,"text":"\t\t\t\tcase 'post-upgrade':"},{"line":83,"text":"\t\t\t\t\t$stateChanges = [];"},{"line":84,"text":"\t\t\t\t\t$addOn->postUpgrade($stateChanges);"},{"line":85,"text":"\t\t\t\t\tbreak;"},{"line":86,"text":""},{"line":87,"text":"\t\t\t\tcase 'uninstall':"},{"line":88,"text":"\t\t\t\t\t$this->performAddOnAction($input, $output, $addOn, \\XF::phrase('uninstalling'), 'uninstall');"},{"line":89,"text":"\t\t\t\t\tbreak;"},{"line":90,"text":""},{"line":91,"text":"\t\t\t\tcase 'uninstall-data':"},{"line":92,"text":"\t\t\t\t\t$installed = $addOn->getInstalledAddOn();"},{"line":93,"text":"\t\t\t\t\tif ($installed)"},{"line":94,"text":"\t\t\t\t\t{"},{"line":95,"text":"\t\t\t\t\t\t$installed->delete();"},{"line":96,"text":"\t\t\t\t\t}"},{"line":97,"text":"\t\t\t\t\tbreak;"},{"line":98,"text":""},{"line":99,"text":"\t\t\t\tcase 'post-uninstall':"},{"line":100,"text":"\t\t\t\t\t$addOn->postUninstall();"},{"line":101,"text":"\t\t\t\t\tbreak;"},{"line":102,"text":""},{"line":103,"text":"\t\t\t\tcase 'post-rebuild':"},{"line":104,"text":"\t\t\t\t\t$addOn->postRebuild();"},{"line":105,"text":"\t\t\t\t\tbreak;"},{"line":106,"text":""},{"line":107,"text":"\t\t\t\tcase 'active-change':"},{"line":108,"text":"\t\t\t\t\t\\XF::app()->addOnDataManager()->triggerRebuildActiveChange($addOn->getInstalledAddOn());"},{"line":109,"text":"\t\t\t\t\tbreak;"},{"line":110,"text":""},{"line":111,"text":"\t\t\t\tdefault:"},{"line":112,"text":"\t\t\t\t\tthrow new \\InvalidArgumentException(\"Unknown action '$action'\");"},{"line":113,"text":"\t\t\t}"},{"line":114,"text":"\t\t}"},{"line":115,"text":"\t\tcatch (\\Exception $e)"},{"line":116,"text":"\t\t{"},{"line":117,"text":"\t\t\t// taking this approach so that we don't get double logging"}],"sha256":"4cbf315edc17bf5773c624da2d1af076f47dd588398462d657f709d832adbb46"},{"file":"src/XF/Cli/Command/AddOnUninstall.php","matches":[{"line":4,"text":""},{"line":5,"text":"use Symfony\\Component\\Console\\Helper\\QuestionHelper;"},{"line":6,"text":"use Symfony\\Component\\Console\\Input\\InputArgument;"},{"line":7,"text":"use Symfony\\Component\\Console\\Input\\InputInterface;"},{"line":8,"text":"use Symfony\\Component\\Console\\Input\\InputOption;"},{"line":9,"text":"use Symfony\\Component\\Console\\Output\\OutputInterface;"},{"line":10,"text":"use Symfony\\Component\\Console\\Question\\ConfirmationQuestion;"},{"line":11,"text":""},{"line":12,"text":"class AddOnUninstall extends AbstractCommand"},{"line":13,"text":"{"},{"line":14,"text":"\tuse AddOnActionTrait;"},{"line":15,"text":"\tuse JobRunnerTrait;"},{"line":16,"text":""},{"line":17,"text":"\tprotected function configure()"},{"line":18,"text":"\t{"},{"line":19,"text":"\t\t$this"},{"line":20,"text":"\t\t\t->setName('xf:addon-uninstall')"},{"line":21,"text":"\t\t\t->setAliases(['xf-addon:uninstall'])"},{"line":22,"text":"\t\t\t->setDescription('Uninstalls the specified add-on')"},{"line":23,"text":"\t\t\t->addArgument("},{"line":24,"text":"\t\t\t\t'id',"},{"line":25,"text":"\t\t\t\tInputArgument::REQUIRED,"},{"line":26,"text":"\t\t\t\t'Add-On ID'"},{"line":27,"text":"\t\t\t)"},{"line":28,"text":"\t\t\t->addOption("},{"line":29,"text":"\t\t\t\t'force',"},{"line":30,"text":"\t\t\t\t'f',"},{"line":31,"text":"\t\t\t\tInputOption::VALUE_NONE,"},{"line":32,"text":"\t\t\t\t'Skip verifying that the add-on is uninstallable'"},{"line":33,"text":"\t\t\t);"},{"line":34,"text":"\t}"},{"line":35,"text":""},{"line":36,"text":"\tprotected function execute(InputInterface $input, OutputInterface $output)"},{"line":37,"text":"\t{"},{"line":38,"text":"\t\t$id = $input->getArgument('id');"},{"line":39,"text":""},{"line":40,"text":"\t\t$addOn = $this->checkInstalledAddOn($id, $error);"},{"line":41,"text":"\t\tif (!$addOn)"},{"line":42,"text":"\t\t{"},{"line":43,"text":"\t\t\t$output->writeln('<error>' . $error . '</error>');"},{"line":44,"text":"\t\t\treturn 1;"},{"line":45,"text":"\t\t}"},{"line":46,"text":""},{"line":47,"text":"\t\tif (!$addOn->canUninstall() && !$input->getOption('force'))"},{"line":48,"text":"\t\t{"},{"line":49,"text":"\t\t\t$output->writeln(\"<error>\" . \\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing') . \"</error>\");"},{"line":50,"text":"\t\t\treturn 1;"},{"line":51,"text":"\t\t}"},{"line":52,"text":""},{"line":53,"text":"\t\t/** @var QuestionHelper $helper */"},{"line":54,"text":"\t\t$helper = $this->getHelper('question');"},{"line":55,"text":""},{"line":56,"text":"\t\t$question = new ConfirmationQuestion(\"<question>\" . \\XF::phrase('please_confirm_that_you_want_to_uninstall_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \") (y/n)</question>\");"},{"line":57,"text":"\t\t$response = $helper->ask($input, $output, $question);"},{"line":58,"text":"\t\tif (!$response)"},{"line":59,"text":"\t\t{"},{"line":60,"text":"\t\t\treturn 1;"},{"line":61,"text":"\t\t}"},{"line":62,"text":""},{"line":63,"text":"\t\t// make sure any errors get logged here"},{"line":64,"text":"\t\t\\XF::app()->error()->setIgnorePendingUpgrade(true);"},{"line":65,"text":""},{"line":66,"text":"\t\t$addOn->preUninstall();"},{"line":67,"text":""},{"line":68,"text":"\t\t$this->runSubAction($output, $addOn, 'uninstall');"},{"line":69,"text":"\t\t$this->runSubAction($output, $addOn, 'uninstall-data');"},{"line":70,"text":"\t\t$this->runSubAction($output, $addOn, 'post-uninstall');"},{"line":71,"text":""},{"line":72,"text":"\t\treturn 0;"},{"line":73,"text":"\t}"},{"line":74,"text":"}"}],"sha256":"6dc768f60efd4af161b549cd54c01ae8922326cf7fd230b8ef93403bf8dba90c"},{"file":"src/XF/AddOn/AbstractSetup.php","matches":[{"line":31,"text":"\t */"},{"line":32,"text":"\tabstract public function upgrade(array $stepParams = []);"},{"line":33,"text":""},{"line":34,"text":"\t/**"},{"line":35,"text":"\t * @param array $stepParams"},{"line":36,"text":"\t *"},{"line":37,"text":"\t * @return null|StepResult"},{"line":38,"text":"\t */"},{"line":39,"text":"\tabstract public function uninstall(array $stepParams = []);"},{"line":40,"text":""},{"line":41,"text":"\tpublic function __construct(AddOn $addOn, App $app)"},{"line":42,"text":"\t{"},{"line":43,"text":"\t\t$this->addOn = $addOn;"},{"line":44,"text":"\t\t$this->app = $app;"},{"line":45,"text":"\t}"},{"line":46,"text":""},{"line":47,"text":"\t/**"},{"line":48,"text":"\t * Perform additional requirement checks."},{"line":49,"text":"\t *"},{"line":50,"text":"\t * @param list<string|\\Stringable> $errors Errors will block the setup from continuing"},{"line":51,"text":"\t * @param list<string|\\Stringable> $warnings Warnings will be displayed but allow the user to continue setup"},{"line":52,"text":"\t *"},{"line":53,"text":"\t * @return void"},{"line":54,"text":"\t */"},{"line":55,"text":"\tpublic function checkRequirements(&$errors = [], &$warnings = [])"},{"line":56,"text":"\t{"},{"line":85,"text":""},{"line":86,"text":"\t\t$this->app->jobManager()->enqueueUnique($uniqueId, FileCleanUp::class, ["},{"line":87,"text":"\t\t\t'addon_id' => $addOn->addon_id,"},{"line":88,"text":"\t\t], false);"},{"line":89,"text":"\t}"},{"line":90,"text":""},{"line":91,"text":"\tpublic function prepareForAction($action)"},{"line":92,"text":"\t{"},{"line":93,"text":"\t\tif ($action == 'uninstall')"},{"line":94,"text":"\t\t{"},{"line":95,"text":"\t\t\t\\XF::db()->ignoreLegacyTableWriteError(true);"},{"line":96,"text":"\t\t}"},{"line":97,"text":"\t}"},{"line":98,"text":""},{"line":99,"text":"\t/**"},{"line":100,"text":"\t * @param $sql"},{"line":101,"text":"\t * @param array $bind"},{"line":102,"text":"\t * @param bool $suppressAll"},{"line":103,"text":"\t *"},{"line":104,"text":"\t * @return bool|AbstractStatement"},{"line":105,"text":"\t * @throws Exception"},{"line":106,"text":"\t */"},{"line":107,"text":"\tprotected function query($sql, $bind = [], $suppressAll = false)"},{"line":108,"text":"\t{"},{"line":109,"text":"\t\treturn $this->executeUpgradeQuery($sql, $bind, $suppressAll);"},{"line":110,"text":"\t}"}],"sha256":"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88"},{"file":"src/XF/AddOn/AddOn.php","matches":[{"line":636,"text":""},{"line":637,"text":"\t\t$this->resetPendingAction();"},{"line":638,"text":"\t\t$this->syncFromJson();"},{"line":639,"text":""},{"line":640,"text":"\t\t$json = $this->getJson();"},{"line":641,"text":"\t\t\\XF::fire('addon_post_upgrade', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":642,"text":"\t}"},{"line":643,"text":""},{"line":644,"text":"\tpublic function preUninstall()"},{"line":645,"text":"\t{"},{"line":646,"text":"\t\t$installed = $this->installedAddOn;"},{"line":647,"text":"\t\tif (!$installed)"},{"line":648,"text":"\t\t{"},{"line":649,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":650,"text":"\t\t}"},{"line":651,"text":""},{"line":652,"text":"\t\t$installed->is_processing = true;"},{"line":653,"text":"\t\t$installed->last_pending_action = 'uninstall:0';"},{"line":654,"text":"\t\t$installed->saveIfChanged();"},{"line":655,"text":""},{"line":656,"text":"\t\t$json = $this->getJson();"},{"line":657,"text":"\t\t\\XF::fire('addon_pre_uninstall', [$this, $installed, $json], $installed->addon_id);"},{"line":658,"text":"\t}"},{"line":659,"text":""},{"line":660,"text":"\tpublic function postUninstall()"},{"line":661,"text":"\t{"},{"line":662,"text":"\t\t/** @var FileCheck $fileCheck */"},{"line":663,"text":"\t\t$fileCheck = \\XF::em()->create(FileCheck::class);"},{"line":664,"text":"\t\t$fileCheck->save();"},{"line":665,"text":""},{"line":666,"text":"\t\t\\XF::app()->jobManager()->enqueueUnique('fileCheck', \\XF\\Job\\FileCheck::class, ["},{"line":667,"text":"\t\t\t'check_id' => $fileCheck->check_id,"},{"line":668,"text":"\t\t\t'automated' => true,"},{"line":669,"text":"\t\t], false);"},{"line":670,"text":""},{"line":671,"text":"\t\t$json = $this->getJson();"},{"line":672,"text":""},{"line":673,"text":"\t\t\\XF::fire('addon_post_uninstall', [$this, $this->addOnId, $json], $this->addOnId);"},{"line":674,"text":"\t}"},{"line":675,"text":""},{"line":676,"text":"\tpublic function preRebuild()"},{"line":677,"text":"\t{"},{"line":678,"text":"\t\t$installed = $this->installedAddOn;"},{"line":679,"text":"\t\tif (!$installed)"},{"line":680,"text":"\t\t{"},{"line":681,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":682,"text":"\t\t}"},{"line":683,"text":""},{"line":684,"text":"\t\t$installed->is_processing = true;"},{"line":685,"text":"\t\t$installed->saveIfChanged();"},{"line":686,"text":""},{"line":687,"text":"\t\t$json = $this->getJson();"},{"line":688,"text":"\t\t\\XF::fire('addon_pre_rebuild', [$this, $installed, $json], $installed->addon_id);"},{"line":689,"text":"\t}"},{"line":690,"text":""},{"line":749,"text":"\t}"},{"line":750,"text":""},{"line":751,"text":"\tpublic function canInstall()"},{"line":752,"text":"\t{"},{"line":753,"text":"\t\treturn !$this->isInstalled()"},{"line":754,"text":"\t\t\t&& $this->isAvailable();"},{"line":755,"text":"\t}"},{"line":756,"text":""},{"line":757,"text":"\tpublic function canUninstall()"},{"line":758,"text":"\t{"},{"line":759,"text":"\t\treturn $this->isInstalled()"},{"line":760,"text":"\t\t\t&& $this->canEdit()"},{"line":761,"text":"\t\t\t&& ("},{"line":762,"text":"\t\t\t\t!$this->json || ($this->isFileVersionValid() && !$this->hasMissingFiles())"},{"line":763,"text":"\t\t\t);"},{"line":764,"text":"\t}"},{"line":765,"text":""},{"line":766,"text":"\tpublic function canEdit()"},{"line":767,"text":"\t{"},{"line":768,"text":"\t\treturn $this->installedAddOn"},{"line":769,"text":"\t\t\t&& $this->installedAddOn->canEdit();"},{"line":770,"text":"\t}"},{"line":771,"text":""},{"line":772,"text":"\tpublic function canRebuild()"},{"line":773,"text":"\t{"},{"line":774,"text":"\t\t// as long as the JSON is for the correct version, we're ok"}],"sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},{"file":"src/XF/AddOn/StepRunnerUninstallTrait.php","matches":[{"line":2,"text":""},{"line":3,"text":"namespace XF\\AddOn;"},{"line":4,"text":""},{"line":5,"text":"use function is_array;"},{"line":6,"text":""},{"line":7,"text":"/**"},{"line":8,"text":" * @property AddOn $addOn"},{"line":9,"text":" */"},{"line":10,"text":"trait StepRunnerUninstallTrait"},{"line":11,"text":"{"},{"line":12,"text":"\t/**"},{"line":13,"text":"\t * @param array $stepParams"},{"line":14,"text":"\t *"},{"line":15,"text":"\t * @return null|StepResult"},{"line":16,"text":"\t */"},{"line":17,"text":"\tpublic function uninstall(array $stepParams = [])"},{"line":18,"text":"\t{"},{"line":19,"text":"\t\t$stepParams = array_replace(["},{"line":20,"text":"\t\t\t'step' => 0,"},{"line":21,"text":"\t\t], $stepParams);"},{"line":22,"text":""},{"line":23,"text":"\t\t$step = $stepParams['step'];"},{"line":24,"text":"\t\tif (!$step)"},{"line":25,"text":"\t\t{"},{"line":26,"text":"\t\t\t$step = $this->getUninstallResumeStep();"},{"line":27,"text":"\t\t}"},{"line":28,"text":"\t\treturn $this->uninstallStepRunner($step, $stepParams);"},{"line":29,"text":"\t}"},{"line":30,"text":""},{"line":31,"text":"\tprivate function getUninstallResumeStep()"},{"line":32,"text":"\t{"},{"line":33,"text":"\t\t$installedAddOn = $this->addOn->getInstalledAddOn();"},{"line":34,"text":"\t\tif ($installedAddOn)"},{"line":35,"text":"\t\t{"},{"line":36,"text":"\t\t\t$lastActionStep = $installedAddOn->getLastActionStep('uninstall');"},{"line":37,"text":"\t\t\tif ($lastActionStep)"},{"line":38,"text":"\t\t\t{"},{"line":39,"text":"\t\t\t\treturn $lastActionStep + 1; // this is the last completed step, so resume with the next"},{"line":40,"text":"\t\t\t}"},{"line":41,"text":"\t\t}"},{"line":42,"text":""},{"line":43,"text":"\t\treturn 1;"},{"line":44,"text":"\t}"},{"line":45,"text":""},{"line":46,"text":"\t/**"},{"line":47,"text":"\t * @param integer $step"},{"line":48,"text":"\t * @param array $stepParams"},{"line":49,"text":"\t *"},{"line":50,"text":"\t * @return null|StepResult"},{"line":51,"text":"\t */"},{"line":52,"text":"\tprivate function uninstallStepRunner($step, array $stepParams)"},{"line":53,"text":"\t{"},{"line":54,"text":"\t\t$fnPrefix = 'uninstallStep';"},{"line":55,"text":"\t\t$fn = $fnPrefix . $step;"},{"line":56,"text":"\t\tif (!method_exists($this, $fn))"},{"line":57,"text":"\t\t{"},{"line":58,"text":"\t\t\treturn null;"},{"line":59,"text":"\t\t}"},{"line":60,"text":""},{"line":61,"text":"\t\t$result = $this->$fn($stepParams);"},{"line":62,"text":"\t\tif ($result === null || $result === true)"},{"line":63,"text":"\t\t{"},{"line":64,"text":"\t\t\t$result = new StepResult(true);"},{"line":65,"text":"\t\t}"},{"line":66,"text":"\t\telse if (is_array($result))"},{"line":67,"text":"\t\t{"},{"line":68,"text":"\t\t\t$result = new StepResult(false, $result);"},{"line":69,"text":"\t\t}"},{"line":70,"text":""},{"line":71,"text":"\t\tif (!($result instanceof StepResult))"},{"line":72,"text":"\t\t{"},{"line":73,"text":"\t\t\tthrow new \\LogicException(\"Must return a StepResult object\");"},{"line":74,"text":"\t\t}"},{"line":75,"text":""},{"line":76,"text":"\t\t$result->step = $step;"},{"line":77,"text":""},{"line":78,"text":"\t\tif ($result->complete)"},{"line":79,"text":"\t\t{"},{"line":80,"text":"\t\t\t$this->addOn->updatePendingAction('uninstall', $result->step);"},{"line":81,"text":""},{"line":82,"text":"\t\t\t$nextStep = $step + 1;"},{"line":83,"text":"\t\t\t$nextFn = $fnPrefix . $nextStep;"},{"line":84,"text":"\t\t\tif (!method_exists($this, $nextFn))"},{"line":85,"text":"\t\t\t{"},{"line":86,"text":"\t\t\t\treturn null;"},{"line":87,"text":"\t\t\t}"},{"line":88,"text":""},{"line":89,"text":"\t\t\t$result = new StepResult(false, [], $nextStep);"},{"line":90,"text":"\t\t}"},{"line":91,"text":""},{"line":92,"text":"\t\treturn $result;"},{"line":93,"text":"\t}"},{"line":94,"text":"}"}],"sha256":"e58a9ab9c30e3cf3c41a0be392e8c5ac37f744578f7b91f76d663139649c49a9"}],"state_after":{"addon":{"active":1,"addon_id":"Gram/Support","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},"addon_rows":1,"board_active":"0","error_max":45,"errors_after_45":0,"routes":1,"tables":6},"state_before":{"addon":{"active":1,"addon_id":"Gram/Support","version_id":1000050,"version_string":"1.0.0 Alpha 3 Unified Fix 3"},"addon_rows":1,"board_active":"0","error_max":45,"errors_after_45":0,"routes":1,"tables":6},"status":"OK","uninstall_help":{"rc":0,"stderr":"","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","stdout":"Description:\n  Uninstalls the specified add-on\n\nUsage:\n  xf:addon-uninstall [options] [--] <id>\n  xf-addon:uninstall\n\nArguments:\n  id                    Add-On ID\n\nOptions:\n  -f, --force           Skip verifying that the add-on is uninstallable\n  -h, --help            Display help for the given command. When no command is given display help for the list command\n  -q, --quiet           Do not output any message\n  -V, --version         Display this application version\n      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output\n  -n, --no-interaction  Do not ask any interactive question\n  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug","stdout_sha256":"c8f2162162c47f832d6c25822395cd2db42d260774e00ebc3bf765532f12ac97"}}
SUPPORT064_HOLDS=[]
SUPPORT064_DECISION=UNINSTALL_CLI_RCA_CAPTURED
SUPPORT064_MUTATION_SCOPE=NONE_READ_ONLY
HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064","rollback_restored":null,"rollback_started":false,"status":"OK","version":1}
SUPPORT064_END

OUTPUT_END
CHAT_OUTPUT_END
