1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-26 16:52:41 +01:00

Explicitly condition Differential draft promotion on only "impactful" builds

Summary:
Depends on D19281. This increases consistency between build timeline publishing and revision draft promotion.

There's no real behavioral change here (switching how publishing worked already changed the beahvior) but this sends more callsites down the same code paths.

Since the builds we're looking at include completed builds, change the term "active" to "impactful". This describes the same set of builds, but hopefully describes them more accurately.

Test Plan: Created a local revision, saw it plausibly interact with draft status and promote. There are a lot of moving parts here and some stuff may well have slipped through.

Differential Revision: https://secure.phabricator.com/D19282
This commit is contained in:
epriestley 2018-04-03 07:54:27 -07:00
parent 51461f18c1
commit f350b9e464
3 changed files with 33 additions and 31 deletions

View file

@ -58,7 +58,7 @@ final class DifferentialDraftField
);
$blocking_map = array_fuse($blocking_map);
$builds = $revision->loadActiveBuilds($viewer);
$builds = $revision->loadImpactfulBuilds($viewer);
$waiting = array();
$blocking = array();

View file

@ -1539,8 +1539,12 @@ final class DifferentialTransactionEditor
}
if ($object->isDraft() && $auto_undraft) {
$active_builds = $this->hasActiveBuilds($object);
if (!$active_builds) {
$status = $this->loadCompletedBuildableStatus($object);
$is_passed = ($status === HarbormasterBuildableStatus::STATUS_PASSED);
$is_failed = ($status === HarbormasterBuildableStatus::STATUS_FAILED);
if ($is_passed) {
// When Harbormaster moves a revision out of the draft state, we
// attribute the action to the revision author since this is more
// natural and more useful.
@ -1572,6 +1576,9 @@ final class DifferentialTransactionEditor
// batch of transactions finishes so that Herald can fire on the new
// revision state. See T13027 for discussion.
$this->queueTransaction($xaction);
} else if ($is_failed) {
// TODO: Change to "Changes Planned + Draft", notify the author (only)
// of the build failure.
}
}
@ -1604,15 +1611,11 @@ final class DifferentialTransactionEditor
return $xactions;
}
private function hasActiveBuilds($object) {
private function loadCompletedBuildableStatus(
DifferentialRevision $revision) {
$viewer = $this->requireActor();
$builds = $object->loadActiveBuilds($viewer);
if (!$builds) {
return false;
}
return true;
$builds = $revision->loadImpactfulBuilds($viewer);
return $revision->newBuildableStatusForBuilds($builds);
}
private function requireReviewers(DifferentialRevision $revision) {

View file

@ -779,23 +779,14 @@ final class DifferentialRevision extends DifferentialDAO
// when computing build status. Differential only cares about remote
// builds when making publishing and undrafting decisions.
$builds = id(new HarbormasterBuildQuery())
->setViewer($viewer)
->withBuildablePHIDs(array($phid))
->withAutobuilds(false)
->withBuildStatuses(
array(
HarbormasterBuildStatus::STATUS_INACTIVE,
HarbormasterBuildStatus::STATUS_PENDING,
HarbormasterBuildStatus::STATUS_BUILDING,
HarbormasterBuildStatus::STATUS_FAILED,
HarbormasterBuildStatus::STATUS_ABORTED,
HarbormasterBuildStatus::STATUS_ERROR,
HarbormasterBuildStatus::STATUS_PAUSED,
HarbormasterBuildStatus::STATUS_DEADLOCKED,
))
->execute();
$builds = $this->loadImpactfulBuildsForBuildablePHIDs(
$viewer,
array($phid));
return $this->newBuildableStatusForBuilds($builds);
}
public function newBuildableStatusForBuilds(array $builds) {
// If we have nothing but passing builds, the buildable passes.
if (!$builds) {
return HarbormasterBuildableStatus::STATUS_PASSED;
@ -803,8 +794,7 @@ final class DifferentialRevision extends DifferentialDAO
// If we have any completed, non-passing builds, the buildable fails.
foreach ($builds as $build) {
$status = $build->getBuildStatusObject();
if ($status->isComplete()) {
if ($build->isComplete()) {
return HarbormasterBuildableStatus::STATUS_FAILED;
}
}
@ -813,7 +803,7 @@ final class DifferentialRevision extends DifferentialDAO
return null;
}
public function loadActiveBuilds(PhabricatorUser $viewer) {
public function loadImpactfulBuilds(PhabricatorUser $viewer) {
$diff = $this->getActiveDiff();
// NOTE: We can't use `withContainerPHIDs()` here because the container
@ -827,9 +817,18 @@ final class DifferentialRevision extends DifferentialDAO
return array();
}
return $this->loadImpactfulBuildsForBuildablePHIDs(
$viewer,
mpull($buildables, 'getPHID'));
}
private function loadImpactfulBuildsForBuildablePHIDs(
PhabricatorUser $viewer,
array $phids) {
return id(new HarbormasterBuildQuery())
->setViewer($viewer)
->withBuildablePHIDs(mpull($buildables, 'getPHID'))
->withBuildablePHIDs($phids)
->withAutobuilds(false)
->withBuildStatuses(
array(