diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -3007,7 +3007,11 @@ 'DifferentialBranchField' => 'DifferentialCustomField', 'DifferentialCapabilityDefaultView' => 'PhabricatorPolicyCapability', 'DifferentialChangesSinceLastUpdateField' => 'DifferentialCustomField', - 'DifferentialChangeset' => 'DifferentialDAO', + 'DifferentialChangeset' => + array( + 0 => 'DifferentialDAO', + 1 => 'PhabricatorPolicyInterface', + ), 'DifferentialChangesetDetailView' => 'AphrontView', 'DifferentialChangesetHTMLRenderer' => 'DifferentialChangesetRenderer', 'DifferentialChangesetListView' => 'AphrontView', diff --git a/src/applications/differential/conduit/ConduitAPI_differential_getrawdiff_Method.php b/src/applications/differential/conduit/ConduitAPI_differential_getrawdiff_Method.php --- a/src/applications/differential/conduit/ConduitAPI_differential_getrawdiff_Method.php +++ b/src/applications/differential/conduit/ConduitAPI_differential_getrawdiff_Method.php @@ -31,23 +31,19 @@ $diff = id(new DifferentialDiffQuery()) ->withIDs(array($diff_id)) ->setViewer($viewer) + ->needChangesets(true) ->executeOne(); if (!$diff) { throw new ConduitException('ERR_NOT_FOUND'); } - $changesets = $diff->loadChangesets(); - foreach ($changesets as $changeset) { - $changeset->attachHunks( - $changeset->loadHunks()); - } + $renderer = id(new DifferentialRawDiffRenderer()) + ->setChangesets($diff->getChangesets()) + ->setViewer($viewer) + ->setFormat('git'); - $renderer = new DifferentialRawDiffRenderer(); - $renderer->setChangesets($changesets); - $renderer->setViewer($viewer); - $renderer->setFormat('git'); return $renderer->buildPatch(); - } + } diff --git a/src/applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php b/src/applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php --- a/src/applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php +++ b/src/applications/differential/parser/__tests__/DifferentialHunkParserTestCase.php @@ -1,22 +1,29 @@ setOldOffset($old_offset) + ->setOldLen($old_len) + ->setNewOffset($new_offset) + ->setNewLen($new_len) + ->setChanges($changes); - private function createHunk($oldOffset, $oldLen, $newOffset, $newLen, $changes) { - $hunk = new DifferentialHunk(); - $hunk->setOldOffset($oldOffset); - $hunk->setOldLen($oldLen); - $hunk->setNewOffset($newOffset); - $hunk->setNewLen($newLen); - $hunk->setChanges($changes); return $hunk; } + // Returns a change that consists of a single hunk, starting at line 1. private function createSingleChange($old_lines, $new_lines, $changes) { return array( diff --git a/src/applications/differential/query/DifferentialDiffQuery.php b/src/applications/differential/query/DifferentialDiffQuery.php --- a/src/applications/differential/query/DifferentialDiffQuery.php +++ b/src/applications/differential/query/DifferentialDiffQuery.php @@ -76,26 +76,39 @@ } - if ($this->needChangesets) { - $this->loadChangesets($diffs); + if ($diffs && $this->needChangesets) { + $diffs = $this->loadChangesets($diffs); } - if ($this->needArcanistProjects) { - $this->loadArcanistProjects($diffs); + if ($diffs && $this->needArcanistProjects) { + $diffs = $this->loadArcanistProjects($diffs); } return $diffs; } private function loadChangesets(array $diffs) { + $diff_ids = mpull($diffs, 'getID'); + + $changesets = id(new DifferentialChangeset())->loadAllWhere( + 'diffID IN (%Ld)', + $diff_ids); + + if ($changesets) { + id(new DifferentialHunkQuery()) + ->setViewer($this->getViewer()) + ->setParentQuery($this) + ->withChangesets($changesets) + ->needAttachToChangesets(true) + ->execute(); + } + + $changeset_groups = mgroup($changesets, 'getDiffID'); foreach ($diffs as $diff) { - $diff->attachChangesets( - $diff->loadRelatives(new DifferentialChangeset(), 'diffID')); - foreach ($diff->getChangesets() as $changeset) { - $changeset->attachHunks( - $changeset->loadRelatives(new DifferentialHunk(), 'changesetID')); - } + $diff_changesets = idx($changeset_groups, $diff->getID(), array()); + $diff->attachChangesets($diff_changesets); } + return $diffs; } diff --git a/src/applications/differential/render/DifferentialRawDiffRenderer.php b/src/applications/differential/render/DifferentialRawDiffRenderer.php --- a/src/applications/differential/render/DifferentialRawDiffRenderer.php +++ b/src/applications/differential/render/DifferentialRawDiffRenderer.php @@ -37,10 +37,6 @@ public function buildPatch() { $diff = new DifferentialDiff(); $diff->attachChangesets($this->getChangesets()); - foreach ($diff->getChangesets() as $changeset) { - $changeset->attachHunks( - $changeset->loadRelatives(new DifferentialHunk(), 'changesetID')); - } $raw_changes = $diff->buildChangesList(); $changes = array(); diff --git a/src/applications/differential/storage/DifferentialChangeset.php b/src/applications/differential/storage/DifferentialChangeset.php --- a/src/applications/differential/storage/DifferentialChangeset.php +++ b/src/applications/differential/storage/DifferentialChangeset.php @@ -1,6 +1,7 @@