@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Move most Herald actions and values into dynamic adapters

Summary: Ref T2769. Shift the bulk of value and action config into Adapters.

Test Plan: Viewed and edited Herald list and rules.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran, vrana

Maniphest Tasks: T2769

Differential Revision: https://secure.phabricator.com/D6660

+226 -127
-1
src/__phutil_library_map__.php
··· 635 635 'HeraldTranscript' => 'applications/herald/storage/transcript/HeraldTranscript.php', 636 636 'HeraldTranscriptController' => 'applications/herald/controller/HeraldTranscriptController.php', 637 637 'HeraldTranscriptListController' => 'applications/herald/controller/HeraldTranscriptListController.php', 638 - 'HeraldValueTypeConfig' => 'applications/herald/config/HeraldValueTypeConfig.php', 639 638 'Javelin' => 'infrastructure/javelin/Javelin.php', 640 639 'JavelinReactorExample' => 'applications/uiexample/examples/JavelinReactorExample.php', 641 640 'JavelinUIExample' => 'applications/uiexample/examples/JavelinUIExample.php',
+158 -17
src/applications/herald/adapter/HeraldAdapter.php
··· 16 16 const FIELD_AFFECTED_PACKAGE = 'affected-package'; 17 17 const FIELD_AFFECTED_PACKAGE_OWNER = 'affected-package-owner'; 18 18 19 - const CONDITION_CONTAINS = 'contains'; 20 - const CONDITION_NOT_CONTAINS = '!contains'; 21 - const CONDITION_IS = 'is'; 22 - const CONDITION_IS_NOT = '!is'; 23 - const CONDITION_IS_ANY = 'isany'; 24 - const CONDITION_IS_NOT_ANY = '!isany'; 25 - const CONDITION_INCLUDE_ALL = 'all'; 26 - const CONDITION_INCLUDE_ANY = 'any'; 27 - const CONDITION_INCLUDE_NONE = 'none'; 28 - const CONDITION_IS_ME = 'me'; 29 - const CONDITION_IS_NOT_ME = '!me'; 30 - const CONDITION_REGEXP = 'regexp'; 31 - const CONDITION_RULE = 'conditions'; 32 - const CONDITION_NOT_RULE = '!conditions'; 33 - const CONDITION_EXISTS = 'exists'; 34 - const CONDITION_NOT_EXISTS = '!exists'; 35 - const CONDITION_REGEXP_PAIR = 'regexp-pair'; 19 + const CONDITION_CONTAINS = 'contains'; 20 + const CONDITION_NOT_CONTAINS = '!contains'; 21 + const CONDITION_IS = 'is'; 22 + const CONDITION_IS_NOT = '!is'; 23 + const CONDITION_IS_ANY = 'isany'; 24 + const CONDITION_IS_NOT_ANY = '!isany'; 25 + const CONDITION_INCLUDE_ALL = 'all'; 26 + const CONDITION_INCLUDE_ANY = 'any'; 27 + const CONDITION_INCLUDE_NONE = 'none'; 28 + const CONDITION_IS_ME = 'me'; 29 + const CONDITION_IS_NOT_ME = '!me'; 30 + const CONDITION_REGEXP = 'regexp'; 31 + const CONDITION_RULE = 'conditions'; 32 + const CONDITION_NOT_RULE = '!conditions'; 33 + const CONDITION_EXISTS = 'exists'; 34 + const CONDITION_NOT_EXISTS = '!exists'; 35 + const CONDITION_REGEXP_PAIR = 'regexp-pair'; 36 + 37 + const ACTION_ADD_CC = 'addcc'; 38 + const ACTION_REMOVE_CC = 'remcc'; 39 + const ACTION_EMAIL = 'email'; 40 + const ACTION_NOTHING = 'nothing'; 41 + const ACTION_AUDIT = 'audit'; 42 + const ACTION_FLAG = 'flag'; 43 + 44 + const VALUE_TEXT = 'text'; 45 + const VALUE_NONE = 'none'; 46 + const VALUE_EMAIL = 'email'; 47 + const VALUE_USER = 'user'; 48 + const VALUE_TAG = 'tag'; 49 + const VALUE_RULE = 'rule'; 50 + const VALUE_REPOSITORY = 'repository'; 51 + const VALUE_OWNERS_PACKAGE = 'package'; 52 + const VALUE_PROJECT = 'project'; 53 + const VALUE_FLAG_COLOR = 'flagcolor'; 36 54 37 55 abstract public function getPHID(); 38 56 abstract public function getHeraldName(); ··· 53 71 } 54 72 55 73 abstract public function getAdapterContentName(); 74 + 75 + 76 + /* -( Fields )------------------------------------------------------------- */ 77 + 78 + 56 79 abstract public function getFields(); 57 80 58 81 public function getFieldNameMap() { ··· 73 96 pht("Any affected package's owner"), 74 97 ); 75 98 } 99 + 100 + 101 + /* -( Conditions )--------------------------------------------------------- */ 102 + 76 103 77 104 public function getConditionNameMap() { 78 105 return array( ··· 147 174 default: 148 175 throw new Exception( 149 176 "This adapter does not define conditions for field '{$field}'!"); 177 + } 178 + } 179 + 180 + 181 + /* -( Actions )------------------------------------------------------------ */ 182 + 183 + abstract public function getActions($rule_type); 184 + 185 + public function getActionNameMap($rule_type) { 186 + switch ($rule_type) { 187 + case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: 188 + return array( 189 + self::ACTION_NOTHING => pht('Do nothing'), 190 + self::ACTION_ADD_CC => pht('Add emails to CC'), 191 + self::ACTION_REMOVE_CC => pht('Remove emails from CC'), 192 + self::ACTION_EMAIL => pht('Send an email to'), 193 + self::ACTION_AUDIT => pht('Trigger an Audit by'), 194 + ); 195 + case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: 196 + return array( 197 + self::ACTION_NOTHING => pht('Do nothing'), 198 + self::ACTION_ADD_CC => pht('Add me to CC'), 199 + self::ACTION_REMOVE_CC => pht('Remove me from CC'), 200 + self::ACTION_EMAIL => pht('Send me an email'), 201 + self::ACTION_AUDIT => pht('Trigger an Audit by me'), 202 + self::ACTION_FLAG => pht('Mark with flag'), 203 + ); 204 + default: 205 + throw new Exception("Unknown rule type '{$rule_type}'!"); 206 + } 207 + } 208 + 209 + 210 + /* -( Values )------------------------------------------------------------- */ 211 + 212 + 213 + public function getValueTypeForFieldAndCondition($field, $condition) { 214 + switch ($condition) { 215 + case self::CONDITION_CONTAINS: 216 + case self::CONDITION_NOT_CONTAINS: 217 + case self::CONDITION_IS: 218 + case self::CONDITION_IS_NOT: 219 + case self::CONDITION_REGEXP: 220 + case self::CONDITION_REGEXP_PAIR: 221 + return self::VALUE_TEXT; 222 + case self::CONDITION_IS_ANY: 223 + case self::CONDITION_IS_NOT_ANY: 224 + switch ($field) { 225 + case self::FIELD_REPOSITORY: 226 + return self::VALUE_REPOSITORY; 227 + default: 228 + return self::VALUE_USER; 229 + } 230 + break; 231 + case self::CONDITION_INCLUDE_ALL: 232 + case self::CONDITION_INCLUDE_ANY: 233 + case self::CONDITION_INCLUDE_NONE: 234 + switch ($field) { 235 + case self::FIELD_REPOSITORY: 236 + return self::VALUE_REPOSITORY; 237 + case self::FIELD_CC: 238 + return self::VALUE_EMAIL; 239 + case self::FIELD_TAGS: 240 + return self::VALUE_TAG; 241 + case self::FIELD_AFFECTED_PACKAGE: 242 + return self::VALUE_OWNERS_PACKAGE; 243 + default: 244 + return self::VALUE_USER; 245 + } 246 + break; 247 + case self::CONDITION_IS_ME: 248 + case self::CONDITION_IS_NOT_ME: 249 + case self::CONDITION_EXISTS: 250 + case self::CONDITION_NOT_EXISTS: 251 + return self::VALUE_NONE; 252 + case self::CONDITION_RULE: 253 + case self::CONDITION_NOT_RULE: 254 + return self::VALUE_RULE; 255 + default: 256 + throw new Exception("Unknown condition '{$condition}'."); 257 + } 258 + } 259 + 260 + public static function getValueTypeForAction($action, $rule_type) { 261 + $is_personal = ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); 262 + 263 + if ($is_personal) { 264 + switch ($action) { 265 + case self::ACTION_ADD_CC: 266 + case self::ACTION_REMOVE_CC: 267 + case self::ACTION_EMAIL: 268 + case self::ACTION_NOTHING: 269 + case self::ACTION_AUDIT: 270 + return self::VALUE_NONE; 271 + case self::ACTION_FLAG: 272 + return self::VALUE_FLAG_COLOR; 273 + default: 274 + throw new Exception("Unknown or invalid action '{$action}'."); 275 + } 276 + } else { 277 + switch ($action) { 278 + case self::ACTION_ADD_CC: 279 + case self::ACTION_REMOVE_CC: 280 + case self::ACTION_EMAIL: 281 + return self::VALUE_EMAIL; 282 + case self::ACTION_NOTHING: 283 + return self::VALUE_NONE; 284 + case self::ACTION_AUDIT: 285 + return self::VALUE_PROJECT; 286 + case self::ACTION_FLAG: 287 + return self::VALUE_FLAG_COLOR; 288 + default: 289 + throw new Exception("Unknown or invalid action '{$action}'."); 290 + } 150 291 } 151 292 } 152 293
+30
src/applications/herald/adapter/HeraldCommitAdapter.php
··· 86 86 return parent::getConditionsForField($field); 87 87 } 88 88 89 + public function getActions($rule_type) { 90 + switch ($rule_type) { 91 + case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: 92 + return array( 93 + self::ACTION_ADD_CC, 94 + self::ACTION_REMOVE_CC, 95 + self::ACTION_EMAIL, 96 + self::ACTION_NOTHING, 97 + ); 98 + case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: 99 + return array( 100 + self::ACTION_ADD_CC, 101 + self::ACTION_REMOVE_CC, 102 + self::ACTION_EMAIL, 103 + self::ACTION_NOTHING, 104 + ); 105 + } 106 + } 107 + 108 + public function getValueTypeForFieldAndCondition($field, $condition) { 109 + switch ($field) { 110 + case self::FIELD_DIFFERENTIAL_CCS: 111 + return self::VALUE_EMAIL; 112 + case self::FIELD_NEED_AUDIT_FOR_PACKAGE: 113 + return self::VALUE_OWNERS_PACKAGE; 114 + } 115 + 116 + return parent::getValueTypeForFieldAndCondition($field, $condition); 117 + } 118 + 89 119 public static function newLegacyAdapter( 90 120 PhabricatorRepository $repository, 91 121 PhabricatorRepositoryCommit $commit,
+19
src/applications/herald/adapter/HeraldDifferentialRevisionAdapter.php
··· 242 242 } 243 243 } 244 244 245 + public function getActions($rule_type) { 246 + switch ($rule_type) { 247 + case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: 248 + return array( 249 + self::ACTION_ADD_CC, 250 + self::ACTION_REMOVE_CC, 251 + self::ACTION_EMAIL, 252 + self::ACTION_NOTHING, 253 + ); 254 + case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: 255 + return array( 256 + self::ACTION_ADD_CC, 257 + self::ACTION_REMOVE_CC, 258 + self::ACTION_EMAIL, 259 + self::ACTION_NOTHING, 260 + ); 261 + } 262 + } 263 + 245 264 public function applyHeraldEffects(array $effects) { 246 265 assert_instances_of($effects, 'HeraldEffect'); 247 266
+4
src/applications/herald/adapter/HeraldDryRunAdapter.php
··· 30 30 return array(); 31 31 } 32 32 33 + public function getActions($rule_type) { 34 + return array(); 35 + } 36 + 33 37 public function applyHeraldEffects(array $effects) { 34 38 assert_instances_of($effects, 'HeraldEffect'); 35 39 $results = array();
+2
src/applications/herald/config/HeraldActionConfig.php
··· 9 9 const ACTION_AUDIT = 'audit'; 10 10 const ACTION_FLAG = 'flag'; 11 11 12 + // TODO: Remove; still used by transcripts. 12 13 public static function getActionMessageMapForRuleType($rule_type) { 13 14 $generic_mappings = array( 14 15 self::ACTION_NOTHING => pht('Do nothing'), ··· 43 44 return $specific_mappings + $generic_mappings; 44 45 } 45 46 47 + // TODO: Remove; still used by transcripts. 46 48 public static function getActionMessageMap($content_type, 47 49 $rule_type) { 48 50 $map = self::getActionMessageMapForRuleType($rule_type);
-98
src/applications/herald/config/HeraldValueTypeConfig.php
··· 1 - <?php 2 - 3 - final class HeraldValueTypeConfig { 4 - 5 - const VALUE_TEXT = 'text'; 6 - const VALUE_NONE = 'none'; 7 - const VALUE_EMAIL = 'email'; 8 - const VALUE_USER = 'user'; 9 - const VALUE_TAG = 'tag'; 10 - const VALUE_RULE = 'rule'; 11 - const VALUE_REPOSITORY = 'repository'; 12 - const VALUE_OWNERS_PACKAGE = 'package'; 13 - const VALUE_PROJECT = 'project'; 14 - const VALUE_FLAG_COLOR = 'flagcolor'; 15 - 16 - public static function getValueTypeForFieldAndCondition($field, $condition) { 17 - switch ($condition) { 18 - case HeraldConditionConfig::CONDITION_CONTAINS: 19 - case HeraldConditionConfig::CONDITION_NOT_CONTAINS: 20 - case HeraldConditionConfig::CONDITION_IS: 21 - case HeraldConditionConfig::CONDITION_IS_NOT: 22 - case HeraldConditionConfig::CONDITION_REGEXP: 23 - case HeraldConditionConfig::CONDITION_REGEXP_PAIR: 24 - return self::VALUE_TEXT; 25 - case HeraldConditionConfig::CONDITION_IS_ANY: 26 - case HeraldConditionConfig::CONDITION_IS_NOT_ANY: 27 - switch ($field) { 28 - case HeraldFieldConfig::FIELD_REPOSITORY: 29 - return self::VALUE_REPOSITORY; 30 - default: 31 - return self::VALUE_USER; 32 - } 33 - break; 34 - case HeraldConditionConfig::CONDITION_INCLUDE_ALL: 35 - case HeraldConditionConfig::CONDITION_INCLUDE_ANY: 36 - case HeraldConditionConfig::CONDITION_INCLUDE_NONE: 37 - switch ($field) { 38 - case HeraldFieldConfig::FIELD_REPOSITORY: 39 - return self::VALUE_REPOSITORY; 40 - case HeraldFieldConfig::FIELD_CC: 41 - case HeraldFieldConfig::FIELD_DIFFERENTIAL_CCS: 42 - return self::VALUE_EMAIL; 43 - case HeraldFieldConfig::FIELD_TAGS: 44 - return self::VALUE_TAG; 45 - case HeraldFieldConfig::FIELD_AFFECTED_PACKAGE: 46 - case HeraldFieldConfig::FIELD_NEED_AUDIT_FOR_PACKAGE: 47 - return self::VALUE_OWNERS_PACKAGE; 48 - default: 49 - return self::VALUE_USER; 50 - } 51 - break; 52 - case HeraldConditionConfig::CONDITION_IS_ME: 53 - case HeraldConditionConfig::CONDITION_IS_NOT_ME: 54 - case HeraldConditionConfig::CONDITION_EXISTS: 55 - case HeraldConditionConfig::CONDITION_NOT_EXISTS: 56 - return self::VALUE_NONE; 57 - case HeraldConditionConfig::CONDITION_RULE: 58 - case HeraldConditionConfig::CONDITION_NOT_RULE: 59 - return self::VALUE_RULE; 60 - default: 61 - throw new Exception("Unknown condition."); 62 - } 63 - } 64 - 65 - public static function getValueTypeForAction($action, $rule_type) { 66 - $is_personal = ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); 67 - 68 - if ($is_personal) { 69 - switch ($action) { 70 - case HeraldActionConfig::ACTION_ADD_CC: 71 - case HeraldActionConfig::ACTION_REMOVE_CC: 72 - case HeraldActionConfig::ACTION_EMAIL: 73 - case HeraldActionConfig::ACTION_NOTHING: 74 - case HeraldActionConfig::ACTION_AUDIT: 75 - return self::VALUE_NONE; 76 - case HeraldActionConfig::ACTION_FLAG: 77 - return self::VALUE_FLAG_COLOR; 78 - default: 79 - throw new Exception("Unknown or invalid action '{$action}'."); 80 - } 81 - } else { 82 - switch ($action) { 83 - case HeraldActionConfig::ACTION_ADD_CC: 84 - case HeraldActionConfig::ACTION_REMOVE_CC: 85 - case HeraldActionConfig::ACTION_EMAIL: 86 - return self::VALUE_EMAIL; 87 - case HeraldActionConfig::ACTION_NOTHING: 88 - return self::VALUE_NONE; 89 - case HeraldActionConfig::ACTION_AUDIT: 90 - return self::VALUE_PROJECT; 91 - case HeraldActionConfig::ACTION_FLAG: 92 - return self::VALUE_FLAG_COLOR; 93 - default: 94 - throw new Exception("Unknown or invalid action '{$action}'."); 95 - } 96 - } 97 - } 98 - }
+13 -11
src/applications/herald/controller/HeraldRuleController.php
··· 389 389 390 390 $all_fields = $adapter->getFieldNameMap(); 391 391 $all_conditions = $adapter->getConditionNameMap(); 392 + $all_actions = $adapter->getActionNameMap($rule->getRuleType()); 392 393 393 394 $fields = $adapter->getFields(); 394 395 $field_map = array_select_keys($all_fields, $fields); 395 396 397 + $actions = $adapter->getActions($rule->getRuleType()); 398 + $action_map = array_select_keys($all_actions, $actions); 399 + 396 400 $config_info = array(); 397 401 $config_info['fields'] = $field_map; 398 402 $config_info['conditions'] = $all_conditions; 403 + $config_info['actions'] = $action_map; 404 + 399 405 foreach ($config_info['fields'] as $field => $name) { 400 406 $field_conditions = $adapter->getConditionsForField($field); 401 407 $config_info['conditionMap'][$field] = $field_conditions; ··· 403 409 404 410 foreach ($config_info['fields'] as $field => $fname) { 405 411 foreach ($config_info['conditionMap'][$field] as $condition) { 406 - $config_info['values'][$field][$condition] = 407 - HeraldValueTypeConfig::getValueTypeForFieldAndCondition( 408 - $field, 409 - $condition); 412 + $value_type = $adapter->getValueTypeForFieldAndCondition( 413 + $field, 414 + $condition); 415 + $config_info['values'][$field][$condition] = $value_type; 410 416 } 411 417 } 412 - 413 - $config_info['actions'] = 414 - HeraldActionConfig::getActionMessageMap($rule->getContentType(), 415 - $rule->getRuleType()); 416 418 417 419 $config_info['rule_type'] = $rule->getRuleType(); 418 420 419 421 foreach ($config_info['actions'] as $action => $name) { 420 - $config_info['targets'][$action] = 421 - HeraldValueTypeConfig::getValueTypeForAction($action, 422 - $rule->getRuleType()); 422 + $config_info['targets'][$action] = $adapter->getValueTypeForAction( 423 + $action, 424 + $rule->getRuleType()); 423 425 } 424 426 425 427 Javelin::initBehavior(