1
0
Files
homelab-public-context/runtime/latest.json
T
2026-09-09 12:40:19 +00:00

39 lines
28 KiB
JSON

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