From a025050e87e08a42ecf3ccb27af4c4bfc23b5aca Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 18 Sep 2013 15:31:48 -0700 Subject: [PATCH] Fix an issue with `differential.getdiff` when providing a revision ID Summary: If handed a revision ID, we might get more than one result, which causes `executeOne()` to throw. Instead, translate the revision id into a diff ID before querying for the diff. Also one small consistency change to parameter casing. Test Plan: Used console to query for a revision with more than one diff using the revision id. Reviewers: btrahan Reviewed By: btrahan CC: aran, mbishopim3 Differential Revision: https://secure.phabricator.com/D7026 --- ...ConduitAPI_differential_getdiff_Method.php | 25 +++++++++++-------- ...duitAPI_differential_querydiffs_Method.php | 4 +-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/applications/differential/conduit/ConduitAPI_differential_getdiff_Method.php b/src/applications/differential/conduit/ConduitAPI_differential_getdiff_Method.php index e2efa11310..2c864a43ab 100644 --- a/src/applications/differential/conduit/ConduitAPI_differential_getdiff_Method.php +++ b/src/applications/differential/conduit/ConduitAPI_differential_getdiff_Method.php @@ -43,23 +43,28 @@ final class ConduitAPI_differential_getdiff_Method } protected function execute(ConduitAPIRequest $request) { - $diff = null; - $revision_ids = array(); - $diff_ids = array(); + $diff_id = $request->getValue('diff_id'); + // If we have a revision ID, we need the most recent diff. Figure that out + // without loading all the attached data. $revision_id = $request->getValue('revision_id'); if ($revision_id) { - $revision_ids = array($revision_id); + $diffs = id(new DifferentialDiffQuery()) + ->setViewer($request->getUser()) + ->withRevisionIDs(array($revision_id)) + ->execute(); + if ($diffs) { + $diff_id = head($diffs)->getID(); + } else { + throw new ConduitException('ERR_BAD_DIFF'); + } } - $diff_id = $request->getValue('diff_id'); + + $diff = null; if ($diff_id) { - $diff_ids = array($diff_id); - } - if ($diff_ids || $revision_ids) { $diff = id(new DifferentialDiffQuery()) ->setViewer($request->getUser()) - ->withIDs($diff_ids) - ->withRevisionIDs($revision_ids) + ->withIDs(array($diff_id)) ->needChangesets(true) ->needArcanistProjects(true) ->executeOne(); diff --git a/src/applications/differential/conduit/ConduitAPI_differential_querydiffs_Method.php b/src/applications/differential/conduit/ConduitAPI_differential_querydiffs_Method.php index 991d7c09a6..25f233e947 100644 --- a/src/applications/differential/conduit/ConduitAPI_differential_querydiffs_Method.php +++ b/src/applications/differential/conduit/ConduitAPI_differential_querydiffs_Method.php @@ -13,7 +13,7 @@ final class ConduitAPI_differential_querydiffs_Method public function defineParamTypes() { return array( 'ids' => 'optional list', - 'revison_ids' => 'optional list', + 'revisonIDs' => 'optional list', ); } @@ -27,7 +27,7 @@ final class ConduitAPI_differential_querydiffs_Method protected function execute(ConduitAPIRequest $request) { $ids = $request->getValue('ids', array()); - $revision_ids = $request->getValue('revision_ids', array()); + $revision_ids = $request->getValue('revisionIDs', array()); $diffs = array(); $diff_dicts = array(); if ($ids || $revision_ids) {