mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-29 17:00:59 +01:00
Implement "Differential Revision" fields in Herald pre-commit content adapter
Summary: Ref T4195. Allows you to write revision-based commit hooks, e.g. block all commits with no corresponding revision. Test Plan: Here's are the fields populating: {F90989} Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T4195 Differential Revision: https://secure.phabricator.com/D7806
This commit is contained in:
parent
d7c4edab28
commit
2436458b90
3 changed files with 76 additions and 25 deletions
|
@ -6,6 +6,8 @@ final class HeraldPreCommitContentAdapter extends HeraldAdapter {
|
|||
private $hookEngine;
|
||||
private $changesets;
|
||||
private $commitRef;
|
||||
private $fields;
|
||||
private $revision = false;
|
||||
|
||||
public function setPushLog(PhabricatorRepositoryPushLog $log) {
|
||||
$this->log = $log;
|
||||
|
@ -47,6 +49,9 @@ final class HeraldPreCommitContentAdapter extends HeraldAdapter {
|
|||
self::FIELD_REPOSITORY,
|
||||
self::FIELD_PUSHER,
|
||||
self::FIELD_PUSHER_PROJECTS,
|
||||
self::FIELD_DIFFERENTIAL_REVISION,
|
||||
self::FIELD_DIFFERENTIAL_REVIEWERS,
|
||||
self::FIELD_DIFFERENTIAL_CCS,
|
||||
self::FIELD_RULE,
|
||||
),
|
||||
parent::getFields());
|
||||
|
@ -107,6 +112,24 @@ final class HeraldPreCommitContentAdapter extends HeraldAdapter {
|
|||
return $this->hookEngine->getViewer()->getPHID();
|
||||
case self::FIELD_PUSHER_PROJECTS:
|
||||
return $this->hookEngine->loadViewerProjectPHIDsForHerald();
|
||||
case self::FIELD_DIFFERENTIAL_REVISION:
|
||||
$revision = $this->getRevision();
|
||||
if (!$revision) {
|
||||
return null;
|
||||
}
|
||||
return $revision->getPHID();
|
||||
case self::FIELD_DIFFERENTIAL_REVIEWERS:
|
||||
$revision = $this->getRevision();
|
||||
if (!$revision) {
|
||||
return array();
|
||||
}
|
||||
return $revision->getReviewers();
|
||||
case self::FIELD_DIFFERENTIAL_CCS:
|
||||
$revision = $this->getRevision();
|
||||
if (!$revision) {
|
||||
return array();
|
||||
}
|
||||
return $revision->getCCPHIDs();
|
||||
}
|
||||
|
||||
return parent::getHeraldField($field);
|
||||
|
@ -244,4 +267,32 @@ final class HeraldPreCommitContentAdapter extends HeraldAdapter {
|
|||
->execute();
|
||||
}
|
||||
|
||||
private function getCommitFields() {
|
||||
if ($this->fields === null) {
|
||||
$this->fields = id(new DiffusionLowLevelCommitFieldsQuery())
|
||||
->setRepository($this->hookEngine->getRepository())
|
||||
->withCommitRef($this->getCommitRef())
|
||||
->execute();
|
||||
}
|
||||
return $this->fields;
|
||||
}
|
||||
|
||||
private function getRevision() {
|
||||
if ($this->revision === false) {
|
||||
$fields = $this->getCommitFields();
|
||||
$revision_id = idx($fields, 'revisionID');
|
||||
if (!$revision_id) {
|
||||
$this->revision = null;
|
||||
} else {
|
||||
$this->revision = id(new DifferentialRevisionQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withIDs(array($revision_id))
|
||||
->needRelationships(true)
|
||||
->executeOne();
|
||||
}
|
||||
}
|
||||
|
||||
return $this->revision;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -27,6 +27,9 @@ abstract class HeraldAdapter {
|
|||
const FIELD_PROJECTS = 'projects';
|
||||
const FIELD_PUSHER = 'pusher';
|
||||
const FIELD_PUSHER_PROJECTS = 'pusher-projects';
|
||||
const FIELD_DIFFERENTIAL_REVISION = 'differential-revision';
|
||||
const FIELD_DIFFERENTIAL_REVIEWERS = 'differential-reviewers';
|
||||
const FIELD_DIFFERENTIAL_CCS = 'differential-ccs';
|
||||
|
||||
const CONDITION_CONTAINS = 'contains';
|
||||
const CONDITION_NOT_CONTAINS = '!contains';
|
||||
|
@ -163,6 +166,9 @@ abstract class HeraldAdapter {
|
|||
self::FIELD_PROJECTS => pht("Projects"),
|
||||
self::FIELD_PUSHER => pht('Pusher'),
|
||||
self::FIELD_PUSHER_PROJECTS => pht("Pusher's projects"),
|
||||
self::FIELD_DIFFERENTIAL_REVISION => pht('Differential revision'),
|
||||
self::FIELD_DIFFERENTIAL_REVIEWERS => pht('Differential reviewers'),
|
||||
self::FIELD_DIFFERENTIAL_CCS => pht('Differential CCs'),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -263,6 +269,25 @@ abstract class HeraldAdapter {
|
|||
return array(
|
||||
self::CONDITION_UNCONDITIONALLY,
|
||||
);
|
||||
case self::FIELD_DIFFERENTIAL_REVIEWERS:
|
||||
return array(
|
||||
self::CONDITION_EXISTS,
|
||||
self::CONDITION_NOT_EXISTS,
|
||||
self::CONDITION_INCLUDE_ALL,
|
||||
self::CONDITION_INCLUDE_ANY,
|
||||
self::CONDITION_INCLUDE_NONE,
|
||||
);
|
||||
case self::FIELD_DIFFERENTIAL_CCS:
|
||||
return array(
|
||||
self::CONDITION_INCLUDE_ALL,
|
||||
self::CONDITION_INCLUDE_ANY,
|
||||
self::CONDITION_INCLUDE_NONE,
|
||||
);
|
||||
case self::FIELD_DIFFERENTIAL_REVISION:
|
||||
return array(
|
||||
self::CONDITION_EXISTS,
|
||||
self::CONDITION_NOT_EXISTS,
|
||||
);
|
||||
default:
|
||||
throw new Exception(
|
||||
"This adapter does not define conditions for field '{$field}'!");
|
||||
|
|
|
@ -6,9 +6,6 @@
|
|||
final class HeraldCommitAdapter extends HeraldAdapter {
|
||||
|
||||
const FIELD_NEED_AUDIT_FOR_PACKAGE = 'need-audit-for-package';
|
||||
const FIELD_DIFFERENTIAL_REVISION = 'differential-revision';
|
||||
const FIELD_DIFFERENTIAL_REVIEWERS = 'differential-reviewers';
|
||||
const FIELD_DIFFERENTIAL_CCS = 'differential-ccs';
|
||||
const FIELD_REPOSITORY_AUTOCLOSE_BRANCH = 'repository-autoclose-branch';
|
||||
|
||||
protected $diff;
|
||||
|
@ -49,9 +46,6 @@ final class HeraldCommitAdapter extends HeraldAdapter {
|
|||
return array(
|
||||
self::FIELD_NEED_AUDIT_FOR_PACKAGE =>
|
||||
pht('Affected packages that need audit'),
|
||||
self::FIELD_DIFFERENTIAL_REVISION => pht('Differential revision'),
|
||||
self::FIELD_DIFFERENTIAL_REVIEWERS => pht('Differential reviewers'),
|
||||
self::FIELD_DIFFERENTIAL_CCS => pht('Differential CCs'),
|
||||
self::FIELD_REPOSITORY_AUTOCLOSE_BRANCH => pht('On autoclose branch'),
|
||||
) + parent::getFieldNameMap();
|
||||
}
|
||||
|
@ -82,25 +76,6 @@ final class HeraldCommitAdapter extends HeraldAdapter {
|
|||
|
||||
public function getConditionsForField($field) {
|
||||
switch ($field) {
|
||||
case self::FIELD_DIFFERENTIAL_REVIEWERS:
|
||||
return array(
|
||||
self::CONDITION_EXISTS,
|
||||
self::CONDITION_NOT_EXISTS,
|
||||
self::CONDITION_INCLUDE_ALL,
|
||||
self::CONDITION_INCLUDE_ANY,
|
||||
self::CONDITION_INCLUDE_NONE,
|
||||
);
|
||||
case self::FIELD_DIFFERENTIAL_CCS:
|
||||
return array(
|
||||
self::CONDITION_INCLUDE_ALL,
|
||||
self::CONDITION_INCLUDE_ANY,
|
||||
self::CONDITION_INCLUDE_NONE,
|
||||
);
|
||||
case self::FIELD_DIFFERENTIAL_REVISION:
|
||||
return array(
|
||||
self::CONDITION_EXISTS,
|
||||
self::CONDITION_NOT_EXISTS,
|
||||
);
|
||||
case self::FIELD_NEED_AUDIT_FOR_PACKAGE:
|
||||
return array(
|
||||
self::CONDITION_INCLUDE_ANY,
|
||||
|
|
Loading…
Reference in a new issue