diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1560,6 +1560,7 @@ 'HeraldRuleIndexEngineExtension' => 'applications/herald/engineextension/HeraldRuleIndexEngineExtension.php', 'HeraldRuleListController' => 'applications/herald/controller/HeraldRuleListController.php', 'HeraldRuleListView' => 'applications/herald/view/HeraldRuleListView.php', + 'HeraldRuleManagementWorkflow' => 'applications/herald/management/HeraldRuleManagementWorkflow.php', 'HeraldRuleNameTransaction' => 'applications/herald/xaction/HeraldRuleNameTransaction.php', 'HeraldRulePHIDType' => 'applications/herald/phid/HeraldRulePHIDType.php', 'HeraldRuleQuery' => 'applications/herald/query/HeraldRuleQuery.php', @@ -7381,6 +7382,7 @@ 'HeraldRuleIndexEngineExtension' => 'PhabricatorEdgeIndexEngineExtension', 'HeraldRuleListController' => 'HeraldController', 'HeraldRuleListView' => 'AphrontView', + 'HeraldRuleManagementWorkflow' => 'HeraldManagementWorkflow', 'HeraldRuleNameTransaction' => 'HeraldRuleTransactionType', 'HeraldRulePHIDType' => 'PhabricatorPHIDType', 'HeraldRuleQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', diff --git a/src/applications/herald/management/HeraldRuleManagementWorkflow.php b/src/applications/herald/management/HeraldRuleManagementWorkflow.php new file mode 100644 --- /dev/null +++ b/src/applications/herald/management/HeraldRuleManagementWorkflow.php @@ -0,0 +1,106 @@ +setName('rule') + ->setExamples('**rule** --rule __rule__ --disable') + ->setSynopsis( + pht( + 'Modify a rule, bypassing policies. This workflow can disable '. + 'problematic personal rules.')) + ->setArguments( + array( + array( + 'name' => 'rule', + 'param' => 'rule', + 'help' => pht('Apply changes to this rule.'), + ), + array( + 'name' => 'disable', + 'help' => pht('Disable the rule.'), + ), + array( + 'name' => 'enable', + 'help' => pht('Enable the rule.'), + ), + )); + } + + public function execute(PhutilArgumentParser $args) { + $viewer = $this->getViewer(); + + $rule_name = $args->getArg('rule'); + if (!strlen($rule_name)) { + throw new PhutilArgumentUsageException( + pht('Specify a rule to edit with "--rule ".')); + } + + if (preg_match('/^H\d+/', $rule_name)) { + $rule_id = substr($rule_name, 1); + } else { + $rule_id = $rule_name; + } + + $rule = id(new HeraldRuleQuery()) + ->setViewer($viewer) + ->withIDs(array($rule_id)) + ->executeOne(); + if (!$rule) { + throw new PhutilArgumentUsageException( + pht( + 'Unable to load Herald rule with ID or monogram "%s".', + $rule_name)); + } + + $is_disable = $args->getArg('disable'); + $is_enable = $args->getArg('enable'); + + $xactions = array(); + + if ($is_disable && $is_enable) { + throw new PhutilArgumentUsageException( + pht( + 'Specify "--enable" or "--disable", but not both.')); + } else if ($is_disable || $is_enable) { + $xactions[] = $rule->getApplicationTransactionTemplate() + ->setTransactionType(HeraldRuleDisableTransaction::TRANSACTIONTYPE) + ->setNewValue($is_disable); + } + + if (!$xactions) { + throw new PhutilArgumentUsageException( + pht( + 'Use flags to specify at least one edit to apply to the '. + 'rule (for example, use "--disable" to disable a rule).')); + } + + $herald_phid = id(new PhabricatorHeraldApplication())->getPHID(); + + $editor = $rule->getApplicationTransactionEditor() + ->setActor($viewer) + ->setActingAsPHID($herald_phid) + ->setContentSource($this->newContentSource()) + ->setContinueOnMissingFields(true) + ->setContinueOnNoEffect(true); + + echo tsprintf( + "%s\n", + pht( + 'Applying changes to %s: %s...', + $rule->getMonogram(), + $rule->getName())); + + $editor->applyTransactions($rule, $xactions); + + echo tsprintf( + "%s\n", + pht('Done.')); + + + return 0; + } + +}