Skip to content

Commit 0da3f34

Browse files
author
epriestley
committed
Provide "differential.diff.search"
Summary: See PHI90. For now, this only provides a limited amount of information, but should satisfy the use case in PHI90 and build toward a more complete version in the future. Test Plan: Used new Conduit method to retrieve information about diffs. Reviewers: amckinley Reviewed By: amckinley Differential Revision: https://secure.phabricator.com/D18744
1 parent f7f3dd5 commit 0da3f34

File tree

6 files changed

+217
-1
lines changed

6 files changed

+217
-1
lines changed

src/__phutil_library_map__.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@
439439
'DifferentialDiffQuery' => 'applications/differential/query/DifferentialDiffQuery.php',
440440
'DifferentialDiffRepositoryHeraldField' => 'applications/differential/herald/DifferentialDiffRepositoryHeraldField.php',
441441
'DifferentialDiffRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialDiffRepositoryProjectsHeraldField.php',
442+
'DifferentialDiffSearchConduitAPIMethod' => 'applications/differential/conduit/DifferentialDiffSearchConduitAPIMethod.php',
443+
'DifferentialDiffSearchEngine' => 'applications/differential/query/DifferentialDiffSearchEngine.php',
442444
'DifferentialDiffTestCase' => 'applications/differential/storage/__tests__/DifferentialDiffTestCase.php',
443445
'DifferentialDiffTransaction' => 'applications/differential/storage/DifferentialDiffTransaction.php',
444446
'DifferentialDiffTransactionQuery' => 'applications/differential/query/DifferentialDiffTransactionQuery.php',
@@ -5435,6 +5437,7 @@
54355437
'HarbormasterBuildkiteBuildableInterface',
54365438
'PhabricatorApplicationTransactionInterface',
54375439
'PhabricatorDestructibleInterface',
5440+
'PhabricatorConduitResultInterface',
54385441
),
54395442
'DifferentialDiffAffectedFilesHeraldField' => 'DifferentialDiffHeraldField',
54405443
'DifferentialDiffAuthorHeraldField' => 'DifferentialDiffHeraldField',
@@ -5453,6 +5456,8 @@
54535456
'DifferentialDiffQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
54545457
'DifferentialDiffRepositoryHeraldField' => 'DifferentialDiffHeraldField',
54555458
'DifferentialDiffRepositoryProjectsHeraldField' => 'DifferentialDiffHeraldField',
5459+
'DifferentialDiffSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod',
5460+
'DifferentialDiffSearchEngine' => 'PhabricatorApplicationSearchEngine',
54565461
'DifferentialDiffTestCase' => 'PhutilTestCase',
54575462
'DifferentialDiffTransaction' => 'PhabricatorApplicationTransaction',
54585463
'DifferentialDiffTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
final class DifferentialDiffSearchConduitAPIMethod
4+
extends PhabricatorSearchEngineAPIMethod {
5+
6+
public function getAPIMethodName() {
7+
return 'differential.diff.search';
8+
}
9+
10+
public function newSearchEngine() {
11+
return new DifferentialDiffSearchEngine();
12+
}
13+
14+
public function getMethodSummary() {
15+
return pht('Read information about diffs.');
16+
}
17+
18+
}

src/applications/differential/conduit/DifferentialQueryDiffsConduitAPIMethod.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@ public function getMethodDescription() {
1111
return pht('Query differential diffs which match certain criteria.');
1212
}
1313

14+
public function getMethodStatus() {
15+
return self::METHOD_STATUS_FROZEN;
16+
}
17+
18+
public function getMethodStatusDescription() {
19+
return pht(
20+
'This method is frozen and will eventually be deprecated. New code '.
21+
'should use "differential.diff.search" instead.');
22+
}
23+
1424
protected function defineParamTypes() {
1525
return array(
1626
'ids' => 'optional list<uint>',

src/applications/differential/query/DifferentialDiffQuery.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ final class DifferentialDiffQuery
66
private $ids;
77
private $phids;
88
private $revisionIDs;
9+
private $revisionPHIDs;
910
private $commitPHIDs;
1011
private $hasRevision;
1112

@@ -27,6 +28,11 @@ public function withRevisionIDs(array $revision_ids) {
2728
return $this;
2829
}
2930

31+
public function withRevisionPHIDs(array $revision_phids) {
32+
$this->revisionPHIDs = $revision_phids;
33+
return $this;
34+
}
35+
3036
public function withCommitPHIDs(array $phids) {
3137
$this->commitPHIDs = $phids;
3238
return $this;
@@ -160,6 +166,25 @@ protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) {
160166
}
161167
}
162168

169+
if ($this->revisionPHIDs !== null) {
170+
$viewer = $this->getViewer();
171+
172+
$revisions = id(new DifferentialRevisionQuery())
173+
->setViewer($viewer)
174+
->setParentQuery($this)
175+
->withPHIDs($this->revisionPHIDs)
176+
->execute();
177+
$revision_ids = mpull($revisions, 'getID');
178+
if (!$revision_ids) {
179+
throw new PhabricatorEmptyQueryException();
180+
}
181+
182+
$where[] = qsprintf(
183+
$conn,
184+
'revisionID IN (%Ls)',
185+
$revision_ids);
186+
}
187+
163188
return $where;
164189
}
165190

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
final class DifferentialDiffSearchEngine
4+
extends PhabricatorApplicationSearchEngine {
5+
6+
public function getResultTypeDescription() {
7+
return pht('Differential Diffs');
8+
}
9+
10+
public function getApplicationClassName() {
11+
return 'PhabricatorDifferentialApplication';
12+
}
13+
14+
public function newQuery() {
15+
return new DifferentialDiffQuery();
16+
}
17+
18+
protected function buildQueryFromParameters(array $map) {
19+
$query = $this->newQuery();
20+
21+
if ($map['revisionPHIDs']) {
22+
$query->withRevisionPHIDs($map['revisionPHIDs']);
23+
}
24+
25+
return $query;
26+
}
27+
28+
protected function buildCustomSearchFields() {
29+
return array(
30+
id(new PhabricatorPHIDsSearchField())
31+
->setLabel(pht('Revisions'))
32+
->setKey('revisionPHIDs')
33+
->setAliases(array('revision', 'revisions', 'revisionPHID'))
34+
->setDescription(
35+
pht('Find diffs attached to a particular revision.')),
36+
);
37+
}
38+
39+
protected function getURI($path) {
40+
return '/differential/diff/'.$path;
41+
}
42+
43+
protected function getBuiltinQueryNames() {
44+
$names = array();
45+
46+
$names['all'] = pht('All Diffs');
47+
48+
return $names;
49+
}
50+
51+
public function buildSavedQueryFromBuiltin($query_key) {
52+
$query = $this->newSavedQuery();
53+
$query->setQueryKey($query_key);
54+
55+
$viewer = $this->requireViewer();
56+
57+
switch ($query_key) {
58+
case 'all':
59+
return $query;
60+
}
61+
62+
return parent::buildSavedQueryFromBuiltin($query_key);
63+
}
64+
65+
protected function renderResultList(
66+
array $revisions,
67+
PhabricatorSavedQuery $query,
68+
array $handles) {
69+
assert_instances_of($revisions, 'DifferentialDiff');
70+
71+
$viewer = $this->requireViewer();
72+
73+
// NOTE: This is only exposed to Conduit, so we don't currently render
74+
// results.
75+
76+
return id(new PhabricatorApplicationSearchResultView());
77+
}
78+
79+
}

src/applications/differential/storage/DifferentialDiff.php

Lines changed: 80 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ final class DifferentialDiff
99
HarbormasterCircleCIBuildableInterface,
1010
HarbormasterBuildkiteBuildableInterface,
1111
PhabricatorApplicationTransactionInterface,
12-
PhabricatorDestructibleInterface {
12+
PhabricatorDestructibleInterface,
13+
PhabricatorConduitResultInterface {
1314

1415
protected $revisionID;
1516
protected $authorPHID;
@@ -740,4 +741,82 @@ public function destroyObjectPermanently(
740741
$this->saveTransaction();
741742
}
742743

744+
745+
/* -( PhabricatorConduitResultInterface )---------------------------------- */
746+
747+
748+
public function getFieldSpecificationsForConduit() {
749+
return array(
750+
id(new PhabricatorConduitSearchFieldSpecification())
751+
->setKey('revisionPHID')
752+
->setType('phid')
753+
->setDescription(pht('Associated revision PHID.')),
754+
id(new PhabricatorConduitSearchFieldSpecification())
755+
->setKey('authorPHID')
756+
->setType('phid')
757+
->setDescription(pht('Revision author PHID.')),
758+
id(new PhabricatorConduitSearchFieldSpecification())
759+
->setKey('repositoryPHID')
760+
->setType('phid')
761+
->setDescription(pht('Associated repository PHID.')),
762+
id(new PhabricatorConduitSearchFieldSpecification())
763+
->setKey('refs')
764+
->setType('map<string, wild>')
765+
->setDescription(pht('List of related VCS references.')),
766+
);
767+
}
768+
769+
public function getFieldValuesForConduit() {
770+
$refs = array();
771+
772+
$branch = $this->getBranch();
773+
if (strlen($branch)) {
774+
$refs[] = array(
775+
'type' => 'branch',
776+
'name' => $branch,
777+
);
778+
}
779+
780+
$onto = $this->loadTargetBranch();
781+
if (strlen($onto)) {
782+
$refs[] = array(
783+
'type' => 'onto',
784+
'name' => $onto,
785+
);
786+
}
787+
788+
$base = $this->getSourceControlBaseRevision();
789+
if (strlen($base)) {
790+
$refs[] = array(
791+
'type' => 'base',
792+
'identifier' => $base,
793+
);
794+
}
795+
796+
$bookmark = $this->getBookmark();
797+
if (strlen($bookmark)) {
798+
$refs[] = array(
799+
'type' => 'bookmark',
800+
'name' => $bookmark,
801+
);
802+
}
803+
804+
$revision_phid = null;
805+
if ($this->getRevisionID()) {
806+
$revision_phid = $this->getRevision()->getPHID();
807+
}
808+
809+
return array(
810+
'revisionPHID' => $revision_phid,
811+
'authorPHID' => $this->getAuthorPHID(),
812+
'repositoryPHID' => $this->getRepositoryPHID(),
813+
'refs' => $refs,
814+
);
815+
}
816+
817+
public function getConduitSearchAttachments() {
818+
return array();
819+
}
820+
821+
743822
}

0 commit comments

Comments
 (0)