1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-10 08:52:39 +01:00

When remote builds fail, demote revisions to "Changes Planned + But, Still A Draft"

Summary:
Depends on D19286. Ref T13110. After builds fail remote builds, put revisions back in the author's queue.

This doesn't actually notify the author quite yet.

Test Plan: Made a failing build plan run on revisions, created a revision, saw it demote after builds failed.

Maniphest Tasks: T13110

Differential Revision: https://secure.phabricator.com/D19287
This commit is contained in:
epriestley 2018-04-03 09:12:08 -07:00
parent d9bd36039f
commit adf8fdef0e
3 changed files with 46 additions and 9 deletions

View file

@ -1577,8 +1577,21 @@ final class DifferentialTransactionEditor
// 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.
// When demoting a revision, we act as "Harbormaster" instead of
// the author since this feels a little more natural.
$harbormaster_phid = id(new PhabricatorHarbormasterApplication())
->getPHID();
$xaction = $object->getApplicationTransactionTemplate()
->setAuthorPHID($harbormaster_phid)
->setMetadataValue('draft.demote', true)
->setTransactionType(
DifferentialRevisionPlanChangesTransaction::TRANSACTIONTYPE)
->setNewValue(true);
$this->queueTransaction($xaction);
// TODO: Notify the author (only) that we did this.
}
}

View file

@ -147,12 +147,25 @@ abstract class DifferentialRevisionActionTransaction
$actor = $this->getActor();
$action_exception = null;
foreach ($xactions as $xaction) {
// If this is a draft demotion action, let it skip all the normal
// validation. This is a little hacky and should perhaps move down
// into the actual action implementations, but currently we can not
// apply this rule in validateAction() because it doesn't operate on
// the actual transaction.
if ($xaction->getMetadataValue('draft.demote')) {
continue;
}
try {
$this->validateAction($object, $actor);
} catch (Exception $ex) {
$action_exception = $ex;
}
break;
}
foreach ($xactions as $xaction) {
if ($action_exception) {
$errors[] = $this->newInvalidError(

View file

@ -96,10 +96,17 @@ final class DifferentialRevisionPlanChangesTransaction
}
public function getTitle() {
if ($this->isDraftDemotion()) {
return pht(
'%s returned this revision to the author for changes because remote '.
'builds failed.',
$this->renderAuthor());
} else {
return pht(
'%s planned changes to this revision.',
$this->renderAuthor());
}
}
public function getTitleForFeed() {
return pht(
@ -108,4 +115,8 @@ final class DifferentialRevisionPlanChangesTransaction
$this->renderObject());
}
private function isDraftDemotion() {
return (bool)$this->getMetadataValue('draft.demote');
}
}