1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-26 16:52:41 +01:00

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
This commit is contained in:
epriestley 2018-04-19 11:39:11 -07:00
parent 19403fdb8e
commit 843bfb4fd8
4 changed files with 87 additions and 1 deletions

View file

@ -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',

View file

@ -0,0 +1,77 @@
<?php
final class DifferentialCommitsSearchEngineAttachment
extends PhabricatorSearchEngineAttachment {
public function getAttachmentName() {
return pht('Diff Commits');
}
public function getAttachmentDescription() {
return pht('Get the local commits (if any) for each diff.');
}
public function loadAttachmentData(array $objects, $spec) {
$properties = id(new DifferentialDiffProperty())->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,
);
}
}

View file

@ -815,7 +815,10 @@ final class DifferentialDiff
}
public function getConduitSearchAttachments() {
return array();
return array(
id(new DifferentialCommitsSearchEngineAttachment())
->setAttachmentKey('commits'),
);
}

View file

@ -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(),
);