CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260909-GRAM-XF-PROCESSING-RCA-065
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=gram-support-processing-state-rca
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=58650c7036826de2b367e43288c37a4bd74fa37fd38895b6cd899c5b17b53b68
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=9fff9616621e2e34c86e9d1b10d3848cacb6aea9487d9a67a849be45c240506d
SANITIZED_OUTPUT_SHA256=9fff9616621e2e34c86e9d1b10d3848cacb6aea9487d9a67a849be45c240506d
OUTPUT_BEGIN
SUPPORT065_BEGIN
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
SUPPORT065_QGA_STATE={"exitcode":0,"state":"COMPLETE"}
SUPPORT065_VM211={"addon_list":{"rc":0,"stderr":"","stdout":"{\n    \"addons\": [\n        {\n            \"addon_id\": \"Newfi\\/Dogs\",\n            \"title\": \"Newfi Dogs\",\n            \"version_string\": \"1.0.0 Alpha 1\",\n            \"version_id\": 1000010,\n            \"active\": true,\n            \"legacy\": false,\n            \"is_processing\": false,\n            \"last_pending_action\": null,\n            \"developer\": \"Newfi\",\n            \"path\": \"\\/var\\/www\\/forums\\/newfi\\/public\\/src\\/addons\\/Newfi\\/Dogs\"\n        },\n        {\n            \"addon_id\": \"Newfi\\/Events\",\n            \"title\": \"Newfi Events\",\n            \"version_string\": \"1.0.0 Alpha 1\",\n            \"version_id\": 1000010,\n            \"active\": true,\n            \"legacy\": false,\n            \"is_processing\": false,\n            \"last_pending_action\": null,\n            \"developer\": \"Newfi\",\n            \"path\": \"\\/var\\/www\\/forums\\/newfi\\/public\\/src\\/addons\\/Newfi\\/Events\"\n        },\n        {\n            \"addon_id\": \"Newfi\\/Portal\",\n            \"title\": \"Newfi Portal\",\n            \"version_string\": \"1.0.0 Alpha 1\",\n            \"version_id\": 1000010,\n            \"active\": true,\n            \"legacy\": false,\n            \"is_processing\": false,\n            \"last_pending_action\": null,\n            \"developer\": \"Newfi\",\n            \"path\": \"\\/var\\/www\\/forums\\/newfi\\/public\\/src\\/addons\\/Newfi\\/Portal\"\n        },\n        {\n            \"addon_id\": \"XFMG\",\n            \"title\": \"XenForo Media Gallery\",\n            \"version_string\": \"2.3.11\",\n            \"version_id\": 902031170,\n            \"active\": true,\n            \"legacy\": false,\n            \"is_processing\": false,\n            \"last_pending_action\": null,\n            \"developer\": \"XenForo Ltd.\",\n            \"path\": \"\\/var\\/www\\/forums\\/newfi\\/public\\/src\\/addons\\/XFMG\"\n        },\n        {\n            \"addon_id\": \"XFRM\",\n            \"title\": \"XenForo Resource Manager\",\n            \"version_string\": \"2.3.11\",\n            \"version_id\": 2031170,\n            \"active\": true,\n            \"legacy\": false,\n            \"is_processing\": false,\n            \"last_pending_action\": null,\n            \"developer\": \"XenForo Ltd.\",\n            \"path\": \"\\/var\\/www\\/forums\\/newfi\\/public\\/src\\/addons\\/XFRM\"\n        }\n    ],\n    \"summary\": {\n        \"total\": 5,\n        \"active\": 5,\n        \"inactive\": 0\n    }\n}"},"command_id":"SUPPORT-260909-GRAM-XF-PROCESSING-RCA-065","decision":"PROCESSING_STATE_AND_UNINSTALL_SOURCE_CAPTURED","guest":"newfi-staging","holds":[],"identity_ok":true,"list_help":{"rc":0,"stderr":"","stdout":"Description:\n  Lists installed add-ons\n\nUsage:\n  xf:addon-list [options]\n  xf-addon:list\n\nOptions:\n      --active          Only show active add-ons\n      --inactive        Only show inactive add-ons\n      --json            Output as JSON\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"},"php_state":{"data":{"addon_columns":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"addon_row":{"active":"1","addon_id":"Gram/Support","is_legacy":"0","is_processing":"1","json_hash":"f3804541014a3dfde3b35323475c5dbcbb72ebb0d0c319d66385e9203628724d","last_pending_action":"install:1","title":"Gram Support","version_id":"1000050","version_string":"1.0.0 Alpha 3 Unified Fix 3"},"board_active":"0","error_max":45,"errors_after_45":0,"manager_class":"XF\\AddOn\\Manager","manager_getById":{"canUninstall":false,"class":"XF\\AddOn\\AddOn","getSetup":"Gram\\Support\\Setup","isActive":false,"isInstalled":false},"manager_methods":{"getAllAddOns":{"public":true,"required":0,"total":0},"getById":{"public":true,"required":1,"total":1},"getInstalledAddOns":{"public":true,"required":0,"total":0}}},"rc":0,"stderr_sha256":""},"scope":"READ_ONLY_NO_MUTATION","source_evidence":[{"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/AddOnUninstall.php","matches":[{"line":2,"text":""},{"line":3,"text":"namespace XF\\Cli\\Command;"},{"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/AddOn.php","matches":[{"line":45,"text":"\t/**"},{"line":46,"text":"\t * @var \\XF\\Entity\\AddOn"},{"line":47,"text":"\t */"},{"line":48,"text":"\tprotected $installedAddOn;"},{"line":49,"text":""},{"line":50,"text":"\t/**"},{"line":51,"text":"\t * @var AbstractSetup"},{"line":52,"text":"\t */"},{"line":53,"text":"\tprotected $setup;"},{"line":54,"text":""},{"line":55,"text":"\tprotected $addOnId;"},{"line":56,"text":"\tprotected $legacyAddOnId;"},{"line":57,"text":""},{"line":58,"text":"\tprotected $addOnDir;"},{"line":59,"text":"\tprotected $buildDir;"},{"line":60,"text":"\tprotected $dataDir;"},{"line":61,"text":"\tprotected $filesDir;"},{"line":62,"text":"\tprotected $outputDir;"},{"line":63,"text":"\tprotected $releasesDir;"},{"line":64,"text":""},{"line":65,"text":"\tprotected $jsonPath;"},{"line":66,"text":"\tprotected $json = [];"},{"line":67,"text":""},{"line":68,"text":"\tprotected $buildJsonPath;"},{"line":69,"text":"\tprotected $buildJson = [];"},{"line":70,"text":""},{"line":71,"text":"\tprotected $missingFiles = [];"},{"line":72,"text":""},{"line":73,"text":"\tprotected $addOnHashes;"},{"line":74,"text":""},{"line":75,"text":"\tpublic function __construct($addOnOrId, Manager $manager)"},{"line":76,"text":"\t{"},{"line":77,"text":"\t\t$this->manager = $manager;"},{"line":78,"text":""},{"line":79,"text":"\t\tif ($addOnOrId instanceof \\XF\\Entity\\AddOn)"},{"line":80,"text":"\t\t{"},{"line":81,"text":"\t\t\t$this->installedAddOn = $addOnOrId;"},{"line":82,"text":"\t\t\t$this->addOnId = $addOnOrId->addon_id;"},{"line":83,"text":"\t\t}"},{"line":84,"text":"\t\telse"},{"line":85,"text":"\t\t{"},{"line":86,"text":"\t\t\t$this->addOnId = $addOnOrId;"},{"line":87,"text":"\t\t}"},{"line":88,"text":""},{"line":89,"text":"\t\t$ds = \\XF::$DS;"},{"line":90,"text":""},{"line":91,"text":"\t\t$this->addOnDir = \\XF::getAddOnDirectory() . $ds . $this->prepareAddOnIdForPath();"},{"line":92,"text":""},{"line":93,"text":"\t\t// Resolve symlinks to ensure consistent path handling"},{"line":94,"text":"\t\t$realAddOnDir = realpath($this->addOnDir);"},{"line":95,"text":"\t\tif ($realAddOnDir !== false)"},{"line":96,"text":"\t\t{"},{"line":97,"text":"\t\t\t$this->addOnDir = $realAddOnDir;"},{"line":98,"text":"\t\t}"},{"line":99,"text":""},{"line":100,"text":"\t\t$this->buildDir = $this->addOnDir . $ds . '_build';"},{"line":101,"text":"\t\t$this->dataDir = $this->addOnDir . $ds . '_data';"},{"line":102,"text":"\t\t$this->filesDir = $this->addOnDir . $ds . '_files';"},{"line":103,"text":"\t\t$this->outputDir = $this->addOnDir . $ds . '_output';"},{"line":104,"text":"\t\t$this->releasesDir = $this->addOnDir . $ds . '_releases';"},{"line":105,"text":""},{"line":106,"text":"\t\t$this->jsonPath = $this->addOnDir . $ds . 'addon.json';"},{"line":107,"text":"\t\tif (file_exists($this->jsonPath))"},{"line":108,"text":"\t\t{"},{"line":109,"text":"\t\t\t$this->json = $this->prepareJsonFile("},{"line":110,"text":"\t\t\t\tjson_decode(file_get_contents($this->jsonPath), true) ?: []"},{"line":111,"text":"\t\t\t);"},{"line":112,"text":"\t\t}"},{"line":113,"text":"\t\telse"},{"line":114,"text":"\t\t{"},{"line":115,"text":"\t\t\t$this->missingFiles[] = 'addon.json';"},{"line":116,"text":"\t\t}"},{"line":117,"text":""},{"line":118,"text":"\t\tif (!$this->installedAddOn && !empty($this->json['legacy_addon_id']))"},{"line":119,"text":"\t\t{"},{"line":120,"text":"\t\t\t$this->legacyAddOnId = $this->json['legacy_addon_id'];"},{"line":121,"text":"\t\t\t$this->installedAddOn = \\XF::em()->find(\\XF\\Entity\\AddOn::class, $this->legacyAddOnId);"},{"line":122,"text":"\t\t}"},{"line":123,"text":""},{"line":124,"text":"\t\t$this->buildJsonPath = $this->addOnDir . $ds . 'build.json';"},{"line":125,"text":"\t\t$this->buildJson = ["},{"line":126,"text":"\t\t\t'additional_files' => [],"},{"line":127,"text":"\t\t\t'minify' => [],"},{"line":128,"text":"\t\t\t'rollup' => [],"},{"line":129,"text":"\t\t\t'exec' => [],"},{"line":130,"text":"\t\t];"},{"line":131,"text":"\t\tif (file_exists($this->buildJsonPath))"},{"line":132,"text":"\t\t{"},{"line":133,"text":"\t\t\t$buildJson = @json_decode(file_get_contents($this->buildJsonPath), true);"},{"line":134,"text":""},{"line":135,"text":"\t\t\t$this->buildJson = array_replace("},{"line":136,"text":"\t\t\t\t$this->buildJson,"},{"line":137,"text":"\t\t\t\t$buildJson ?: []"},{"line":138,"text":"\t\t\t);"},{"line":139,"text":"\t\t}"},{"line":140,"text":"\t}"},{"line":141,"text":""},{"line":142,"text":"\tpublic function getInstalledAddOn()"},{"line":143,"text":"\t{"},{"line":144,"text":"\t\treturn $this->installedAddOn;"},{"line":145,"text":"\t}"},{"line":146,"text":""},{"line":147,"text":"\tpublic function getAddOnId()"},{"line":148,"text":"\t{"},{"line":149,"text":"\t\treturn $this->addOnId;"},{"line":150,"text":"\t}"},{"line":151,"text":""},{"line":152,"text":"\tpublic function getAddOnIdUrl()"},{"line":153,"text":"\t{"},{"line":154,"text":"\t\treturn \\XF::app()->repository(AddOnRepository::class)->convertAddOnIdToUrlVersion($this->getAddOnId());"},{"line":155,"text":"\t}"},{"line":156,"text":""},{"line":157,"text":"\tpublic function prepareVersionForFilename()"},{"line":158,"text":"\t{"},{"line":159,"text":"\t\t$versionString = preg_replace('/[^a-z0-9-_. ]/i', '', $this->version_string);"},{"line":160,"text":"\t\treturn trim(preg_replace('/\\s{2,}/', ' ', $versionString));"},{"line":161,"text":"\t}"},{"line":162,"text":""},{"line":163,"text":"\tpublic function prepareAddOnIdForFilename()"},{"line":164,"text":"\t{"},{"line":165,"text":"\t\tif (strpos($this->addOnId, '/') !== false)"},{"line":166,"text":"\t\t{"},{"line":167,"text":"\t\t\treturn str_replace('/', '-', $this->addOnId);"},{"line":168,"text":"\t\t}"},{"line":169,"text":"\t\telse"},{"line":170,"text":"\t\t{"},{"line":171,"text":"\t\t\treturn $this->addOnId;"},{"line":172,"text":"\t\t}"},{"line":173,"text":"\t}"},{"line":174,"text":""},{"line":175,"text":"\tpublic function prepareAddOnIdForPath()"},{"line":176,"text":"\t{"},{"line":177,"text":"\t\tif (strpos($this->addOnId, '/') !== false)"},{"line":178,"text":"\t\t{"},{"line":179,"text":"\t\t\treturn str_replace('/', \\XF::$DS, $this->addOnId);"},{"line":180,"text":"\t\t}"},{"line":181,"text":"\t\telse"},{"line":182,"text":"\t\t{"},{"line":183,"text":"\t\t\treturn $this->addOnId;"},{"line":184,"text":"\t\t}"},{"line":185,"text":"\t}"},{"line":186,"text":""},{"line":187,"text":"\tpublic function prepareAddOnIdForClass()"},{"line":188,"text":"\t{"},{"line":189,"text":"\t\tif (strpos($this->addOnId, '/') !== false)"},{"line":190,"text":"\t\t{"},{"line":191,"text":"\t\t\treturn str_replace('/', '\\\\', $this->addOnId);"},{"line":192,"text":"\t\t}"},{"line":193,"text":"\t\telse"},{"line":194,"text":"\t\t{"},{"line":195,"text":"\t\t\treturn $this->addOnId;"},{"line":196,"text":"\t\t}"},{"line":197,"text":"\t}"},{"line":198,"text":""},{"line":199,"text":"\tpublic function getMissingFiles()"},{"line":200,"text":"\t{"},{"line":201,"text":"\t\treturn $this->missingFiles;"},{"line":202,"text":"\t}"},{"line":203,"text":""},{"line":204,"text":"\tpublic function getAddOnDirectory()"},{"line":205,"text":"\t{"},{"line":206,"text":"\t\treturn $this->addOnDir;"},{"line":207,"text":"\t}"},{"line":208,"text":""},{"line":209,"text":"\tpublic function getBuildDirectory()"},{"line":210,"text":"\t{"},{"line":211,"text":"\t\treturn $this->buildDir;"},{"line":212,"text":"\t}"},{"line":213,"text":""},{"line":214,"text":"\tpublic function getDataDirectory()"},{"line":215,"text":"\t{"},{"line":216,"text":"\t\treturn $this->dataDir;"},{"line":221,"text":"\t\treturn $this->filesDir;"},{"line":222,"text":"\t}"},{"line":223,"text":""},{"line":224,"text":"\tpublic function getReleasesDirectory()"},{"line":225,"text":"\t{"},{"line":226,"text":"\t\treturn $this->releasesDir;"},{"line":227,"text":"\t}"},{"line":228,"text":""}],"sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},{"file":"src/XF/AddOn/StepRunnerUninstallTrait.php","matches":[{"line":1,"text":"<?php"},{"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_columns":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"addon_row":{"active":"1","addon_id":"Gram/Support","is_legacy":"0","is_processing":"1","json_hash":"f3804541014a3dfde3b35323475c5dbcbb72ebb0d0c319d66385e9203628724d","last_pending_action":"install:1","title":"Gram Support","version_id":"1000050","version_string":"1.0.0 Alpha 3 Unified Fix 3"},"board_active":"0","error_max":45,"errors_after_45":0,"manager_class":"XF\\AddOn\\Manager","manager_getById":{"canUninstall":false,"class":"XF\\AddOn\\AddOn","getSetup":"Gram\\Support\\Setup","isActive":false,"isInstalled":false},"manager_methods":{"getAllAddOns":{"public":true,"required":0,"total":0},"getById":{"public":true,"required":1,"total":1},"getInstalledAddOns":{"public":true,"required":0,"total":0}}},"status":"OK","uninstall_help":{"rc":0,"stderr":"","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"}}
SUPPORT065_HOLDS=[]
SUPPORT065_DECISION=PROCESSING_STATE_AND_UNINSTALL_SOURCE_CAPTURED
SUPPORT065_MUTATION_SCOPE=NONE_READ_ONLY
HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260909-GRAM-XF-PROCESSING-RCA-065","rollback_restored":null,"rollback_started":false,"status":"OK","version":1}
SUPPORT065_END

OUTPUT_END
CHAT_OUTPUT_END
