CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260909-GRAM-XF-PROCESSING-NARROW-066
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=gram-support-processing-narrow
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=b3716049942ceaea06095b5ef78a11b817e642afcc6903f53a48e9f209af6efa
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=f3bacd113632355b0404ed76453af3e803d539bb8c332baf6b14b126f66f47ee
SANITIZED_OUTPUT_SHA256=f3bacd113632355b0404ed76453af3e803d539bb8c332baf6b14b126f66f47ee
OUTPUT_BEGIN
SUPPORT066_BEGIN
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
SUPPORT066_QGA_STATE={"exitcode":0,"state":"COMPLETE"}
SUPPORT066_VM211={"command_id":"SUPPORT-260909-GRAM-XF-PROCESSING-NARROW-066","decision":"NARROW_PROCESSING_STATE_CAPTURED","guest":"newfi-staging","holds":[],"identity_ok":true,"probe":{"rc":0,"stderr_sha256":""},"probe_after":{"rc":0,"stderr_sha256":""},"scope":"READ_ONLY_NO_MUTATION","source_evidence":[{"file":"src/XF/Cli/Command/AddOn/AbstractSetupStep.php","matches":[{"line":42,"text":"\t{"},{"line":43,"text":"\t\t$id = $input->getArgument('id');"},{"line":44,"text":""},{"line":45,"text":"\t\t$addOn = $this->checkEditableAddOn($id, $error);"},{"line":46,"text":"\t\tif (!$addOn)"},{"line":47,"text":"\t\t{"},{"line":48,"text":"\t\t\t$output->writeln('<error>' . $error . '</error>');"},{"line":49,"text":"\t\t\treturn 1;"},{"line":50,"text":"\t\t}"},{"line":51,"text":""},{"line":52,"text":"\t\t$setup = $addOn->getSetup();"},{"line":53,"text":""},{"line":54,"text":"\t\tif (!$setup)"},{"line":55,"text":"\t\t{"},{"line":56,"text":"\t\t\t$output->writeln(\"<error>Setup class for add-on could not be found.</error>\");"},{"line":57,"text":"\t\t\treturn 1;"},{"line":58,"text":"\t\t}"},{"line":59,"text":""},{"line":60,"text":"\t\t$step = $input->getArgument('step');"},{"line":61,"text":"\t\t$version = null;"},{"line":62,"text":"\t\t$params = [];"},{"line":63,"text":""},{"line":64,"text":"\t\t$stepType = $this->getStepType();"},{"line":65,"text":"\t\tif ($stepType == 'upgrade')"},{"line":66,"text":"\t\t{"},{"line":67,"text":"\t\t\t$version = $input->getArgument('version');"},{"line":68,"text":"\t\t}"},{"line":69,"text":""},{"line":70,"text":"\t\t$setup->prepareForAction($stepType);"},{"line":71,"text":""},{"line":72,"text":"\t\tdo"},{"line":73,"text":"\t\t{"},{"line":74,"text":"\t\t\t$result = $this->runStep($setup, $output, $stepType, $step, $version, $params);"},{"line":75,"text":"\t\t\tif (!($result instanceof StepResult))"},{"line":76,"text":"\t\t\t{"},{"line":77,"text":"\t\t\t\t$this->clearStatus($output, \"<error>Must return a StepResult object.</error>\");"},{"line":78,"text":"\t\t\t\treturn 1;"},{"line":79,"text":"\t\t\t}"},{"line":80,"text":"\t\t\telse"},{"line":81,"text":"\t\t\t{"},{"line":82,"text":"\t\t\t\tif ($result->complete)"},{"line":83,"text":"\t\t\t\t{"},{"line":84,"text":"\t\t\t\t\t$loop = false;"},{"line":85,"text":"\t\t\t\t}"},{"line":86,"text":"\t\t\t\telse if (is_int($result))"},{"line":87,"text":"\t\t\t\t{"},{"line":88,"text":"\t\t\t\t\t$loop = false;"},{"line":89,"text":"\t\t\t\t}"},{"line":90,"text":"\t\t\t\telse"},{"line":91,"text":"\t\t\t\t{"},{"line":92,"text":"\t\t\t\t\t$params = $result->params;"},{"line":93,"text":"\t\t\t\t\t$loop = true;"},{"line":104,"text":"\tprotected function runStep(AbstractSetup $setup, OutputInterface $output, $stepType, $step, $version = null, array $params = [])"},{"line":105,"text":"\t{"},{"line":106,"text":"\t\t$method = $stepType;"},{"line":107,"text":""},{"line":108,"text":"\t\tswitch ($method)"},{"line":109,"text":"\t\t{"},{"line":110,"text":"\t\t\tcase 'install':"},{"line":111,"text":"\t\t\tcase 'uninstall':"},{"line":112,"text":"\t\t\t\tif ($step)"},{"line":113,"text":"\t\t\t\t{"},{"line":114,"text":"\t\t\t\t\t$method .= 'Step' . $step;"},{"line":115,"text":"\t\t\t\t}"},{"line":116,"text":"\t\t\t\tbreak;"},{"line":117,"text":""},{"line":118,"text":"\t\t\tcase 'upgrade':"},{"line":119,"text":"\t\t\t\tif ($version && $step)"},{"line":120,"text":"\t\t\t\t{"},{"line":121,"text":"\t\t\t\t\t$method .= $version . 'Step' . $step;"},{"line":122,"text":"\t\t\t\t}"},{"line":123,"text":"\t\t\t\tbreak;"},{"line":124,"text":"\t\t}"},{"line":125,"text":""},{"line":126,"text":"\t\tif (!method_exists($setup, $method))"}],"sha256":"86ac6e9eda2202a75f3566a6bf20b14b5cc5171a823e0a23de0e66d0e8c0a8b7"},{"file":"src/XF/Cli/Command/AddOn/Create.php","matches":[{"line":40,"text":"\t\tif ($devOutput->isAddOnSkipped($addOnId))"},{"line":41,"text":"\t\t{"},{"line":42,"text":"\t\t\t$output->writeln(\"<error>Development output for this add-on ID has been disabled. Cannot continue.</error>\");"},{"line":43,"text":"\t\t\tif (strtolower(substr($addOnId, 0, 2)) == 'xf')"},{"line":44,"text":"\t\t\t{"},{"line":45,"text":"\t\t\t\t$output->writeln(\"Note: use of add-on IDs starting with 'xf' is strongly discouraged.\");"},{"line":46,"text":"\t\t\t}"},{"line":47,"text":"\t\t\treturn 1;"},{"line":48,"text":"\t\t}"},{"line":49,"text":""},{"line":50,"text":"\t\t$checkPath = \\XF::getAddOnDirectory();"},{"line":51,"text":""},{"line":52,"text":"\t\t$addOnManager = \\XF::app()->addOnManager();"},{"line":53,"text":"\t\tforeach ($addOnManager->getAllAddOns() AS $existingAddOnId => $existingAddOn)"},{"line":54,"text":"\t\t{"},{"line":55,"text":"\t\t\tif ($existingAddOnId !== $addOnId && strcasecmp($existingAddOnId, $addOnId) === 0)"},{"line":56,"text":"\t\t\t{"},{"line":57,"text":"\t\t\t\t$output->writeln(\"<error>Add-on ID '{$addOnId}' conflicts with existing add-on '{$existingAddOnId}' (case mismatch).</error>\");"},{"line":58,"text":"\t\t\t\treturn 1;"},{"line":59,"text":"\t\t\t}"},{"line":60,"text":"\t\t}"},{"line":61,"text":""},{"line":62,"text":"\t\tif (strpos($addOnId, '/') !== false)"},{"line":63,"text":"\t\t{"},{"line":64,"text":"\t\t\t$addOnIdParts = explode('/', $addOnId);"},{"line":65,"text":"\t\t\t$vendor = reset($addOnIdParts);"},{"line":66,"text":""},{"line":67,"text":"\t\t\tif (file_exists(\\XF::getAddOnDirectory() . \\XF::$DS . $vendor))"},{"line":68,"text":"\t\t\t{"},{"line":69,"text":"\t\t\t\t$checkPath = \\XF::getAddOnDirectory() . \\XF::$DS . $vendor;"},{"line":70,"text":"\t\t\t}"},{"line":71,"text":""},{"line":72,"text":"\t\t\tif ($addOnDir = opendir(\\XF::getAddOnDirectory()))"},{"line":73,"text":"\t\t\t{"},{"line":74,"text":"\t\t\t\twhile (($dir = readdir($addOnDir)) !== false)"},{"line":75,"text":"\t\t\t\t{"},{"line":76,"text":"\t\t\t\t\tif (strcasecmp($dir, $vendor) == 0 && $dir != $vendor)"},{"line":77,"text":"\t\t\t\t\t{"},{"line":78,"text":"\t\t\t\t\t\t$output->writeln(\"<error>The '{$checkPath}' directory conflicts with an existing directory with the same name but a different case.</error>\");"},{"line":79,"text":"\t\t\t\t\t\treturn 1;"},{"line":80,"text":"\t\t\t\t\t}"},{"line":81,"text":"\t\t\t\t}"},{"line":82,"text":"\t\t\t\tclosedir($addOnDir);"},{"line":83,"text":"\t\t\t}"},{"line":84,"text":"\t\t}"},{"line":85,"text":""},{"line":86,"text":"\t\tif (!is_writable($checkPath))"},{"line":87,"text":"\t\t{"},{"line":88,"text":"\t\t\t$checkPathPrintable = str_replace(\\XF::getRootDirectory() . \\XF::$DS, '', $checkPath);"},{"line":89,"text":"\t\t\t$output->writeln(\"<error>The '{$checkPathPrintable}' directory is not writable.</error>\");"},{"line":90,"text":"\t\t\treturn 1;"},{"line":91,"text":"\t\t}"},{"line":92,"text":""},{"line":93,"text":"\t\t$addOnObj = new AddOn($addOnId, \\XF::app()->addOnManager());"},{"line":94,"text":""},{"line":95,"text":"\t\t$jsonPath = $addOnObj->getJsonPath();"},{"line":96,"text":""},{"line":97,"text":"\t\tif (file_exists($jsonPath))"},{"line":98,"text":"\t\t{"},{"line":99,"text":"\t\t\t$output->writeln(\"<error>The addon.json file already exists at {$jsonPath}. You can create the add-on by installing it from the Admin CP.</error>\");"},{"line":100,"text":"\t\t\treturn 1;"},{"line":101,"text":"\t\t}"},{"line":102,"text":""},{"line":103,"text":"\t\t$question = new Question(\"<question>Enter a title:</question> \");"},{"line":104,"text":"\t\t$question->setValidator($this->getAddOnQuestionFieldValidator('title'));"},{"line":105,"text":"\t\t$title = $helper->ask($input, $output, $question);"},{"line":106,"text":"\t\t$output->writeln(\"\");"},{"line":107,"text":""},{"line":108,"text":"\t\t$question = new Question(\"<question>Enter a version ID.</question><info> This integer will be used for internal version comparisons. Each release of your add-on should increase this number: </info> \");"},{"line":109,"text":"\t\t$question->setValidator(function ($value)"},{"line":110,"text":"\t\t{"},{"line":111,"text":"\t\t\tif (!preg_match('/^[0-9]+$/', $value))"},{"line":112,"text":"\t\t\t{"},{"line":113,"text":"\t\t\t\tthrow new \\InvalidArgumentException(\"The version ID should contain numeric values only.\");"},{"line":114,"text":"\t\t\t}"},{"line":115,"text":"\t\t\treturn $value;"},{"line":170,"text":""},{"line":171,"text":"\t\t$output->writeln(\"\");"},{"line":172,"text":""},{"line":173,"text":"\t\t$addOn->preSave();"},{"line":174,"text":"\t\tif ($errors = $addOn->getErrors())"},{"line":175,"text":"\t\t{"},{"line":176,"text":"\t\t\t$output->writeln(\"<error>An unexpected error occurred while saving the add-on: \" . reset($errors) . \"</error>\");"},{"line":177,"text":"\t\t\treturn 1;"},{"line":178,"text":"\t\t}"},{"line":179,"text":""},{"line":180,"text":"\t\t$addOn->save();"},{"line":181,"text":""},{"line":182,"text":"\t\tFile::createDirectory($addOnObj->getAddOnDirectory(), false);"},{"line":183,"text":""},{"line":184,"text":"\t\t$json = ["},{"line":185,"text":"\t\t\t'title' => $addOn->title,"},{"line":186,"text":"\t\t\t'version_string' => $addOn->version_string,"},{"line":187,"text":"\t\t\t'version_id' => intval($addOn->version_id),"},{"line":188,"text":"\t\t];"},{"line":189,"text":"\t\tif ($legacyAddOnId)"},{"line":190,"text":"\t\t{"},{"line":191,"text":"\t\t\t$json['legacy_addon_id'] = $legacyAddOnId;"},{"line":192,"text":"\t\t}"},{"line":220,"text":"\t\t\t\t$setupContent = <<< SETUP"}],"sha256":"4ff8f77caa12327158b9a6ba6ed2ffe85b959011279be5a70a8b3e77f75204f5"},{"file":"src/XF/Cli/Command/AddOn/UninstallStep.php","matches":[{"line":1,"text":"<?php"},{"line":2,"text":""},{"line":3,"text":"namespace XF\\Cli\\Command\\AddOn;"},{"line":4,"text":""},{"line":5,"text":"use Symfony\\Component\\Console\\Input\\InputArgument;"},{"line":6,"text":""},{"line":7,"text":"class UninstallStep extends AbstractSetupStep"},{"line":8,"text":"{"},{"line":9,"text":"\tprotected function getStepType()"},{"line":10,"text":"\t{"},{"line":11,"text":"\t\treturn 'uninstall';"},{"line":12,"text":"\t}"},{"line":13,"text":""},{"line":14,"text":"\tprotected function getCommandArguments()"},{"line":15,"text":"\t{"},{"line":16,"text":"\t\t$this->addArgument("},{"line":17,"text":"\t\t\t'step',"},{"line":18,"text":"\t\t\tInputArgument::REQUIRED,"},{"line":19,"text":"\t\t\t'The step number to run.'"},{"line":20,"text":"\t\t);"},{"line":21,"text":"\t}"},{"line":22,"text":"}"}],"sha256":"d69b287acd3ea5c02bf23492e1bdef465fb75f22f00b45acdb4ffafe547260e5"},{"file":"src/XF/AddOn/AbstractSetup.php","matches":[{"line":32,"text":"\tabstract public function upgrade(array $stepParams = []);"},{"line":33,"text":""},{"line":34,"text":"\t/**"},{"line":35,"text":"\t * @param array $stepParams"},{"line":36,"text":"\t *"},{"line":37,"text":"\t * @return null|StepResult"},{"line":38,"text":"\t */"},{"line":39,"text":"\tabstract public function uninstall(array $stepParams = []);"},{"line":40,"text":""},{"line":41,"text":"\tpublic function __construct(AddOn $addOn, App $app)"},{"line":42,"text":"\t{"},{"line":43,"text":"\t\t$this->addOn = $addOn;"},{"line":44,"text":"\t\t$this->app = $app;"},{"line":45,"text":"\t}"},{"line":46,"text":""},{"line":47,"text":"\t/**"},{"line":48,"text":"\t * Perform additional requirement checks."},{"line":49,"text":"\t *"},{"line":50,"text":"\t * @param list<string|\\Stringable> $errors Errors will block the setup from continuing"},{"line":51,"text":"\t * @param list<string|\\Stringable> $warnings Warnings will be displayed but allow the user to continue setup"},{"line":52,"text":"\t *"},{"line":53,"text":"\t * @return void"},{"line":54,"text":"\t */"},{"line":86,"text":"\t\t$this->app->jobManager()->enqueueUnique($uniqueId, FileCleanUp::class, ["},{"line":87,"text":"\t\t\t'addon_id' => $addOn->addon_id,"},{"line":88,"text":"\t\t], false);"},{"line":89,"text":"\t}"},{"line":90,"text":""},{"line":91,"text":"\tpublic function prepareForAction($action)"},{"line":92,"text":"\t{"},{"line":93,"text":"\t\tif ($action == 'uninstall')"},{"line":94,"text":"\t\t{"},{"line":95,"text":"\t\t\t\\XF::db()->ignoreLegacyTableWriteError(true);"},{"line":96,"text":"\t\t}"},{"line":97,"text":"\t}"},{"line":98,"text":""},{"line":99,"text":"\t/**"},{"line":100,"text":"\t * @param $sql"},{"line":101,"text":"\t * @param array $bind"},{"line":102,"text":"\t * @param bool $suppressAll"},{"line":103,"text":"\t *"},{"line":104,"text":"\t * @return bool|AbstractStatement"},{"line":105,"text":"\t * @throws Exception"},{"line":106,"text":"\t */"},{"line":107,"text":"\tprotected function query($sql, $bind = [], $suppressAll = false)"},{"line":108,"text":"\t{"}],"sha256":"6bdd3fe834e15b963a52c9357f54262f2d12f3c7c3686fc31333b549cddf2d88"},{"file":"src/XF/AddOn/AddOn.php","matches":[{"line":332,"text":"\t\t\t\t}"},{"line":333,"text":"\t\t\t}"},{"line":334,"text":"\t\t}"},{"line":335,"text":""},{"line":336,"text":"\t\treturn $this->setup;"},{"line":337,"text":"\t}"},{"line":338,"text":""},{"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}"},{"line":355,"text":""},{"line":356,"text":"\tpublic function isActive()"},{"line":357,"text":"\t{"},{"line":358,"text":"\t\treturn $this->isInstalled()"},{"line":359,"text":"\t\t\t&& $this->installedAddOn->active;"},{"line":360,"text":"\t}"},{"line":361,"text":""},{"line":362,"text":"\tpublic function isLegacy()"},{"line":363,"text":"\t{"},{"line":364,"text":"\t\treturn $this->isInstalled()"},{"line":365,"text":"\t\t\t&& $this->installedAddOn->is_legacy;"},{"line":366,"text":"\t}"},{"line":367,"text":""},{"line":368,"text":"\tpublic function isDevOutputAvailable()"},{"line":369,"text":"\t{"},{"line":370,"text":"\t\treturn \\XF::app()->developmentOutput()->isAddOnOutputAvailable($this->getAddOnId());"},{"line":371,"text":"\t}"},{"line":372,"text":""},{"line":373,"text":"\tpublic function hasMissingFiles()"},{"line":374,"text":"\t{"},{"line":375,"text":"\t\treturn count($this->missingFiles) > 0;"},{"line":376,"text":"\t}"},{"line":377,"text":""},{"line":378,"text":"\tpublic function hasPendingChanges()"},{"line":379,"text":"\t{"},{"line":380,"text":"\t\treturn $this->isInstalled()"},{"line":381,"text":"\t\t\t&& !$this->isLegacy()"},{"line":382,"text":"\t\t\t&& ("},{"line":383,"text":"\t\t\t\t!$this->isFileVersionValid()"},{"line":384,"text":"\t\t\t\t|| $this->isJsonHashChanged()"},{"line":385,"text":"\t\t\t);"},{"line":386,"text":"\t}"},{"line":387,"text":""},{"line":388,"text":"\tpublic function hasFaIcon()"},{"line":389,"text":"\t{"},{"line":390,"text":"\t\treturn ("},{"line":391,"text":"\t\t\t$this->icon"},{"line":392,"text":"\t\t\t&& !$this->hasIcon()"},{"line":393,"text":"\t\t\t&& preg_match('#^(fa-|fa[a-z] )#', $this->icon)"},{"line":394,"text":"\t\t);"},{"line":395,"text":"\t}"},{"line":431,"text":"\tpublic function isAvailable()"},{"line":432,"text":"\t{"},{"line":433,"text":"\t\treturn count($this->missingFiles) == 0;"},{"line":434,"text":"\t}"},{"line":435,"text":""},{"line":436,"text":"\tpublic function isFileVersionValid()"},{"line":437,"text":"\t{"},{"line":438,"text":"\t\treturn $this->isInstalled()"},{"line":439,"text":"\t\t\t&& $this->isAvailable()"},{"line":440,"text":"\t\t\t&& $this->installedAddOn->version_id == $this->json['version_id'];"},{"line":441,"text":"\t}"},{"line":442,"text":""},{"line":443,"text":"\tpublic function isJsonHashChanged()"},{"line":444,"text":"\t{"},{"line":445,"text":"\t\treturn ("},{"line":446,"text":"\t\t\t$this->isAvailable()"},{"line":447,"text":"\t\t\t&& $this->getJsonHash() !== $this->installedAddOn->json_hash"},{"line":448,"text":"\t\t);"},{"line":449,"text":"\t}"},{"line":450,"text":""},{"line":451,"text":"\tpublic function isJsonVersionNewer()"},{"line":452,"text":"\t{"},{"line":453,"text":"\t\treturn ($this->json['version_id'] > $this->installedAddOn->version_id);"},{"line":459,"text":"\t\t\t'version_id' => $this->json['version_id'],"},{"line":460,"text":"\t\t\t'version_string' => $this->json['version_string'],"},{"line":461,"text":"\t\t];"},{"line":462,"text":"\t}"},{"line":463,"text":""},{"line":464,"text":"\tpublic function canUpgrade()"},{"line":465,"text":"\t{"},{"line":466,"text":"\t\treturn $this->isInstalled()"},{"line":467,"text":"\t\t\t&& $this->isJsonHashChanged()"},{"line":468,"text":"\t\t\t&& $this->isJsonVersionNewer()"},{"line":469,"text":"\t\t\t&& $this->canEdit();"},{"line":470,"text":"\t}"},{"line":471,"text":""}],"sha256":"0e0346a046fff6bde9850cb53e9dc0d0b5379387029dc16925e562fa141ab422"},{"file":"src/XF/AddOn/DataManager.php","matches":[{"line":28,"text":"use XF\\AddOn\\DataType\\StylePropertyGroup;"},{"line":29,"text":"use XF\\AddOn\\DataType\\Template;"},{"line":30,"text":"use XF\\AddOn\\DataType\\TemplateModification;"},{"line":31,"text":"use XF\\AddOn\\DataType\\WidgetDefinition;"},{"line":32,"text":"use XF\\AddOn\\DataType\\WidgetPosition;"},{"line":33,"text":"use XF\\Finder\\AddOnFinder;"},{"line":34,"text":"use XF\\Job\\AddOnData;"},{"line":35,"text":"use XF\\Job\\AddOnUninstallData;"},{"line":36,"text":"use XF\\Job\\Atomic;"},{"line":37,"text":"use XF\\Mvc\\Entity\\Manager;"},{"line":38,"text":"use XF\\Repository\\ClassExtensionRepository;"},{"line":39,"text":"use XF\\Repository\\CodeEventListenerRepository;"},{"line":40,"text":"use XF\\Repository\\ForumTypeRepository;"},{"line":41,"text":"use XF\\Repository\\PaymentRepository;"},{"line":42,"text":"use XF\\Repository\\RouteRepository;"},{"line":43,"text":"use XF\\Repository\\ThreadTypeRepository;"},{"line":44,"text":"use XF\\Util\\File;"},{"line":45,"text":""},{"line":46,"text":"class DataManager"},{"line":47,"text":"{"},{"line":48,"text":"\t/**"},{"line":49,"text":"\t * @var Manager"},{"line":50,"text":"\t */"},{"line":132,"text":"\t\t$addOnManager = \\XF::app()->addOnManager();"},{"line":133,"text":""},{"line":134,"text":"\t\t$addOns = $this->em->getFinder(AddOnFinder::class)->where('active', 1)->fetch();"},{"line":135,"text":"\t\tforeach ($addOns AS $addOn)"},{"line":136,"text":"\t\t{"},{"line":137,"text":"\t\t\t$activeAddOns[$addOn->addon_id] = $addOn->version_id;"},{"line":138,"text":""},{"line":139,"text":"\t\t\t$addOnClass = $addOnManager->getById($addOn->addon_id);"},{"line":140,"text":"\t\t\tif ($addOnClass)"},{"line":141,"text":"\t\t\t{"},{"line":142,"text":"\t\t\t\t$addOnId = $addOn->addon_id;"},{"line":143,"text":"\t\t\t\t$autoloadPath = $addOnClass->composer_autoload;"},{"line":144,"text":""},{"line":145,"text":"\t\t\t\tif (!$autoloadPath)"},{"line":146,"text":"\t\t\t\t{"},{"line":147,"text":"\t\t\t\t\tcontinue;"},{"line":148,"text":"\t\t\t\t}"},{"line":149,"text":""},{"line":150,"text":"\t\t\t\t$addOnAutoload = $addOnManager->getAddOnPath($addOnId) . \\XF::$DS . $autoloadPath;"},{"line":151,"text":""},{"line":152,"text":"\t\t\t\tif (!$this->checkComposerAutoloadPath('installed.json', $addOnAutoload))"},{"line":153,"text":"\t\t\t\t{"},{"line":154,"text":"\t\t\t\t\tcontinue;"},{"line":266,"text":"\t\t}"},{"line":267,"text":""},{"line":268,"text":"\t\t$db->commit();"},{"line":269,"text":"\t}"},{"line":270,"text":""},{"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}"},{"line":277,"text":""},{"line":278,"text":"\tpublic function finalizeRemoveAddOnData($addOnId)"},{"line":279,"text":"\t{"},{"line":280,"text":"\t\t$simpleCache = \\XF::app()->simpleCache();"},{"line":281,"text":"\t\t$simpleCache->deleteSet($addOnId);"},{"line":282,"text":""},{"line":283,"text":"\t\t$this->rebuildActiveAddOnCache();"},{"line":284,"text":"\t}"},{"line":285,"text":""},{"line":286,"text":"\t/**"},{"line":287,"text":"\t * @template T of AbstractDataType"},{"line":288,"text":"\t *"}],"sha256":"cfc97d6e825ba983234c86a405bbcf985706575bba6325e253a70c05001338f0"},{"file":"src/XF/AddOn/StepRunnerUninstallTrait.php","matches":[{"line":3,"text":"namespace XF\\AddOn;"},{"line":4,"text":""},{"line":5,"text":"use function is_array;"},{"line":6,"text":""},{"line":7,"text":"/**"},{"line":8,"text":" * @property AddOn $addOn"},{"line":9,"text":" */"},{"line":10,"text":"trait StepRunnerUninstallTrait"},{"line":11,"text":"{"},{"line":12,"text":"\t/**"},{"line":13,"text":"\t * @param array $stepParams"},{"line":14,"text":"\t *"},{"line":15,"text":"\t * @return null|StepResult"},{"line":16,"text":"\t */"},{"line":17,"text":"\tpublic function uninstall(array $stepParams = [])"},{"line":18,"text":"\t{"},{"line":19,"text":"\t\t$stepParams = array_replace(["},{"line":20,"text":"\t\t\t'step' => 0,"},{"line":21,"text":"\t\t], $stepParams);"},{"line":22,"text":""},{"line":23,"text":"\t\t$step = $stepParams['step'];"},{"line":24,"text":"\t\tif (!$step)"},{"line":25,"text":"\t\t{"},{"line":26,"text":"\t\t\t$step = $this->getUninstallResumeStep();"},{"line":27,"text":"\t\t}"},{"line":28,"text":"\t\treturn $this->uninstallStepRunner($step, $stepParams);"},{"line":29,"text":"\t}"},{"line":30,"text":""},{"line":31,"text":"\tprivate function getUninstallResumeStep()"},{"line":32,"text":"\t{"},{"line":33,"text":"\t\t$installedAddOn = $this->addOn->getInstalledAddOn();"},{"line":34,"text":"\t\tif ($installedAddOn)"},{"line":35,"text":"\t\t{"},{"line":36,"text":"\t\t\t$lastActionStep = $installedAddOn->getLastActionStep('uninstall');"},{"line":37,"text":"\t\t\tif ($lastActionStep)"},{"line":38,"text":"\t\t\t{"},{"line":39,"text":"\t\t\t\treturn $lastActionStep + 1; // this is the last completed step, so resume with the next"},{"line":40,"text":"\t\t\t}"},{"line":41,"text":"\t\t}"},{"line":42,"text":""},{"line":43,"text":"\t\treturn 1;"},{"line":44,"text":"\t}"},{"line":45,"text":""},{"line":46,"text":"\t/**"},{"line":47,"text":"\t * @param integer $step"},{"line":48,"text":"\t * @param array $stepParams"},{"line":49,"text":"\t *"},{"line":50,"text":"\t * @return null|StepResult"},{"line":51,"text":"\t */"},{"line":52,"text":"\tprivate function uninstallStepRunner($step, array $stepParams)"},{"line":53,"text":"\t{"},{"line":54,"text":"\t\t$fnPrefix = 'uninstallStep';"},{"line":55,"text":"\t\t$fn = $fnPrefix . $step;"},{"line":56,"text":"\t\tif (!method_exists($this, $fn))"},{"line":57,"text":"\t\t{"},{"line":58,"text":"\t\t\treturn null;"},{"line":59,"text":"\t\t}"},{"line":60,"text":""},{"line":61,"text":"\t\t$result = $this->$fn($stepParams);"},{"line":62,"text":"\t\tif ($result === null || $result === true)"},{"line":63,"text":"\t\t{"},{"line":64,"text":"\t\t\t$result = new StepResult(true);"},{"line":65,"text":"\t\t}"},{"line":66,"text":"\t\telse if (is_array($result))"},{"line":67,"text":"\t\t{"},{"line":68,"text":"\t\t\t$result = new StepResult(false, $result);"},{"line":69,"text":"\t\t}"},{"line":73,"text":"\t\t\tthrow new \\LogicException(\"Must return a StepResult object\");"},{"line":74,"text":"\t\t}"},{"line":75,"text":""},{"line":76,"text":"\t\t$result->step = $step;"},{"line":77,"text":""},{"line":78,"text":"\t\tif ($result->complete)"},{"line":79,"text":"\t\t{"},{"line":80,"text":"\t\t\t$this->addOn->updatePendingAction('uninstall', $result->step);"},{"line":81,"text":""},{"line":82,"text":"\t\t\t$nextStep = $step + 1;"},{"line":83,"text":"\t\t\t$nextFn = $fnPrefix . $nextStep;"},{"line":84,"text":"\t\t\tif (!method_exists($this, $nextFn))"},{"line":85,"text":"\t\t\t{"},{"line":86,"text":"\t\t\t\treturn null;"},{"line":87,"text":"\t\t\t}"},{"line":88,"text":""},{"line":89,"text":"\t\t\t$result = new StepResult(false, [], $nextStep);"},{"line":90,"text":"\t\t}"},{"line":91,"text":""},{"line":92,"text":"\t\treturn $result;"},{"line":93,"text":"\t}"},{"line":94,"text":"}"}],"sha256":"e58a9ab9c30e3cf3c41a0be392e8c5ac37f744578f7b91f76d663139649c49a9"}],"state":{"addon_columns":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"addon_object":{"canUninstall":{"exists":true,"public":true,"required":0,"total":0,"value":false},"class":"XF\\AddOn\\AddOn","getAddOnId":{"exists":true,"public":true,"required":0,"total":0,"value":"Gram/Support"},"getInstalledAddOnVersion":{"exists":false},"getInstalledVersion":{"exists":false},"getLastPendingAction":{"exists":false},"getPendingAction":{"exists":false},"getTitle":{"exists":false},"isActive":{"exists":true,"public":true,"required":0,"total":0,"value":false},"isInstalled":{"exists":true,"public":true,"required":0,"total":0,"value":false},"isProcessing":{"exists":false},"present":true},"addon_row":{"active":"1","addon_id":"Gram/Support","is_legacy":"0","is_processing":"1","json_hash":"f3804541014a3dfde3b35323475c5dbcbb72ebb0d0c319d66385e9203628724d","last_pending_action":"install:1","title":"Gram Support","version_id":"1000050","version_string":"1.0.0 Alpha 3 Unified Fix 3"},"board_active":"0","error_max":45,"errors_after_45":0,"manager":{"class":"XF\\AddOn\\Manager","getAllAddOns":{"exists":true,"public":true,"required":0,"total":0,"value":{"Gram/Support":{"object":"XF\\AddOn\\AddOn"},"Newfi/Dogs":{"object":"XF\\AddOn\\AddOn"},"Newfi/Events":{"object":"XF\\AddOn\\AddOn"},"Newfi/Portal":{"object":"XF\\AddOn\\AddOn"},"XFMG":{"object":"XF\\AddOn\\AddOn"},"XFRM":{"object":"XF\\AddOn\\AddOn"}}},"getById":{"exists":true,"public":true,"required":1,"total":1},"getInstalledAddOns":{"exists":true,"public":true,"required":0,"total":0,"value":{"Newfi/Dogs":{"object":"XF\\AddOn\\AddOn"},"Newfi/Events":{"object":"XF\\AddOn\\AddOn"},"Newfi/Portal":{"object":"XF\\AddOn\\AddOn"},"XFMG":{"object":"XF\\AddOn\\AddOn"},"XFRM":{"object":"XF\\AddOn\\AddOn"}}}},"registry":{"type":"object"},"registry_rows":[{"bytes":187,"contains_gram":true,"data_key":"addOns","sha256":"dca4ff8a040ff5651348c60446b8983b7bc1372d3403ee249da526c679c966e4"},{"bytes":6,"contains_gram":false,"data_key":"addOnsComposer","sha256":"35786c7117b4e38d0f169239752ce71158266ae2f6e4aa230fbbb87bd699c0e3"}]},"state_after":{"addon_columns":["addon_id","title","version_string","version_id","json_hash","active","is_legacy","is_processing","last_pending_action"],"addon_object":{"canUninstall":{"exists":true,"public":true,"required":0,"total":0,"value":false},"class":"XF\\AddOn\\AddOn","getAddOnId":{"exists":true,"public":true,"required":0,"total":0,"value":"Gram/Support"},"getInstalledAddOnVersion":{"exists":false},"getInstalledVersion":{"exists":false},"getLastPendingAction":{"exists":false},"getPendingAction":{"exists":false},"getTitle":{"exists":false},"isActive":{"exists":true,"public":true,"required":0,"total":0,"value":false},"isInstalled":{"exists":true,"public":true,"required":0,"total":0,"value":false},"isProcessing":{"exists":false},"present":true},"addon_row":{"active":"1","addon_id":"Gram/Support","is_legacy":"0","is_processing":"1","json_hash":"f3804541014a3dfde3b35323475c5dbcbb72ebb0d0c319d66385e9203628724d","last_pending_action":"install:1","title":"Gram Support","version_id":"1000050","version_string":"1.0.0 Alpha 3 Unified Fix 3"},"board_active":"0","error_max":45,"errors_after_45":0,"manager":{"class":"XF\\AddOn\\Manager","getAllAddOns":{"exists":true,"public":true,"required":0,"total":0,"value":{"Gram/Support":{"object":"XF\\AddOn\\AddOn"},"Newfi/Dogs":{"object":"XF\\AddOn\\AddOn"},"Newfi/Events":{"object":"XF\\AddOn\\AddOn"},"Newfi/Portal":{"object":"XF\\AddOn\\AddOn"},"XFMG":{"object":"XF\\AddOn\\AddOn"},"XFRM":{"object":"XF\\AddOn\\AddOn"}}},"getById":{"exists":true,"public":true,"required":1,"total":1},"getInstalledAddOns":{"exists":true,"public":true,"required":0,"total":0,"value":{"Newfi/Dogs":{"object":"XF\\AddOn\\AddOn"},"Newfi/Events":{"object":"XF\\AddOn\\AddOn"},"Newfi/Portal":{"object":"XF\\AddOn\\AddOn"},"XFMG":{"object":"XF\\AddOn\\AddOn"},"XFRM":{"object":"XF\\AddOn\\AddOn"}}}},"registry":{"type":"object"},"registry_rows":[{"bytes":187,"contains_gram":true,"data_key":"addOns","sha256":"dca4ff8a040ff5651348c60446b8983b7bc1372d3403ee249da526c679c966e4"},{"bytes":6,"contains_gram":false,"data_key":"addOnsComposer","sha256":"35786c7117b4e38d0f169239752ce71158266ae2f6e4aa230fbbb87bd699c0e3"}]},"status":"OK","uninstall_help":{"lines":["Description:","Uninstalls the specified add-on","Usage:","xf:addon-uninstall [options] [--] <id>","xf-addon:uninstall","Arguments:","id                    Add-On ID","Options:","-f, --force           Skip verifying that the add-on is uninstallable","-h, --help            Display help for the given command. When no command is given display help for the list command","-q, --quiet           Do not output any message","-V, --version         Display this application version","--ansi|--no-ansi  Force (or disable --no-ansi) ANSI output","-n, --no-interaction  Do not ask any interactive question","-v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug"],"rc":0,"stderr_sha256":""}}
SUPPORT066_HOLDS=[]
SUPPORT066_DECISION=NARROW_PROCESSING_STATE_CAPTURED
SUPPORT066_MUTATION_SCOPE=NONE_READ_ONLY
HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260909-GRAM-XF-PROCESSING-NARROW-066","rollback_restored":null,"rollback_started":false,"status":"OK","version":1}
SUPPORT066_END

OUTPUT_END
CHAT_OUTPUT_END
