From 134c8f55476334778446612d1fe98bcfd3626a5c Mon Sep 17 00:00:00 2001 From: epriestley Date: Thu, 19 Dec 2013 11:05:31 -0800 Subject: [PATCH] Add "Author" and "Committer" fields to Herald pre-commit content hooks Summary: Ref T4195. Adds "Author" and "Committer" fields. Test Plan: Created a rule using these fields: {F90897} ...then pushed git, mercurial and svn commits and verified the correct values populated in the transcript: {F90898} Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T4195 Differential Revision: https://secure.phabricator.com/D7802 --- .../herald/HeraldPreCommitContentAdapter.php | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/applications/diffusion/herald/HeraldPreCommitContentAdapter.php b/src/applications/diffusion/herald/HeraldPreCommitContentAdapter.php index e65bc0643e..afef42ede6 100644 --- a/src/applications/diffusion/herald/HeraldPreCommitContentAdapter.php +++ b/src/applications/diffusion/herald/HeraldPreCommitContentAdapter.php @@ -38,6 +38,8 @@ final class HeraldPreCommitContentAdapter extends HeraldAdapter { return array_merge( array( self::FIELD_BODY, + self::FIELD_AUTHOR, + self::FIELD_COMMITTER, self::FIELD_DIFF_FILE, self::FIELD_DIFF_CONTENT, self::FIELD_DIFF_ADDED_CONTENT, @@ -87,6 +89,10 @@ final class HeraldPreCommitContentAdapter extends HeraldAdapter { switch ($field) { case self::FIELD_BODY: return $this->getCommitRef()->getMessage(); + case self::FIELD_AUTHOR: + return $this->getAuthorPHID(); + case self::FIELD_COMMITTER: + return $this->getCommitterPHID(); case self::FIELD_DIFF_FILE: return $this->getDiffContent('name'); case self::FIELD_DIFF_CONTENT: @@ -190,4 +196,52 @@ final class HeraldPreCommitContentAdapter extends HeraldAdapter { return $this->commitRef; } + private function getAuthorPHID() { + $repository = $this->hookEngine->getRepository(); + $vcs = $repository->getVersionControlSystem(); + switch ($vcs) { + case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: + case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: + $ref = $this->getCommitRef(); + $author = $ref->getAuthor(); + if (!strlen($author)) { + return null; + } + return $this->lookupUser($author); + case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: + // In Subversion, the pusher is always the author. + return $this->hookEngine->getViewer()->getPHID(); + } + } + + private function getCommitterPHID() { + $repository = $this->hookEngine->getRepository(); + $vcs = $repository->getVersionControlSystem(); + switch ($vcs) { + case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: + case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: + // Here, if there's no committer, we're going to return the author + // instead. + $ref = $this->getCommitRef(); + $committer = $ref->getCommitter(); + if (!strlen($committer)) { + return $this->getAuthorPHID(); + } + $phid = $this->lookupUser($committer); + if (!$phid) { + return $this->getAuthorPHID(); + } + return $phid; + case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: + // In Subversion, the pusher is always the committer. + return $this->hookEngine->getViewer()->getPHID(); + } + } + + private function lookupUser($author) { + return id(new DiffusionResolveUserQuery()) + ->withName($author) + ->execute(); + } + }