diff --git a/src/applications/differential/render/DifferentialChangesetRenderer.php b/src/applications/differential/render/DifferentialChangesetRenderer.php --- a/src/applications/differential/render/DifferentialChangesetRenderer.php +++ b/src/applications/differential/render/DifferentialChangesetRenderer.php @@ -33,7 +33,7 @@ private $canMarkDone; private $objectOwnerPHID; private $highlightingDisabled; - private $scopeEngine; + private $scopeEngine = false; private $depthOnlyLines; private $oldFile = false; @@ -677,13 +677,23 @@ return $views; } - final protected function getScopeEngine() { - if (!$this->scopeEngine) { - $line_map = $this->getNewLineTextMap(); + if ($this->scopeEngine === false) { + $hunk_starts = $this->getHunkStartLines(); + + // If this change is missing context, don't try to identify scopes, since + // we won't really be able to get anywhere. + $has_multiple_hunks = (count($hunk_starts) > 1); + $has_offset_hunks = (head_key($hunk_starts) != 1); + $missing_context = ($has_multiple_hunks || $has_offset_hunks); - $scope_engine = id(new PhabricatorDiffScopeEngine()) - ->setLineTextMap($line_map); + if ($missing_context) { + $scope_engine = null; + } else { + $line_map = $this->getNewLineTextMap(); + $scope_engine = id(new PhabricatorDiffScopeEngine()) + ->setLineTextMap($line_map); + } $this->scopeEngine = $scope_engine; } diff --git a/src/applications/differential/render/DifferentialChangesetTwoUpRenderer.php b/src/applications/differential/render/DifferentialChangesetTwoUpRenderer.php --- a/src/applications/differential/render/DifferentialChangesetTwoUpRenderer.php +++ b/src/applications/differential/render/DifferentialChangesetTwoUpRenderer.php @@ -94,7 +94,7 @@ $context_text = null; $context_line = null; - if (!$is_last_block) { + if (!$is_last_block && $scope_engine) { $target_line = $new_lines[$ii + $len]['line']; $context_line = $scope_engine->getScopeStart($target_line); if ($context_line !== null) {