diff --git a/src/applications/differential/harbormaster/DifferentialBuildableEngine.php b/src/applications/differential/harbormaster/DifferentialBuildableEngine.php --- a/src/applications/differential/harbormaster/DifferentialBuildableEngine.php +++ b/src/applications/differential/harbormaster/DifferentialBuildableEngine.php @@ -54,4 +54,28 @@ $this->applyTransactions(array($xaction)); } + public function getAuthorIdentity() { + $object = $this->getObject(); + + if ($object instanceof DifferentialRevision) { + $object = $object->loadActiveDiff(); + } + + $authorship = $object->getDiffAuthorshipDict(); + if (!isset($authorship['authorName'])) { + return null; + } + + $name = $authorship['authorName']; + $address = idx($authorship, 'authorEmail'); + + $full = id(new PhutilEmailAddress()) + ->setDisplayName($name) + ->setAddress($address); + + return id(new PhabricatorRepositoryIdentity()) + ->setIdentityName((string)$full) + ->makeEphemeral(); + } + } diff --git a/src/applications/diffusion/harbormaster/DiffusionBuildableEngine.php b/src/applications/diffusion/harbormaster/DiffusionBuildableEngine.php --- a/src/applications/diffusion/harbormaster/DiffusionBuildableEngine.php +++ b/src/applications/diffusion/harbormaster/DiffusionBuildableEngine.php @@ -34,4 +34,10 @@ $this->applyTransactions(array($xaction)); } + public function getAuthorIdentity() { + return $this->getObject() + ->loadIdentities($this->getViewer()) + ->getAuthorIdentity(); + } + } diff --git a/src/applications/harbormaster/engine/HarbormasterBuildableEngine.php b/src/applications/harbormaster/engine/HarbormasterBuildableEngine.php --- a/src/applications/harbormaster/engine/HarbormasterBuildableEngine.php +++ b/src/applications/harbormaster/engine/HarbormasterBuildableEngine.php @@ -101,5 +101,8 @@ $xactions); } + public function getAuthorIdentity() { + return null; + } } diff --git a/src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php b/src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php --- a/src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php +++ b/src/applications/harbormaster/step/HarbormasterBuildkiteBuildStepImplementation.php @@ -117,6 +117,20 @@ ), ); + $engine = HarbormasterBuildableEngine::newForObject( + $object, + $viewer); + + $author_identity = $engine->getAuthorIdentity(); + if ($author_identity) { + $data_structure += array( + 'author' => array( + 'name' => $author_identity->getIdentityDisplayName(), + 'email' => $author_identity->getIdentityEmailAddress(), + ), + ); + } + $json_data = phutil_json_encode($data_structure); $credential_phid = $this->getSetting('token'); diff --git a/src/applications/repository/storage/PhabricatorRepositoryCommit.php b/src/applications/repository/storage/PhabricatorRepositoryCommit.php --- a/src/applications/repository/storage/PhabricatorRepositoryCommit.php +++ b/src/applications/repository/storage/PhabricatorRepositoryCommit.php @@ -200,6 +200,8 @@ $this->authorIdentity = $author; $this->committerIdentity = $committer; + + return $this; } public function getAuthorIdentity() { @@ -485,6 +487,23 @@ return null; } + public function loadIdentities(PhabricatorUser $viewer) { + if ($this->authorIdentity !== self::ATTACHABLE) { + return $this; + } + + $commit = id(new DiffusionCommitQuery()) + ->setViewer($viewer) + ->withIDs(array($this->getID())) + ->needIdentities(true) + ->executeOne(); + + $author_identity = $commit->getAuthorIdentity(); + $committer_identity = $commit->getCommitterIdentity(); + + return $this->attachIdentities($author_identity, $committer_identity); + } + public function hasCommitterIdentity() { return ($this->getCommitterIdentity() !== null); } diff --git a/src/applications/repository/storage/PhabricatorRepositoryIdentity.php b/src/applications/repository/storage/PhabricatorRepositoryIdentity.php --- a/src/applications/repository/storage/PhabricatorRepositoryIdentity.php +++ b/src/applications/repository/storage/PhabricatorRepositoryIdentity.php @@ -65,6 +65,16 @@ $this->getIdentityNameEncoding()); } + public function getIdentityEmailAddress() { + $address = new PhutilEmailAddress($this->getIdentityName()); + return $address->getAddress(); + } + + public function getIdentityDisplayName() { + $address = new PhutilEmailAddress($this->getIdentityName()); + return $address->getDisplayName(); + } + public function getIdentityShortName() { // TODO return $this->getIdentityName();