From 9eb24f83dc5ab44db9f8fe21e92be3ebc1d620e2 Mon Sep 17 00:00:00 2001 From: homelab-runtime-publisher Date: Wed, 9 Sep 2026 12:40:19 +0000 Subject: [PATCH] runtime: publish SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064 --- ...PORT-260909-GRAM-XF-UNINSTALL-RCA-064.json | 38 ++++++++++++++++ ...PPORT-260909-GRAM-XF-UNINSTALL-RCA-064.txt | 44 +++++++++++++++++++ runtime/latest.json | 28 ++++++------ runtime/latest.txt | 35 ++++++++------- 4 files changed, 115 insertions(+), 30 deletions(-) create mode 100644 runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.json create mode 100644 runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.txt diff --git a/runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.json b/runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.json new file mode 100644 index 00000000..9ffa5806 --- /dev/null +++ b/runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "gram-support-uninstall-cli-rca", + "started_at_utc": "2026-09-09T12:40:16Z", + "finished_at_utc": "2026-09-09T12:40:19Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "3c1f44eb83c66ec4258fe2c23525c894f82f1309bcb63501cb73e660ca6a3a63", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": false, + "result_contract_valid": true, + "result_contract_status": null, + "result_contract_error": null, + "command_rc": 0, + "changes_made": false, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "NO_MUTATION", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934", + "sanitized_output_sha256": "d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "SUPPORT064_BEGIN\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSUPPORT064_QGA_STATE={\"exitcode\":0,\"state\":\"COMPLETE\"}\nSUPPORT064_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, \\\"Setup class does not have a $method() method.\\\");\"}],\"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\":\"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\":\"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\":\"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 . '');\"},{\"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(\\\"\\\" . \\\\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing') . \\\"\\\");\"},{\"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(\\\"\\\" . \\\\XF::phrase('please_confirm_that_you_want_to_uninstall_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \\\") (y/n)\\\");\"},{\"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 $errors Errors will block the setup from continuing\"},{\"line\":51,\"text\":\"\\t * @param list $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] [--] \\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\"}}\nSUPPORT064_HOLDS=[]\nSUPPORT064_DECISION=UNINSTALL_CLI_RCA_CAPTURED\nSUPPORT064_MUTATION_SCOPE=NONE_READ_ONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nSUPPORT064_END\n" +} diff --git a/runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.txt b/runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.txt new file mode 100644 index 00000000..939d0321 --- /dev/null +++ b/runtime/history/SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064.txt @@ -0,0 +1,44 @@ +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, \"Setup class does not have a $method() method.\");"}],"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":"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":"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":"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 . '');"},{"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(\"\" . \\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing') . \"\");"},{"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(\"\" . \\XF::phrase('please_confirm_that_you_want_to_uninstall_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \") (y/n)\");"},{"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 $errors Errors will block the setup from continuing"},{"line":51,"text":"\t * @param list $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] [--] \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 diff --git a/runtime/latest.json b/runtime/latest.json index 56374e1c..9ffa5806 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,27 +1,27 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-260909-GRAM-XF-STAGING-CLEANUP-063", - "status": "FAIL", - "rc": 3, + "command_id": "SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064", + "status": "OK", + "rc": 0, "host": "pve01", - "mode": "change", - "component": "gram-support-staging-cleanup-partial-fix3", - "started_at_utc": "2026-09-09T12:35:37Z", - "finished_at_utc": "2026-09-09T12:35:40Z", + "mode": "read-only", + "component": "gram-support-uninstall-cli-rca", + "started_at_utc": "2026-09-09T12:40:16Z", + "finished_at_utc": "2026-09-09T12:40:19Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "a7c128316b1b8b1554496eec403843e6e6d8846d49047e026ce8835db6476c92", + "command_sha256": "3c1f44eb83c66ec4258fe2c23525c894f82f1309bcb63501cb73e660ca6a3a63", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, - "change_declared": true, + "change_declared": false, "result_contract_valid": true, - "result_contract_status": "FAIL", + "result_contract_status": null, "result_contract_error": null, - "command_rc": 3, + "command_rc": 0, "changes_made": false, "rollback_started": false, "rollback_restored": null, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "22b291bd52fcc0a8492c281f0ca765ed61b2f520b9c9958f4256af7e4c3638f4", - "sanitized_output_sha256": "22b291bd52fcc0a8492c281f0ca765ed61b2f520b9c9958f4256af7e4c3638f4", + "raw_evidence_sha256": "d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934", + "sanitized_output_sha256": "d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "SUPPORT063_BEGIN\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSUPPORT063_GUEST_STATE={\"exitcode\":3,\"state\":\"GUEST_FAIL\"}\nSUPPORT063_VM211={\"changed\":false,\"command_id\":\"SUPPORT-260909-GRAM-XF-STAGING-CLEANUP-063\",\"decision\":\"HOLD_CLEANUP_INCOMPLETE\",\"failure_class\":\"RuntimeError\",\"failure_phase\":\"NATIVE_UNINSTALL\",\"failure_reason\":\"NATIVE_UNINSTALL_RC\",\"guest\":\"newfi-staging\",\"native_uninstall\":{\"rc\":1,\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\"stderr_tail\":[],\"stdout_sha256\":\"7f81e50c71630eeb18ae235abc7140e2be17add9984de1c3890f6d0d60c31377\",\"stdout_tail\":[\"No add-on with ID 'Gram/Support' could be found.\"]},\"phase\":\"NATIVE_UNINSTALL\",\"post_uninstall\":{\"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\",\"content_type_fields\":1,\"error_max\":45,\"errors_after_45\":0,\"listeners\":1,\"option_groups\":1,\"options\":4,\"permissions\":9,\"phrases_addon\":54,\"phrases_prefix\":37,\"routes\":1,\"tables\":6,\"template_mods\":0,\"templates_addon\":0,\"templates_prefix\":0},\"prestate\":{\"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\",\"content_type_fields\":1,\"error_max\":45,\"errors_after_45\":0,\"listeners\":1,\"option_groups\":1,\"options\":4,\"permissions\":9,\"phrases_addon\":54,\"phrases_prefix\":37,\"routes\":1,\"tables\":6,\"template_mods\":0,\"templates_addon\":0,\"templates_prefix\":0},\"scope\":\"CLEANUP_ONLY_PARTIAL_FIX3\",\"status\":\"FAIL\",\"tree\":{\"bad\":[],\"expected_files\":59,\"extra\":[],\"mismatch\":[],\"missing\":[],\"observed_files\":59,\"ok\":true}}\nSUPPORT063_DECISION=HOLD_CLEANUP_INCOMPLETE\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260909-GRAM-XF-STAGING-CLEANUP-063\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"FAIL\",\"version\":1}\n" + "output": "SUPPORT064_BEGIN\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nSUPPORT064_QGA_STATE={\"exitcode\":0,\"state\":\"COMPLETE\"}\nSUPPORT064_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, \\\"Setup class does not have a $method() method.\\\");\"}],\"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\":\"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\":\"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\":\"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 . '');\"},{\"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(\\\"\\\" . \\\\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing') . \\\"\\\");\"},{\"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(\\\"\\\" . \\\\XF::phrase('please_confirm_that_you_want_to_uninstall_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \\\") (y/n)\\\");\"},{\"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 $errors Errors will block the setup from continuing\"},{\"line\":51,\"text\":\"\\t * @param list $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] [--] \\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\"}}\nSUPPORT064_HOLDS=[]\nSUPPORT064_DECISION=UNINSTALL_CLI_RCA_CAPTURED\nSUPPORT064_MUTATION_SCOPE=NONE_READ_ONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nSUPPORT064_END\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index ee2981a0..939d0321 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,22 +1,22 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-260909-GRAM-XF-STAGING-CLEANUP-063 -STATUS=FAIL -RC=3 +COMMAND_ID=SUPPORT-260909-GRAM-XF-UNINSTALL-RCA-064 +STATUS=OK +RC=0 HOST=pve01 -MODE=change -COMPONENT=gram-support-staging-cleanup-partial-fix3 +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=a7c128316b1b8b1554496eec403843e6e6d8846d49047e026ce8835db6476c92 +COMMAND_SHA256=3c1f44eb83c66ec4258fe2c23525c894f82f1309bcb63501cb73e660ca6a3a63 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true -CHANGE_DECLARED=true +CHANGE_DECLARED=false RESULT_CONTRACT_VALID=true -RESULT_CONTRACT_STATUS=FAIL +RESULT_CONTRACT_STATUS=NOT_APPLICABLE RESULT_CONTRACT_ERROR=NONE -COMMAND_RC=3 +COMMAND_RC=0 CHANGES_MADE=false ROLLBACK_STARTED=false ROLLBACK_RESTORED=null @@ -24,18 +24,21 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=22b291bd52fcc0a8492c281f0ca765ed61b2f520b9c9958f4256af7e4c3638f4 -SANITIZED_OUTPUT_SHA256=22b291bd52fcc0a8492c281f0ca765ed61b2f520b9c9958f4256af7e4c3638f4 +RAW_EVIDENCE_SHA256=d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934 +SANITIZED_OUTPUT_SHA256=d21978ee9d7dd7d562dd3864238e11976b912663b56c279d3b8a14d1d282d934 OUTPUT_BEGIN -SUPPORT063_BEGIN +SUPPORT064_BEGIN ERROR_REGISTER_CHECK=OK REFERENCE_CHECK=OK AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d -SUPPORT063_GUEST_STATE={"exitcode":3,"state":"GUEST_FAIL"} -SUPPORT063_VM211={"changed":false,"command_id":"SUPPORT-260909-GRAM-XF-STAGING-CLEANUP-063","decision":"HOLD_CLEANUP_INCOMPLETE","failure_class":"RuntimeError","failure_phase":"NATIVE_UNINSTALL","failure_reason":"NATIVE_UNINSTALL_RC","guest":"newfi-staging","native_uninstall":{"rc":1,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","stderr_tail":[],"stdout_sha256":"7f81e50c71630eeb18ae235abc7140e2be17add9984de1c3890f6d0d60c31377","stdout_tail":["No add-on with ID 'Gram/Support' could be found."]},"phase":"NATIVE_UNINSTALL","post_uninstall":{"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","content_type_fields":1,"error_max":45,"errors_after_45":0,"listeners":1,"option_groups":1,"options":4,"permissions":9,"phrases_addon":54,"phrases_prefix":37,"routes":1,"tables":6,"template_mods":0,"templates_addon":0,"templates_prefix":0},"prestate":{"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","content_type_fields":1,"error_max":45,"errors_after_45":0,"listeners":1,"option_groups":1,"options":4,"permissions":9,"phrases_addon":54,"phrases_prefix":37,"routes":1,"tables":6,"template_mods":0,"templates_addon":0,"templates_prefix":0},"scope":"CLEANUP_ONLY_PARTIAL_FIX3","status":"FAIL","tree":{"bad":[],"expected_files":59,"extra":[],"mismatch":[],"missing":[],"observed_files":59,"ok":true}} -SUPPORT063_DECISION=HOLD_CLEANUP_INCOMPLETE -HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260909-GRAM-XF-STAGING-CLEANUP-063","rollback_restored":null,"rollback_started":false,"status":"FAIL","version":1} +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, \"Setup class does not have a $method() method.\");"}],"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":"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":"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":"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 . '');"},{"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(\"\" . \\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing') . \"\");"},{"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(\"\" . \\XF::phrase('please_confirm_that_you_want_to_uninstall_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \") (y/n)\");"},{"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 $errors Errors will block the setup from continuing"},{"line":51,"text":"\t * @param list $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] [--] \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