diff --git a/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1.json b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1.json new file mode 100644 index 00000000..0bd80444 --- /dev/null +++ b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "pvepro-homepage-portal-install-lifecycle-rca-readonly", + "started_at_utc": "2026-09-20T16:42:17Z", + "finished_at_utc": "2026-09-20T16:42:22Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "3e979c32a397a411ac1e4144d432831e49d53b89bc5cfef8b70eca4ebe8c81b6", + "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": "8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182", + "sanitized_output_sha256": "8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1\nMODE=read-only\nCOMPONENT=pvepro-homepage-portal-install-lifecycle-rca-readonly\nWINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT\n782_ERROR_DECODE={\"matches\":true,\"sha256\":\"51939ddaddcc4d67fdb44c0507c06186062f750225b49d7b937841700e8713a7\",\"string\":\"W2PORTAL782ENQUEUE_MARKER\"}\nPRODUCTION_HOST={\"all_link_down\":false,\"config_sha256\":\"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab\",\"name\":\"pvepro-prod\",\"snapshots\":[],\"status\":\"running\"}\nSTAGING_HOST={\"all_link_down\":true,\"config_sha256\":\"9fd5f15119b54c8f83eb3c4bf47aac12f02e0cb9bc2bf593487a157d2d4840e3\",\"name\":\"pvepro-staging-v1\",\"snapshots\":[],\"status\":\"stopped\"}\nPRODUCTION_DB_PRESTATE={\"addons\":[{\"active\":1,\"addon_id\":\"XF\",\"is_processing\":0,\"last_pending_action\":null}],\"board_active\":\"1\",\"default_style\":\"2\",\"errors\":20,\"index_route\":\"forums/\",\"portal_addon_rows\":0,\"portal_job_rows\":0,\"portal_route_rows\":0,\"portal_template_rows\":0}\nXF_INSTALL_LIFECYCLE_SOURCE={\"likely\":{\"src/XF/AddOn/AddOn.php\":{\"hits\":[{\"context\":[{\"line\":536,\"text\":\"\"},{\"line\":537,\"text\":\"\\tpublic function updatePendingAction($action, $step)\"},{\"line\":538,\"text\":\"\\t{\"},{\"line\":539,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":540,\"text\":\"\\t\\t{\"},{\"line\":541,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', \\\"$action:$step\\\");\"},{\"line\":542,\"text\":\"\\t\\t}\"},{\"line\":543,\"text\":\"\\t}\"},{\"line\":544,\"text\":\"\"},{\"line\":545,\"text\":\"\\tpublic function resetPendingAction()\"},{\"line\":546,\"text\":\"\\t{\"},{\"line\":547,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"}],\"match_line\":541,\"match_text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', \\\"$action:$step\\\");\"},{\"context\":[{\"line\":540,\"text\":\"\\t\\t{\"},{\"line\":541,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', \\\"$action:$step\\\");\"},{\"line\":542,\"text\":\"\\t\\t}\"},{\"line\":543,\"text\":\"\\t}\"},{\"line\":544,\"text\":\"\"},{\"line\":545,\"text\":\"\\tpublic function resetPendingAction()\"},{\"line\":546,\"text\":\"\\t{\"},{\"line\":547,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"},{\"line\":551,\"text\":\"\\t}\"},{\"line\":552,\"text\":\"\"},{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"}],\"match_line\":545,\"match_text\":\"\\tpublic function resetPendingAction()\"},{\"context\":[{\"line\":544,\"text\":\"\"},{\"line\":545,\"text\":\"\\tpublic function resetPendingAction()\"},{\"line\":546,\"text\":\"\\t{\"},{\"line\":547,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"},{\"line\":551,\"text\":\"\\t}\"},{\"line\":552,\"text\":\"\"},{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"},{\"line\":555,\"text\":\"\\t\\tif (!$this->installedAddOn)\"},{\"line\":556,\"text\":\"\\t\\t{\"},{\"line\":557,\"text\":\"\\t\\t\\t$json = $this->getJson();\"},{\"line\":558,\"text\":\"\"}],\"match_line\":549,\"match_text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"context\":[{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"},{\"line\":551,\"text\":\"\\t}\"},{\"line\":552,\"text\":\"\"},{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"},{\"line\":555,\"text\":\"\\t\\tif (!$this->installedAddOn)\"},{\"line\":556,\"text\":\"\\t\\t{\"},{\"line\":557,\"text\":\"\\t\\t\\t$json = $this->getJson();\"},{\"line\":558,\"text\":\"\"},{\"line\":559,\"text\":\"\\t\\t\\t$installed = \\\\XF::em()->create(\\\\XF\\\\Entity\\\\AddOn::class);\"},{\"line\":560,\"text\":\"\\t\\t\\t$installed->bulkSet([\"},{\"line\":561,\"text\":\"\\t\\t\\t\\t'addon_id' => $this->getAddOnId(),\"},{\"line\":562,\"text\":\"\\t\\t\\t\\t'title' => $json['title'],\"}],\"match_line\":553,\"match_text\":\"\\tpublic function preInstall()\"},{\"context\":[{\"line\":561,\"text\":\"\\t\\t\\t\\t'addon_id' => $this->getAddOnId(),\"},{\"line\":562,\"text\":\"\\t\\t\\t\\t'title' => $json['title'],\"},{\"line\":563,\"text\":\"\\t\\t\\t\\t'version_string' => $json['version_string'],\"},{\"line\":564,\"text\":\"\\t\\t\\t\\t'version_id' => $json['version_id'],\"},{\"line\":565,\"text\":\"\\t\\t\\t\\t'active' => true,\"},{\"line\":566,\"text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"line\":567,\"text\":\"\\t\\t\\t\\t'json_hash' => $this->getJsonHash(),\"},{\"line\":568,\"text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"line\":569,\"text\":\"\\t\\t\\t]);\"},{\"line\":570,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":571,\"text\":\"\"},{\"line\":572,\"text\":\"\\t\\t\\t$this->installedAddOn = $installed;\"},{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"}],\"match_line\":566,\"match_text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"context\":[{\"line\":563,\"text\":\"\\t\\t\\t\\t'version_string' => $json['version_string'],\"},{\"line\":564,\"text\":\"\\t\\t\\t\\t'version_id' => $json['version_id'],\"},{\"line\":565,\"text\":\"\\t\\t\\t\\t'active' => true,\"},{\"line\":566,\"text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"line\":567,\"text\":\"\\t\\t\\t\\t'json_hash' => $this->getJsonHash(),\"},{\"line\":568,\"text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"line\":569,\"text\":\"\\t\\t\\t]);\"},{\"line\":570,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":571,\"text\":\"\"},{\"line\":572,\"text\":\"\\t\\t\\t$this->installedAddOn = $installed;\"},{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"},{\"line\":576,\"text\":\"\\t}\"},{\"line\":577,\"text\":\"\"}],\"match_line\":568,\"match_text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"context\":[{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"},{\"line\":576,\"text\":\"\\t}\"},{\"line\":577,\"text\":\"\"},{\"line\":578,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":579,\"text\":\"\\t{\"},{\"line\":580,\"text\":\"\\t\\t$setup = $this->getSetup();\"},{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"}],\"match_line\":578,\"match_text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"context\":[{\"line\":578,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":579,\"text\":\"\\t{\"},{\"line\":580,\"text\":\"\\t\\t$setup = $this->getSetup();\"},{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"},{\"line\":588,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":589,\"text\":\"\"},{\"line\":590,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":591,\"text\":\"\\t\\t\\\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);\"},{\"line\":592,\"text\":\"\\t}\"}],\"match_line\":583,\"match_text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"context\":[{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"},{\"line\":588,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":589,\"text\":\"\"},{\"line\":590,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":591,\"text\":\"\\t\\t\\\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);\"},{\"line\":592,\"text\":\"\\t}\"},{\"line\":593,\"text\":\"\"},{\"line\":594,\"text\":\"\\tpublic function preUpgrade()\"},{\"line\":595,\"text\":\"\\t{\"}],\"match_line\":586,\"match_text\":\"\\t\\t$this->resetPendingAction();\"},{\"context\":[{\"line\":612,\"text\":\"\\t\\t}\"},{\"line\":613,\"text\":\"\"},{\"line\":614,\"text\":\"\\t\\t// as we will be importing data after this, we don't need to bother doing this now\"},{\"line\":615,\"text\":\"\\t\\t$installed->setOption('rebuild_active_change', false);\"},{\"line\":616,\"text\":\"\\t\\t$installed->active = true;\"},{\"line\":617,\"text\":\"\\t\\t$installed->is_processing = true;\"},{\"line\":618,\"text\":\"\"},{\"line\":619,\"text\":\"\\t\\t$installed->saveIfChanged();\"},{\"line\":620,\"text\":\"\\t\\t$installed->resetOption('rebuild_active_change');\"},{\"line\":621,\"text\":\"\"},{\"line\":622,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":623,\"text\":\"\\t\\t\\\\XF::fire('addon_pre_upgrade', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":624,\"text\":\"\\t}\"},{\"line\":625,\"text\":\"\"},{\"line\":626,\"text\":\"\\tpublic function postUpgrade(array &$stateChanges)\"}],\"match_line\":617,\"match_text\":\"\\t\\t$installed->is_processing = true;\"},{\"context\":[{\"line\":632,\"text\":\"\\t\\t{\"},{\"line\":633,\"text\":\"\\t\\t\\t$previousVersion = $installed ? $installed->version_id : null;\"},{\"line\":634,\"text\":\"\\t\\t\\t$setup->postUpgrade($previousVersion, $stateChanges);\"},{\"line\":635,\"text\":\"\\t\\t}\"},{\"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;\"}],\"match_line\":637,\"match_text\":\"\\t\\t$this->resetPendingAction();\"},{\"context\":[{\"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{\"}],\"match_line\":652,\"match_text\":\"\\t\\t$installed->is_processing = true;\"},{\"context\":[{\"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 */\"}],\"match_line\":653,\"match_text\":\"\\t\\t$installed->last_pending_action = 'uninstall:0';\"},{\"context\":[{\"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\":691,\"text\":\"\\tpublic function postRebuild()\"},{\"line\":692,\"text\":\"\\t{\"},{\"line\":693,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"}],\"match_line\":684,\"match_text\":\"\\t\\t$installed->is_processing = true;\"},{\"context\":[{\"line\":711,\"text\":\"\\t\\t{\"},{\"line\":712,\"text\":\"\\t\\t\\t$setup->onActiveChange($newActive, $jobList);\"},{\"line\":713,\"text\":\"\\t\\t}\"},{\"line\":714,\"text\":\"\\t}\"},{\"line\":715,\"text\":\"\"},{\"line\":716,\"text\":\"\\tpublic function postDataImport()\"},{\"line\":717,\"text\":\"\\t{\"},{\"line\":718,\"text\":\"\\t\\t// all data will be imported, re-enable this so postX methods will have access to their methods\"},{\"line\":719,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":720,\"text\":\"\\t\\tif (!$installed)\"},{\"line\":721,\"text\":\"\\t\\t{\"},{\"line\":722,\"text\":\"\\t\\t\\tthrow new \\\\LogicException(\\\"Add-on is not installed\\\");\"},{\"line\":723,\"text\":\"\\t\\t}\"},{\"line\":724,\"text\":\"\"},{\"line\":725,\"text\":\"\\t\\t$installed->is_processing = false;\"}],\"match_line\":716,\"match_text\":\"\\tpublic function postDataImport()\"},{\"context\":[{\"line\":720,\"text\":\"\\t\\tif (!$installed)\"},{\"line\":721,\"text\":\"\\t\\t{\"},{\"line\":722,\"text\":\"\\t\\t\\tthrow new \\\\LogicException(\\\"Add-on is not installed\\\");\"},{\"line\":723,\"text\":\"\\t\\t}\"},{\"line\":724,\"text\":\"\"},{\"line\":725,\"text\":\"\\t\\t$installed->is_processing = false;\"},{\"line\":726,\"text\":\"\\t\\t$installed->saveIfChanged();\"},{\"line\":727,\"text\":\"\"},{\"line\":728,\"text\":\"\\t\\t\\\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\\\XF::$time);\"},{\"line\":729,\"text\":\"\\t}\"},{\"line\":730,\"text\":\"\"},{\"line\":731,\"text\":\"\\tpublic function syncFromJson($extraChanges = [])\"},{\"line\":732,\"text\":\"\\t{\"},{\"line\":733,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":734,\"text\":\"\\t\\tif (!$installed)\"}],\"match_line\":725,\"match_text\":\"\\t\\t$installed->is_processing = false;\"}],\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},\"src/XF/AddOn/DataManager.php\":{\"hits\":[{\"context\":[{\"line\":80,\"text\":\"\\t\\t}\"},{\"line\":81,\"text\":\"\"},{\"line\":82,\"text\":\"\\t\\treturn $document;\"},{\"line\":83,\"text\":\"\\t}\"},{\"line\":84,\"text\":\"\"},{\"line\":85,\"text\":\"\\tpublic function enqueueImportAddOnData(AddOn $addOn)\"},{\"line\":86,\"text\":\"\\t{\"},{\"line\":87,\"text\":\"\\t\\treturn \\\\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, [\"},{\"line\":88,\"text\":\"\\t\\t\\t'addon_id' => $addOn->addon_id,\"},{\"line\":89,\"text\":\"\\t\\t]);\"},{\"line\":90,\"text\":\"\\t}\"},{\"line\":91,\"text\":\"\"},{\"line\":92,\"text\":\"\\tpublic function getImportDataJobId(AddOn $addOn)\"},{\"line\":93,\"text\":\"\\t{\"},{\"line\":94,\"text\":\"\\t\\treturn 'addOnData-' . $addOn->addon_id;\"}],\"match_line\":85,\"match_text\":\"\\tpublic function enqueueImportAddOnData(AddOn $addOn)\"}],\"sha256\":\"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0\"},\"src/XF/Admin/Controller/AddOnController.php\":{\"hits\":[{\"context\":[{\"line\":371,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":372,\"text\":\"\\t\\t{\"},{\"line\":373,\"text\":\"\\t\\t\\t$addOn->preRebuild();\"},{\"line\":374,\"text\":\"\"},{\"line\":375,\"text\":\"\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":376,\"text\":\"\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\"\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'rebuild'));\"},{\"line\":379,\"text\":\"\\t\\t}\"},{\"line\":380,\"text\":\"\\t\\telse\"},{\"line\":381,\"text\":\"\\t\\t{\"},{\"line\":382,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":383,\"text\":\"\\t\\t\\t\\t'addOn' => $addOn,\"},{\"line\":384,\"text\":\"\\t\\t\\t\\t'warnings' => $warnings,\"},{\"line\":385,\"text\":\"\\t\\t\\t\\t'errors' => $errors,\"}],\"match_line\":376,\"match_text\":\"\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"context\":[{\"line\":411,\"text\":\"\\t\\t\\t]);\"},{\"line\":412,\"text\":\"\"},{\"line\":413,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":414,\"text\":\"\\t\\t\\t{\"},{\"line\":415,\"text\":\"\\t\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":416,\"text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":417,\"text\":\"\"},{\"line\":418,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));\"},{\"line\":419,\"text\":\"\\t\\t\\t}\"},{\"line\":420,\"text\":\"\\t\\t\\telse\"},{\"line\":421,\"text\":\"\\t\\t\\t{\"},{\"line\":422,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":423,\"text\":\"\"},{\"line\":424,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":425,\"text\":\"\\t\\t\\t\\t{\"}],\"match_line\":416,\"match_text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"context\":[{\"line\":431,\"text\":\"\\t\\t\\t\\t\\t$result = $setup ? $setup->install($input['params']) : null;\"},{\"line\":432,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":433,\"text\":\"\\t\\t\\t\\telse\"},{\"line\":434,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":435,\"text\":\"\\t\\t\\t\\t\\t$result = null;\"},{\"line\":436,\"text\":\"\\t\\t\\t\\t\\t$addOn->preInstall();\"},{\"line\":437,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":438,\"text\":\"\"},{\"line\":439,\"text\":\"\\t\\t\\t\\treturn $this->displayAddOnActionStep(\"},{\"line\":440,\"text\":\"\\t\\t\\t\\t\\t$addOn,\"},{\"line\":441,\"text\":\"\\t\\t\\t\\t\\t$result,\"},{\"line\":442,\"text\":\"\\t\\t\\t\\t\\t\\\\XF::phrase('installing'),\"},{\"line\":443,\"text\":\"\\t\\t\\t\\t\\t'add-ons/install',\"},{\"line\":444,\"text\":\"\\t\\t\\t\\t\\t$input['count']\"},{\"line\":445,\"text\":\"\\t\\t\\t\\t);\"}],\"match_line\":436,\"match_text\":\"\\t\\t\\t\\t\\t$addOn->preInstall();\"},{\"context\":[{\"line\":592,\"text\":\"\\t\\t\\t]);\"},{\"line\":593,\"text\":\"\"},{\"line\":594,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":595,\"text\":\"\\t\\t\\t{\"},{\"line\":596,\"text\":\"\\t\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":597,\"text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":598,\"text\":\"\"},{\"line\":599,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'upgrade'));\"},{\"line\":600,\"text\":\"\\t\\t\\t}\"},{\"line\":601,\"text\":\"\\t\\t\\telse\"},{\"line\":602,\"text\":\"\\t\\t\\t{\"},{\"line\":603,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":604,\"text\":\"\"},{\"line\":605,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":606,\"text\":\"\\t\\t\\t\\t{\"}],\"match_line\":597,\"match_text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"context\":[{\"line\":774,\"text\":\"\\t\\t}\"},{\"line\":775,\"text\":\"\"},{\"line\":776,\"text\":\"\\t\\tif ($installed && $action != 'uninstall')\"},{\"line\":777,\"text\":\"\\t\\t{\"},{\"line\":778,\"text\":\"\\t\\t\\t// this is a sanity check, it shouldn't happen\"},{\"line\":779,\"text\":\"\\t\\t\\t$installed->is_processing = false;\"},{\"line\":780,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":781,\"text\":\"\\t\\t}\"},{\"line\":782,\"text\":\"\"},{\"line\":783,\"text\":\"\\t\\t$redirect = $this->buildLink('add-ons');\"},{\"line\":784,\"text\":\"\\t\\t$stateChanges = [];\"},{\"line\":785,\"text\":\"\"},{\"line\":786,\"text\":\"\\t\\tif ($addOn)\"},{\"line\":787,\"text\":\"\\t\\t{\"},{\"line\":788,\"text\":\"\\t\\t\\tswitch ($action)\"}],\"match_line\":779,\"match_text\":\"\\t\\t\\t$installed->is_processing = false;\"},{\"context\":[{\"line\":789,\"text\":\"\\t\\t\\t{\"},{\"line\":790,\"text\":\"\\t\\t\\t\\tcase 'upgrade':\"},{\"line\":791,\"text\":\"\\t\\t\\t\\t\\t$addOn->postUpgrade($stateChanges);\"},{\"line\":792,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":793,\"text\":\"\\t\\t\\t\\tcase 'install':\"},{\"line\":794,\"text\":\"\\t\\t\\t\\t\\t$addOn->postInstall($stateChanges);\"},{\"line\":795,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":796,\"text\":\"\\t\\t\\t\\tcase 'uninstall':\"},{\"line\":797,\"text\":\"\\t\\t\\t\\t\\t$addOn->postUninstall();\"},{\"line\":798,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":799,\"text\":\"\\t\\t\\t\\tcase 'rebuild':\"},{\"line\":800,\"text\":\"\\t\\t\\t\\t\\t$addOn->postRebuild();\"},{\"line\":801,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":802,\"text\":\"\\t\\t\\t}\"},{\"line\":803,\"text\":\"\\t\\t}\"}],\"match_line\":794,\"match_text\":\"\\t\\t\\t\\t\\t$addOn->postInstall($stateChanges);\"}],\"sha256\":\"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915\"},\"src/XF/Job/AddOnData.php\":{\"hits\":[{\"context\":[{\"line\":75,\"text\":\"\\t\\t\\t$this->data['current_type'] = array_shift($this->data['data_types']);\"},{\"line\":76,\"text\":\"\\t\\t\\tif (!$this->data['current_type'])\"},{\"line\":77,\"text\":\"\\t\\t\\t{\"},{\"line\":78,\"text\":\"\\t\\t\\t\\tif ($addOn)\"},{\"line\":79,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":80,\"text\":\"\\t\\t\\t\\t\\t$addOn->postDataImport();\"},{\"line\":81,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":82,\"text\":\"\"},{\"line\":83,\"text\":\"\\t\\t\\t\\t$repo = $this->app->repository(StyleRepository::class);\"},{\"line\":84,\"text\":\"\\t\\t\\t\\t$repo->updateAllStylesLastModifiedDateLater();\"},{\"line\":85,\"text\":\"\"},{\"line\":86,\"text\":\"\\t\\t\\t\\treturn $this->complete();\"},{\"line\":87,\"text\":\"\\t\\t\\t}\"},{\"line\":88,\"text\":\"\"},{\"line\":89,\"text\":\"\\t\\t\\t$this->data['start'] = 0;\"}],\"match_line\":80,\"match_text\":\"\\t\\t\\t\\t\\t$addOn->postDataImport();\"}],\"sha256\":\"3b34bd0837176ac8bef4e9d34152a9d776c4fa195aebf186a389deec75d36535\"}},\"methods\":{\"actionInstall\":[{\"context\":[{\"line\":713,\"text\":\"\\tpublic function actionInstallXfAddOn()\"},{\"line\":714,\"text\":\"\\t{\"},{\"line\":715,\"text\":\"\\t\\t$this->assertAdminPermission('upgradeXenForo');\"},{\"line\":716,\"text\":\"\\t\\t$this->assertAdminPermission('addOn');\"},{\"line\":717,\"text\":\"\\t\\t$this->assertUpgradeCheckingPossible();\"},{\"line\":718,\"text\":\"\\t\\t$this->assertCanOneClickUpgrade();\"},{\"line\":719,\"text\":\"\"},{\"line\":720,\"text\":\"\\t\\t$upgradeCheckRepo = $this->repository(UpgradeCheckRepository::class);\"},{\"line\":721,\"text\":\"\\t\\t$upgradeCheck = $upgradeCheckRepo->getLatestUpgradeCheck();\"},{\"line\":722,\"text\":\"\"},{\"line\":723,\"text\":\"\\t\\tif (!$upgradeCheck)\"},{\"line\":724,\"text\":\"\\t\\t{\"},{\"line\":725,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('tools/upgrade-check'));\"},{\"line\":726,\"text\":\"\\t\\t}\"},{\"line\":727,\"text\":\"\\t\\tif (!$upgradeCheck->canDownload())\"},{\"line\":728,\"text\":\"\\t\\t{\"},{\"line\":729,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('issues_with_license_must_resolve_before_upgrading'));\"},{\"line\":730,\"text\":\"\\t\\t}\"},{\"line\":731,\"text\":\"\"},{\"line\":732,\"text\":\"\\t\\t$addOnRepo = $this->repository(AddOnRepository::class);\"},{\"line\":733,\"text\":\"\\t\\tif (!$addOnRepo->canInstallFromArchive($error, true))\"},{\"line\":734,\"text\":\"\\t\\t{\"},{\"line\":735,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('following_issue_found_one_click_upgrade_x', ['error' => $error]));\"},{\"line\":736,\"text\":\"\\t\\t}\"},{\"line\":737,\"text\":\"\"},{\"line\":738,\"text\":\"\\t\\t$installableAddOns = [];\"},{\"line\":739,\"text\":\"\"},{\"line\":740,\"text\":\"\\t\\tforeach ($upgradeCheck->installable_add_ons AS $addOnId => $install)\"},{\"line\":741,\"text\":\"\\t\\t{\"},{\"line\":742,\"text\":\"\\t\\t\\t$installableAddOns[$addOnId] = $install;\"},{\"line\":743,\"text\":\"\\t\\t}\"},{\"line\":744,\"text\":\"\"},{\"line\":745,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":746,\"text\":\"\\t\\t{\"},{\"line\":747,\"text\":\"\\t\\t\\t$confirmInstalls = $this->filter('confirm_install', 'array-uint');\"},{\"line\":748,\"text\":\"\\t\\t\\t$filesToDownload = [];\"},{\"line\":749,\"text\":\"\\t\\t\\tforeach ($confirmInstalls AS $addOnId => $versionId)\"},{\"line\":750,\"text\":\"\\t\\t\\t{\"},{\"line\":751,\"text\":\"\\t\\t\\t\\t$filesToDownload[$addOnId] = $installableAddOns[$addOnId];\"},{\"line\":752,\"text\":\"\\t\\t\\t}\"},{\"line\":753,\"text\":\"\"},{\"line\":754,\"text\":\"\\t\\t\\tif (!$filesToDownload)\"},{\"line\":755,\"text\":\"\\t\\t\\t{\"},{\"line\":756,\"text\":\"\\t\\t\\t\\treturn $this->error(\\\\XF::phrase('no_installs_were_selected_for_download'));\"},{\"line\":757,\"text\":\"\\t\\t\\t}\"},{\"line\":758,\"text\":\"\"},{\"line\":759,\"text\":\"\\t\\t\\tif ($upgradeCheck->license_agreement_required)\"},{\"line\":760,\"text\":\"\\t\\t\\t{\"},{\"line\":761,\"text\":\"\\t\\t\\t\\t$agree = $this->filter('agree', 'bool');\"},{\"line\":762,\"text\":\"\\t\\t\\t\\tif (!$agree)\"},{\"line\":763,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":764,\"text\":\"\\t\\t\\t\\t\\treturn $this->error(\\\\XF::phrase('you_must_agree_to_terms_of_xenforo_license_agreement_to_continue'));\"},{\"line\":765,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":766,\"text\":\"\\t\\t\\t}\"},{\"line\":767,\"text\":\"\"},{\"line\":768,\"text\":\"\\t\\t\\t$addOnBatch = $this->downloadAndCreateAddOnBatch($filesToDownload, $upgradeCheck->license_agreement_required);\"},{\"line\":769,\"text\":\"\"},{\"line\":770,\"text\":\"\\t\\t\\t// note: this will bypass the install from archive config check intentionally\"},{\"line\":771,\"text\":\"\\t\\t\\treturn $this->redirect(\"},{\"line\":772,\"text\":\"\\t\\t\\t\\t$this->buildLink('add-ons/install-from-archive-confirm', null, ['batch_id' => $addOnBatch->batch_id])\"},{\"line\":773,\"text\":\"\\t\\t\\t);\"},{\"line\":774,\"text\":\"\\t\\t}\"},{\"line\":775,\"text\":\"\\t\\telse\"},{\"line\":776,\"text\":\"\\t\\t{\"},{\"line\":777,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":778,\"text\":\"\\t\\t\\t\\t'upgradeCheck' => $upgradeCheck,\"},{\"line\":779,\"text\":\"\\t\\t\\t\\t'installableAddOns' => $installableAddOns,\"},{\"line\":780,\"text\":\"\\t\\t\\t];\"},{\"line\":781,\"text\":\"\\t\\t\\treturn $this->view(\"},{\"line\":782,\"text\":\"\\t\\t\\t\\t'XF:Tools\\\\InstallXfAddOn',\"},{\"line\":783,\"text\":\"\\t\\t\\t\\t'tools_install_xf_addon',\"},{\"line\":784,\"text\":\"\\t\\t\\t\\t$viewParams\"},{\"line\":785,\"text\":\"\\t\\t\\t);\"},{\"line\":786,\"text\":\"\\t\\t}\"},{\"line\":787,\"text\":\"\\t}\"}],\"path\":\"src/XF/Admin/Controller/ToolsController.php\",\"sha256\":\"eeb900c4158b215003adfdb3849c083a4c95c32cb4a04ed3f7d9d5283b6157a9\"},{\"context\":[{\"line\":391,\"text\":\"\\tpublic function actionInstall(ParameterBag $params)\"},{\"line\":392,\"text\":\"\\t{\"},{\"line\":393,\"text\":\"\\t\\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);\"},{\"line\":394,\"text\":\"\\t\\tif (!$addOn->canInstall())\"},{\"line\":395,\"text\":\"\\t\\t{\"},{\"line\":396,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('this_add_on_cannot_be_installed'));\"},{\"line\":397,\"text\":\"\\t\\t}\"},{\"line\":398,\"text\":\"\"},{\"line\":399,\"text\":\"\\t\\t[$warnings, $errors] = $this->getAddOnWarningsAndErrors($addOn);\"},{\"line\":400,\"text\":\"\"},{\"line\":401,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":402,\"text\":\"\\t\\t{\"},{\"line\":403,\"text\":\"\\t\\t\\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged\"},{\"line\":404,\"text\":\"\\t\\t\\t\\\\XF::app()->error()->setIgnorePendingUpgrade(true);\"},{\"line\":405,\"text\":\"\"},{\"line\":406,\"text\":\"\\t\\t\\t$input = $this->filter([\"},{\"line\":407,\"text\":\"\\t\\t\\t\\t'_xfProcessing' => 'bool',\"},{\"line\":408,\"text\":\"\\t\\t\\t\\t'params' => 'json-array',\"},{\"line\":409,\"text\":\"\\t\\t\\t\\t'count' => 'uint',\"},{\"line\":410,\"text\":\"\\t\\t\\t\\t'finished' => 'bool',\"},{\"line\":411,\"text\":\"\\t\\t\\t]);\"},{\"line\":412,\"text\":\"\"},{\"line\":413,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":414,\"text\":\"\\t\\t\\t{\"},{\"line\":415,\"text\":\"\\t\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":416,\"text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":417,\"text\":\"\"},{\"line\":418,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));\"},{\"line\":419,\"text\":\"\\t\\t\\t}\"},{\"line\":420,\"text\":\"\\t\\t\\telse\"},{\"line\":421,\"text\":\"\\t\\t\\t{\"},{\"line\":422,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":423,\"text\":\"\"},{\"line\":424,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":425,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":426,\"text\":\"\\t\\t\\t\\t\\tif ($setup)\"},{\"line\":427,\"text\":\"\\t\\t\\t\\t\\t{\"},{\"line\":428,\"text\":\"\\t\\t\\t\\t\\t\\t$setup->prepareForAction('install');\"},{\"line\":429,\"text\":\"\\t\\t\\t\\t\\t}\"},{\"line\":430,\"text\":\"\"},{\"line\":431,\"text\":\"\\t\\t\\t\\t\\t$result = $setup ? $setup->install($input['params']) : null;\"},{\"line\":432,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":433,\"text\":\"\\t\\t\\t\\telse\"},{\"line\":434,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":435,\"text\":\"\\t\\t\\t\\t\\t$result = null;\"},{\"line\":436,\"text\":\"\\t\\t\\t\\t\\t$addOn->preInstall();\"},{\"line\":437,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":438,\"text\":\"\"},{\"line\":439,\"text\":\"\\t\\t\\t\\treturn $this->displayAddOnActionStep(\"},{\"line\":440,\"text\":\"\\t\\t\\t\\t\\t$addOn,\"},{\"line\":441,\"text\":\"\\t\\t\\t\\t\\t$result,\"},{\"line\":442,\"text\":\"\\t\\t\\t\\t\\t\\\\XF::phrase('installing'),\"},{\"line\":443,\"text\":\"\\t\\t\\t\\t\\t'add-ons/install',\"},{\"line\":444,\"text\":\"\\t\\t\\t\\t\\t$input['count']\"},{\"line\":445,\"text\":\"\\t\\t\\t\\t);\"},{\"line\":446,\"text\":\"\\t\\t\\t}\"},{\"line\":447,\"text\":\"\\t\\t}\"},{\"line\":448,\"text\":\"\\t\\telse\"},{\"line\":449,\"text\":\"\\t\\t{\"},{\"line\":450,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":451,\"text\":\"\\t\\t\\t\\t'addOn' => $addOn,\"},{\"line\":452,\"text\":\"\\t\\t\\t\\t'warnings' => $warnings,\"},{\"line\":453,\"text\":\"\\t\\t\\t\\t'errors' => $errors,\"},{\"line\":454,\"text\":\"\\t\\t\\t];\"},{\"line\":455,\"text\":\"\\t\\t\\treturn $this->view('XF:AddOn\\\\Install', 'addon_install', $viewParams);\"},{\"line\":456,\"text\":\"\\t\\t}\"},{\"line\":457,\"text\":\"\\t}\"}],\"path\":\"src/XF/Admin/Controller/AddOnController.php\",\"sha256\":\"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915\"}],\"actionUninstall\":[{\"context\":[{\"line\":640,\"text\":\"\\tpublic function actionUninstall(ParameterBag $params)\"},{\"line\":641,\"text\":\"\\t{\"},{\"line\":642,\"text\":\"\\t\\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);\"},{\"line\":643,\"text\":\"\\t\\tif (!$addOn->canUninstall())\"},{\"line\":644,\"text\":\"\\t\\t{\"},{\"line\":645,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing'));\"},{\"line\":646,\"text\":\"\\t\\t}\"},{\"line\":647,\"text\":\"\"},{\"line\":648,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":649,\"text\":\"\\t\\t{\"},{\"line\":650,\"text\":\"\\t\\t\\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged\"},{\"line\":651,\"text\":\"\\t\\t\\t\\\\XF::app()->error()->setIgnorePendingUpgrade(true);\"},{\"line\":652,\"text\":\"\"},{\"line\":653,\"text\":\"\\t\\t\\t$input = $this->filter([\"},{\"line\":654,\"text\":\"\\t\\t\\t\\t'_xfProcessing' => 'bool',\"},{\"line\":655,\"text\":\"\\t\\t\\t\\t'params' => 'json-array',\"},{\"line\":656,\"text\":\"\\t\\t\\t\\t'count' => 'uint',\"},{\"line\":657,\"text\":\"\\t\\t\\t\\t'finished' => 'bool',\"},{\"line\":658,\"text\":\"\\t\\t\\t]);\"},{\"line\":659,\"text\":\"\"},{\"line\":660,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":661,\"text\":\"\\t\\t\\t{\"},{\"line\":662,\"text\":\"\\t\\t\\t\\t$addOn->getInstalledAddOn()->delete();\"},{\"line\":663,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'uninstall'));\"},{\"line\":664,\"text\":\"\\t\\t\\t}\"},{\"line\":665,\"text\":\"\\t\\t\\telse\"},{\"line\":666,\"text\":\"\\t\\t\\t{\"},{\"line\":667,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":668,\"text\":\"\"},{\"line\":669,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":670,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":671,\"text\":\"\\t\\t\\t\\t\\tif ($setup)\"},{\"line\":672,\"text\":\"\\t\\t\\t\\t\\t{\"},{\"line\":673,\"text\":\"\\t\\t\\t\\t\\t\\t$setup->prepareForAction('uninstall');\"},{\"line\":674,\"text\":\"\\t\\t\\t\\t\\t}\"},{\"line\":675,\"text\":\"\"},{\"line\":676,\"text\":\"\\t\\t\\t\\t\\t$result = $setup ? $setup->uninstall($input['params']) : null;\"},{\"line\":677,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":678,\"text\":\"\\t\\t\\t\\telse\"},{\"line\":679,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":680,\"text\":\"\\t\\t\\t\\t\\t$result = null;\"},{\"line\":681,\"text\":\"\\t\\t\\t\\t\\t$addOn->preUninstall();\"},{\"line\":682,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":683,\"text\":\"\"},{\"line\":684,\"text\":\"\\t\\t\\t\\treturn $this->displayAddOnActionStep(\"},{\"line\":685,\"text\":\"\\t\\t\\t\\t\\t$addOn,\"},{\"line\":686,\"text\":\"\\t\\t\\t\\t\\t$result,\"},{\"line\":687,\"text\":\"\\t\\t\\t\\t\\t\\\\XF::phrase('uninstalling'),\"},{\"line\":688,\"text\":\"\\t\\t\\t\\t\\t'add-ons/uninstall',\"},{\"line\":689,\"text\":\"\\t\\t\\t\\t\\t$input['count']\"},{\"line\":690,\"text\":\"\\t\\t\\t\\t);\"},{\"line\":691,\"text\":\"\\t\\t\\t}\"},{\"line\":692,\"text\":\"\\t\\t}\"},{\"line\":693,\"text\":\"\\t\\telse\"},{\"line\":694,\"text\":\"\\t\\t{\"},{\"line\":695,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":696,\"text\":\"\\t\\t\\t\\t'addOn' => $addOn,\"},{\"line\":697,\"text\":\"\\t\\t\\t];\"},{\"line\":698,\"text\":\"\\t\\t\\treturn $this->view('XF:AddOn\\\\Uninstall', 'addon_uninstall', $viewParams);\"},{\"line\":699,\"text\":\"\\t\\t}\"},{\"line\":700,\"text\":\"\\t}\"}],\"path\":\"src/XF/Admin/Controller/AddOnController.php\",\"sha256\":\"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915\"}],\"enqueueImportAddOnData\":[{\"context\":[{\"line\":85,\"text\":\"\\tpublic function enqueueImportAddOnData(AddOn $addOn)\"},{\"line\":86,\"text\":\"\\t{\"},{\"line\":87,\"text\":\"\\t\\treturn \\\\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, [\"},{\"line\":88,\"text\":\"\\t\\t\\t'addon_id' => $addOn->addon_id,\"},{\"line\":89,\"text\":\"\\t\\t]);\"},{\"line\":90,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/DataManager.php\",\"sha256\":\"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0\"}],\"enqueueRemoveAddOnData\":[{\"context\":[{\"line\":271,\"text\":\"\\tpublic function enqueueRemoveAddOnData($id)\"},{\"line\":272,\"text\":\"\\t{\"},{\"line\":273,\"text\":\"\\t\\treturn \\\\XF::app()->jobManager()->enqueueUnique($id . 'AddOnUnInstall', AddOnUninstallData::class, [\"},{\"line\":274,\"text\":\"\\t\\t\\t'addon_id' => $id,\"},{\"line\":275,\"text\":\"\\t\\t]);\"},{\"line\":276,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/DataManager.php\",\"sha256\":\"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0\"}],\"isInstalled\":[{\"context\":[{\"line\":339,\"text\":\"\\tpublic function isInstalled()\"},{\"line\":340,\"text\":\"\\t{\"},{\"line\":341,\"text\":\"\\t\\tif ($this->installedAddOn === null)\"},{\"line\":342,\"text\":\"\\t\\t{\"},{\"line\":343,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":344,\"text\":\"\\t\\t}\"},{\"line\":345,\"text\":\"\"},{\"line\":346,\"text\":\"\\t\\t$lastAction = $this->installedAddOn->getLastActionStep('install');\"},{\"line\":347,\"text\":\"\\t\\tif ($lastAction !== null)\"},{\"line\":348,\"text\":\"\\t\\t{\"},{\"line\":349,\"text\":\"\\t\\t\\t// we haven't completed the install steps yet, don't consider as installed\"},{\"line\":350,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":351,\"text\":\"\\t\\t}\"},{\"line\":352,\"text\":\"\"},{\"line\":353,\"text\":\"\\t\\treturn true;\"},{\"line\":354,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},{\"context\":[{\"line\":546,\"text\":\"\\tpublic function isInstalled()\"},{\"line\":547,\"text\":\"\\t{\"},{\"line\":548,\"text\":\"\\t\\treturn (\"},{\"line\":549,\"text\":\"\\t\\t\\tFile::installLockExists()\"},{\"line\":550,\"text\":\"\\t\\t\\t&& ($this->app->config('exists') || $this->app->config('legacyExists'))\"},{\"line\":551,\"text\":\"\\t\\t);\"},{\"line\":552,\"text\":\"\\t}\"}],\"path\":\"src/XF/Install/Helper.php\",\"sha256\":\"582a775e5bd3bd75cb1a6b5f0c4efdbe96301400a3bc6f89e75778d652022cf8\"}],\"postDataImport\":[{\"context\":[{\"line\":716,\"text\":\"\\tpublic function postDataImport()\"},{\"line\":717,\"text\":\"\\t{\"},{\"line\":718,\"text\":\"\\t\\t// all data will be imported, re-enable this so postX methods will have access to their methods\"},{\"line\":719,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":720,\"text\":\"\\t\\tif (!$installed)\"},{\"line\":721,\"text\":\"\\t\\t{\"},{\"line\":722,\"text\":\"\\t\\t\\tthrow new \\\\LogicException(\\\"Add-on is not installed\\\");\"},{\"line\":723,\"text\":\"\\t\\t}\"},{\"line\":724,\"text\":\"\"},{\"line\":725,\"text\":\"\\t\\t$installed->is_processing = false;\"},{\"line\":726,\"text\":\"\\t\\t$installed->saveIfChanged();\"},{\"line\":727,\"text\":\"\"},{\"line\":728,\"text\":\"\\t\\t\\\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\\\XF::$time);\"},{\"line\":729,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"}],\"postInstall\":[{\"context\":[{\"line\":578,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":579,\"text\":\"\\t{\"},{\"line\":580,\"text\":\"\\t\\t$setup = $this->getSetup();\"},{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"},{\"line\":588,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":589,\"text\":\"\"},{\"line\":590,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":591,\"text\":\"\\t\\t\\\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);\"},{\"line\":592,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},{\"context\":[{\"line\":60,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":61,\"text\":\"\\t{\"},{\"line\":62,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AbstractSetup.php\",\"sha256\":\"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88\"}],\"preInstall\":[{\"context\":[{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"},{\"line\":555,\"text\":\"\\t\\tif (!$this->installedAddOn)\"},{\"line\":556,\"text\":\"\\t\\t{\"},{\"line\":557,\"text\":\"\\t\\t\\t$json = $this->getJson();\"},{\"line\":558,\"text\":\"\"},{\"line\":559,\"text\":\"\\t\\t\\t$installed = \\\\XF::em()->create(\\\\XF\\\\Entity\\\\AddOn::class);\"},{\"line\":560,\"text\":\"\\t\\t\\t$installed->bulkSet([\"},{\"line\":561,\"text\":\"\\t\\t\\t\\t'addon_id' => $this->getAddOnId(),\"},{\"line\":562,\"text\":\"\\t\\t\\t\\t'title' => $json['title'],\"},{\"line\":563,\"text\":\"\\t\\t\\t\\t'version_string' => $json['version_string'],\"},{\"line\":564,\"text\":\"\\t\\t\\t\\t'version_id' => $json['version_id'],\"},{\"line\":565,\"text\":\"\\t\\t\\t\\t'active' => true,\"},{\"line\":566,\"text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"line\":567,\"text\":\"\\t\\t\\t\\t'json_hash' => $this->getJsonHash(),\"},{\"line\":568,\"text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"line\":569,\"text\":\"\\t\\t\\t]);\"},{\"line\":570,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":571,\"text\":\"\"},{\"line\":572,\"text\":\"\\t\\t\\t$this->installedAddOn = $installed;\"},{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"},{\"line\":576,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"}]}}\nNO_MUTATION=True\nPRODUCT_CHECKPOINTS_REMAINING=18\nTASK_RESULT=PASS_PVEPRO_HOMEPAGE_PORTAL_INSTALL_LIFECYCLE_RCA\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n" +} diff --git a/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1.txt b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1.txt new file mode 100644 index 00000000..a004e4c8 --- /dev/null +++ b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1.txt @@ -0,0 +1,45 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=pvepro-homepage-portal-install-lifecycle-rca-readonly +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=3e979c32a397a411ac1e4144d432831e49d53b89bc5cfef8b70eca4ebe8c81b6 +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=8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182 +SANITIZED_OUTPUT_SHA256=8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182 +OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1 +MODE=read-only +COMPONENT=pvepro-homepage-portal-install-lifecycle-rca-readonly +WINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT +782_ERROR_DECODE={"matches":true,"sha256":"51939ddaddcc4d67fdb44c0507c06186062f750225b49d7b937841700e8713a7","string":"W2PORTAL782ENQUEUE_MARKER"} +PRODUCTION_HOST={"all_link_down":false,"config_sha256":"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab","name":"pvepro-prod","snapshots":[],"status":"running"} +STAGING_HOST={"all_link_down":true,"config_sha256":"9fd5f15119b54c8f83eb3c4bf47aac12f02e0cb9bc2bf593487a157d2d4840e3","name":"pvepro-staging-v1","snapshots":[],"status":"stopped"} +PRODUCTION_DB_PRESTATE={"addons":[{"active":1,"addon_id":"XF","is_processing":0,"last_pending_action":null}],"board_active":"1","default_style":"2","errors":20,"index_route":"forums/","portal_addon_rows":0,"portal_job_rows":0,"portal_route_rows":0,"portal_template_rows":0} +XF_INSTALL_LIFECYCLE_SOURCE={"likely":{"src/XF/AddOn/AddOn.php":{"hits":[{"context":[{"line":536,"text":""},{"line":537,"text":"\tpublic function updatePendingAction($action, $step)"},{"line":538,"text":"\t{"},{"line":539,"text":"\t\tif ($this->installedAddOn)"},{"line":540,"text":"\t\t{"},{"line":541,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', \"$action:$step\");"},{"line":542,"text":"\t\t}"},{"line":543,"text":"\t}"},{"line":544,"text":""},{"line":545,"text":"\tpublic function resetPendingAction()"},{"line":546,"text":"\t{"},{"line":547,"text":"\t\tif ($this->installedAddOn)"},{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"}],"match_line":541,"match_text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', \"$action:$step\");"},{"context":[{"line":540,"text":"\t\t{"},{"line":541,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', \"$action:$step\");"},{"line":542,"text":"\t\t}"},{"line":543,"text":"\t}"},{"line":544,"text":""},{"line":545,"text":"\tpublic function resetPendingAction()"},{"line":546,"text":"\t{"},{"line":547,"text":"\t\tif ($this->installedAddOn)"},{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"},{"line":551,"text":"\t}"},{"line":552,"text":""},{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"}],"match_line":545,"match_text":"\tpublic function resetPendingAction()"},{"context":[{"line":544,"text":""},{"line":545,"text":"\tpublic function resetPendingAction()"},{"line":546,"text":"\t{"},{"line":547,"text":"\t\tif ($this->installedAddOn)"},{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"},{"line":551,"text":"\t}"},{"line":552,"text":""},{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"},{"line":555,"text":"\t\tif (!$this->installedAddOn)"},{"line":556,"text":"\t\t{"},{"line":557,"text":"\t\t\t$json = $this->getJson();"},{"line":558,"text":""}],"match_line":549,"match_text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"context":[{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"},{"line":551,"text":"\t}"},{"line":552,"text":""},{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"},{"line":555,"text":"\t\tif (!$this->installedAddOn)"},{"line":556,"text":"\t\t{"},{"line":557,"text":"\t\t\t$json = $this->getJson();"},{"line":558,"text":""},{"line":559,"text":"\t\t\t$installed = \\XF::em()->create(\\XF\\Entity\\AddOn::class);"},{"line":560,"text":"\t\t\t$installed->bulkSet(["},{"line":561,"text":"\t\t\t\t'addon_id' => $this->getAddOnId(),"},{"line":562,"text":"\t\t\t\t'title' => $json['title'],"}],"match_line":553,"match_text":"\tpublic function preInstall()"},{"context":[{"line":561,"text":"\t\t\t\t'addon_id' => $this->getAddOnId(),"},{"line":562,"text":"\t\t\t\t'title' => $json['title'],"},{"line":563,"text":"\t\t\t\t'version_string' => $json['version_string'],"},{"line":564,"text":"\t\t\t\t'version_id' => $json['version_id'],"},{"line":565,"text":"\t\t\t\t'active' => true,"},{"line":566,"text":"\t\t\t\t'is_processing' => true,"},{"line":567,"text":"\t\t\t\t'json_hash' => $this->getJsonHash(),"},{"line":568,"text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"line":569,"text":"\t\t\t]);"},{"line":570,"text":"\t\t\t$installed->save();"},{"line":571,"text":""},{"line":572,"text":"\t\t\t$this->installedAddOn = $installed;"},{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"}],"match_line":566,"match_text":"\t\t\t\t'is_processing' => true,"},{"context":[{"line":563,"text":"\t\t\t\t'version_string' => $json['version_string'],"},{"line":564,"text":"\t\t\t\t'version_id' => $json['version_id'],"},{"line":565,"text":"\t\t\t\t'active' => true,"},{"line":566,"text":"\t\t\t\t'is_processing' => true,"},{"line":567,"text":"\t\t\t\t'json_hash' => $this->getJsonHash(),"},{"line":568,"text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"line":569,"text":"\t\t\t]);"},{"line":570,"text":"\t\t\t$installed->save();"},{"line":571,"text":""},{"line":572,"text":"\t\t\t$this->installedAddOn = $installed;"},{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"},{"line":576,"text":"\t}"},{"line":577,"text":""}],"match_line":568,"match_text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"context":[{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"},{"line":576,"text":"\t}"},{"line":577,"text":""},{"line":578,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":579,"text":"\t{"},{"line":580,"text":"\t\t$setup = $this->getSetup();"},{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""}],"match_line":578,"match_text":"\tpublic function postInstall(array &$stateChanges)"},{"context":[{"line":578,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":579,"text":"\t{"},{"line":580,"text":"\t\t$setup = $this->getSetup();"},{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""},{"line":588,"text":"\t\t$installed = $this->installedAddOn;"},{"line":589,"text":""},{"line":590,"text":"\t\t$json = $this->getJson();"},{"line":591,"text":"\t\t\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":592,"text":"\t}"}],"match_line":583,"match_text":"\t\t\t$setup->postInstall($stateChanges);"},{"context":[{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""},{"line":588,"text":"\t\t$installed = $this->installedAddOn;"},{"line":589,"text":""},{"line":590,"text":"\t\t$json = $this->getJson();"},{"line":591,"text":"\t\t\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":592,"text":"\t}"},{"line":593,"text":""},{"line":594,"text":"\tpublic function preUpgrade()"},{"line":595,"text":"\t{"}],"match_line":586,"match_text":"\t\t$this->resetPendingAction();"},{"context":[{"line":612,"text":"\t\t}"},{"line":613,"text":""},{"line":614,"text":"\t\t// as we will be importing data after this, we don't need to bother doing this now"},{"line":615,"text":"\t\t$installed->setOption('rebuild_active_change', false);"},{"line":616,"text":"\t\t$installed->active = true;"},{"line":617,"text":"\t\t$installed->is_processing = true;"},{"line":618,"text":""},{"line":619,"text":"\t\t$installed->saveIfChanged();"},{"line":620,"text":"\t\t$installed->resetOption('rebuild_active_change');"},{"line":621,"text":""},{"line":622,"text":"\t\t$json = $this->getJson();"},{"line":623,"text":"\t\t\\XF::fire('addon_pre_upgrade', [$this, $installed, $json], $installed->addon_id);"},{"line":624,"text":"\t}"},{"line":625,"text":""},{"line":626,"text":"\tpublic function postUpgrade(array &$stateChanges)"}],"match_line":617,"match_text":"\t\t$installed->is_processing = true;"},{"context":[{"line":632,"text":"\t\t{"},{"line":633,"text":"\t\t\t$previousVersion = $installed ? $installed->version_id : null;"},{"line":634,"text":"\t\t\t$setup->postUpgrade($previousVersion, $stateChanges);"},{"line":635,"text":"\t\t}"},{"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;"}],"match_line":637,"match_text":"\t\t$this->resetPendingAction();"},{"context":[{"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{"}],"match_line":652,"match_text":"\t\t$installed->is_processing = true;"},{"context":[{"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 */"}],"match_line":653,"match_text":"\t\t$installed->last_pending_action = 'uninstall:0';"},{"context":[{"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":691,"text":"\tpublic function postRebuild()"},{"line":692,"text":"\t{"},{"line":693,"text":"\t\t$installed = $this->installedAddOn;"}],"match_line":684,"match_text":"\t\t$installed->is_processing = true;"},{"context":[{"line":711,"text":"\t\t{"},{"line":712,"text":"\t\t\t$setup->onActiveChange($newActive, $jobList);"},{"line":713,"text":"\t\t}"},{"line":714,"text":"\t}"},{"line":715,"text":""},{"line":716,"text":"\tpublic function postDataImport()"},{"line":717,"text":"\t{"},{"line":718,"text":"\t\t// all data will be imported, re-enable this so postX methods will have access to their methods"},{"line":719,"text":"\t\t$installed = $this->installedAddOn;"},{"line":720,"text":"\t\tif (!$installed)"},{"line":721,"text":"\t\t{"},{"line":722,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":723,"text":"\t\t}"},{"line":724,"text":""},{"line":725,"text":"\t\t$installed->is_processing = false;"}],"match_line":716,"match_text":"\tpublic function postDataImport()"},{"context":[{"line":720,"text":"\t\tif (!$installed)"},{"line":721,"text":"\t\t{"},{"line":722,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":723,"text":"\t\t}"},{"line":724,"text":""},{"line":725,"text":"\t\t$installed->is_processing = false;"},{"line":726,"text":"\t\t$installed->saveIfChanged();"},{"line":727,"text":""},{"line":728,"text":"\t\t\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\XF::$time);"},{"line":729,"text":"\t}"},{"line":730,"text":""},{"line":731,"text":"\tpublic function syncFromJson($extraChanges = [])"},{"line":732,"text":"\t{"},{"line":733,"text":"\t\t$installed = $this->installedAddOn;"},{"line":734,"text":"\t\tif (!$installed)"}],"match_line":725,"match_text":"\t\t$installed->is_processing = false;"}],"sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},"src/XF/AddOn/DataManager.php":{"hits":[{"context":[{"line":80,"text":"\t\t}"},{"line":81,"text":""},{"line":82,"text":"\t\treturn $document;"},{"line":83,"text":"\t}"},{"line":84,"text":""},{"line":85,"text":"\tpublic function enqueueImportAddOnData(AddOn $addOn)"},{"line":86,"text":"\t{"},{"line":87,"text":"\t\treturn \\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, ["},{"line":88,"text":"\t\t\t'addon_id' => $addOn->addon_id,"},{"line":89,"text":"\t\t]);"},{"line":90,"text":"\t}"},{"line":91,"text":""},{"line":92,"text":"\tpublic function getImportDataJobId(AddOn $addOn)"},{"line":93,"text":"\t{"},{"line":94,"text":"\t\treturn 'addOnData-' . $addOn->addon_id;"}],"match_line":85,"match_text":"\tpublic function enqueueImportAddOnData(AddOn $addOn)"}],"sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"},"src/XF/Admin/Controller/AddOnController.php":{"hits":[{"context":[{"line":371,"text":"\t\tif ($this->isPost())"},{"line":372,"text":"\t\t{"},{"line":373,"text":"\t\t\t$addOn->preRebuild();"},{"line":374,"text":""},{"line":375,"text":"\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":376,"text":"\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":377,"text":""},{"line":378,"text":"\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'rebuild'));"},{"line":379,"text":"\t\t}"},{"line":380,"text":"\t\telse"},{"line":381,"text":"\t\t{"},{"line":382,"text":"\t\t\t$viewParams = ["},{"line":383,"text":"\t\t\t\t'addOn' => $addOn,"},{"line":384,"text":"\t\t\t\t'warnings' => $warnings,"},{"line":385,"text":"\t\t\t\t'errors' => $errors,"}],"match_line":376,"match_text":"\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"context":[{"line":411,"text":"\t\t\t]);"},{"line":412,"text":""},{"line":413,"text":"\t\t\tif ($input['finished'])"},{"line":414,"text":"\t\t\t{"},{"line":415,"text":"\t\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":416,"text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":417,"text":""},{"line":418,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));"},{"line":419,"text":"\t\t\t}"},{"line":420,"text":"\t\t\telse"},{"line":421,"text":"\t\t\t{"},{"line":422,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":423,"text":""},{"line":424,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":425,"text":"\t\t\t\t{"}],"match_line":416,"match_text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"context":[{"line":431,"text":"\t\t\t\t\t$result = $setup ? $setup->install($input['params']) : null;"},{"line":432,"text":"\t\t\t\t}"},{"line":433,"text":"\t\t\t\telse"},{"line":434,"text":"\t\t\t\t{"},{"line":435,"text":"\t\t\t\t\t$result = null;"},{"line":436,"text":"\t\t\t\t\t$addOn->preInstall();"},{"line":437,"text":"\t\t\t\t}"},{"line":438,"text":""},{"line":439,"text":"\t\t\t\treturn $this->displayAddOnActionStep("},{"line":440,"text":"\t\t\t\t\t$addOn,"},{"line":441,"text":"\t\t\t\t\t$result,"},{"line":442,"text":"\t\t\t\t\t\\XF::phrase('installing'),"},{"line":443,"text":"\t\t\t\t\t'add-ons/install',"},{"line":444,"text":"\t\t\t\t\t$input['count']"},{"line":445,"text":"\t\t\t\t);"}],"match_line":436,"match_text":"\t\t\t\t\t$addOn->preInstall();"},{"context":[{"line":592,"text":"\t\t\t]);"},{"line":593,"text":""},{"line":594,"text":"\t\t\tif ($input['finished'])"},{"line":595,"text":"\t\t\t{"},{"line":596,"text":"\t\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":597,"text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":598,"text":""},{"line":599,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'upgrade'));"},{"line":600,"text":"\t\t\t}"},{"line":601,"text":"\t\t\telse"},{"line":602,"text":"\t\t\t{"},{"line":603,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":604,"text":""},{"line":605,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":606,"text":"\t\t\t\t{"}],"match_line":597,"match_text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"context":[{"line":774,"text":"\t\t}"},{"line":775,"text":""},{"line":776,"text":"\t\tif ($installed && $action != 'uninstall')"},{"line":777,"text":"\t\t{"},{"line":778,"text":"\t\t\t// this is a sanity check, it shouldn't happen"},{"line":779,"text":"\t\t\t$installed->is_processing = false;"},{"line":780,"text":"\t\t\t$installed->save();"},{"line":781,"text":"\t\t}"},{"line":782,"text":""},{"line":783,"text":"\t\t$redirect = $this->buildLink('add-ons');"},{"line":784,"text":"\t\t$stateChanges = [];"},{"line":785,"text":""},{"line":786,"text":"\t\tif ($addOn)"},{"line":787,"text":"\t\t{"},{"line":788,"text":"\t\t\tswitch ($action)"}],"match_line":779,"match_text":"\t\t\t$installed->is_processing = false;"},{"context":[{"line":789,"text":"\t\t\t{"},{"line":790,"text":"\t\t\t\tcase 'upgrade':"},{"line":791,"text":"\t\t\t\t\t$addOn->postUpgrade($stateChanges);"},{"line":792,"text":"\t\t\t\t\tbreak;"},{"line":793,"text":"\t\t\t\tcase 'install':"},{"line":794,"text":"\t\t\t\t\t$addOn->postInstall($stateChanges);"},{"line":795,"text":"\t\t\t\t\tbreak;"},{"line":796,"text":"\t\t\t\tcase 'uninstall':"},{"line":797,"text":"\t\t\t\t\t$addOn->postUninstall();"},{"line":798,"text":"\t\t\t\t\tbreak;"},{"line":799,"text":"\t\t\t\tcase 'rebuild':"},{"line":800,"text":"\t\t\t\t\t$addOn->postRebuild();"},{"line":801,"text":"\t\t\t\t\tbreak;"},{"line":802,"text":"\t\t\t}"},{"line":803,"text":"\t\t}"}],"match_line":794,"match_text":"\t\t\t\t\t$addOn->postInstall($stateChanges);"}],"sha256":"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915"},"src/XF/Job/AddOnData.php":{"hits":[{"context":[{"line":75,"text":"\t\t\t$this->data['current_type'] = array_shift($this->data['data_types']);"},{"line":76,"text":"\t\t\tif (!$this->data['current_type'])"},{"line":77,"text":"\t\t\t{"},{"line":78,"text":"\t\t\t\tif ($addOn)"},{"line":79,"text":"\t\t\t\t{"},{"line":80,"text":"\t\t\t\t\t$addOn->postDataImport();"},{"line":81,"text":"\t\t\t\t}"},{"line":82,"text":""},{"line":83,"text":"\t\t\t\t$repo = $this->app->repository(StyleRepository::class);"},{"line":84,"text":"\t\t\t\t$repo->updateAllStylesLastModifiedDateLater();"},{"line":85,"text":""},{"line":86,"text":"\t\t\t\treturn $this->complete();"},{"line":87,"text":"\t\t\t}"},{"line":88,"text":""},{"line":89,"text":"\t\t\t$this->data['start'] = 0;"}],"match_line":80,"match_text":"\t\t\t\t\t$addOn->postDataImport();"}],"sha256":"3b34bd0837176ac8bef4e9d34152a9d776c4fa195aebf186a389deec75d36535"}},"methods":{"actionInstall":[{"context":[{"line":713,"text":"\tpublic function actionInstallXfAddOn()"},{"line":714,"text":"\t{"},{"line":715,"text":"\t\t$this->assertAdminPermission('upgradeXenForo');"},{"line":716,"text":"\t\t$this->assertAdminPermission('addOn');"},{"line":717,"text":"\t\t$this->assertUpgradeCheckingPossible();"},{"line":718,"text":"\t\t$this->assertCanOneClickUpgrade();"},{"line":719,"text":""},{"line":720,"text":"\t\t$upgradeCheckRepo = $this->repository(UpgradeCheckRepository::class);"},{"line":721,"text":"\t\t$upgradeCheck = $upgradeCheckRepo->getLatestUpgradeCheck();"},{"line":722,"text":""},{"line":723,"text":"\t\tif (!$upgradeCheck)"},{"line":724,"text":"\t\t{"},{"line":725,"text":"\t\t\treturn $this->redirect($this->buildLink('tools/upgrade-check'));"},{"line":726,"text":"\t\t}"},{"line":727,"text":"\t\tif (!$upgradeCheck->canDownload())"},{"line":728,"text":"\t\t{"},{"line":729,"text":"\t\t\treturn $this->error(\\XF::phrase('issues_with_license_must_resolve_before_upgrading'));"},{"line":730,"text":"\t\t}"},{"line":731,"text":""},{"line":732,"text":"\t\t$addOnRepo = $this->repository(AddOnRepository::class);"},{"line":733,"text":"\t\tif (!$addOnRepo->canInstallFromArchive($error, true))"},{"line":734,"text":"\t\t{"},{"line":735,"text":"\t\t\treturn $this->error(\\XF::phrase('following_issue_found_one_click_upgrade_x', ['error' => $error]));"},{"line":736,"text":"\t\t}"},{"line":737,"text":""},{"line":738,"text":"\t\t$installableAddOns = [];"},{"line":739,"text":""},{"line":740,"text":"\t\tforeach ($upgradeCheck->installable_add_ons AS $addOnId => $install)"},{"line":741,"text":"\t\t{"},{"line":742,"text":"\t\t\t$installableAddOns[$addOnId] = $install;"},{"line":743,"text":"\t\t}"},{"line":744,"text":""},{"line":745,"text":"\t\tif ($this->isPost())"},{"line":746,"text":"\t\t{"},{"line":747,"text":"\t\t\t$confirmInstalls = $this->filter('confirm_install', 'array-uint');"},{"line":748,"text":"\t\t\t$filesToDownload = [];"},{"line":749,"text":"\t\t\tforeach ($confirmInstalls AS $addOnId => $versionId)"},{"line":750,"text":"\t\t\t{"},{"line":751,"text":"\t\t\t\t$filesToDownload[$addOnId] = $installableAddOns[$addOnId];"},{"line":752,"text":"\t\t\t}"},{"line":753,"text":""},{"line":754,"text":"\t\t\tif (!$filesToDownload)"},{"line":755,"text":"\t\t\t{"},{"line":756,"text":"\t\t\t\treturn $this->error(\\XF::phrase('no_installs_were_selected_for_download'));"},{"line":757,"text":"\t\t\t}"},{"line":758,"text":""},{"line":759,"text":"\t\t\tif ($upgradeCheck->license_agreement_required)"},{"line":760,"text":"\t\t\t{"},{"line":761,"text":"\t\t\t\t$agree = $this->filter('agree', 'bool');"},{"line":762,"text":"\t\t\t\tif (!$agree)"},{"line":763,"text":"\t\t\t\t{"},{"line":764,"text":"\t\t\t\t\treturn $this->error(\\XF::phrase('you_must_agree_to_terms_of_xenforo_license_agreement_to_continue'));"},{"line":765,"text":"\t\t\t\t}"},{"line":766,"text":"\t\t\t}"},{"line":767,"text":""},{"line":768,"text":"\t\t\t$addOnBatch = $this->downloadAndCreateAddOnBatch($filesToDownload, $upgradeCheck->license_agreement_required);"},{"line":769,"text":""},{"line":770,"text":"\t\t\t// note: this will bypass the install from archive config check intentionally"},{"line":771,"text":"\t\t\treturn $this->redirect("},{"line":772,"text":"\t\t\t\t$this->buildLink('add-ons/install-from-archive-confirm', null, ['batch_id' => $addOnBatch->batch_id])"},{"line":773,"text":"\t\t\t);"},{"line":774,"text":"\t\t}"},{"line":775,"text":"\t\telse"},{"line":776,"text":"\t\t{"},{"line":777,"text":"\t\t\t$viewParams = ["},{"line":778,"text":"\t\t\t\t'upgradeCheck' => $upgradeCheck,"},{"line":779,"text":"\t\t\t\t'installableAddOns' => $installableAddOns,"},{"line":780,"text":"\t\t\t];"},{"line":781,"text":"\t\t\treturn $this->view("},{"line":782,"text":"\t\t\t\t'XF:Tools\\InstallXfAddOn',"},{"line":783,"text":"\t\t\t\t'tools_install_xf_addon',"},{"line":784,"text":"\t\t\t\t$viewParams"},{"line":785,"text":"\t\t\t);"},{"line":786,"text":"\t\t}"},{"line":787,"text":"\t}"}],"path":"src/XF/Admin/Controller/ToolsController.php","sha256":"eeb900c4158b215003adfdb3849c083a4c95c32cb4a04ed3f7d9d5283b6157a9"},{"context":[{"line":391,"text":"\tpublic function actionInstall(ParameterBag $params)"},{"line":392,"text":"\t{"},{"line":393,"text":"\t\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);"},{"line":394,"text":"\t\tif (!$addOn->canInstall())"},{"line":395,"text":"\t\t{"},{"line":396,"text":"\t\t\treturn $this->error(\\XF::phrase('this_add_on_cannot_be_installed'));"},{"line":397,"text":"\t\t}"},{"line":398,"text":""},{"line":399,"text":"\t\t[$warnings, $errors] = $this->getAddOnWarningsAndErrors($addOn);"},{"line":400,"text":""},{"line":401,"text":"\t\tif ($this->isPost())"},{"line":402,"text":"\t\t{"},{"line":403,"text":"\t\t\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged"},{"line":404,"text":"\t\t\t\\XF::app()->error()->setIgnorePendingUpgrade(true);"},{"line":405,"text":""},{"line":406,"text":"\t\t\t$input = $this->filter(["},{"line":407,"text":"\t\t\t\t'_xfProcessing' => 'bool',"},{"line":408,"text":"\t\t\t\t'params' => 'json-array',"},{"line":409,"text":"\t\t\t\t'count' => 'uint',"},{"line":410,"text":"\t\t\t\t'finished' => 'bool',"},{"line":411,"text":"\t\t\t]);"},{"line":412,"text":""},{"line":413,"text":"\t\t\tif ($input['finished'])"},{"line":414,"text":"\t\t\t{"},{"line":415,"text":"\t\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":416,"text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":417,"text":""},{"line":418,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));"},{"line":419,"text":"\t\t\t}"},{"line":420,"text":"\t\t\telse"},{"line":421,"text":"\t\t\t{"},{"line":422,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":423,"text":""},{"line":424,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":425,"text":"\t\t\t\t{"},{"line":426,"text":"\t\t\t\t\tif ($setup)"},{"line":427,"text":"\t\t\t\t\t{"},{"line":428,"text":"\t\t\t\t\t\t$setup->prepareForAction('install');"},{"line":429,"text":"\t\t\t\t\t}"},{"line":430,"text":""},{"line":431,"text":"\t\t\t\t\t$result = $setup ? $setup->install($input['params']) : null;"},{"line":432,"text":"\t\t\t\t}"},{"line":433,"text":"\t\t\t\telse"},{"line":434,"text":"\t\t\t\t{"},{"line":435,"text":"\t\t\t\t\t$result = null;"},{"line":436,"text":"\t\t\t\t\t$addOn->preInstall();"},{"line":437,"text":"\t\t\t\t}"},{"line":438,"text":""},{"line":439,"text":"\t\t\t\treturn $this->displayAddOnActionStep("},{"line":440,"text":"\t\t\t\t\t$addOn,"},{"line":441,"text":"\t\t\t\t\t$result,"},{"line":442,"text":"\t\t\t\t\t\\XF::phrase('installing'),"},{"line":443,"text":"\t\t\t\t\t'add-ons/install',"},{"line":444,"text":"\t\t\t\t\t$input['count']"},{"line":445,"text":"\t\t\t\t);"},{"line":446,"text":"\t\t\t}"},{"line":447,"text":"\t\t}"},{"line":448,"text":"\t\telse"},{"line":449,"text":"\t\t{"},{"line":450,"text":"\t\t\t$viewParams = ["},{"line":451,"text":"\t\t\t\t'addOn' => $addOn,"},{"line":452,"text":"\t\t\t\t'warnings' => $warnings,"},{"line":453,"text":"\t\t\t\t'errors' => $errors,"},{"line":454,"text":"\t\t\t];"},{"line":455,"text":"\t\t\treturn $this->view('XF:AddOn\\Install', 'addon_install', $viewParams);"},{"line":456,"text":"\t\t}"},{"line":457,"text":"\t}"}],"path":"src/XF/Admin/Controller/AddOnController.php","sha256":"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915"}],"actionUninstall":[{"context":[{"line":640,"text":"\tpublic function actionUninstall(ParameterBag $params)"},{"line":641,"text":"\t{"},{"line":642,"text":"\t\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);"},{"line":643,"text":"\t\tif (!$addOn->canUninstall())"},{"line":644,"text":"\t\t{"},{"line":645,"text":"\t\t\treturn $this->error(\\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing'));"},{"line":646,"text":"\t\t}"},{"line":647,"text":""},{"line":648,"text":"\t\tif ($this->isPost())"},{"line":649,"text":"\t\t{"},{"line":650,"text":"\t\t\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged"},{"line":651,"text":"\t\t\t\\XF::app()->error()->setIgnorePendingUpgrade(true);"},{"line":652,"text":""},{"line":653,"text":"\t\t\t$input = $this->filter(["},{"line":654,"text":"\t\t\t\t'_xfProcessing' => 'bool',"},{"line":655,"text":"\t\t\t\t'params' => 'json-array',"},{"line":656,"text":"\t\t\t\t'count' => 'uint',"},{"line":657,"text":"\t\t\t\t'finished' => 'bool',"},{"line":658,"text":"\t\t\t]);"},{"line":659,"text":""},{"line":660,"text":"\t\t\tif ($input['finished'])"},{"line":661,"text":"\t\t\t{"},{"line":662,"text":"\t\t\t\t$addOn->getInstalledAddOn()->delete();"},{"line":663,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'uninstall'));"},{"line":664,"text":"\t\t\t}"},{"line":665,"text":"\t\t\telse"},{"line":666,"text":"\t\t\t{"},{"line":667,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":668,"text":""},{"line":669,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":670,"text":"\t\t\t\t{"},{"line":671,"text":"\t\t\t\t\tif ($setup)"},{"line":672,"text":"\t\t\t\t\t{"},{"line":673,"text":"\t\t\t\t\t\t$setup->prepareForAction('uninstall');"},{"line":674,"text":"\t\t\t\t\t}"},{"line":675,"text":""},{"line":676,"text":"\t\t\t\t\t$result = $setup ? $setup->uninstall($input['params']) : null;"},{"line":677,"text":"\t\t\t\t}"},{"line":678,"text":"\t\t\t\telse"},{"line":679,"text":"\t\t\t\t{"},{"line":680,"text":"\t\t\t\t\t$result = null;"},{"line":681,"text":"\t\t\t\t\t$addOn->preUninstall();"},{"line":682,"text":"\t\t\t\t}"},{"line":683,"text":""},{"line":684,"text":"\t\t\t\treturn $this->displayAddOnActionStep("},{"line":685,"text":"\t\t\t\t\t$addOn,"},{"line":686,"text":"\t\t\t\t\t$result,"},{"line":687,"text":"\t\t\t\t\t\\XF::phrase('uninstalling'),"},{"line":688,"text":"\t\t\t\t\t'add-ons/uninstall',"},{"line":689,"text":"\t\t\t\t\t$input['count']"},{"line":690,"text":"\t\t\t\t);"},{"line":691,"text":"\t\t\t}"},{"line":692,"text":"\t\t}"},{"line":693,"text":"\t\telse"},{"line":694,"text":"\t\t{"},{"line":695,"text":"\t\t\t$viewParams = ["},{"line":696,"text":"\t\t\t\t'addOn' => $addOn,"},{"line":697,"text":"\t\t\t];"},{"line":698,"text":"\t\t\treturn $this->view('XF:AddOn\\Uninstall', 'addon_uninstall', $viewParams);"},{"line":699,"text":"\t\t}"},{"line":700,"text":"\t}"}],"path":"src/XF/Admin/Controller/AddOnController.php","sha256":"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915"}],"enqueueImportAddOnData":[{"context":[{"line":85,"text":"\tpublic function enqueueImportAddOnData(AddOn $addOn)"},{"line":86,"text":"\t{"},{"line":87,"text":"\t\treturn \\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, ["},{"line":88,"text":"\t\t\t'addon_id' => $addOn->addon_id,"},{"line":89,"text":"\t\t]);"},{"line":90,"text":"\t}"}],"path":"src/XF/AddOn/DataManager.php","sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"}],"enqueueRemoveAddOnData":[{"context":[{"line":271,"text":"\tpublic function enqueueRemoveAddOnData($id)"},{"line":272,"text":"\t{"},{"line":273,"text":"\t\treturn \\XF::app()->jobManager()->enqueueUnique($id . 'AddOnUnInstall', AddOnUninstallData::class, ["},{"line":274,"text":"\t\t\t'addon_id' => $id,"},{"line":275,"text":"\t\t]);"},{"line":276,"text":"\t}"}],"path":"src/XF/AddOn/DataManager.php","sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"}],"isInstalled":[{"context":[{"line":339,"text":"\tpublic function isInstalled()"},{"line":340,"text":"\t{"},{"line":341,"text":"\t\tif ($this->installedAddOn === null)"},{"line":342,"text":"\t\t{"},{"line":343,"text":"\t\t\treturn false;"},{"line":344,"text":"\t\t}"},{"line":345,"text":""},{"line":346,"text":"\t\t$lastAction = $this->installedAddOn->getLastActionStep('install');"},{"line":347,"text":"\t\tif ($lastAction !== null)"},{"line":348,"text":"\t\t{"},{"line":349,"text":"\t\t\t// we haven't completed the install steps yet, don't consider as installed"},{"line":350,"text":"\t\t\treturn false;"},{"line":351,"text":"\t\t}"},{"line":352,"text":""},{"line":353,"text":"\t\treturn true;"},{"line":354,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},{"context":[{"line":546,"text":"\tpublic function isInstalled()"},{"line":547,"text":"\t{"},{"line":548,"text":"\t\treturn ("},{"line":549,"text":"\t\t\tFile::installLockExists()"},{"line":550,"text":"\t\t\t&& ($this->app->config('exists') || $this->app->config('legacyExists'))"},{"line":551,"text":"\t\t);"},{"line":552,"text":"\t}"}],"path":"src/XF/Install/Helper.php","sha256":"582a775e5bd3bd75cb1a6b5f0c4efdbe96301400a3bc6f89e75778d652022cf8"}],"postDataImport":[{"context":[{"line":716,"text":"\tpublic function postDataImport()"},{"line":717,"text":"\t{"},{"line":718,"text":"\t\t// all data will be imported, re-enable this so postX methods will have access to their methods"},{"line":719,"text":"\t\t$installed = $this->installedAddOn;"},{"line":720,"text":"\t\tif (!$installed)"},{"line":721,"text":"\t\t{"},{"line":722,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":723,"text":"\t\t}"},{"line":724,"text":""},{"line":725,"text":"\t\t$installed->is_processing = false;"},{"line":726,"text":"\t\t$installed->saveIfChanged();"},{"line":727,"text":""},{"line":728,"text":"\t\t\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\XF::$time);"},{"line":729,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"}],"postInstall":[{"context":[{"line":578,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":579,"text":"\t{"},{"line":580,"text":"\t\t$setup = $this->getSetup();"},{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""},{"line":588,"text":"\t\t$installed = $this->installedAddOn;"},{"line":589,"text":""},{"line":590,"text":"\t\t$json = $this->getJson();"},{"line":591,"text":"\t\t\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":592,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},{"context":[{"line":60,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":61,"text":"\t{"},{"line":62,"text":"\t}"}],"path":"src/XF/AddOn/AbstractSetup.php","sha256":"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88"}],"preInstall":[{"context":[{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"},{"line":555,"text":"\t\tif (!$this->installedAddOn)"},{"line":556,"text":"\t\t{"},{"line":557,"text":"\t\t\t$json = $this->getJson();"},{"line":558,"text":""},{"line":559,"text":"\t\t\t$installed = \\XF::em()->create(\\XF\\Entity\\AddOn::class);"},{"line":560,"text":"\t\t\t$installed->bulkSet(["},{"line":561,"text":"\t\t\t\t'addon_id' => $this->getAddOnId(),"},{"line":562,"text":"\t\t\t\t'title' => $json['title'],"},{"line":563,"text":"\t\t\t\t'version_string' => $json['version_string'],"},{"line":564,"text":"\t\t\t\t'version_id' => $json['version_id'],"},{"line":565,"text":"\t\t\t\t'active' => true,"},{"line":566,"text":"\t\t\t\t'is_processing' => true,"},{"line":567,"text":"\t\t\t\t'json_hash' => $this->getJsonHash(),"},{"line":568,"text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"line":569,"text":"\t\t\t]);"},{"line":570,"text":"\t\t\t$installed->save();"},{"line":571,"text":""},{"line":572,"text":"\t\t\t$this->installedAddOn = $installed;"},{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"},{"line":576,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"}]}} +NO_MUTATION=True +PRODUCT_CHECKPOINTS_REMAINING=18 +TASK_RESULT=PASS_PVEPRO_HOMEPAGE_PORTAL_INSTALL_LIFECYCLE_RCA +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 4a64a931..0bd80444 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,38 +1,38 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-STAGING-FOUNDATION-782R1", - "status": "FAIL", - "rc": 3, + "command_id": "SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1", + "status": "OK", + "rc": 0, "host": "pve01", - "mode": "change", - "component": "pvepro-homepage-portal-staging-foundation", - "started_at_utc": "2026-09-20T16:32:22Z", - "finished_at_utc": "2026-09-20T16:36:54Z", + "mode": "read-only", + "component": "pvepro-homepage-portal-install-lifecycle-rca-readonly", + "started_at_utc": "2026-09-20T16:42:17Z", + "finished_at_utc": "2026-09-20T16:42:22Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "25be87e3745f3a1e026eb2a9a1c175d2d90f665c9bb8c3713c9f16391493f51b", + "command_sha256": "3e979c32a397a411ac1e4144d432831e49d53b89bc5cfef8b70eca4ebe8c81b6", "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, - "changes_made": true, - "rollback_started": true, - "rollback_restored": true, - "mutation_outcome": "ROLLED_BACK", + "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": "b4a04258a6bcf5d6d6df5b195caecd5dbf3ed2bc96718216a5e0b36f51dabd40", - "sanitized_output_sha256": "b4a04258a6bcf5d6d6df5b195caecd5dbf3ed2bc96718216a5e0b36f51dabd40", + "raw_evidence_sha256": "8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182", + "sanitized_output_sha256": "8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-STAGING-FOUNDATION-782R1\nMODE=change\nCOMPONENT=pvepro-homepage-portal-staging-foundation\nWINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT\nPRODUCTION_PRESTATE={\"host\":{\"all_link_down\":false,\"config_sha256\":\"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab\",\"name\":\"pvepro-prod\",\"snapshots\":[],\"status\":\"running\"},\"portal\":{\"addon\":null,\"addonRows\":0,\"boardActive\":true,\"controllerLoads\":false,\"defaultStyleId\":2,\"defaultStyleIdDb\":\"2\",\"errors\":20,\"forums\":12,\"indexRoute\":\"forums/\",\"nodes\":18,\"portalTemplateRows\":0,\"posts\":44,\"pveproStyleCount\":1,\"routeController\":\"\",\"routeRows\":0,\"sourceDir\":false,\"styleCount\":2,\"styleRebuild\":0,\"templateRows\":0,\"threads\":44,\"viewLoads\":false},\"state\":{\"admins\":1,\"boardActive\":true,\"defaultLanguageId\":2,\"enCount\":1,\"errors\":20,\"languageRebuildJobs\":0,\"manualJobs\":0,\"nodes\":[{\"node_id\":1,\"node_type_id\":\"Category\",\"title\":\"\\u041e\\u0441\\u043d\\u043e\\u0432\\u043d\\u0430\\u044f \\u043a\\u0430\\u0442\\u0435\\u0433\\u043e\\u0440\\u0438\\u044f\"},{\"node_id\":2,\"node_type_id\":\"Forum\",\"title\":\"\\u041e\\u0441\\u043d\\u043e\\u0432\\u043d\\u043e\\u0439 \\u0444\\u043e\\u0440\\u0443\\u043c\"}],\"posts\":44,\"registrationEnabled\":false,\"ruCount\":1,\"ruPhraseCount\":11142,\"ruPhraseMapCount\":11194,\"threads\":44},\"style\":{\"boardActive\":true,\"defaultStyleId\":2,\"defaultStyleIdDb\":\"2\",\"effectiveMatchCount\":42,\"effectiveMismatches\":[],\"effectiveTargetCount\":42,\"errors\":20,\"mapRows\":284,\"physicalChildPropertyRows\":40,\"propertyGroupRows\":0,\"style\":{\"description\":\"PVEPro visual style\",\"enable_variations\":1,\"parent_id\":1,\"style_id\":2,\"title\":\"PVEPro\",\"user_selectable\":1},\"templateRows\":0}}\nSTAGING_HOST_PRE={\"all_link_down\":true,\"config_sha256\":\"9e76316f794f741a80e4a040d9c539180cc53fe498ef0fff770777b37b1acb49\",\"name\":\"pvepro-staging-v1\",\"snapshots\":[],\"status\":\"stopped\"}\nFRESH_STAGING_SNAPSHOT_CREATED=True\nSTAGING_QGA_READY_TRIES=24\nSTAGING_APP_PRESTATE={\"portal\":{\"addon\":null,\"addonRows\":0,\"boardActive\":false,\"controllerLoads\":false,\"defaultStyleId\":2,\"defaultStyleIdDb\":\"2\",\"errors\":16,\"forums\":12,\"indexRoute\":\"forums/\",\"nodes\":18,\"portalTemplateRows\":0,\"posts\":44,\"pveproStyleCount\":1,\"routeController\":\"\",\"routeRows\":0,\"sourceDir\":false,\"styleCount\":2,\"styleRebuild\":0,\"templateRows\":0,\"threads\":44,\"viewLoads\":false},\"state\":{\"admins\":1,\"boardActive\":false,\"defaultLanguageId\":2,\"enCount\":1,\"errors\":16,\"languageRebuildJobs\":0,\"manualJobs\":0,\"nodes\":[{\"node_id\":1,\"node_type_id\":\"Category\",\"title\":\"\\u041e\\u0441\\u043d\\u043e\\u0432\\u043d\\u0430\\u044f \\u043a\\u0430\\u0442\\u0435\\u0433\\u043e\\u0440\\u0438\\u044f\"},{\"node_id\":2,\"node_type_id\":\"Forum\",\"title\":\"\\u041e\\u0441\\u043d\\u043e\\u0432\\u043d\\u043e\\u0439 \\u0444\\u043e\\u0440\\u0443\\u043c\"}],\"posts\":44,\"registrationEnabled\":false,\"ruCount\":1,\"ruPhraseCount\":11142,\"ruPhraseMapCount\":11194,\"threads\":44},\"style\":{\"boardActive\":false,\"defaultStyleId\":2,\"defaultStyleIdDb\":\"2\",\"effectiveMatchCount\":42,\"effectiveMismatches\":[],\"effectiveTargetCount\":42,\"errors\":16,\"mapRows\":284,\"physicalChildPropertyRows\":40,\"propertyGroupRows\":0,\"style\":{\"description\":\"PVEPro visual style\",\"enable_variations\":1,\"parent_id\":1,\"style_id\":2,\"title\":\"PVEPro\",\"user_selectable\":1},\"templateRows\":0}}\nPORTAL_SOURCE_WRITTEN={\"files\":[\"Pub/Controller/Portal.php\",\"Pub/View/Portal.php\",\"_data/routes.xml\",\"_data/templates.xml\",\"addon.json\"],\"root\":\"/var/www/pvepro/src/addons/PVEPro/Portal\"}\nPORTAL_SOURCE_MANIFEST={\"Pub/Controller/Portal.php\":{\"bytes\":250,\"sha256\":\"ba1d32539697631079f82eb91b397adffce95a52f261f16f767b89bedc363f01\"},\"Pub/View/Portal.php\":{\"bytes\":80,\"sha256\":\"347e980e0f9356d22a53e7af2797389e334a7206ceaec3a5488026a8e418dee6\"},\"_data/routes.xml\":{\"bytes\":145,\"sha256\":\"cda2bca556f34a4b50166d7547feb1e0baa4c4d7c550db522995850e4a57e49d\"},\"_data/templates.xml\":{\"bytes\":8768,\"sha256\":\"a48047f6aea81cf2ff3d9badc8e6232b4ef1b07295a46aad02ab1c161539bcf2\"},\"addon.json\":{\"bytes\":466,\"sha256\":\"9af0b1dd9d8c1103144bad346ca5d47e518be7daec90cf9744ded8225643ca5b\"}}\nPORTAL_INSTALL_PRE={\"active\":1,\"addon_id\":\"PVEPro/Portal\",\"is_processing\":1,\"last_pending_action\":\"install:0\"}\nPORTAL_FOUNDATION_ERROR_CLASS=RuntimeError\nPORTAL_FOUNDATION_ERROR_SHA256=51939ddaddcc4d67fdb44c0507c06186062f750225b49d7b937841700e8713a7\nROLLBACK_STARTED=True\nROLLBACK_APP_RESTORED=True\nROLLBACK_HOST_WITH_SNAPSHOT={\"all_link_down\":true,\"config_sha256\":\"0c1dfec072dfc86bc8b68b886d0c92fa8441304e3e79240c9633d4a91bbd15f3\",\"name\":\"pvepro-staging-v1\",\"snapshots\":[\"w2-pre-portal-782r1\"],\"status\":\"stopped\"}\nROLLBACK_FINAL_HOST={\"all_link_down\":true,\"config_sha256\":\"9fd5f15119b54c8f83eb3c4bf47aac12f02e0cb9bc2bf593487a157d2d4840e3\",\"name\":\"pvepro-staging-v1\",\"snapshots\":[],\"status\":\"stopped\"}\nROLLBACK_RESTORED=True\nTASK_RESULT=PVEPRO_HOMEPAGE_PORTAL_STAGING_FOUNDATION_FAILED\nHOMELAB_RESULT_CONTRACT={\"changes_made\":true,\"command_id\":\"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-STAGING-FOUNDATION-782R1\",\"rollback_restored\":true,\"rollback_started\":true,\"status\":\"FAIL\",\"version\":1}\n" + "output": "COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1\nMODE=read-only\nCOMPONENT=pvepro-homepage-portal-install-lifecycle-rca-readonly\nWINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT\n782_ERROR_DECODE={\"matches\":true,\"sha256\":\"51939ddaddcc4d67fdb44c0507c06186062f750225b49d7b937841700e8713a7\",\"string\":\"W2PORTAL782ENQUEUE_MARKER\"}\nPRODUCTION_HOST={\"all_link_down\":false,\"config_sha256\":\"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab\",\"name\":\"pvepro-prod\",\"snapshots\":[],\"status\":\"running\"}\nSTAGING_HOST={\"all_link_down\":true,\"config_sha256\":\"9fd5f15119b54c8f83eb3c4bf47aac12f02e0cb9bc2bf593487a157d2d4840e3\",\"name\":\"pvepro-staging-v1\",\"snapshots\":[],\"status\":\"stopped\"}\nPRODUCTION_DB_PRESTATE={\"addons\":[{\"active\":1,\"addon_id\":\"XF\",\"is_processing\":0,\"last_pending_action\":null}],\"board_active\":\"1\",\"default_style\":\"2\",\"errors\":20,\"index_route\":\"forums/\",\"portal_addon_rows\":0,\"portal_job_rows\":0,\"portal_route_rows\":0,\"portal_template_rows\":0}\nXF_INSTALL_LIFECYCLE_SOURCE={\"likely\":{\"src/XF/AddOn/AddOn.php\":{\"hits\":[{\"context\":[{\"line\":536,\"text\":\"\"},{\"line\":537,\"text\":\"\\tpublic function updatePendingAction($action, $step)\"},{\"line\":538,\"text\":\"\\t{\"},{\"line\":539,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":540,\"text\":\"\\t\\t{\"},{\"line\":541,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', \\\"$action:$step\\\");\"},{\"line\":542,\"text\":\"\\t\\t}\"},{\"line\":543,\"text\":\"\\t}\"},{\"line\":544,\"text\":\"\"},{\"line\":545,\"text\":\"\\tpublic function resetPendingAction()\"},{\"line\":546,\"text\":\"\\t{\"},{\"line\":547,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"}],\"match_line\":541,\"match_text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', \\\"$action:$step\\\");\"},{\"context\":[{\"line\":540,\"text\":\"\\t\\t{\"},{\"line\":541,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', \\\"$action:$step\\\");\"},{\"line\":542,\"text\":\"\\t\\t}\"},{\"line\":543,\"text\":\"\\t}\"},{\"line\":544,\"text\":\"\"},{\"line\":545,\"text\":\"\\tpublic function resetPendingAction()\"},{\"line\":546,\"text\":\"\\t{\"},{\"line\":547,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"},{\"line\":551,\"text\":\"\\t}\"},{\"line\":552,\"text\":\"\"},{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"}],\"match_line\":545,\"match_text\":\"\\tpublic function resetPendingAction()\"},{\"context\":[{\"line\":544,\"text\":\"\"},{\"line\":545,\"text\":\"\\tpublic function resetPendingAction()\"},{\"line\":546,\"text\":\"\\t{\"},{\"line\":547,\"text\":\"\\t\\tif ($this->installedAddOn)\"},{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"},{\"line\":551,\"text\":\"\\t}\"},{\"line\":552,\"text\":\"\"},{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"},{\"line\":555,\"text\":\"\\t\\tif (!$this->installedAddOn)\"},{\"line\":556,\"text\":\"\\t\\t{\"},{\"line\":557,\"text\":\"\\t\\t\\t$json = $this->getJson();\"},{\"line\":558,\"text\":\"\"}],\"match_line\":549,\"match_text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"context\":[{\"line\":548,\"text\":\"\\t\\t{\"},{\"line\":549,\"text\":\"\\t\\t\\t$this->installedAddOn->fastUpdate('last_pending_action', null);\"},{\"line\":550,\"text\":\"\\t\\t}\"},{\"line\":551,\"text\":\"\\t}\"},{\"line\":552,\"text\":\"\"},{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"},{\"line\":555,\"text\":\"\\t\\tif (!$this->installedAddOn)\"},{\"line\":556,\"text\":\"\\t\\t{\"},{\"line\":557,\"text\":\"\\t\\t\\t$json = $this->getJson();\"},{\"line\":558,\"text\":\"\"},{\"line\":559,\"text\":\"\\t\\t\\t$installed = \\\\XF::em()->create(\\\\XF\\\\Entity\\\\AddOn::class);\"},{\"line\":560,\"text\":\"\\t\\t\\t$installed->bulkSet([\"},{\"line\":561,\"text\":\"\\t\\t\\t\\t'addon_id' => $this->getAddOnId(),\"},{\"line\":562,\"text\":\"\\t\\t\\t\\t'title' => $json['title'],\"}],\"match_line\":553,\"match_text\":\"\\tpublic function preInstall()\"},{\"context\":[{\"line\":561,\"text\":\"\\t\\t\\t\\t'addon_id' => $this->getAddOnId(),\"},{\"line\":562,\"text\":\"\\t\\t\\t\\t'title' => $json['title'],\"},{\"line\":563,\"text\":\"\\t\\t\\t\\t'version_string' => $json['version_string'],\"},{\"line\":564,\"text\":\"\\t\\t\\t\\t'version_id' => $json['version_id'],\"},{\"line\":565,\"text\":\"\\t\\t\\t\\t'active' => true,\"},{\"line\":566,\"text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"line\":567,\"text\":\"\\t\\t\\t\\t'json_hash' => $this->getJsonHash(),\"},{\"line\":568,\"text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"line\":569,\"text\":\"\\t\\t\\t]);\"},{\"line\":570,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":571,\"text\":\"\"},{\"line\":572,\"text\":\"\\t\\t\\t$this->installedAddOn = $installed;\"},{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"}],\"match_line\":566,\"match_text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"context\":[{\"line\":563,\"text\":\"\\t\\t\\t\\t'version_string' => $json['version_string'],\"},{\"line\":564,\"text\":\"\\t\\t\\t\\t'version_id' => $json['version_id'],\"},{\"line\":565,\"text\":\"\\t\\t\\t\\t'active' => true,\"},{\"line\":566,\"text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"line\":567,\"text\":\"\\t\\t\\t\\t'json_hash' => $this->getJsonHash(),\"},{\"line\":568,\"text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"line\":569,\"text\":\"\\t\\t\\t]);\"},{\"line\":570,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":571,\"text\":\"\"},{\"line\":572,\"text\":\"\\t\\t\\t$this->installedAddOn = $installed;\"},{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"},{\"line\":576,\"text\":\"\\t}\"},{\"line\":577,\"text\":\"\"}],\"match_line\":568,\"match_text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"context\":[{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"},{\"line\":576,\"text\":\"\\t}\"},{\"line\":577,\"text\":\"\"},{\"line\":578,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":579,\"text\":\"\\t{\"},{\"line\":580,\"text\":\"\\t\\t$setup = $this->getSetup();\"},{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"}],\"match_line\":578,\"match_text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"context\":[{\"line\":578,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":579,\"text\":\"\\t{\"},{\"line\":580,\"text\":\"\\t\\t$setup = $this->getSetup();\"},{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"},{\"line\":588,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":589,\"text\":\"\"},{\"line\":590,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":591,\"text\":\"\\t\\t\\\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);\"},{\"line\":592,\"text\":\"\\t}\"}],\"match_line\":583,\"match_text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"context\":[{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"},{\"line\":588,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":589,\"text\":\"\"},{\"line\":590,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":591,\"text\":\"\\t\\t\\\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);\"},{\"line\":592,\"text\":\"\\t}\"},{\"line\":593,\"text\":\"\"},{\"line\":594,\"text\":\"\\tpublic function preUpgrade()\"},{\"line\":595,\"text\":\"\\t{\"}],\"match_line\":586,\"match_text\":\"\\t\\t$this->resetPendingAction();\"},{\"context\":[{\"line\":612,\"text\":\"\\t\\t}\"},{\"line\":613,\"text\":\"\"},{\"line\":614,\"text\":\"\\t\\t// as we will be importing data after this, we don't need to bother doing this now\"},{\"line\":615,\"text\":\"\\t\\t$installed->setOption('rebuild_active_change', false);\"},{\"line\":616,\"text\":\"\\t\\t$installed->active = true;\"},{\"line\":617,\"text\":\"\\t\\t$installed->is_processing = true;\"},{\"line\":618,\"text\":\"\"},{\"line\":619,\"text\":\"\\t\\t$installed->saveIfChanged();\"},{\"line\":620,\"text\":\"\\t\\t$installed->resetOption('rebuild_active_change');\"},{\"line\":621,\"text\":\"\"},{\"line\":622,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":623,\"text\":\"\\t\\t\\\\XF::fire('addon_pre_upgrade', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":624,\"text\":\"\\t}\"},{\"line\":625,\"text\":\"\"},{\"line\":626,\"text\":\"\\tpublic function postUpgrade(array &$stateChanges)\"}],\"match_line\":617,\"match_text\":\"\\t\\t$installed->is_processing = true;\"},{\"context\":[{\"line\":632,\"text\":\"\\t\\t{\"},{\"line\":633,\"text\":\"\\t\\t\\t$previousVersion = $installed ? $installed->version_id : null;\"},{\"line\":634,\"text\":\"\\t\\t\\t$setup->postUpgrade($previousVersion, $stateChanges);\"},{\"line\":635,\"text\":\"\\t\\t}\"},{\"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;\"}],\"match_line\":637,\"match_text\":\"\\t\\t$this->resetPendingAction();\"},{\"context\":[{\"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{\"}],\"match_line\":652,\"match_text\":\"\\t\\t$installed->is_processing = true;\"},{\"context\":[{\"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 */\"}],\"match_line\":653,\"match_text\":\"\\t\\t$installed->last_pending_action = 'uninstall:0';\"},{\"context\":[{\"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\":691,\"text\":\"\\tpublic function postRebuild()\"},{\"line\":692,\"text\":\"\\t{\"},{\"line\":693,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"}],\"match_line\":684,\"match_text\":\"\\t\\t$installed->is_processing = true;\"},{\"context\":[{\"line\":711,\"text\":\"\\t\\t{\"},{\"line\":712,\"text\":\"\\t\\t\\t$setup->onActiveChange($newActive, $jobList);\"},{\"line\":713,\"text\":\"\\t\\t}\"},{\"line\":714,\"text\":\"\\t}\"},{\"line\":715,\"text\":\"\"},{\"line\":716,\"text\":\"\\tpublic function postDataImport()\"},{\"line\":717,\"text\":\"\\t{\"},{\"line\":718,\"text\":\"\\t\\t// all data will be imported, re-enable this so postX methods will have access to their methods\"},{\"line\":719,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":720,\"text\":\"\\t\\tif (!$installed)\"},{\"line\":721,\"text\":\"\\t\\t{\"},{\"line\":722,\"text\":\"\\t\\t\\tthrow new \\\\LogicException(\\\"Add-on is not installed\\\");\"},{\"line\":723,\"text\":\"\\t\\t}\"},{\"line\":724,\"text\":\"\"},{\"line\":725,\"text\":\"\\t\\t$installed->is_processing = false;\"}],\"match_line\":716,\"match_text\":\"\\tpublic function postDataImport()\"},{\"context\":[{\"line\":720,\"text\":\"\\t\\tif (!$installed)\"},{\"line\":721,\"text\":\"\\t\\t{\"},{\"line\":722,\"text\":\"\\t\\t\\tthrow new \\\\LogicException(\\\"Add-on is not installed\\\");\"},{\"line\":723,\"text\":\"\\t\\t}\"},{\"line\":724,\"text\":\"\"},{\"line\":725,\"text\":\"\\t\\t$installed->is_processing = false;\"},{\"line\":726,\"text\":\"\\t\\t$installed->saveIfChanged();\"},{\"line\":727,\"text\":\"\"},{\"line\":728,\"text\":\"\\t\\t\\\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\\\XF::$time);\"},{\"line\":729,\"text\":\"\\t}\"},{\"line\":730,\"text\":\"\"},{\"line\":731,\"text\":\"\\tpublic function syncFromJson($extraChanges = [])\"},{\"line\":732,\"text\":\"\\t{\"},{\"line\":733,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":734,\"text\":\"\\t\\tif (!$installed)\"}],\"match_line\":725,\"match_text\":\"\\t\\t$installed->is_processing = false;\"}],\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},\"src/XF/AddOn/DataManager.php\":{\"hits\":[{\"context\":[{\"line\":80,\"text\":\"\\t\\t}\"},{\"line\":81,\"text\":\"\"},{\"line\":82,\"text\":\"\\t\\treturn $document;\"},{\"line\":83,\"text\":\"\\t}\"},{\"line\":84,\"text\":\"\"},{\"line\":85,\"text\":\"\\tpublic function enqueueImportAddOnData(AddOn $addOn)\"},{\"line\":86,\"text\":\"\\t{\"},{\"line\":87,\"text\":\"\\t\\treturn \\\\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, [\"},{\"line\":88,\"text\":\"\\t\\t\\t'addon_id' => $addOn->addon_id,\"},{\"line\":89,\"text\":\"\\t\\t]);\"},{\"line\":90,\"text\":\"\\t}\"},{\"line\":91,\"text\":\"\"},{\"line\":92,\"text\":\"\\tpublic function getImportDataJobId(AddOn $addOn)\"},{\"line\":93,\"text\":\"\\t{\"},{\"line\":94,\"text\":\"\\t\\treturn 'addOnData-' . $addOn->addon_id;\"}],\"match_line\":85,\"match_text\":\"\\tpublic function enqueueImportAddOnData(AddOn $addOn)\"}],\"sha256\":\"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0\"},\"src/XF/Admin/Controller/AddOnController.php\":{\"hits\":[{\"context\":[{\"line\":371,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":372,\"text\":\"\\t\\t{\"},{\"line\":373,\"text\":\"\\t\\t\\t$addOn->preRebuild();\"},{\"line\":374,\"text\":\"\"},{\"line\":375,\"text\":\"\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":376,\"text\":\"\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\"\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'rebuild'));\"},{\"line\":379,\"text\":\"\\t\\t}\"},{\"line\":380,\"text\":\"\\t\\telse\"},{\"line\":381,\"text\":\"\\t\\t{\"},{\"line\":382,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":383,\"text\":\"\\t\\t\\t\\t'addOn' => $addOn,\"},{\"line\":384,\"text\":\"\\t\\t\\t\\t'warnings' => $warnings,\"},{\"line\":385,\"text\":\"\\t\\t\\t\\t'errors' => $errors,\"}],\"match_line\":376,\"match_text\":\"\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"context\":[{\"line\":411,\"text\":\"\\t\\t\\t]);\"},{\"line\":412,\"text\":\"\"},{\"line\":413,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":414,\"text\":\"\\t\\t\\t{\"},{\"line\":415,\"text\":\"\\t\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":416,\"text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":417,\"text\":\"\"},{\"line\":418,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));\"},{\"line\":419,\"text\":\"\\t\\t\\t}\"},{\"line\":420,\"text\":\"\\t\\t\\telse\"},{\"line\":421,\"text\":\"\\t\\t\\t{\"},{\"line\":422,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":423,\"text\":\"\"},{\"line\":424,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":425,\"text\":\"\\t\\t\\t\\t{\"}],\"match_line\":416,\"match_text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"context\":[{\"line\":431,\"text\":\"\\t\\t\\t\\t\\t$result = $setup ? $setup->install($input['params']) : null;\"},{\"line\":432,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":433,\"text\":\"\\t\\t\\t\\telse\"},{\"line\":434,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":435,\"text\":\"\\t\\t\\t\\t\\t$result = null;\"},{\"line\":436,\"text\":\"\\t\\t\\t\\t\\t$addOn->preInstall();\"},{\"line\":437,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":438,\"text\":\"\"},{\"line\":439,\"text\":\"\\t\\t\\t\\treturn $this->displayAddOnActionStep(\"},{\"line\":440,\"text\":\"\\t\\t\\t\\t\\t$addOn,\"},{\"line\":441,\"text\":\"\\t\\t\\t\\t\\t$result,\"},{\"line\":442,\"text\":\"\\t\\t\\t\\t\\t\\\\XF::phrase('installing'),\"},{\"line\":443,\"text\":\"\\t\\t\\t\\t\\t'add-ons/install',\"},{\"line\":444,\"text\":\"\\t\\t\\t\\t\\t$input['count']\"},{\"line\":445,\"text\":\"\\t\\t\\t\\t);\"}],\"match_line\":436,\"match_text\":\"\\t\\t\\t\\t\\t$addOn->preInstall();\"},{\"context\":[{\"line\":592,\"text\":\"\\t\\t\\t]);\"},{\"line\":593,\"text\":\"\"},{\"line\":594,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":595,\"text\":\"\\t\\t\\t{\"},{\"line\":596,\"text\":\"\\t\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":597,\"text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":598,\"text\":\"\"},{\"line\":599,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'upgrade'));\"},{\"line\":600,\"text\":\"\\t\\t\\t}\"},{\"line\":601,\"text\":\"\\t\\t\\telse\"},{\"line\":602,\"text\":\"\\t\\t\\t{\"},{\"line\":603,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":604,\"text\":\"\"},{\"line\":605,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":606,\"text\":\"\\t\\t\\t\\t{\"}],\"match_line\":597,\"match_text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"context\":[{\"line\":774,\"text\":\"\\t\\t}\"},{\"line\":775,\"text\":\"\"},{\"line\":776,\"text\":\"\\t\\tif ($installed && $action != 'uninstall')\"},{\"line\":777,\"text\":\"\\t\\t{\"},{\"line\":778,\"text\":\"\\t\\t\\t// this is a sanity check, it shouldn't happen\"},{\"line\":779,\"text\":\"\\t\\t\\t$installed->is_processing = false;\"},{\"line\":780,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":781,\"text\":\"\\t\\t}\"},{\"line\":782,\"text\":\"\"},{\"line\":783,\"text\":\"\\t\\t$redirect = $this->buildLink('add-ons');\"},{\"line\":784,\"text\":\"\\t\\t$stateChanges = [];\"},{\"line\":785,\"text\":\"\"},{\"line\":786,\"text\":\"\\t\\tif ($addOn)\"},{\"line\":787,\"text\":\"\\t\\t{\"},{\"line\":788,\"text\":\"\\t\\t\\tswitch ($action)\"}],\"match_line\":779,\"match_text\":\"\\t\\t\\t$installed->is_processing = false;\"},{\"context\":[{\"line\":789,\"text\":\"\\t\\t\\t{\"},{\"line\":790,\"text\":\"\\t\\t\\t\\tcase 'upgrade':\"},{\"line\":791,\"text\":\"\\t\\t\\t\\t\\t$addOn->postUpgrade($stateChanges);\"},{\"line\":792,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":793,\"text\":\"\\t\\t\\t\\tcase 'install':\"},{\"line\":794,\"text\":\"\\t\\t\\t\\t\\t$addOn->postInstall($stateChanges);\"},{\"line\":795,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":796,\"text\":\"\\t\\t\\t\\tcase 'uninstall':\"},{\"line\":797,\"text\":\"\\t\\t\\t\\t\\t$addOn->postUninstall();\"},{\"line\":798,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":799,\"text\":\"\\t\\t\\t\\tcase 'rebuild':\"},{\"line\":800,\"text\":\"\\t\\t\\t\\t\\t$addOn->postRebuild();\"},{\"line\":801,\"text\":\"\\t\\t\\t\\t\\tbreak;\"},{\"line\":802,\"text\":\"\\t\\t\\t}\"},{\"line\":803,\"text\":\"\\t\\t}\"}],\"match_line\":794,\"match_text\":\"\\t\\t\\t\\t\\t$addOn->postInstall($stateChanges);\"}],\"sha256\":\"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915\"},\"src/XF/Job/AddOnData.php\":{\"hits\":[{\"context\":[{\"line\":75,\"text\":\"\\t\\t\\t$this->data['current_type'] = array_shift($this->data['data_types']);\"},{\"line\":76,\"text\":\"\\t\\t\\tif (!$this->data['current_type'])\"},{\"line\":77,\"text\":\"\\t\\t\\t{\"},{\"line\":78,\"text\":\"\\t\\t\\t\\tif ($addOn)\"},{\"line\":79,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":80,\"text\":\"\\t\\t\\t\\t\\t$addOn->postDataImport();\"},{\"line\":81,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":82,\"text\":\"\"},{\"line\":83,\"text\":\"\\t\\t\\t\\t$repo = $this->app->repository(StyleRepository::class);\"},{\"line\":84,\"text\":\"\\t\\t\\t\\t$repo->updateAllStylesLastModifiedDateLater();\"},{\"line\":85,\"text\":\"\"},{\"line\":86,\"text\":\"\\t\\t\\t\\treturn $this->complete();\"},{\"line\":87,\"text\":\"\\t\\t\\t}\"},{\"line\":88,\"text\":\"\"},{\"line\":89,\"text\":\"\\t\\t\\t$this->data['start'] = 0;\"}],\"match_line\":80,\"match_text\":\"\\t\\t\\t\\t\\t$addOn->postDataImport();\"}],\"sha256\":\"3b34bd0837176ac8bef4e9d34152a9d776c4fa195aebf186a389deec75d36535\"}},\"methods\":{\"actionInstall\":[{\"context\":[{\"line\":713,\"text\":\"\\tpublic function actionInstallXfAddOn()\"},{\"line\":714,\"text\":\"\\t{\"},{\"line\":715,\"text\":\"\\t\\t$this->assertAdminPermission('upgradeXenForo');\"},{\"line\":716,\"text\":\"\\t\\t$this->assertAdminPermission('addOn');\"},{\"line\":717,\"text\":\"\\t\\t$this->assertUpgradeCheckingPossible();\"},{\"line\":718,\"text\":\"\\t\\t$this->assertCanOneClickUpgrade();\"},{\"line\":719,\"text\":\"\"},{\"line\":720,\"text\":\"\\t\\t$upgradeCheckRepo = $this->repository(UpgradeCheckRepository::class);\"},{\"line\":721,\"text\":\"\\t\\t$upgradeCheck = $upgradeCheckRepo->getLatestUpgradeCheck();\"},{\"line\":722,\"text\":\"\"},{\"line\":723,\"text\":\"\\t\\tif (!$upgradeCheck)\"},{\"line\":724,\"text\":\"\\t\\t{\"},{\"line\":725,\"text\":\"\\t\\t\\treturn $this->redirect($this->buildLink('tools/upgrade-check'));\"},{\"line\":726,\"text\":\"\\t\\t}\"},{\"line\":727,\"text\":\"\\t\\tif (!$upgradeCheck->canDownload())\"},{\"line\":728,\"text\":\"\\t\\t{\"},{\"line\":729,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('issues_with_license_must_resolve_before_upgrading'));\"},{\"line\":730,\"text\":\"\\t\\t}\"},{\"line\":731,\"text\":\"\"},{\"line\":732,\"text\":\"\\t\\t$addOnRepo = $this->repository(AddOnRepository::class);\"},{\"line\":733,\"text\":\"\\t\\tif (!$addOnRepo->canInstallFromArchive($error, true))\"},{\"line\":734,\"text\":\"\\t\\t{\"},{\"line\":735,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('following_issue_found_one_click_upgrade_x', ['error' => $error]));\"},{\"line\":736,\"text\":\"\\t\\t}\"},{\"line\":737,\"text\":\"\"},{\"line\":738,\"text\":\"\\t\\t$installableAddOns = [];\"},{\"line\":739,\"text\":\"\"},{\"line\":740,\"text\":\"\\t\\tforeach ($upgradeCheck->installable_add_ons AS $addOnId => $install)\"},{\"line\":741,\"text\":\"\\t\\t{\"},{\"line\":742,\"text\":\"\\t\\t\\t$installableAddOns[$addOnId] = $install;\"},{\"line\":743,\"text\":\"\\t\\t}\"},{\"line\":744,\"text\":\"\"},{\"line\":745,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":746,\"text\":\"\\t\\t{\"},{\"line\":747,\"text\":\"\\t\\t\\t$confirmInstalls = $this->filter('confirm_install', 'array-uint');\"},{\"line\":748,\"text\":\"\\t\\t\\t$filesToDownload = [];\"},{\"line\":749,\"text\":\"\\t\\t\\tforeach ($confirmInstalls AS $addOnId => $versionId)\"},{\"line\":750,\"text\":\"\\t\\t\\t{\"},{\"line\":751,\"text\":\"\\t\\t\\t\\t$filesToDownload[$addOnId] = $installableAddOns[$addOnId];\"},{\"line\":752,\"text\":\"\\t\\t\\t}\"},{\"line\":753,\"text\":\"\"},{\"line\":754,\"text\":\"\\t\\t\\tif (!$filesToDownload)\"},{\"line\":755,\"text\":\"\\t\\t\\t{\"},{\"line\":756,\"text\":\"\\t\\t\\t\\treturn $this->error(\\\\XF::phrase('no_installs_were_selected_for_download'));\"},{\"line\":757,\"text\":\"\\t\\t\\t}\"},{\"line\":758,\"text\":\"\"},{\"line\":759,\"text\":\"\\t\\t\\tif ($upgradeCheck->license_agreement_required)\"},{\"line\":760,\"text\":\"\\t\\t\\t{\"},{\"line\":761,\"text\":\"\\t\\t\\t\\t$agree = $this->filter('agree', 'bool');\"},{\"line\":762,\"text\":\"\\t\\t\\t\\tif (!$agree)\"},{\"line\":763,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":764,\"text\":\"\\t\\t\\t\\t\\treturn $this->error(\\\\XF::phrase('you_must_agree_to_terms_of_xenforo_license_agreement_to_continue'));\"},{\"line\":765,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":766,\"text\":\"\\t\\t\\t}\"},{\"line\":767,\"text\":\"\"},{\"line\":768,\"text\":\"\\t\\t\\t$addOnBatch = $this->downloadAndCreateAddOnBatch($filesToDownload, $upgradeCheck->license_agreement_required);\"},{\"line\":769,\"text\":\"\"},{\"line\":770,\"text\":\"\\t\\t\\t// note: this will bypass the install from archive config check intentionally\"},{\"line\":771,\"text\":\"\\t\\t\\treturn $this->redirect(\"},{\"line\":772,\"text\":\"\\t\\t\\t\\t$this->buildLink('add-ons/install-from-archive-confirm', null, ['batch_id' => $addOnBatch->batch_id])\"},{\"line\":773,\"text\":\"\\t\\t\\t);\"},{\"line\":774,\"text\":\"\\t\\t}\"},{\"line\":775,\"text\":\"\\t\\telse\"},{\"line\":776,\"text\":\"\\t\\t{\"},{\"line\":777,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":778,\"text\":\"\\t\\t\\t\\t'upgradeCheck' => $upgradeCheck,\"},{\"line\":779,\"text\":\"\\t\\t\\t\\t'installableAddOns' => $installableAddOns,\"},{\"line\":780,\"text\":\"\\t\\t\\t];\"},{\"line\":781,\"text\":\"\\t\\t\\treturn $this->view(\"},{\"line\":782,\"text\":\"\\t\\t\\t\\t'XF:Tools\\\\InstallXfAddOn',\"},{\"line\":783,\"text\":\"\\t\\t\\t\\t'tools_install_xf_addon',\"},{\"line\":784,\"text\":\"\\t\\t\\t\\t$viewParams\"},{\"line\":785,\"text\":\"\\t\\t\\t);\"},{\"line\":786,\"text\":\"\\t\\t}\"},{\"line\":787,\"text\":\"\\t}\"}],\"path\":\"src/XF/Admin/Controller/ToolsController.php\",\"sha256\":\"eeb900c4158b215003adfdb3849c083a4c95c32cb4a04ed3f7d9d5283b6157a9\"},{\"context\":[{\"line\":391,\"text\":\"\\tpublic function actionInstall(ParameterBag $params)\"},{\"line\":392,\"text\":\"\\t{\"},{\"line\":393,\"text\":\"\\t\\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);\"},{\"line\":394,\"text\":\"\\t\\tif (!$addOn->canInstall())\"},{\"line\":395,\"text\":\"\\t\\t{\"},{\"line\":396,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('this_add_on_cannot_be_installed'));\"},{\"line\":397,\"text\":\"\\t\\t}\"},{\"line\":398,\"text\":\"\"},{\"line\":399,\"text\":\"\\t\\t[$warnings, $errors] = $this->getAddOnWarningsAndErrors($addOn);\"},{\"line\":400,\"text\":\"\"},{\"line\":401,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":402,\"text\":\"\\t\\t{\"},{\"line\":403,\"text\":\"\\t\\t\\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged\"},{\"line\":404,\"text\":\"\\t\\t\\t\\\\XF::app()->error()->setIgnorePendingUpgrade(true);\"},{\"line\":405,\"text\":\"\"},{\"line\":406,\"text\":\"\\t\\t\\t$input = $this->filter([\"},{\"line\":407,\"text\":\"\\t\\t\\t\\t'_xfProcessing' => 'bool',\"},{\"line\":408,\"text\":\"\\t\\t\\t\\t'params' => 'json-array',\"},{\"line\":409,\"text\":\"\\t\\t\\t\\t'count' => 'uint',\"},{\"line\":410,\"text\":\"\\t\\t\\t\\t'finished' => 'bool',\"},{\"line\":411,\"text\":\"\\t\\t\\t]);\"},{\"line\":412,\"text\":\"\"},{\"line\":413,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":414,\"text\":\"\\t\\t\\t{\"},{\"line\":415,\"text\":\"\\t\\t\\t\\t$dataManager = $this->app->addOnDataManager();\"},{\"line\":416,\"text\":\"\\t\\t\\t\\t$dataManager->enqueueImportAddOnData($addOn);\"},{\"line\":417,\"text\":\"\"},{\"line\":418,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));\"},{\"line\":419,\"text\":\"\\t\\t\\t}\"},{\"line\":420,\"text\":\"\\t\\t\\telse\"},{\"line\":421,\"text\":\"\\t\\t\\t{\"},{\"line\":422,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":423,\"text\":\"\"},{\"line\":424,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":425,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":426,\"text\":\"\\t\\t\\t\\t\\tif ($setup)\"},{\"line\":427,\"text\":\"\\t\\t\\t\\t\\t{\"},{\"line\":428,\"text\":\"\\t\\t\\t\\t\\t\\t$setup->prepareForAction('install');\"},{\"line\":429,\"text\":\"\\t\\t\\t\\t\\t}\"},{\"line\":430,\"text\":\"\"},{\"line\":431,\"text\":\"\\t\\t\\t\\t\\t$result = $setup ? $setup->install($input['params']) : null;\"},{\"line\":432,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":433,\"text\":\"\\t\\t\\t\\telse\"},{\"line\":434,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":435,\"text\":\"\\t\\t\\t\\t\\t$result = null;\"},{\"line\":436,\"text\":\"\\t\\t\\t\\t\\t$addOn->preInstall();\"},{\"line\":437,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":438,\"text\":\"\"},{\"line\":439,\"text\":\"\\t\\t\\t\\treturn $this->displayAddOnActionStep(\"},{\"line\":440,\"text\":\"\\t\\t\\t\\t\\t$addOn,\"},{\"line\":441,\"text\":\"\\t\\t\\t\\t\\t$result,\"},{\"line\":442,\"text\":\"\\t\\t\\t\\t\\t\\\\XF::phrase('installing'),\"},{\"line\":443,\"text\":\"\\t\\t\\t\\t\\t'add-ons/install',\"},{\"line\":444,\"text\":\"\\t\\t\\t\\t\\t$input['count']\"},{\"line\":445,\"text\":\"\\t\\t\\t\\t);\"},{\"line\":446,\"text\":\"\\t\\t\\t}\"},{\"line\":447,\"text\":\"\\t\\t}\"},{\"line\":448,\"text\":\"\\t\\telse\"},{\"line\":449,\"text\":\"\\t\\t{\"},{\"line\":450,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":451,\"text\":\"\\t\\t\\t\\t'addOn' => $addOn,\"},{\"line\":452,\"text\":\"\\t\\t\\t\\t'warnings' => $warnings,\"},{\"line\":453,\"text\":\"\\t\\t\\t\\t'errors' => $errors,\"},{\"line\":454,\"text\":\"\\t\\t\\t];\"},{\"line\":455,\"text\":\"\\t\\t\\treturn $this->view('XF:AddOn\\\\Install', 'addon_install', $viewParams);\"},{\"line\":456,\"text\":\"\\t\\t}\"},{\"line\":457,\"text\":\"\\t}\"}],\"path\":\"src/XF/Admin/Controller/AddOnController.php\",\"sha256\":\"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915\"}],\"actionUninstall\":[{\"context\":[{\"line\":640,\"text\":\"\\tpublic function actionUninstall(ParameterBag $params)\"},{\"line\":641,\"text\":\"\\t{\"},{\"line\":642,\"text\":\"\\t\\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);\"},{\"line\":643,\"text\":\"\\t\\tif (!$addOn->canUninstall())\"},{\"line\":644,\"text\":\"\\t\\t{\"},{\"line\":645,\"text\":\"\\t\\t\\treturn $this->error(\\\\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing'));\"},{\"line\":646,\"text\":\"\\t\\t}\"},{\"line\":647,\"text\":\"\"},{\"line\":648,\"text\":\"\\t\\tif ($this->isPost())\"},{\"line\":649,\"text\":\"\\t\\t{\"},{\"line\":650,\"text\":\"\\t\\t\\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged\"},{\"line\":651,\"text\":\"\\t\\t\\t\\\\XF::app()->error()->setIgnorePendingUpgrade(true);\"},{\"line\":652,\"text\":\"\"},{\"line\":653,\"text\":\"\\t\\t\\t$input = $this->filter([\"},{\"line\":654,\"text\":\"\\t\\t\\t\\t'_xfProcessing' => 'bool',\"},{\"line\":655,\"text\":\"\\t\\t\\t\\t'params' => 'json-array',\"},{\"line\":656,\"text\":\"\\t\\t\\t\\t'count' => 'uint',\"},{\"line\":657,\"text\":\"\\t\\t\\t\\t'finished' => 'bool',\"},{\"line\":658,\"text\":\"\\t\\t\\t]);\"},{\"line\":659,\"text\":\"\"},{\"line\":660,\"text\":\"\\t\\t\\tif ($input['finished'])\"},{\"line\":661,\"text\":\"\\t\\t\\t{\"},{\"line\":662,\"text\":\"\\t\\t\\t\\t$addOn->getInstalledAddOn()->delete();\"},{\"line\":663,\"text\":\"\\t\\t\\t\\treturn $this->redirect($this->getFinalizeUrl($addOn, 'uninstall'));\"},{\"line\":664,\"text\":\"\\t\\t\\t}\"},{\"line\":665,\"text\":\"\\t\\t\\telse\"},{\"line\":666,\"text\":\"\\t\\t\\t{\"},{\"line\":667,\"text\":\"\\t\\t\\t\\t$setup = $addOn->getSetup();\"},{\"line\":668,\"text\":\"\"},{\"line\":669,\"text\":\"\\t\\t\\t\\tif ($input['_xfProcessing'])\"},{\"line\":670,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":671,\"text\":\"\\t\\t\\t\\t\\tif ($setup)\"},{\"line\":672,\"text\":\"\\t\\t\\t\\t\\t{\"},{\"line\":673,\"text\":\"\\t\\t\\t\\t\\t\\t$setup->prepareForAction('uninstall');\"},{\"line\":674,\"text\":\"\\t\\t\\t\\t\\t}\"},{\"line\":675,\"text\":\"\"},{\"line\":676,\"text\":\"\\t\\t\\t\\t\\t$result = $setup ? $setup->uninstall($input['params']) : null;\"},{\"line\":677,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":678,\"text\":\"\\t\\t\\t\\telse\"},{\"line\":679,\"text\":\"\\t\\t\\t\\t{\"},{\"line\":680,\"text\":\"\\t\\t\\t\\t\\t$result = null;\"},{\"line\":681,\"text\":\"\\t\\t\\t\\t\\t$addOn->preUninstall();\"},{\"line\":682,\"text\":\"\\t\\t\\t\\t}\"},{\"line\":683,\"text\":\"\"},{\"line\":684,\"text\":\"\\t\\t\\t\\treturn $this->displayAddOnActionStep(\"},{\"line\":685,\"text\":\"\\t\\t\\t\\t\\t$addOn,\"},{\"line\":686,\"text\":\"\\t\\t\\t\\t\\t$result,\"},{\"line\":687,\"text\":\"\\t\\t\\t\\t\\t\\\\XF::phrase('uninstalling'),\"},{\"line\":688,\"text\":\"\\t\\t\\t\\t\\t'add-ons/uninstall',\"},{\"line\":689,\"text\":\"\\t\\t\\t\\t\\t$input['count']\"},{\"line\":690,\"text\":\"\\t\\t\\t\\t);\"},{\"line\":691,\"text\":\"\\t\\t\\t}\"},{\"line\":692,\"text\":\"\\t\\t}\"},{\"line\":693,\"text\":\"\\t\\telse\"},{\"line\":694,\"text\":\"\\t\\t{\"},{\"line\":695,\"text\":\"\\t\\t\\t$viewParams = [\"},{\"line\":696,\"text\":\"\\t\\t\\t\\t'addOn' => $addOn,\"},{\"line\":697,\"text\":\"\\t\\t\\t];\"},{\"line\":698,\"text\":\"\\t\\t\\treturn $this->view('XF:AddOn\\\\Uninstall', 'addon_uninstall', $viewParams);\"},{\"line\":699,\"text\":\"\\t\\t}\"},{\"line\":700,\"text\":\"\\t}\"}],\"path\":\"src/XF/Admin/Controller/AddOnController.php\",\"sha256\":\"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915\"}],\"enqueueImportAddOnData\":[{\"context\":[{\"line\":85,\"text\":\"\\tpublic function enqueueImportAddOnData(AddOn $addOn)\"},{\"line\":86,\"text\":\"\\t{\"},{\"line\":87,\"text\":\"\\t\\treturn \\\\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, [\"},{\"line\":88,\"text\":\"\\t\\t\\t'addon_id' => $addOn->addon_id,\"},{\"line\":89,\"text\":\"\\t\\t]);\"},{\"line\":90,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/DataManager.php\",\"sha256\":\"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0\"}],\"enqueueRemoveAddOnData\":[{\"context\":[{\"line\":271,\"text\":\"\\tpublic function enqueueRemoveAddOnData($id)\"},{\"line\":272,\"text\":\"\\t{\"},{\"line\":273,\"text\":\"\\t\\treturn \\\\XF::app()->jobManager()->enqueueUnique($id . 'AddOnUnInstall', AddOnUninstallData::class, [\"},{\"line\":274,\"text\":\"\\t\\t\\t'addon_id' => $id,\"},{\"line\":275,\"text\":\"\\t\\t]);\"},{\"line\":276,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/DataManager.php\",\"sha256\":\"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0\"}],\"isInstalled\":[{\"context\":[{\"line\":339,\"text\":\"\\tpublic function isInstalled()\"},{\"line\":340,\"text\":\"\\t{\"},{\"line\":341,\"text\":\"\\t\\tif ($this->installedAddOn === null)\"},{\"line\":342,\"text\":\"\\t\\t{\"},{\"line\":343,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":344,\"text\":\"\\t\\t}\"},{\"line\":345,\"text\":\"\"},{\"line\":346,\"text\":\"\\t\\t$lastAction = $this->installedAddOn->getLastActionStep('install');\"},{\"line\":347,\"text\":\"\\t\\tif ($lastAction !== null)\"},{\"line\":348,\"text\":\"\\t\\t{\"},{\"line\":349,\"text\":\"\\t\\t\\t// we haven't completed the install steps yet, don't consider as installed\"},{\"line\":350,\"text\":\"\\t\\t\\treturn false;\"},{\"line\":351,\"text\":\"\\t\\t}\"},{\"line\":352,\"text\":\"\"},{\"line\":353,\"text\":\"\\t\\treturn true;\"},{\"line\":354,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},{\"context\":[{\"line\":546,\"text\":\"\\tpublic function isInstalled()\"},{\"line\":547,\"text\":\"\\t{\"},{\"line\":548,\"text\":\"\\t\\treturn (\"},{\"line\":549,\"text\":\"\\t\\t\\tFile::installLockExists()\"},{\"line\":550,\"text\":\"\\t\\t\\t&& ($this->app->config('exists') || $this->app->config('legacyExists'))\"},{\"line\":551,\"text\":\"\\t\\t);\"},{\"line\":552,\"text\":\"\\t}\"}],\"path\":\"src/XF/Install/Helper.php\",\"sha256\":\"582a775e5bd3bd75cb1a6b5f0c4efdbe96301400a3bc6f89e75778d652022cf8\"}],\"postDataImport\":[{\"context\":[{\"line\":716,\"text\":\"\\tpublic function postDataImport()\"},{\"line\":717,\"text\":\"\\t{\"},{\"line\":718,\"text\":\"\\t\\t// all data will be imported, re-enable this so postX methods will have access to their methods\"},{\"line\":719,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":720,\"text\":\"\\t\\tif (!$installed)\"},{\"line\":721,\"text\":\"\\t\\t{\"},{\"line\":722,\"text\":\"\\t\\t\\tthrow new \\\\LogicException(\\\"Add-on is not installed\\\");\"},{\"line\":723,\"text\":\"\\t\\t}\"},{\"line\":724,\"text\":\"\"},{\"line\":725,\"text\":\"\\t\\t$installed->is_processing = false;\"},{\"line\":726,\"text\":\"\\t\\t$installed->saveIfChanged();\"},{\"line\":727,\"text\":\"\"},{\"line\":728,\"text\":\"\\t\\t\\\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\\\XF::$time);\"},{\"line\":729,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"}],\"postInstall\":[{\"context\":[{\"line\":578,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":579,\"text\":\"\\t{\"},{\"line\":580,\"text\":\"\\t\\t$setup = $this->getSetup();\"},{\"line\":581,\"text\":\"\\t\\tif ($setup)\"},{\"line\":582,\"text\":\"\\t\\t{\"},{\"line\":583,\"text\":\"\\t\\t\\t$setup->postInstall($stateChanges);\"},{\"line\":584,\"text\":\"\\t\\t}\"},{\"line\":585,\"text\":\"\"},{\"line\":586,\"text\":\"\\t\\t$this->resetPendingAction();\"},{\"line\":587,\"text\":\"\"},{\"line\":588,\"text\":\"\\t\\t$installed = $this->installedAddOn;\"},{\"line\":589,\"text\":\"\"},{\"line\":590,\"text\":\"\\t\\t$json = $this->getJson();\"},{\"line\":591,\"text\":\"\\t\\t\\\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);\"},{\"line\":592,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"},{\"context\":[{\"line\":60,\"text\":\"\\tpublic function postInstall(array &$stateChanges)\"},{\"line\":61,\"text\":\"\\t{\"},{\"line\":62,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AbstractSetup.php\",\"sha256\":\"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88\"}],\"preInstall\":[{\"context\":[{\"line\":553,\"text\":\"\\tpublic function preInstall()\"},{\"line\":554,\"text\":\"\\t{\"},{\"line\":555,\"text\":\"\\t\\tif (!$this->installedAddOn)\"},{\"line\":556,\"text\":\"\\t\\t{\"},{\"line\":557,\"text\":\"\\t\\t\\t$json = $this->getJson();\"},{\"line\":558,\"text\":\"\"},{\"line\":559,\"text\":\"\\t\\t\\t$installed = \\\\XF::em()->create(\\\\XF\\\\Entity\\\\AddOn::class);\"},{\"line\":560,\"text\":\"\\t\\t\\t$installed->bulkSet([\"},{\"line\":561,\"text\":\"\\t\\t\\t\\t'addon_id' => $this->getAddOnId(),\"},{\"line\":562,\"text\":\"\\t\\t\\t\\t'title' => $json['title'],\"},{\"line\":563,\"text\":\"\\t\\t\\t\\t'version_string' => $json['version_string'],\"},{\"line\":564,\"text\":\"\\t\\t\\t\\t'version_id' => $json['version_id'],\"},{\"line\":565,\"text\":\"\\t\\t\\t\\t'active' => true,\"},{\"line\":566,\"text\":\"\\t\\t\\t\\t'is_processing' => true,\"},{\"line\":567,\"text\":\"\\t\\t\\t\\t'json_hash' => $this->getJsonHash(),\"},{\"line\":568,\"text\":\"\\t\\t\\t\\t'last_pending_action' => 'install:0',\"},{\"line\":569,\"text\":\"\\t\\t\\t]);\"},{\"line\":570,\"text\":\"\\t\\t\\t$installed->save();\"},{\"line\":571,\"text\":\"\"},{\"line\":572,\"text\":\"\\t\\t\\t$this->installedAddOn = $installed;\"},{\"line\":573,\"text\":\"\"},{\"line\":574,\"text\":\"\\t\\t\\t\\\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);\"},{\"line\":575,\"text\":\"\\t\\t}\"},{\"line\":576,\"text\":\"\\t}\"}],\"path\":\"src/XF/AddOn/AddOn.php\",\"sha256\":\"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422\"}]}}\nNO_MUTATION=True\nPRODUCT_CHECKPOINTS_REMAINING=18\nTASK_RESULT=PASS_PVEPRO_HOMEPAGE_PORTAL_INSTALL_LIFECYCLE_RCA\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index d6026e7b..a004e4c8 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,53 +1,45 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-STAGING-FOUNDATION-782R1 -STATUS=FAIL -RC=3 +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1 +STATUS=OK +RC=0 HOST=pve01 -MODE=change -COMPONENT=pvepro-homepage-portal-staging-foundation +MODE=read-only +COMPONENT=pvepro-homepage-portal-install-lifecycle-rca-readonly REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=25be87e3745f3a1e026eb2a9a1c175d2d90f665c9bb8c3713c9f16391493f51b +COMMAND_SHA256=3e979c32a397a411ac1e4144d432831e49d53b89bc5cfef8b70eca4ebe8c81b6 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 -CHANGES_MADE=true -ROLLBACK_STARTED=true -ROLLBACK_RESTORED=true -MUTATION_OUTCOME=ROLLED_BACK +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=b4a04258a6bcf5d6d6df5b195caecd5dbf3ed2bc96718216a5e0b36f51dabd40 -SANITIZED_OUTPUT_SHA256=b4a04258a6bcf5d6d6df5b195caecd5dbf3ed2bc96718216a5e0b36f51dabd40 +RAW_EVIDENCE_SHA256=8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182 +SANITIZED_OUTPUT_SHA256=8589eaf4c34f96d8b68aa8d8288fd85613d415cf5fbeaae91a530568218dc182 OUTPUT_BEGIN -COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-STAGING-FOUNDATION-782R1 -MODE=change -COMPONENT=pvepro-homepage-portal-staging-foundation +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1 +MODE=read-only +COMPONENT=pvepro-homepage-portal-install-lifecycle-rca-readonly WINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT -PRODUCTION_PRESTATE={"host":{"all_link_down":false,"config_sha256":"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab","name":"pvepro-prod","snapshots":[],"status":"running"},"portal":{"addon":null,"addonRows":0,"boardActive":true,"controllerLoads":false,"defaultStyleId":2,"defaultStyleIdDb":"2","errors":20,"forums":12,"indexRoute":"forums/","nodes":18,"portalTemplateRows":0,"posts":44,"pveproStyleCount":1,"routeController":"","routeRows":0,"sourceDir":false,"styleCount":2,"styleRebuild":0,"templateRows":0,"threads":44,"viewLoads":false},"state":{"admins":1,"boardActive":true,"defaultLanguageId":2,"enCount":1,"errors":20,"languageRebuildJobs":0,"manualJobs":0,"nodes":[{"node_id":1,"node_type_id":"Category","title":"\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f"},{"node_id":2,"node_type_id":"Forum","title":"\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u043e\u0440\u0443\u043c"}],"posts":44,"registrationEnabled":false,"ruCount":1,"ruPhraseCount":11142,"ruPhraseMapCount":11194,"threads":44},"style":{"boardActive":true,"defaultStyleId":2,"defaultStyleIdDb":"2","effectiveMatchCount":42,"effectiveMismatches":[],"effectiveTargetCount":42,"errors":20,"mapRows":284,"physicalChildPropertyRows":40,"propertyGroupRows":0,"style":{"description":"PVEPro visual style","enable_variations":1,"parent_id":1,"style_id":2,"title":"PVEPro","user_selectable":1},"templateRows":0}} -STAGING_HOST_PRE={"all_link_down":true,"config_sha256":"9e76316f794f741a80e4a040d9c539180cc53fe498ef0fff770777b37b1acb49","name":"pvepro-staging-v1","snapshots":[],"status":"stopped"} -FRESH_STAGING_SNAPSHOT_CREATED=True -STAGING_QGA_READY_TRIES=24 -STAGING_APP_PRESTATE={"portal":{"addon":null,"addonRows":0,"boardActive":false,"controllerLoads":false,"defaultStyleId":2,"defaultStyleIdDb":"2","errors":16,"forums":12,"indexRoute":"forums/","nodes":18,"portalTemplateRows":0,"posts":44,"pveproStyleCount":1,"routeController":"","routeRows":0,"sourceDir":false,"styleCount":2,"styleRebuild":0,"templateRows":0,"threads":44,"viewLoads":false},"state":{"admins":1,"boardActive":false,"defaultLanguageId":2,"enCount":1,"errors":16,"languageRebuildJobs":0,"manualJobs":0,"nodes":[{"node_id":1,"node_type_id":"Category","title":"\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f"},{"node_id":2,"node_type_id":"Forum","title":"\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0444\u043e\u0440\u0443\u043c"}],"posts":44,"registrationEnabled":false,"ruCount":1,"ruPhraseCount":11142,"ruPhraseMapCount":11194,"threads":44},"style":{"boardActive":false,"defaultStyleId":2,"defaultStyleIdDb":"2","effectiveMatchCount":42,"effectiveMismatches":[],"effectiveTargetCount":42,"errors":16,"mapRows":284,"physicalChildPropertyRows":40,"propertyGroupRows":0,"style":{"description":"PVEPro visual style","enable_variations":1,"parent_id":1,"style_id":2,"title":"PVEPro","user_selectable":1},"templateRows":0}} -PORTAL_SOURCE_WRITTEN={"files":["Pub/Controller/Portal.php","Pub/View/Portal.php","_data/routes.xml","_data/templates.xml","addon.json"],"root":"/var/www/pvepro/src/addons/PVEPro/Portal"} -PORTAL_SOURCE_MANIFEST={"Pub/Controller/Portal.php":{"bytes":250,"sha256":"ba1d32539697631079f82eb91b397adffce95a52f261f16f767b89bedc363f01"},"Pub/View/Portal.php":{"bytes":80,"sha256":"347e980e0f9356d22a53e7af2797389e334a7206ceaec3a5488026a8e418dee6"},"_data/routes.xml":{"bytes":145,"sha256":"cda2bca556f34a4b50166d7547feb1e0baa4c4d7c550db522995850e4a57e49d"},"_data/templates.xml":{"bytes":8768,"sha256":"a48047f6aea81cf2ff3d9badc8e6232b4ef1b07295a46aad02ab1c161539bcf2"},"addon.json":{"bytes":466,"sha256":"9af0b1dd9d8c1103144bad346ca5d47e518be7daec90cf9744ded8225643ca5b"}} -PORTAL_INSTALL_PRE={"active":1,"addon_id":"PVEPro/Portal","is_processing":1,"last_pending_action":"install:0"} -PORTAL_FOUNDATION_ERROR_CLASS=RuntimeError -PORTAL_FOUNDATION_ERROR_SHA256=51939ddaddcc4d67fdb44c0507c06186062f750225b49d7b937841700e8713a7 -ROLLBACK_STARTED=True -ROLLBACK_APP_RESTORED=True -ROLLBACK_HOST_WITH_SNAPSHOT={"all_link_down":true,"config_sha256":"0c1dfec072dfc86bc8b68b886d0c92fa8441304e3e79240c9633d4a91bbd15f3","name":"pvepro-staging-v1","snapshots":["w2-pre-portal-782r1"],"status":"stopped"} -ROLLBACK_FINAL_HOST={"all_link_down":true,"config_sha256":"9fd5f15119b54c8f83eb3c4bf47aac12f02e0cb9bc2bf593487a157d2d4840e3","name":"pvepro-staging-v1","snapshots":[],"status":"stopped"} -ROLLBACK_RESTORED=True -TASK_RESULT=PVEPRO_HOMEPAGE_PORTAL_STAGING_FOUNDATION_FAILED -HOMELAB_RESULT_CONTRACT={"changes_made":true,"command_id":"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-STAGING-FOUNDATION-782R1","rollback_restored":true,"rollback_started":true,"status":"FAIL","version":1} +782_ERROR_DECODE={"matches":true,"sha256":"51939ddaddcc4d67fdb44c0507c06186062f750225b49d7b937841700e8713a7","string":"W2PORTAL782ENQUEUE_MARKER"} +PRODUCTION_HOST={"all_link_down":false,"config_sha256":"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab","name":"pvepro-prod","snapshots":[],"status":"running"} +STAGING_HOST={"all_link_down":true,"config_sha256":"9fd5f15119b54c8f83eb3c4bf47aac12f02e0cb9bc2bf593487a157d2d4840e3","name":"pvepro-staging-v1","snapshots":[],"status":"stopped"} +PRODUCTION_DB_PRESTATE={"addons":[{"active":1,"addon_id":"XF","is_processing":0,"last_pending_action":null}],"board_active":"1","default_style":"2","errors":20,"index_route":"forums/","portal_addon_rows":0,"portal_job_rows":0,"portal_route_rows":0,"portal_template_rows":0} +XF_INSTALL_LIFECYCLE_SOURCE={"likely":{"src/XF/AddOn/AddOn.php":{"hits":[{"context":[{"line":536,"text":""},{"line":537,"text":"\tpublic function updatePendingAction($action, $step)"},{"line":538,"text":"\t{"},{"line":539,"text":"\t\tif ($this->installedAddOn)"},{"line":540,"text":"\t\t{"},{"line":541,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', \"$action:$step\");"},{"line":542,"text":"\t\t}"},{"line":543,"text":"\t}"},{"line":544,"text":""},{"line":545,"text":"\tpublic function resetPendingAction()"},{"line":546,"text":"\t{"},{"line":547,"text":"\t\tif ($this->installedAddOn)"},{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"}],"match_line":541,"match_text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', \"$action:$step\");"},{"context":[{"line":540,"text":"\t\t{"},{"line":541,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', \"$action:$step\");"},{"line":542,"text":"\t\t}"},{"line":543,"text":"\t}"},{"line":544,"text":""},{"line":545,"text":"\tpublic function resetPendingAction()"},{"line":546,"text":"\t{"},{"line":547,"text":"\t\tif ($this->installedAddOn)"},{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"},{"line":551,"text":"\t}"},{"line":552,"text":""},{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"}],"match_line":545,"match_text":"\tpublic function resetPendingAction()"},{"context":[{"line":544,"text":""},{"line":545,"text":"\tpublic function resetPendingAction()"},{"line":546,"text":"\t{"},{"line":547,"text":"\t\tif ($this->installedAddOn)"},{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"},{"line":551,"text":"\t}"},{"line":552,"text":""},{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"},{"line":555,"text":"\t\tif (!$this->installedAddOn)"},{"line":556,"text":"\t\t{"},{"line":557,"text":"\t\t\t$json = $this->getJson();"},{"line":558,"text":""}],"match_line":549,"match_text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"context":[{"line":548,"text":"\t\t{"},{"line":549,"text":"\t\t\t$this->installedAddOn->fastUpdate('last_pending_action', null);"},{"line":550,"text":"\t\t}"},{"line":551,"text":"\t}"},{"line":552,"text":""},{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"},{"line":555,"text":"\t\tif (!$this->installedAddOn)"},{"line":556,"text":"\t\t{"},{"line":557,"text":"\t\t\t$json = $this->getJson();"},{"line":558,"text":""},{"line":559,"text":"\t\t\t$installed = \\XF::em()->create(\\XF\\Entity\\AddOn::class);"},{"line":560,"text":"\t\t\t$installed->bulkSet(["},{"line":561,"text":"\t\t\t\t'addon_id' => $this->getAddOnId(),"},{"line":562,"text":"\t\t\t\t'title' => $json['title'],"}],"match_line":553,"match_text":"\tpublic function preInstall()"},{"context":[{"line":561,"text":"\t\t\t\t'addon_id' => $this->getAddOnId(),"},{"line":562,"text":"\t\t\t\t'title' => $json['title'],"},{"line":563,"text":"\t\t\t\t'version_string' => $json['version_string'],"},{"line":564,"text":"\t\t\t\t'version_id' => $json['version_id'],"},{"line":565,"text":"\t\t\t\t'active' => true,"},{"line":566,"text":"\t\t\t\t'is_processing' => true,"},{"line":567,"text":"\t\t\t\t'json_hash' => $this->getJsonHash(),"},{"line":568,"text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"line":569,"text":"\t\t\t]);"},{"line":570,"text":"\t\t\t$installed->save();"},{"line":571,"text":""},{"line":572,"text":"\t\t\t$this->installedAddOn = $installed;"},{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"}],"match_line":566,"match_text":"\t\t\t\t'is_processing' => true,"},{"context":[{"line":563,"text":"\t\t\t\t'version_string' => $json['version_string'],"},{"line":564,"text":"\t\t\t\t'version_id' => $json['version_id'],"},{"line":565,"text":"\t\t\t\t'active' => true,"},{"line":566,"text":"\t\t\t\t'is_processing' => true,"},{"line":567,"text":"\t\t\t\t'json_hash' => $this->getJsonHash(),"},{"line":568,"text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"line":569,"text":"\t\t\t]);"},{"line":570,"text":"\t\t\t$installed->save();"},{"line":571,"text":""},{"line":572,"text":"\t\t\t$this->installedAddOn = $installed;"},{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"},{"line":576,"text":"\t}"},{"line":577,"text":""}],"match_line":568,"match_text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"context":[{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"},{"line":576,"text":"\t}"},{"line":577,"text":""},{"line":578,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":579,"text":"\t{"},{"line":580,"text":"\t\t$setup = $this->getSetup();"},{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""}],"match_line":578,"match_text":"\tpublic function postInstall(array &$stateChanges)"},{"context":[{"line":578,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":579,"text":"\t{"},{"line":580,"text":"\t\t$setup = $this->getSetup();"},{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""},{"line":588,"text":"\t\t$installed = $this->installedAddOn;"},{"line":589,"text":""},{"line":590,"text":"\t\t$json = $this->getJson();"},{"line":591,"text":"\t\t\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":592,"text":"\t}"}],"match_line":583,"match_text":"\t\t\t$setup->postInstall($stateChanges);"},{"context":[{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""},{"line":588,"text":"\t\t$installed = $this->installedAddOn;"},{"line":589,"text":""},{"line":590,"text":"\t\t$json = $this->getJson();"},{"line":591,"text":"\t\t\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":592,"text":"\t}"},{"line":593,"text":""},{"line":594,"text":"\tpublic function preUpgrade()"},{"line":595,"text":"\t{"}],"match_line":586,"match_text":"\t\t$this->resetPendingAction();"},{"context":[{"line":612,"text":"\t\t}"},{"line":613,"text":""},{"line":614,"text":"\t\t// as we will be importing data after this, we don't need to bother doing this now"},{"line":615,"text":"\t\t$installed->setOption('rebuild_active_change', false);"},{"line":616,"text":"\t\t$installed->active = true;"},{"line":617,"text":"\t\t$installed->is_processing = true;"},{"line":618,"text":""},{"line":619,"text":"\t\t$installed->saveIfChanged();"},{"line":620,"text":"\t\t$installed->resetOption('rebuild_active_change');"},{"line":621,"text":""},{"line":622,"text":"\t\t$json = $this->getJson();"},{"line":623,"text":"\t\t\\XF::fire('addon_pre_upgrade', [$this, $installed, $json], $installed->addon_id);"},{"line":624,"text":"\t}"},{"line":625,"text":""},{"line":626,"text":"\tpublic function postUpgrade(array &$stateChanges)"}],"match_line":617,"match_text":"\t\t$installed->is_processing = true;"},{"context":[{"line":632,"text":"\t\t{"},{"line":633,"text":"\t\t\t$previousVersion = $installed ? $installed->version_id : null;"},{"line":634,"text":"\t\t\t$setup->postUpgrade($previousVersion, $stateChanges);"},{"line":635,"text":"\t\t}"},{"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;"}],"match_line":637,"match_text":"\t\t$this->resetPendingAction();"},{"context":[{"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{"}],"match_line":652,"match_text":"\t\t$installed->is_processing = true;"},{"context":[{"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 */"}],"match_line":653,"match_text":"\t\t$installed->last_pending_action = 'uninstall:0';"},{"context":[{"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":691,"text":"\tpublic function postRebuild()"},{"line":692,"text":"\t{"},{"line":693,"text":"\t\t$installed = $this->installedAddOn;"}],"match_line":684,"match_text":"\t\t$installed->is_processing = true;"},{"context":[{"line":711,"text":"\t\t{"},{"line":712,"text":"\t\t\t$setup->onActiveChange($newActive, $jobList);"},{"line":713,"text":"\t\t}"},{"line":714,"text":"\t}"},{"line":715,"text":""},{"line":716,"text":"\tpublic function postDataImport()"},{"line":717,"text":"\t{"},{"line":718,"text":"\t\t// all data will be imported, re-enable this so postX methods will have access to their methods"},{"line":719,"text":"\t\t$installed = $this->installedAddOn;"},{"line":720,"text":"\t\tif (!$installed)"},{"line":721,"text":"\t\t{"},{"line":722,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":723,"text":"\t\t}"},{"line":724,"text":""},{"line":725,"text":"\t\t$installed->is_processing = false;"}],"match_line":716,"match_text":"\tpublic function postDataImport()"},{"context":[{"line":720,"text":"\t\tif (!$installed)"},{"line":721,"text":"\t\t{"},{"line":722,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":723,"text":"\t\t}"},{"line":724,"text":""},{"line":725,"text":"\t\t$installed->is_processing = false;"},{"line":726,"text":"\t\t$installed->saveIfChanged();"},{"line":727,"text":""},{"line":728,"text":"\t\t\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\XF::$time);"},{"line":729,"text":"\t}"},{"line":730,"text":""},{"line":731,"text":"\tpublic function syncFromJson($extraChanges = [])"},{"line":732,"text":"\t{"},{"line":733,"text":"\t\t$installed = $this->installedAddOn;"},{"line":734,"text":"\t\tif (!$installed)"}],"match_line":725,"match_text":"\t\t$installed->is_processing = false;"}],"sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},"src/XF/AddOn/DataManager.php":{"hits":[{"context":[{"line":80,"text":"\t\t}"},{"line":81,"text":""},{"line":82,"text":"\t\treturn $document;"},{"line":83,"text":"\t}"},{"line":84,"text":""},{"line":85,"text":"\tpublic function enqueueImportAddOnData(AddOn $addOn)"},{"line":86,"text":"\t{"},{"line":87,"text":"\t\treturn \\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, ["},{"line":88,"text":"\t\t\t'addon_id' => $addOn->addon_id,"},{"line":89,"text":"\t\t]);"},{"line":90,"text":"\t}"},{"line":91,"text":""},{"line":92,"text":"\tpublic function getImportDataJobId(AddOn $addOn)"},{"line":93,"text":"\t{"},{"line":94,"text":"\t\treturn 'addOnData-' . $addOn->addon_id;"}],"match_line":85,"match_text":"\tpublic function enqueueImportAddOnData(AddOn $addOn)"}],"sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"},"src/XF/Admin/Controller/AddOnController.php":{"hits":[{"context":[{"line":371,"text":"\t\tif ($this->isPost())"},{"line":372,"text":"\t\t{"},{"line":373,"text":"\t\t\t$addOn->preRebuild();"},{"line":374,"text":""},{"line":375,"text":"\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":376,"text":"\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":377,"text":""},{"line":378,"text":"\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'rebuild'));"},{"line":379,"text":"\t\t}"},{"line":380,"text":"\t\telse"},{"line":381,"text":"\t\t{"},{"line":382,"text":"\t\t\t$viewParams = ["},{"line":383,"text":"\t\t\t\t'addOn' => $addOn,"},{"line":384,"text":"\t\t\t\t'warnings' => $warnings,"},{"line":385,"text":"\t\t\t\t'errors' => $errors,"}],"match_line":376,"match_text":"\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"context":[{"line":411,"text":"\t\t\t]);"},{"line":412,"text":""},{"line":413,"text":"\t\t\tif ($input['finished'])"},{"line":414,"text":"\t\t\t{"},{"line":415,"text":"\t\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":416,"text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":417,"text":""},{"line":418,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));"},{"line":419,"text":"\t\t\t}"},{"line":420,"text":"\t\t\telse"},{"line":421,"text":"\t\t\t{"},{"line":422,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":423,"text":""},{"line":424,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":425,"text":"\t\t\t\t{"}],"match_line":416,"match_text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"context":[{"line":431,"text":"\t\t\t\t\t$result = $setup ? $setup->install($input['params']) : null;"},{"line":432,"text":"\t\t\t\t}"},{"line":433,"text":"\t\t\t\telse"},{"line":434,"text":"\t\t\t\t{"},{"line":435,"text":"\t\t\t\t\t$result = null;"},{"line":436,"text":"\t\t\t\t\t$addOn->preInstall();"},{"line":437,"text":"\t\t\t\t}"},{"line":438,"text":""},{"line":439,"text":"\t\t\t\treturn $this->displayAddOnActionStep("},{"line":440,"text":"\t\t\t\t\t$addOn,"},{"line":441,"text":"\t\t\t\t\t$result,"},{"line":442,"text":"\t\t\t\t\t\\XF::phrase('installing'),"},{"line":443,"text":"\t\t\t\t\t'add-ons/install',"},{"line":444,"text":"\t\t\t\t\t$input['count']"},{"line":445,"text":"\t\t\t\t);"}],"match_line":436,"match_text":"\t\t\t\t\t$addOn->preInstall();"},{"context":[{"line":592,"text":"\t\t\t]);"},{"line":593,"text":""},{"line":594,"text":"\t\t\tif ($input['finished'])"},{"line":595,"text":"\t\t\t{"},{"line":596,"text":"\t\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":597,"text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":598,"text":""},{"line":599,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'upgrade'));"},{"line":600,"text":"\t\t\t}"},{"line":601,"text":"\t\t\telse"},{"line":602,"text":"\t\t\t{"},{"line":603,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":604,"text":""},{"line":605,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":606,"text":"\t\t\t\t{"}],"match_line":597,"match_text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"context":[{"line":774,"text":"\t\t}"},{"line":775,"text":""},{"line":776,"text":"\t\tif ($installed && $action != 'uninstall')"},{"line":777,"text":"\t\t{"},{"line":778,"text":"\t\t\t// this is a sanity check, it shouldn't happen"},{"line":779,"text":"\t\t\t$installed->is_processing = false;"},{"line":780,"text":"\t\t\t$installed->save();"},{"line":781,"text":"\t\t}"},{"line":782,"text":""},{"line":783,"text":"\t\t$redirect = $this->buildLink('add-ons');"},{"line":784,"text":"\t\t$stateChanges = [];"},{"line":785,"text":""},{"line":786,"text":"\t\tif ($addOn)"},{"line":787,"text":"\t\t{"},{"line":788,"text":"\t\t\tswitch ($action)"}],"match_line":779,"match_text":"\t\t\t$installed->is_processing = false;"},{"context":[{"line":789,"text":"\t\t\t{"},{"line":790,"text":"\t\t\t\tcase 'upgrade':"},{"line":791,"text":"\t\t\t\t\t$addOn->postUpgrade($stateChanges);"},{"line":792,"text":"\t\t\t\t\tbreak;"},{"line":793,"text":"\t\t\t\tcase 'install':"},{"line":794,"text":"\t\t\t\t\t$addOn->postInstall($stateChanges);"},{"line":795,"text":"\t\t\t\t\tbreak;"},{"line":796,"text":"\t\t\t\tcase 'uninstall':"},{"line":797,"text":"\t\t\t\t\t$addOn->postUninstall();"},{"line":798,"text":"\t\t\t\t\tbreak;"},{"line":799,"text":"\t\t\t\tcase 'rebuild':"},{"line":800,"text":"\t\t\t\t\t$addOn->postRebuild();"},{"line":801,"text":"\t\t\t\t\tbreak;"},{"line":802,"text":"\t\t\t}"},{"line":803,"text":"\t\t}"}],"match_line":794,"match_text":"\t\t\t\t\t$addOn->postInstall($stateChanges);"}],"sha256":"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915"},"src/XF/Job/AddOnData.php":{"hits":[{"context":[{"line":75,"text":"\t\t\t$this->data['current_type'] = array_shift($this->data['data_types']);"},{"line":76,"text":"\t\t\tif (!$this->data['current_type'])"},{"line":77,"text":"\t\t\t{"},{"line":78,"text":"\t\t\t\tif ($addOn)"},{"line":79,"text":"\t\t\t\t{"},{"line":80,"text":"\t\t\t\t\t$addOn->postDataImport();"},{"line":81,"text":"\t\t\t\t}"},{"line":82,"text":""},{"line":83,"text":"\t\t\t\t$repo = $this->app->repository(StyleRepository::class);"},{"line":84,"text":"\t\t\t\t$repo->updateAllStylesLastModifiedDateLater();"},{"line":85,"text":""},{"line":86,"text":"\t\t\t\treturn $this->complete();"},{"line":87,"text":"\t\t\t}"},{"line":88,"text":""},{"line":89,"text":"\t\t\t$this->data['start'] = 0;"}],"match_line":80,"match_text":"\t\t\t\t\t$addOn->postDataImport();"}],"sha256":"3b34bd0837176ac8bef4e9d34152a9d776c4fa195aebf186a389deec75d36535"}},"methods":{"actionInstall":[{"context":[{"line":713,"text":"\tpublic function actionInstallXfAddOn()"},{"line":714,"text":"\t{"},{"line":715,"text":"\t\t$this->assertAdminPermission('upgradeXenForo');"},{"line":716,"text":"\t\t$this->assertAdminPermission('addOn');"},{"line":717,"text":"\t\t$this->assertUpgradeCheckingPossible();"},{"line":718,"text":"\t\t$this->assertCanOneClickUpgrade();"},{"line":719,"text":""},{"line":720,"text":"\t\t$upgradeCheckRepo = $this->repository(UpgradeCheckRepository::class);"},{"line":721,"text":"\t\t$upgradeCheck = $upgradeCheckRepo->getLatestUpgradeCheck();"},{"line":722,"text":""},{"line":723,"text":"\t\tif (!$upgradeCheck)"},{"line":724,"text":"\t\t{"},{"line":725,"text":"\t\t\treturn $this->redirect($this->buildLink('tools/upgrade-check'));"},{"line":726,"text":"\t\t}"},{"line":727,"text":"\t\tif (!$upgradeCheck->canDownload())"},{"line":728,"text":"\t\t{"},{"line":729,"text":"\t\t\treturn $this->error(\\XF::phrase('issues_with_license_must_resolve_before_upgrading'));"},{"line":730,"text":"\t\t}"},{"line":731,"text":""},{"line":732,"text":"\t\t$addOnRepo = $this->repository(AddOnRepository::class);"},{"line":733,"text":"\t\tif (!$addOnRepo->canInstallFromArchive($error, true))"},{"line":734,"text":"\t\t{"},{"line":735,"text":"\t\t\treturn $this->error(\\XF::phrase('following_issue_found_one_click_upgrade_x', ['error' => $error]));"},{"line":736,"text":"\t\t}"},{"line":737,"text":""},{"line":738,"text":"\t\t$installableAddOns = [];"},{"line":739,"text":""},{"line":740,"text":"\t\tforeach ($upgradeCheck->installable_add_ons AS $addOnId => $install)"},{"line":741,"text":"\t\t{"},{"line":742,"text":"\t\t\t$installableAddOns[$addOnId] = $install;"},{"line":743,"text":"\t\t}"},{"line":744,"text":""},{"line":745,"text":"\t\tif ($this->isPost())"},{"line":746,"text":"\t\t{"},{"line":747,"text":"\t\t\t$confirmInstalls = $this->filter('confirm_install', 'array-uint');"},{"line":748,"text":"\t\t\t$filesToDownload = [];"},{"line":749,"text":"\t\t\tforeach ($confirmInstalls AS $addOnId => $versionId)"},{"line":750,"text":"\t\t\t{"},{"line":751,"text":"\t\t\t\t$filesToDownload[$addOnId] = $installableAddOns[$addOnId];"},{"line":752,"text":"\t\t\t}"},{"line":753,"text":""},{"line":754,"text":"\t\t\tif (!$filesToDownload)"},{"line":755,"text":"\t\t\t{"},{"line":756,"text":"\t\t\t\treturn $this->error(\\XF::phrase('no_installs_were_selected_for_download'));"},{"line":757,"text":"\t\t\t}"},{"line":758,"text":""},{"line":759,"text":"\t\t\tif ($upgradeCheck->license_agreement_required)"},{"line":760,"text":"\t\t\t{"},{"line":761,"text":"\t\t\t\t$agree = $this->filter('agree', 'bool');"},{"line":762,"text":"\t\t\t\tif (!$agree)"},{"line":763,"text":"\t\t\t\t{"},{"line":764,"text":"\t\t\t\t\treturn $this->error(\\XF::phrase('you_must_agree_to_terms_of_xenforo_license_agreement_to_continue'));"},{"line":765,"text":"\t\t\t\t}"},{"line":766,"text":"\t\t\t}"},{"line":767,"text":""},{"line":768,"text":"\t\t\t$addOnBatch = $this->downloadAndCreateAddOnBatch($filesToDownload, $upgradeCheck->license_agreement_required);"},{"line":769,"text":""},{"line":770,"text":"\t\t\t// note: this will bypass the install from archive config check intentionally"},{"line":771,"text":"\t\t\treturn $this->redirect("},{"line":772,"text":"\t\t\t\t$this->buildLink('add-ons/install-from-archive-confirm', null, ['batch_id' => $addOnBatch->batch_id])"},{"line":773,"text":"\t\t\t);"},{"line":774,"text":"\t\t}"},{"line":775,"text":"\t\telse"},{"line":776,"text":"\t\t{"},{"line":777,"text":"\t\t\t$viewParams = ["},{"line":778,"text":"\t\t\t\t'upgradeCheck' => $upgradeCheck,"},{"line":779,"text":"\t\t\t\t'installableAddOns' => $installableAddOns,"},{"line":780,"text":"\t\t\t];"},{"line":781,"text":"\t\t\treturn $this->view("},{"line":782,"text":"\t\t\t\t'XF:Tools\\InstallXfAddOn',"},{"line":783,"text":"\t\t\t\t'tools_install_xf_addon',"},{"line":784,"text":"\t\t\t\t$viewParams"},{"line":785,"text":"\t\t\t);"},{"line":786,"text":"\t\t}"},{"line":787,"text":"\t}"}],"path":"src/XF/Admin/Controller/ToolsController.php","sha256":"eeb900c4158b215003adfdb3849c083a4c95c32cb4a04ed3f7d9d5283b6157a9"},{"context":[{"line":391,"text":"\tpublic function actionInstall(ParameterBag $params)"},{"line":392,"text":"\t{"},{"line":393,"text":"\t\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);"},{"line":394,"text":"\t\tif (!$addOn->canInstall())"},{"line":395,"text":"\t\t{"},{"line":396,"text":"\t\t\treturn $this->error(\\XF::phrase('this_add_on_cannot_be_installed'));"},{"line":397,"text":"\t\t}"},{"line":398,"text":""},{"line":399,"text":"\t\t[$warnings, $errors] = $this->getAddOnWarningsAndErrors($addOn);"},{"line":400,"text":""},{"line":401,"text":"\t\tif ($this->isPost())"},{"line":402,"text":"\t\t{"},{"line":403,"text":"\t\t\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged"},{"line":404,"text":"\t\t\t\\XF::app()->error()->setIgnorePendingUpgrade(true);"},{"line":405,"text":""},{"line":406,"text":"\t\t\t$input = $this->filter(["},{"line":407,"text":"\t\t\t\t'_xfProcessing' => 'bool',"},{"line":408,"text":"\t\t\t\t'params' => 'json-array',"},{"line":409,"text":"\t\t\t\t'count' => 'uint',"},{"line":410,"text":"\t\t\t\t'finished' => 'bool',"},{"line":411,"text":"\t\t\t]);"},{"line":412,"text":""},{"line":413,"text":"\t\t\tif ($input['finished'])"},{"line":414,"text":"\t\t\t{"},{"line":415,"text":"\t\t\t\t$dataManager = $this->app->addOnDataManager();"},{"line":416,"text":"\t\t\t\t$dataManager->enqueueImportAddOnData($addOn);"},{"line":417,"text":""},{"line":418,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'install'));"},{"line":419,"text":"\t\t\t}"},{"line":420,"text":"\t\t\telse"},{"line":421,"text":"\t\t\t{"},{"line":422,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":423,"text":""},{"line":424,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":425,"text":"\t\t\t\t{"},{"line":426,"text":"\t\t\t\t\tif ($setup)"},{"line":427,"text":"\t\t\t\t\t{"},{"line":428,"text":"\t\t\t\t\t\t$setup->prepareForAction('install');"},{"line":429,"text":"\t\t\t\t\t}"},{"line":430,"text":""},{"line":431,"text":"\t\t\t\t\t$result = $setup ? $setup->install($input['params']) : null;"},{"line":432,"text":"\t\t\t\t}"},{"line":433,"text":"\t\t\t\telse"},{"line":434,"text":"\t\t\t\t{"},{"line":435,"text":"\t\t\t\t\t$result = null;"},{"line":436,"text":"\t\t\t\t\t$addOn->preInstall();"},{"line":437,"text":"\t\t\t\t}"},{"line":438,"text":""},{"line":439,"text":"\t\t\t\treturn $this->displayAddOnActionStep("},{"line":440,"text":"\t\t\t\t\t$addOn,"},{"line":441,"text":"\t\t\t\t\t$result,"},{"line":442,"text":"\t\t\t\t\t\\XF::phrase('installing'),"},{"line":443,"text":"\t\t\t\t\t'add-ons/install',"},{"line":444,"text":"\t\t\t\t\t$input['count']"},{"line":445,"text":"\t\t\t\t);"},{"line":446,"text":"\t\t\t}"},{"line":447,"text":"\t\t}"},{"line":448,"text":"\t\telse"},{"line":449,"text":"\t\t{"},{"line":450,"text":"\t\t\t$viewParams = ["},{"line":451,"text":"\t\t\t\t'addOn' => $addOn,"},{"line":452,"text":"\t\t\t\t'warnings' => $warnings,"},{"line":453,"text":"\t\t\t\t'errors' => $errors,"},{"line":454,"text":"\t\t\t];"},{"line":455,"text":"\t\t\treturn $this->view('XF:AddOn\\Install', 'addon_install', $viewParams);"},{"line":456,"text":"\t\t}"},{"line":457,"text":"\t}"}],"path":"src/XF/Admin/Controller/AddOnController.php","sha256":"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915"}],"actionUninstall":[{"context":[{"line":640,"text":"\tpublic function actionUninstall(ParameterBag $params)"},{"line":641,"text":"\t{"},{"line":642,"text":"\t\t$addOn = $this->assertAddOnAvailable($params->addon_id_url);"},{"line":643,"text":"\t\tif (!$addOn->canUninstall())"},{"line":644,"text":"\t\t{"},{"line":645,"text":"\t\t\treturn $this->error(\\XF::phrase('this_add_on_cannot_be_uninstalled_like_files_missing'));"},{"line":646,"text":"\t\t}"},{"line":647,"text":""},{"line":648,"text":"\t\tif ($this->isPost())"},{"line":649,"text":"\t\t{"},{"line":650,"text":"\t\t\t// this applies to add-on changes as well, so we want to ensure errors here are shown and logged"},{"line":651,"text":"\t\t\t\\XF::app()->error()->setIgnorePendingUpgrade(true);"},{"line":652,"text":""},{"line":653,"text":"\t\t\t$input = $this->filter(["},{"line":654,"text":"\t\t\t\t'_xfProcessing' => 'bool',"},{"line":655,"text":"\t\t\t\t'params' => 'json-array',"},{"line":656,"text":"\t\t\t\t'count' => 'uint',"},{"line":657,"text":"\t\t\t\t'finished' => 'bool',"},{"line":658,"text":"\t\t\t]);"},{"line":659,"text":""},{"line":660,"text":"\t\t\tif ($input['finished'])"},{"line":661,"text":"\t\t\t{"},{"line":662,"text":"\t\t\t\t$addOn->getInstalledAddOn()->delete();"},{"line":663,"text":"\t\t\t\treturn $this->redirect($this->getFinalizeUrl($addOn, 'uninstall'));"},{"line":664,"text":"\t\t\t}"},{"line":665,"text":"\t\t\telse"},{"line":666,"text":"\t\t\t{"},{"line":667,"text":"\t\t\t\t$setup = $addOn->getSetup();"},{"line":668,"text":""},{"line":669,"text":"\t\t\t\tif ($input['_xfProcessing'])"},{"line":670,"text":"\t\t\t\t{"},{"line":671,"text":"\t\t\t\t\tif ($setup)"},{"line":672,"text":"\t\t\t\t\t{"},{"line":673,"text":"\t\t\t\t\t\t$setup->prepareForAction('uninstall');"},{"line":674,"text":"\t\t\t\t\t}"},{"line":675,"text":""},{"line":676,"text":"\t\t\t\t\t$result = $setup ? $setup->uninstall($input['params']) : null;"},{"line":677,"text":"\t\t\t\t}"},{"line":678,"text":"\t\t\t\telse"},{"line":679,"text":"\t\t\t\t{"},{"line":680,"text":"\t\t\t\t\t$result = null;"},{"line":681,"text":"\t\t\t\t\t$addOn->preUninstall();"},{"line":682,"text":"\t\t\t\t}"},{"line":683,"text":""},{"line":684,"text":"\t\t\t\treturn $this->displayAddOnActionStep("},{"line":685,"text":"\t\t\t\t\t$addOn,"},{"line":686,"text":"\t\t\t\t\t$result,"},{"line":687,"text":"\t\t\t\t\t\\XF::phrase('uninstalling'),"},{"line":688,"text":"\t\t\t\t\t'add-ons/uninstall',"},{"line":689,"text":"\t\t\t\t\t$input['count']"},{"line":690,"text":"\t\t\t\t);"},{"line":691,"text":"\t\t\t}"},{"line":692,"text":"\t\t}"},{"line":693,"text":"\t\telse"},{"line":694,"text":"\t\t{"},{"line":695,"text":"\t\t\t$viewParams = ["},{"line":696,"text":"\t\t\t\t'addOn' => $addOn,"},{"line":697,"text":"\t\t\t];"},{"line":698,"text":"\t\t\treturn $this->view('XF:AddOn\\Uninstall', 'addon_uninstall', $viewParams);"},{"line":699,"text":"\t\t}"},{"line":700,"text":"\t}"}],"path":"src/XF/Admin/Controller/AddOnController.php","sha256":"2f49d3d8edd5e288d43fff571b02c75b0f297d5ab0a0f934582b7dc11f913915"}],"enqueueImportAddOnData":[{"context":[{"line":85,"text":"\tpublic function enqueueImportAddOnData(AddOn $addOn)"},{"line":86,"text":"\t{"},{"line":87,"text":"\t\treturn \\XF::app()->jobManager()->enqueueUnique($this->getImportDataJobId($addOn), AddOnData::class, ["},{"line":88,"text":"\t\t\t'addon_id' => $addOn->addon_id,"},{"line":89,"text":"\t\t]);"},{"line":90,"text":"\t}"}],"path":"src/XF/AddOn/DataManager.php","sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"}],"enqueueRemoveAddOnData":[{"context":[{"line":271,"text":"\tpublic function enqueueRemoveAddOnData($id)"},{"line":272,"text":"\t{"},{"line":273,"text":"\t\treturn \\XF::app()->jobManager()->enqueueUnique($id . 'AddOnUnInstall', AddOnUninstallData::class, ["},{"line":274,"text":"\t\t\t'addon_id' => $id,"},{"line":275,"text":"\t\t]);"},{"line":276,"text":"\t}"}],"path":"src/XF/AddOn/DataManager.php","sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"}],"isInstalled":[{"context":[{"line":339,"text":"\tpublic function isInstalled()"},{"line":340,"text":"\t{"},{"line":341,"text":"\t\tif ($this->installedAddOn === null)"},{"line":342,"text":"\t\t{"},{"line":343,"text":"\t\t\treturn false;"},{"line":344,"text":"\t\t}"},{"line":345,"text":""},{"line":346,"text":"\t\t$lastAction = $this->installedAddOn->getLastActionStep('install');"},{"line":347,"text":"\t\tif ($lastAction !== null)"},{"line":348,"text":"\t\t{"},{"line":349,"text":"\t\t\t// we haven't completed the install steps yet, don't consider as installed"},{"line":350,"text":"\t\t\treturn false;"},{"line":351,"text":"\t\t}"},{"line":352,"text":""},{"line":353,"text":"\t\treturn true;"},{"line":354,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},{"context":[{"line":546,"text":"\tpublic function isInstalled()"},{"line":547,"text":"\t{"},{"line":548,"text":"\t\treturn ("},{"line":549,"text":"\t\t\tFile::installLockExists()"},{"line":550,"text":"\t\t\t&& ($this->app->config('exists') || $this->app->config('legacyExists'))"},{"line":551,"text":"\t\t);"},{"line":552,"text":"\t}"}],"path":"src/XF/Install/Helper.php","sha256":"582a775e5bd3bd75cb1a6b5f0c4efdbe96301400a3bc6f89e75778d652022cf8"}],"postDataImport":[{"context":[{"line":716,"text":"\tpublic function postDataImport()"},{"line":717,"text":"\t{"},{"line":718,"text":"\t\t// all data will be imported, re-enable this so postX methods will have access to their methods"},{"line":719,"text":"\t\t$installed = $this->installedAddOn;"},{"line":720,"text":"\t\tif (!$installed)"},{"line":721,"text":"\t\t{"},{"line":722,"text":"\t\t\tthrow new \\LogicException(\"Add-on is not installed\");"},{"line":723,"text":"\t\t}"},{"line":724,"text":""},{"line":725,"text":"\t\t$installed->is_processing = false;"},{"line":726,"text":"\t\t$installed->saveIfChanged();"},{"line":727,"text":""},{"line":728,"text":"\t\t\\XF::repository(OptionRepository::class)->updateOption('jsLastUpdate', \\XF::$time);"},{"line":729,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"}],"postInstall":[{"context":[{"line":578,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":579,"text":"\t{"},{"line":580,"text":"\t\t$setup = $this->getSetup();"},{"line":581,"text":"\t\tif ($setup)"},{"line":582,"text":"\t\t{"},{"line":583,"text":"\t\t\t$setup->postInstall($stateChanges);"},{"line":584,"text":"\t\t}"},{"line":585,"text":""},{"line":586,"text":"\t\t$this->resetPendingAction();"},{"line":587,"text":""},{"line":588,"text":"\t\t$installed = $this->installedAddOn;"},{"line":589,"text":""},{"line":590,"text":"\t\t$json = $this->getJson();"},{"line":591,"text":"\t\t\\XF::fire('addon_post_install', [$this, $installed, $json, &$stateChanges], $installed->addon_id);"},{"line":592,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},{"context":[{"line":60,"text":"\tpublic function postInstall(array &$stateChanges)"},{"line":61,"text":"\t{"},{"line":62,"text":"\t}"}],"path":"src/XF/AddOn/AbstractSetup.php","sha256":"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88"}],"preInstall":[{"context":[{"line":553,"text":"\tpublic function preInstall()"},{"line":554,"text":"\t{"},{"line":555,"text":"\t\tif (!$this->installedAddOn)"},{"line":556,"text":"\t\t{"},{"line":557,"text":"\t\t\t$json = $this->getJson();"},{"line":558,"text":""},{"line":559,"text":"\t\t\t$installed = \\XF::em()->create(\\XF\\Entity\\AddOn::class);"},{"line":560,"text":"\t\t\t$installed->bulkSet(["},{"line":561,"text":"\t\t\t\t'addon_id' => $this->getAddOnId(),"},{"line":562,"text":"\t\t\t\t'title' => $json['title'],"},{"line":563,"text":"\t\t\t\t'version_string' => $json['version_string'],"},{"line":564,"text":"\t\t\t\t'version_id' => $json['version_id'],"},{"line":565,"text":"\t\t\t\t'active' => true,"},{"line":566,"text":"\t\t\t\t'is_processing' => true,"},{"line":567,"text":"\t\t\t\t'json_hash' => $this->getJsonHash(),"},{"line":568,"text":"\t\t\t\t'last_pending_action' => 'install:0',"},{"line":569,"text":"\t\t\t]);"},{"line":570,"text":"\t\t\t$installed->save();"},{"line":571,"text":""},{"line":572,"text":"\t\t\t$this->installedAddOn = $installed;"},{"line":573,"text":""},{"line":574,"text":"\t\t\t\\XF::fire('addon_pre_install', [$this, $installed, $json], $installed->addon_id);"},{"line":575,"text":"\t\t}"},{"line":576,"text":"\t}"}],"path":"src/XF/AddOn/AddOn.php","sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"}]}} +NO_MUTATION=True +PRODUCT_CHECKPOINTS_REMAINING=18 +TASK_RESULT=PASS_PVEPRO_HOMEPAGE_PORTAL_INSTALL_LIFECYCLE_RCA +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-INSTALL-LIFECYCLE-RCA-READONLY-783R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} OUTPUT_END CHAT_OUTPUT_END