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

Add "Revision has passing builds" Herald rules for commit content (pushes) and commits (discovery)

Summary:
Depends on D20469. Ref T13276. See PHI1159. See PHI953. See PHI901.

Allow Herald to detect when "arc land" would (or did) warn users about failed or ongoing builds. This respects the "Warn on Landing" build plan behavior.

To accomplish this:

- When we close a revision, set a "wrong build state" flag if it lands in the wrong build state.
- If the revision is closed when we hit Herald, look for the flag.
- If not (common for push rules, can happen for commit rules if we race against the revision update worker), hit Harbormaster ourselves and check the current state.

Test Plan:

- Wrote a "Require Green" rule.
- Ran it against various commits with various build states (good, not good).
- Fiddled with "Warn on Landing" and saw the effect in rule evaluation.

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13276

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

+124 -5
+4
src/__phutil_library_map__.php
··· 773 773 'DiffusionCommitTimelineEngine' => 'applications/diffusion/engine/DiffusionCommitTimelineEngine.php', 774 774 'DiffusionCommitTransactionType' => 'applications/diffusion/xaction/DiffusionCommitTransactionType.php', 775 775 'DiffusionCommitVerifyTransaction' => 'applications/diffusion/xaction/DiffusionCommitVerifyTransaction.php', 776 + 'DiffusionCommitWrongBuildsHeraldField' => 'applications/diffusion/herald/DiffusionCommitWrongBuildsHeraldField.php', 776 777 'DiffusionCompareController' => 'applications/diffusion/controller/DiffusionCompareController.php', 777 778 'DiffusionConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionConduitAPIMethod.php', 778 779 'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php', ··· 904 905 'DiffusionPreCommitContentRevisionHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionHeraldField.php', 905 906 'DiffusionPreCommitContentRevisionReviewersHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionReviewersHeraldField.php', 906 907 'DiffusionPreCommitContentRevisionSubscribersHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentRevisionSubscribersHeraldField.php', 908 + 'DiffusionPreCommitContentWrongBuildsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentWrongBuildsHeraldField.php', 907 909 'DiffusionPreCommitRefChangeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefChangeHeraldField.php', 908 910 'DiffusionPreCommitRefHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefHeraldField.php', 909 911 'DiffusionPreCommitRefHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionPreCommitRefHeraldFieldGroup.php', ··· 6438 6440 'DiffusionCommitTimelineEngine' => 'PhabricatorTimelineEngine', 6439 6441 'DiffusionCommitTransactionType' => 'PhabricatorModularTransactionType', 6440 6442 'DiffusionCommitVerifyTransaction' => 'DiffusionCommitAuditTransaction', 6443 + 'DiffusionCommitWrongBuildsHeraldField' => 'DiffusionCommitHeraldField', 6441 6444 'DiffusionCompareController' => 'DiffusionController', 6442 6445 'DiffusionConduitAPIMethod' => 'ConduitAPIMethod', 6443 6446 'DiffusionController' => 'PhabricatorController', ··· 6572 6575 'DiffusionPreCommitContentRevisionHeraldField' => 'DiffusionPreCommitContentHeraldField', 6573 6576 'DiffusionPreCommitContentRevisionReviewersHeraldField' => 'DiffusionPreCommitContentHeraldField', 6574 6577 'DiffusionPreCommitContentRevisionSubscribersHeraldField' => 'DiffusionPreCommitContentHeraldField', 6578 + 'DiffusionPreCommitContentWrongBuildsHeraldField' => 'DiffusionPreCommitContentHeraldField', 6575 6579 'DiffusionPreCommitRefChangeHeraldField' => 'DiffusionPreCommitRefHeraldField', 6576 6580 'DiffusionPreCommitRefHeraldField' => 'HeraldField', 6577 6581 'DiffusionPreCommitRefHeraldFieldGroup' => 'HeraldFieldGroup',
+17 -5
src/applications/differential/engine/DifferentialDiffExtractionEngine.php
··· 281 281 ->setNewValue($revision->getModernRevisionStatus()); 282 282 } 283 283 284 - $concerning_builds = $this->loadConcerningBuilds($revision); 284 + $concerning_builds = self::loadConcerningBuilds( 285 + $this->getViewer(), 286 + $revision, 287 + $strict = false); 288 + 285 289 if ($concerning_builds) { 286 290 $build_list = array(); 287 291 foreach ($concerning_builds as $build) { ··· 328 332 $editor->applyTransactions($revision, $xactions); 329 333 } 330 334 331 - private function loadConcerningBuilds(DifferentialRevision $revision) { 332 - $viewer = $this->getViewer(); 335 + public static function loadConcerningBuilds( 336 + PhabricatorUser $viewer, 337 + DifferentialRevision $revision, 338 + $strict) { 339 + 333 340 $diff = $revision->getActiveDiff(); 334 341 335 342 $buildables = id(new HarbormasterBuildableQuery()) ··· 341 348 if (!$buildables) { 342 349 return array(); 343 350 } 344 - 345 351 346 352 $land_key = HarbormasterBuildPlanBehavior::BEHAVIOR_LANDWARNING; 347 353 $behavior = HarbormasterBuildPlanBehavior::getBehavior($land_key); ··· 391 397 // cases where the repository is observed and the fetch pipeline 392 398 // stalls for a while. 393 399 394 - continue; 400 + // If we're in strict mode (from a pre-commit content hook), we do 401 + // not ignore these, since we're doing an instantaneous check against 402 + // the current state. 403 + 404 + if (!$strict) { 405 + continue; 406 + } 395 407 } 396 408 397 409 if ($build->isPassed()) {
+1
src/applications/differential/storage/DifferentialRevision.php
··· 62 62 const PROPERTY_LINES_ADDED = 'lines.added'; 63 63 const PROPERTY_LINES_REMOVED = 'lines.removed'; 64 64 const PROPERTY_BUILDABLES = 'buildables'; 65 + const PROPERTY_WRONG_BUILDS = 'wrong.builds'; 65 66 66 67 public static function initializeNewRevision(PhabricatorUser $actor) { 67 68 $app = id(new PhabricatorApplicationQuery())
+4
src/applications/differential/xaction/DifferentialRevisionWrongBuildsTransaction.php
··· 13 13 return $value; 14 14 } 15 15 16 + public function applyInternalEffects($object, $value) { 17 + $object->setProperty(DifferentialRevision::PROPERTY_WRONG_BUILDS, true); 18 + } 19 + 16 20 public function getIcon() { 17 21 return 'fa-exclamation'; 18 22 }
+49
src/applications/diffusion/herald/DiffusionCommitWrongBuildsHeraldField.php
··· 1 + <?php 2 + 3 + final class DiffusionCommitWrongBuildsHeraldField 4 + extends DiffusionCommitHeraldField { 5 + 6 + const FIELDCONST = 'diffusion.commit.builds.wrong'; 7 + 8 + public function getHeraldFieldName() { 9 + return pht('Revision has build warning'); 10 + } 11 + 12 + public function getFieldGroupKey() { 13 + return HeraldRelatedFieldGroup::FIELDGROUPKEY; 14 + } 15 + 16 + public function getHeraldFieldValue($object) { 17 + $adapter = $this->getAdapter(); 18 + $viewer = $adapter->getViewer(); 19 + 20 + $revision = $adapter->loadDifferentialRevision(); 21 + if (!$revision) { 22 + return false; 23 + } 24 + 25 + if ($revision->isPublished()) { 26 + $wrong_builds = DifferentialRevision::PROPERTY_WRONG_BUILDS; 27 + return !$revision->getProperty($wrong_builds, false); 28 + } 29 + 30 + // Reload the revision to pick up active diffs. 31 + $revision = id(new DifferentialRevisionQuery()) 32 + ->setViewer($viewer) 33 + ->withPHIDs(array($revision->getPHID())) 34 + ->needActiveDiffs(true) 35 + ->executeOne(); 36 + 37 + $concerning = DifferentialDiffExtractionEngine::loadConcerningBuilds( 38 + $viewer, 39 + $revision, 40 + $strict = false); 41 + 42 + return (bool)$concerning; 43 + } 44 + 45 + protected function getHeraldFieldStandardType() { 46 + return self::STANDARD_BOOL; 47 + } 48 + 49 + }
+49
src/applications/diffusion/herald/DiffusionPreCommitContentWrongBuildsHeraldField.php
··· 1 + <?php 2 + 3 + final class DiffusionPreCommitContentWrongBuildsHeraldField 4 + extends DiffusionPreCommitContentHeraldField { 5 + 6 + const FIELDCONST = 'diffusion.pre.content.builds.wrong'; 7 + 8 + public function getHeraldFieldName() { 9 + return pht('Revision has build warning'); 10 + } 11 + 12 + public function getFieldGroupKey() { 13 + return HeraldRelatedFieldGroup::FIELDGROUPKEY; 14 + } 15 + 16 + public function getHeraldFieldValue($object) { 17 + $adapter = $this->getAdapter(); 18 + $viewer = $adapter->getViewer(); 19 + 20 + $revision = $adapter->getRevision(); 21 + if (!$revision) { 22 + return false; 23 + } 24 + 25 + if ($revision->isPublished()) { 26 + $wrong_builds = DifferentialRevision::PROPERTY_WRONG_BUILDS; 27 + return !$revision->getProperty($wrong_builds, false); 28 + } 29 + 30 + // Reload the revision to pick up active diffs. 31 + $revision = id(new DifferentialRevisionQuery()) 32 + ->setViewer($viewer) 33 + ->withPHIDs(array($revision->getPHID())) 34 + ->needActiveDiffs(true) 35 + ->executeOne(); 36 + 37 + $concerning = DifferentialDiffExtractionEngine::loadConcerningBuilds( 38 + $viewer, 39 + $revision, 40 + $strict = true); 41 + 42 + return (bool)$concerning; 43 + } 44 + 45 + protected function getHeraldFieldStandardType() { 46 + return self::STANDARD_BOOL; 47 + } 48 + 49 + }