@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.

Modularize the Diffusion "Add Auditors" Herald action

Ref T8726.

+365 -105
+13
resources/sql/autopatches/20150803.herald.1.sql
··· 1 + UPDATE {$NAMESPACE}_herald.herald_action a 2 + JOIN {$NAMESPACE}_herald.herald_rule r 3 + ON a.ruleID = r.id 4 + SET a.action = 'diffusion.auditors.add' 5 + WHERE r.ruleType != 'personal' 6 + AND a.action = 'audit'; 7 + 8 + UPDATE {$NAMESPACE}_herald.herald_action a 9 + JOIN {$NAMESPACE}_herald.herald_rule r 10 + ON a.ruleID = r.id 11 + SET a.action = 'diffusion.auditors.self.add' 12 + WHERE r.ruleType = 'personal' 13 + AND a.action = 'audit';
+6
src/__phutil_library_map__.php
··· 498 498 'DifferentialUpdateUnitResultsConduitAPIMethod' => 'applications/differential/conduit/DifferentialUpdateUnitResultsConduitAPIMethod.php', 499 499 'DifferentialViewPolicyField' => 'applications/differential/customfield/DifferentialViewPolicyField.php', 500 500 'DiffusionAuditorDatasource' => 'applications/diffusion/typeahead/DiffusionAuditorDatasource.php', 501 + 'DiffusionAuditorsAddAuditorsHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsAddAuditorsHeraldAction.php', 502 + 'DiffusionAuditorsAddSelfHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsAddSelfHeraldAction.php', 503 + 'DiffusionAuditorsHeraldAction' => 'applications/diffusion/herald/DiffusionAuditorsHeraldAction.php', 501 504 'DiffusionBranchQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionBranchQueryConduitAPIMethod.php', 502 505 'DiffusionBranchTableController' => 'applications/diffusion/controller/DiffusionBranchTableController.php', 503 506 'DiffusionBranchTableView' => 'applications/diffusion/view/DiffusionBranchTableView.php', ··· 4129 4132 'DifferentialUpdateUnitResultsConduitAPIMethod' => 'DifferentialConduitAPIMethod', 4130 4133 'DifferentialViewPolicyField' => 'DifferentialCoreCustomField', 4131 4134 'DiffusionAuditorDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 4135 + 'DiffusionAuditorsAddAuditorsHeraldAction' => 'DiffusionAuditorsHeraldAction', 4136 + 'DiffusionAuditorsAddSelfHeraldAction' => 'DiffusionAuditorsHeraldAction', 4137 + 'DiffusionAuditorsHeraldAction' => 'HeraldAction', 4132 4138 'DiffusionBranchQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 4133 4139 'DiffusionBranchTableController' => 'DiffusionController', 4134 4140 'DiffusionBranchTableView' => 'DiffusionView',
+1 -25
src/applications/audit/editor/PhabricatorAuditEditor.php
··· 877 877 HeraldAdapter $adapter, 878 878 HeraldTranscript $transcript) { 879 879 880 - $xactions = array(); 881 - 882 - $audit_phids = $adapter->getAuditMap(); 883 - foreach ($audit_phids as $phid => $rule_ids) { 884 - foreach ($rule_ids as $rule_id) { 885 - $this->addAuditReason( 886 - $phid, 887 - pht( 888 - '%s Triggered Audit', 889 - "H{$rule_id}")); 890 - } 891 - } 892 - 893 - if ($audit_phids) { 894 - $xactions[] = id(new PhabricatorAuditTransaction()) 895 - ->setTransactionType(PhabricatorAuditActionConstants::ADD_AUDITORS) 896 - ->setNewValue(array_fuse(array_keys($audit_phids))) 897 - ->setMetadataValue( 898 - 'auditStatus', 899 - PhabricatorAuditStatusConstants::AUDIT_REQUIRED) 900 - ->setMetadataValue( 901 - 'auditReasonMap', $this->auditReasonMap); 902 - } 903 - 904 880 $limit = self::MAX_FILES_SHOWN_IN_EMAIL; 905 881 $files = $adapter->loadAffectedPaths(); 906 882 sort($files); ··· 914 890 } 915 891 $this->affectedFiles = implode("\n", $files); 916 892 917 - return $xactions; 893 + return array(); 918 894 } 919 895 920 896 private function isCommitMostlyImported(PhabricatorLiskDAO $object) {
+1 -1
src/applications/differential/herald/DifferentialReviewersHeraldAction.php
··· 200 200 ); 201 201 } 202 202 203 - public function renderActionEffectDescription($type, $data) { 203 + protected function renderActionEffectDescription($type, $data) { 204 204 switch ($type) { 205 205 case self::DO_NO_TARGETS: 206 206 return pht('Rule lists no targets.');
+33
src/applications/diffusion/herald/DiffusionAuditorsAddAuditorsHeraldAction.php
··· 1 + <?php 2 + 3 + final class DiffusionAuditorsAddAuditorsHeraldAction 4 + extends DiffusionAuditorsHeraldAction { 5 + 6 + const ACTIONCONST = 'diffusion.auditors.add'; 7 + 8 + public function getHeraldActionName() { 9 + return pht('Add auditors'); 10 + } 11 + 12 + public function supportsRuleType($rule_type) { 13 + return ($rule_type != HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); 14 + } 15 + 16 + public function applyEffect($object, HeraldEffect $effect) { 17 + $rule = $effect->getRule(); 18 + return $this->applyAuditors($effect->getTarget(), $rule); 19 + } 20 + 21 + public function getHeraldActionStandardType() { 22 + return self::STANDARD_PHID_LIST; 23 + } 24 + 25 + protected function getDatasource() { 26 + return new DiffusionAuditorDatasource(); 27 + } 28 + 29 + public function renderActionDescription($value) { 30 + return pht('Add auditors: %s.', $this->renderHandleList($value)); 31 + } 32 + 33 + }
+30
src/applications/diffusion/herald/DiffusionAuditorsAddSelfHeraldAction.php
··· 1 + <?php 2 + 3 + final class DiffusionAuditorsAddSelfHeraldAction 4 + extends DiffusionAuditorsHeraldAction { 5 + 6 + const ACTIONCONST = 'diffusion.auditors.self.add'; 7 + 8 + public function getHeraldActionName() { 9 + return pht('Add me as an auditor'); 10 + } 11 + 12 + public function supportsRuleType($rule_type) { 13 + return ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); 14 + } 15 + 16 + public function applyEffect($object, HeraldEffect $effect) { 17 + $rule = $effect->getRule(); 18 + $phid = $rule->getAuthorPHID(); 19 + return $this->applyAuditors(array($phid), $rule); 20 + } 21 + 22 + public function getHeraldActionStandardType() { 23 + return self::STANDARD_NONE; 24 + } 25 + 26 + public function renderActionDescription($value) { 27 + return pht('Add rule author as auditor.'); 28 + } 29 + 30 + }
+76
src/applications/diffusion/herald/DiffusionAuditorsHeraldAction.php
··· 1 + <?php 2 + 3 + abstract class DiffusionAuditorsHeraldAction 4 + extends HeraldAction { 5 + 6 + const DO_ADD_AUDITORS = 'do.add-auditors'; 7 + 8 + public function getActionGroupKey() { 9 + return HeraldApplicationActionGroup::ACTIONGROUPKEY; 10 + } 11 + 12 + public function supportsObject($object) { 13 + return ($object instanceof PhabricatorRepositoryCommit); 14 + } 15 + 16 + protected function applyAuditors(array $phids, HeraldRule $rule) { 17 + $adapter = $this->getAdapter(); 18 + $object = $adapter->getObject(); 19 + 20 + $auditors = $object->getAudits(); 21 + $auditors = mpull($auditors, null, 'getAuditorPHID'); 22 + $current = array_keys($auditors); 23 + 24 + $allowed_types = array( 25 + PhabricatorPeopleUserPHIDType::TYPECONST, 26 + PhabricatorProjectProjectPHIDType::TYPECONST, 27 + PhabricatorOwnersPackagePHIDType::TYPECONST, 28 + ); 29 + 30 + $targets = $this->loadStandardTargets($phids, $allowed_types, $current); 31 + if (!$targets) { 32 + return; 33 + } 34 + 35 + $phids = array_fuse(array_keys($targets)); 36 + 37 + // TODO: Convert this to be translatable, structured data eventually. 38 + $reason_map = array(); 39 + foreach ($phids as $phid) { 40 + $reason_map[$phid][] = pht('%s Triggered Audit', $rule->getMonogram()); 41 + } 42 + 43 + $xaction = $adapter->newTransaction() 44 + ->setTransactionType(PhabricatorAuditActionConstants::ADD_AUDITORS) 45 + ->setNewValue($phids) 46 + ->setMetadataValue( 47 + 'auditStatus', 48 + PhabricatorAuditStatusConstants::AUDIT_REQUIRED) 49 + ->setMetadataValue('auditReasonMap', $reason_map); 50 + 51 + $adapter->queueTransaction($xaction); 52 + 53 + $this->logEffect(self::DO_ADD_AUDITORS, $phids); 54 + } 55 + 56 + protected function getActionEffectMap() { 57 + return array( 58 + self::DO_ADD_AUDITORS => array( 59 + 'icon' => 'fa-user', 60 + 'color' => 'green', 61 + 'name' => pht('Added Auditors'), 62 + ), 63 + ); 64 + } 65 + 66 + protected function renderActionEffectDescription($type, $data) { 67 + switch ($type) { 68 + case self::DO_ADD_AUDITORS: 69 + return pht( 70 + 'Added %s auditor(s): %s.', 71 + new PhutilNumber(count($data)), 72 + $this->renderHandleList($data)); 73 + } 74 + } 75 + 76 + }
-51
src/applications/diffusion/herald/HeraldCommitAdapter.php
··· 12 12 protected $commitData; 13 13 private $commitDiff; 14 14 15 - protected $auditMap = array(); 16 - 17 15 protected $affectedPaths; 18 16 protected $affectedRevision; 19 17 protected $affectedPackages; ··· 86 84 return pht('This rule can trigger for **repositories** and **projects**.'); 87 85 } 88 86 89 - public function getActions($rule_type) { 90 - switch ($rule_type) { 91 - case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: 92 - case HeraldRuleTypeConfig::RULE_TYPE_OBJECT: 93 - return array_merge( 94 - array( 95 - self::ACTION_AUDIT, 96 - ), 97 - parent::getActions($rule_type)); 98 - case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: 99 - return array_merge( 100 - array( 101 - self::ACTION_AUDIT, 102 - ), 103 - parent::getActions($rule_type)); 104 - } 105 - } 106 - 107 87 public static function newLegacyAdapter( 108 88 PhabricatorRepository $repository, 109 89 PhabricatorRepositoryCommit $commit, ··· 147 127 $this->commitData = $data; 148 128 149 129 return $this; 150 - } 151 - 152 - public function getAuditMap() { 153 - return $this->auditMap; 154 130 } 155 131 156 132 public function getHeraldName() { ··· 319 295 $result[$change->getFilename()] = implode("\n", $lines); 320 296 } 321 297 322 - return $result; 323 - } 324 - 325 - public function applyHeraldEffects(array $effects) { 326 - assert_instances_of($effects, 'HeraldEffect'); 327 - 328 - $result = array(); 329 - foreach ($effects as $effect) { 330 - $action = $effect->getAction(); 331 - switch ($action) { 332 - case self::ACTION_AUDIT: 333 - foreach ($effect->getTarget() as $phid) { 334 - if (empty($this->auditMap[$phid])) { 335 - $this->auditMap[$phid] = array(); 336 - } 337 - $this->auditMap[$phid][] = $effect->getRule()->getID(); 338 - } 339 - $result[] = new HeraldApplyTranscript( 340 - $effect, 341 - true, 342 - pht('Triggered an audit.')); 343 - break; 344 - default: 345 - $result[] = $this->applyStandardEffect($effect); 346 - break; 347 - } 348 - } 349 298 return $result; 350 299 } 351 300
+1 -1
src/applications/flag/herald/PhabricatorFlagAddFlagHeraldAction.php
··· 72 72 return pht('Mark with %s flag.', $color); 73 73 } 74 74 75 - public function renderActionEffectDescription($type, $data) { 75 + protected function renderActionEffectDescription($type, $data) { 76 76 switch ($type) { 77 77 case self::DO_IGNORE: 78 78 return pht(
+3 -3
src/applications/harbormaster/herald/HarbormasterRunBuildPlansHeraldAction.php
··· 68 68 'color' => 'red', 69 69 'name' => pht('Invalid Targets'), 70 70 ), 71 - self::DO_ALREADY_REQUIRED => array( 71 + self::DO_BUILD => array( 72 72 'icon' => 'fa-play', 73 73 'color' => 'green', 74 74 'name' => pht('Building'), ··· 76 76 ); 77 77 } 78 78 79 - public function renderActionEffectDescription($type, $data) { 79 + protected function renderActionEffectDescription($type, $data) { 80 80 switch ($type) { 81 81 case self::DO_NO_TARGETS: 82 82 return pht('Rule lists no targets.'); ··· 85 85 '%s build plan(s) are not valid: %s.', 86 86 new PhutilNumber(count($data)), 87 87 $this->renderHandleList($data)); 88 - case self::DO_REQUIRED: 88 + case self::DO_BUILD: 89 89 return pht( 90 90 'Started %s build(s): %s.', 91 91 new PhutilNumber(count($data)),
+183 -5
src/applications/herald/action/HeraldAction.php
··· 9 9 const STANDARD_NONE = 'standard.none'; 10 10 const STANDARD_PHID_LIST = 'standard.phid.list'; 11 11 12 + const DO_STANDARD_EMPTY = 'do.standard.empty'; 13 + const DO_STANDARD_NO_EFFECT = 'do.standard.no-effect'; 14 + const DO_STANDARD_INVALID = 'do.standard.invalid'; 15 + const DO_STANDARD_UNLOADABLE = 'do.standard.unloadable'; 16 + const DO_STANDARD_PERMISSION = 'do.standard.permission'; 17 + 12 18 abstract public function getHeraldActionName(); 13 19 abstract public function supportsObject($object); 14 20 abstract public function supportsRuleType($rule_type); 15 21 abstract public function applyEffect($object, HeraldEffect $effect); 16 - abstract public function renderActionEffectDescription($type, $data); 22 + 23 + protected function renderActionEffectDescription($type, $data) { 24 + return null; 25 + } 17 26 18 27 public function getActionGroupKey() { 19 28 return null; ··· 154 163 } 155 164 156 165 private function getActionEffectSpec($type) { 157 - $map = $this->getActionEffectMap(); 166 + $map = $this->getActionEffectMap() + $this->getStandardEffectMap(); 158 167 return idx($map, $type, array()); 159 168 } 160 169 161 - public function renderActionEffectIcon($type, $data) { 170 + final public function renderActionEffectIcon($type, $data) { 162 171 $map = $this->getActionEffectSpec($type); 163 172 return idx($map, 'icon'); 164 173 } 165 174 166 - public function renderActionEffectColor($type, $data) { 175 + final public function renderActionEffectColor($type, $data) { 167 176 $map = $this->getActionEffectSpec($type); 168 177 return idx($map, 'color'); 169 178 } 170 179 171 - public function renderActionEffectName($type, $data) { 180 + final public function renderActionEffectName($type, $data) { 172 181 $map = $this->getActionEffectSpec($type); 173 182 return idx($map, 'name'); 174 183 } ··· 182 191 ->renderHandleList($phids) 183 192 ->setAsInline(true) 184 193 ->render(); 194 + } 195 + 196 + protected function loadStandardTargets( 197 + array $phids, 198 + array $allowed_types, 199 + array $current_value) { 200 + 201 + $phids = array_fuse($phids); 202 + if (!$phids) { 203 + $this->logEffect(self::DO_STANDARD_EMPTY); 204 + } 205 + 206 + $current_value = array_fuse($current_value); 207 + $no_effect = array(); 208 + foreach ($phids as $phid) { 209 + if (isset($current_value[$phid])) { 210 + $no_effect[] = $phid; 211 + unset($phids[$phid]); 212 + } 213 + } 214 + 215 + if ($no_effect) { 216 + $this->logEffect(self::DO_STANDARD_NO_EFFECT, $no_effect); 217 + } 218 + 219 + if (!$phids) { 220 + return; 221 + } 222 + 223 + $allowed_types = array_fuse($allowed_types); 224 + $invalid = array(); 225 + foreach ($phids as $phid) { 226 + $type = phid_get_type($phid); 227 + if ($type == PhabricatorPHIDConstants::PHID_TYPE_UNKNOWN) { 228 + $invalid[] = $phid; 229 + unset($phids[$phid]); 230 + continue; 231 + } 232 + 233 + if ($allowed_types && empty($allowed_types[$type])) { 234 + $invalid[] = $phid; 235 + unset($phids[$phid]); 236 + continue; 237 + } 238 + } 239 + 240 + if ($invalid) { 241 + $this->logEffect(self::DO_STANDARD_INVALID, $invalid); 242 + } 243 + 244 + if (!$phids) { 245 + return; 246 + } 247 + 248 + $targets = id(new PhabricatorObjectQuery()) 249 + ->setViewer(PhabricatorUser::getOmnipotentUser()) 250 + ->withPHIDs($phids) 251 + ->execute(); 252 + $targets = mpull($targets, null, 'getPHID'); 253 + 254 + $unloadable = array(); 255 + foreach ($phids as $phid) { 256 + if (empty($targets[$phid])) { 257 + $unloadable[] = $phid; 258 + unset($phids[$phid]); 259 + } 260 + } 261 + 262 + if ($unloadable) { 263 + $this->logEffect(self::DO_STANDARD_UNLOADABLE, $unloadable); 264 + } 265 + 266 + if (!$phids) { 267 + return; 268 + } 269 + 270 + $adapter = $this->getAdapter(); 271 + $object = $adapter->getObject(); 272 + 273 + if ($object instanceof PhabricatorPolicyInterface) { 274 + $no_permission = array(); 275 + foreach ($targets as $phid => $target) { 276 + if (!($target instanceof PhabricatorUser)) { 277 + continue; 278 + } 279 + 280 + $can_view = PhabricatorPolicyFilter::hasCapability( 281 + $target, 282 + $object, 283 + PhabricatorPolicyCapability::CAN_VIEW); 284 + if ($can_view) { 285 + continue; 286 + } 287 + 288 + $no_permission[] = $phid; 289 + unset($targets[$phid]); 290 + } 291 + } 292 + 293 + if ($no_permission) { 294 + $this->logEffect(self::DO_STANDARD_PERMISSION, $no_permission); 295 + } 296 + 297 + return $targets; 298 + } 299 + 300 + protected function getStandardEffectMap() { 301 + return array( 302 + self::DO_STANDARD_EMPTY => array( 303 + 'icon' => 'fa-ban', 304 + 'color' => 'grey', 305 + 'name' => pht('No Targets'), 306 + ), 307 + self::DO_STANDARD_NO_EFFECT => array( 308 + 'icon' => 'fa-circle-o', 309 + 'color' => 'grey', 310 + 'name' => pht('No Effect'), 311 + ), 312 + self::DO_STANDARD_INVALID => array( 313 + 'icon' => 'fa-ban', 314 + 'color' => 'red', 315 + 'name' => pht('Invalid Targets'), 316 + ), 317 + self::DO_STANDARD_UNLOADABLE => array( 318 + 'icon' => 'fa-ban', 319 + 'color' => 'red', 320 + 'name' => pht('Unloadable Targets'), 321 + ), 322 + self::DO_STANDARD_PERMISSION => array( 323 + 'icon' => 'fa-lock', 324 + 'color' => 'red', 325 + 'name' => pht('No Permission'), 326 + ), 327 + ); 328 + } 329 + 330 + final public function renderEffectDescription($type, $data) { 331 + $result = $this->renderActionEffectDescription($type, $data); 332 + if ($result !== null) { 333 + return $result; 334 + } 335 + 336 + switch ($type) { 337 + case self::DO_STANDARD_EMPTY: 338 + return pht( 339 + 'This action specifies no targets.'); 340 + case self::DO_STANDARD_NO_EFFECT: 341 + return pht( 342 + 'This action has no effect on %s target(s): %s.', 343 + new PhutilNumber(count($data)), 344 + $this->renderHandleList($data)); 345 + case self::DO_STANDARD_INVALID: 346 + return pht( 347 + '%s target(s) are invalid or of the wrong type: %s.', 348 + new PhutilNumber(count($data)), 349 + $this->renderHandleList($data)); 350 + case self::DO_STANDARD_UNLOADABLE: 351 + return pht( 352 + '%s target(s) could not be loaded: %s.', 353 + new PhutilNumber(count($data)), 354 + $this->renderHandleList($data)); 355 + case self::DO_STANDARD_PERMISSION: 356 + return pht( 357 + '%s target(s) do not have permission to see this object: %s.', 358 + new PhutilNumber(count($data)), 359 + $this->renderHandleList($data)); 360 + } 361 + 362 + return null; 185 363 } 186 364 187 365 }
+1 -1
src/applications/herald/action/HeraldDoNothingAction.php
··· 43 43 return pht('Do nothing.'); 44 44 } 45 45 46 - public function renderActionEffectDescription($type, $data) { 46 + protected function renderActionEffectDescription($type, $data) { 47 47 return pht('Did nothing.'); 48 48 } 49 49
+1 -12
src/applications/herald/adapter/HeraldAdapter.php
··· 26 26 const CONDITION_IS_TRUE = 'true'; 27 27 const CONDITION_IS_FALSE = 'false'; 28 28 29 - const ACTION_AUDIT = 'audit'; 30 29 const ACTION_BLOCK = 'block'; 31 30 32 31 private $contentSource; ··· 712 711 case HeraldRuleTypeConfig::RULE_TYPE_GLOBAL: 713 712 case HeraldRuleTypeConfig::RULE_TYPE_OBJECT: 714 713 $standard = array( 715 - self::ACTION_AUDIT => pht('Trigger an Audit by'), 716 714 self::ACTION_BLOCK => pht('Block change with message'), 717 715 ); 718 716 break; 719 717 case HeraldRuleTypeConfig::RULE_TYPE_PERSONAL: 720 718 $standard = array( 721 - self::ACTION_AUDIT => pht('Trigger an Audit by me'), 722 719 ); 723 720 break; 724 721 default: ··· 757 754 $rule_type = $rule->getRuleType(); 758 755 if ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL) { 759 756 switch ($action->getAction()) { 760 - case self::ACTION_AUDIT: 761 - break; 762 757 case self::ACTION_BLOCK: 763 758 break; 764 759 default: ··· 790 785 791 786 $is_personal = ($rule_type == HeraldRuleTypeConfig::RULE_TYPE_PERSONAL); 792 787 793 - if ($is_personal) { 794 - switch ($action) { 795 - case self::ACTION_AUDIT: 796 - return new HeraldEmptyFieldValue(); 797 - } 798 - } else { 788 + if (!$is_personal) { 799 789 switch ($action) { 800 - case self::ACTION_AUDIT: 801 790 case self::ACTION_BLOCK: 802 791 return new HeraldTextFieldValue(); 803 792 }
+1 -1
src/applications/herald/controller/HeraldTranscriptController.php
··· 376 376 $icon = $action->renderActionEffectIcon($type, $data); 377 377 $color = $action->renderActionEffectColor($type, $data); 378 378 $name = $action->renderActionEffectName($type, $data); 379 - $note = $action->renderActionEffectDescription($type, $data); 379 + $note = $action->renderEffectDescription($type, $data); 380 380 } else { 381 381 $icon = 'fa-question-circle'; 382 382 $color = 'indigo';
+1 -1
src/applications/legalpad/herald/LegalpadRequireSignatureHeraldAction.php
··· 142 142 ); 143 143 } 144 144 145 - public function renderActionEffectDescription($type, $data) { 145 + protected function renderActionEffectDescription($type, $data) { 146 146 switch ($type) { 147 147 case self::DO_NO_TARGETS: 148 148 return pht('Rule lists no targets.');
+1 -1
src/applications/maniphest/herald/ManiphestTaskAssignHeraldAction.php
··· 90 90 ); 91 91 } 92 92 93 - public function renderActionEffectDescription($type, $data) { 93 + protected function renderActionEffectDescription($type, $data) { 94 94 switch ($type) { 95 95 case self::DO_EMPTY: 96 96 return pht('Action lists no user to assign.');
+1 -1
src/applications/metamta/herald/PhabricatorMetaMTAEmailHeraldAction.php
··· 50 50 ); 51 51 } 52 52 53 - public function renderActionEffectDescription($type, $data) { 53 + protected function renderActionEffectDescription($type, $data) { 54 54 switch ($type) { 55 55 case self::DO_SEND: 56 56 return pht(
+1 -1
src/applications/project/herald/PhabricatorProjectHeraldAction.php
··· 145 145 ); 146 146 } 147 147 148 - public function renderActionEffectDescription($type, $data) { 148 + protected function renderActionEffectDescription($type, $data) { 149 149 switch ($type) { 150 150 case self::DO_NO_TARGETS: 151 151 return pht('Rule lists no projects.');
+1 -1
src/applications/subscriptions/herald/PhabricatorSubscriptionsHeraldAction.php
··· 196 196 ); 197 197 } 198 198 199 - public function renderActionEffectDescription($type, $data) { 199 + protected function renderActionEffectDescription($type, $data) { 200 200 switch ($type) { 201 201 case self::DO_NO_TARGETS: 202 202 return pht('Rule lists no targets.');
+10
src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php
··· 1338 1338 'Required signatures: %2$s.', 1339 1339 ), 1340 1340 1341 + 'Started %s build(s): %s.' => array( 1342 + 'Started a build: %2$s.', 1343 + 'Started builds: %2$s.', 1344 + ), 1345 + 1346 + 'Added %s auditor(s): %s.' => array( 1347 + 'Added an auditor: %2$s.', 1348 + 'Added auditors: %2$s.', 1349 + ), 1350 + 1341 1351 ); 1342 1352 } 1343 1353