From 843bfb4fd8ac72457691d0583330807d74671c97 Mon Sep 17 00:00:00 2001 From: epriestley Date: Thu, 19 Apr 2018 11:39:11 -0700 Subject: [PATCH] Add a "commits" attachment to "differential.diff.search" for retrieving local commit information Summary: Ref T13124. See PHI593. When you `arc diff` in a Git or Mercurial repository, we upload some information about the local commits in your working copy which the change was generated from. In the future (for example, with T1508) we may increase the prominence of this feature. Provide a stable way to read this information back via the API. This roughly mirrors the information we provide about commits in "diffusion.commit.search", although the latter is less fleshed-out today. Test Plan: Used `differential.diff.search` to retrieve commit information about Git, Mercurial, and Subversion diffs. (There's no info for Subversion, but it doesn't crash or anything.) Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13124 Differential Revision: https://secure.phabricator.com/D19386 --- src/__phutil_library_map__.php | 2 + ...ferentialCommitsSearchEngineAttachment.php | 77 +++++++++++++++++++ .../differential/storage/DifferentialDiff.php | 5 +- .../storage/PhabricatorRepositoryCommit.php | 4 + 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 src/applications/differential/engineextension/DifferentialCommitsSearchEngineAttachment.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 5f1543aa91..beec5058a6 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -455,6 +455,7 @@ phutil_register_library_map(array( 'DifferentialCommitMessageParser' => 'applications/differential/parser/DifferentialCommitMessageParser.php', 'DifferentialCommitMessageParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCommitMessageParserTestCase.php', 'DifferentialCommitsField' => 'applications/differential/customfield/DifferentialCommitsField.php', + 'DifferentialCommitsSearchEngineAttachment' => 'applications/differential/engineextension/DifferentialCommitsSearchEngineAttachment.php', 'DifferentialConduitAPIMethod' => 'applications/differential/conduit/DifferentialConduitAPIMethod.php', 'DifferentialConflictsCommitMessageField' => 'applications/differential/field/DifferentialConflictsCommitMessageField.php', 'DifferentialController' => 'applications/differential/controller/DifferentialController.php', @@ -5733,6 +5734,7 @@ phutil_register_library_map(array( 'DifferentialCommitMessageParser' => 'Phobject', 'DifferentialCommitMessageParserTestCase' => 'PhabricatorTestCase', 'DifferentialCommitsField' => 'DifferentialCustomField', + 'DifferentialCommitsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment', 'DifferentialConduitAPIMethod' => 'ConduitAPIMethod', 'DifferentialConflictsCommitMessageField' => 'DifferentialCommitMessageField', 'DifferentialController' => 'PhabricatorController', diff --git a/src/applications/differential/engineextension/DifferentialCommitsSearchEngineAttachment.php b/src/applications/differential/engineextension/DifferentialCommitsSearchEngineAttachment.php new file mode 100644 index 0000000000..395541c9f9 --- /dev/null +++ b/src/applications/differential/engineextension/DifferentialCommitsSearchEngineAttachment.php @@ -0,0 +1,77 @@ +loadAllWhere( + 'diffID IN (%Ld) AND name = %s', + mpull($objects, 'getID'), + 'local:commits'); + + $map = array(); + foreach ($properties as $property) { + $map[$property->getDiffID()] = $property->getData(); + } + + return $map; + } + + public function getAttachmentForObject($object, $data, $spec) { + $diff_id = $object->getID(); + $info = idx($data, $diff_id, array()); + + // NOTE: This should be similar to the information returned about commits + // by "diffusion.commit.search". + + $list = array(); + foreach ($info as $commit) { + $author_epoch = idx($commit, 'time'); + if ($author_epoch) { + $author_epoch = (int)$author_epoch; + } + + // TODO: Currently, we don't upload the raw author string from "arc". + // Reconstruct a plausible version of it until we begin uploading this + // information. + + $author_name = idx($commit, 'author'); + $author_email = idx($commit, 'authorEmail'); + if (strlen($author_name) && strlen($author_email)) { + $author_raw = (string)id(new PhutilEmailAddress()) + ->setDisplayName($author_name) + ->setAddress($author_email); + } else if (strlen($author_email)) { + $author_raw = $author_email; + } else { + $author_raw = $author_name; + } + + $list[] = array( + 'identifier' => $commit['commit'], + 'tree' => idx($commit, 'tree'), + 'parents' => idx($commit, 'parents', array()), + 'author' => array( + 'name' => $author_name, + 'email' => $author_email, + 'raw' => $author_raw, + 'epoch' => $author_epoch, + ), + 'message' => idx($commit, 'message'), + ); + } + + return array( + 'commits' => $list, + ); + } + +} diff --git a/src/applications/differential/storage/DifferentialDiff.php b/src/applications/differential/storage/DifferentialDiff.php index 728ec4b538..cb392c4306 100644 --- a/src/applications/differential/storage/DifferentialDiff.php +++ b/src/applications/differential/storage/DifferentialDiff.php @@ -815,7 +815,10 @@ final class DifferentialDiff } public function getConduitSearchAttachments() { - return array(); + return array( + id(new DifferentialCommitsSearchEngineAttachment()) + ->setAttachmentKey('commits'), + ); } diff --git a/src/applications/repository/storage/PhabricatorRepositoryCommit.php b/src/applications/repository/storage/PhabricatorRepositoryCommit.php index 01088522e7..98f78e63e6 100644 --- a/src/applications/repository/storage/PhabricatorRepositoryCommit.php +++ b/src/applications/repository/storage/PhabricatorRepositoryCommit.php @@ -716,6 +716,10 @@ final class PhabricatorRepositoryCommit } public function getFieldValuesForConduit() { + + // NOTE: This data should be similar to the information returned about + // commmits by "differential.diff.search" with the "commits" attachment. + return array( 'identifier' => $this->getCommitIdentifier(), ); -- 2.51.2