mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
Simplify context parsing and add test coverage
Summary: - Remove 'missingNew', etc. It's impossible for a diff to popluate these, as far as I can tell (I can't generate such a diff, or find any which generate it). - Add unit tests. Test Plan: Unit tests, viewed a diff with some missing context. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2009 Differential Revision: https://secure.phabricator.com/D4393
This commit is contained in:
parent
ebf2435c49
commit
6a69108358
8 changed files with 118 additions and 79 deletions
|
@ -10,8 +10,7 @@ final class DifferentialChangesetParser {
|
||||||
protected $oldRender = null;
|
protected $oldRender = null;
|
||||||
|
|
||||||
protected $filename = null;
|
protected $filename = null;
|
||||||
protected $missingOld = array();
|
protected $hunkStartLines = array();
|
||||||
protected $missingNew = array();
|
|
||||||
|
|
||||||
protected $comments = array();
|
protected $comments = array();
|
||||||
protected $specialAttributes = array();
|
protected $specialAttributes = array();
|
||||||
|
@ -41,7 +40,7 @@ final class DifferentialChangesetParser {
|
||||||
private $markupEngine;
|
private $markupEngine;
|
||||||
private $highlightErrors;
|
private $highlightErrors;
|
||||||
|
|
||||||
const CACHE_VERSION = 8;
|
const CACHE_VERSION = 9;
|
||||||
const CACHE_MAX_SIZE = 8e6;
|
const CACHE_MAX_SIZE = 8e6;
|
||||||
|
|
||||||
const ATTR_GENERATED = 'attr:generated';
|
const ATTR_GENERATED = 'attr:generated';
|
||||||
|
@ -74,16 +73,6 @@ final class DifferentialChangesetParser {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setMissingNewLineMarkerMap(array $map) {
|
|
||||||
$this->missingNew = $map;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setMissingOldLineMarkerMap(array $map) {
|
|
||||||
$this->missingOld = $map;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setIntraLineDiffs(array $diffs) {
|
public function setIntraLineDiffs(array $diffs) {
|
||||||
$this->intra = $diffs;
|
$this->intra = $diffs;
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -298,8 +287,7 @@ final class DifferentialChangesetParser {
|
||||||
'newRender',
|
'newRender',
|
||||||
'oldRender',
|
'oldRender',
|
||||||
'specialAttributes',
|
'specialAttributes',
|
||||||
'missingOld',
|
'hunkStartLines',
|
||||||
'missingNew',
|
|
||||||
'cacheVersion',
|
'cacheVersion',
|
||||||
'cacheHost',
|
'cacheHost',
|
||||||
);
|
);
|
||||||
|
@ -593,8 +581,8 @@ final class DifferentialChangesetParser {
|
||||||
$this->setNewLines($hunk_parser->getNewLines());
|
$this->setNewLines($hunk_parser->getNewLines());
|
||||||
$this->setIntraLineDiffs($hunk_parser->getIntraLineDiffs());
|
$this->setIntraLineDiffs($hunk_parser->getIntraLineDiffs());
|
||||||
$this->setVisibileLinesMask($hunk_parser->getVisibleLinesMask());
|
$this->setVisibileLinesMask($hunk_parser->getVisibleLinesMask());
|
||||||
$this->setMissingOldLineMarkerMap($hunk_parser->getOldLineMarkerMap());
|
$this->hunkStartLines = $hunk_parser->getHunkStartLines(
|
||||||
$this->setMissingNewLineMarkerMap($hunk_parser->getNewLineMarkerMap());
|
$changeset->getHunks());
|
||||||
|
|
||||||
$new_corpus = $hunk_parser->getNewCorpus();
|
$new_corpus = $hunk_parser->getNewCorpus();
|
||||||
$new_corpus_block = implode('', $new_corpus);
|
$new_corpus_block = implode('', $new_corpus);
|
||||||
|
@ -711,8 +699,7 @@ final class DifferentialChangesetParser {
|
||||||
->setLineCount($rows)
|
->setLineCount($rows)
|
||||||
->setOldRender($this->oldRender)
|
->setOldRender($this->oldRender)
|
||||||
->setNewRender($this->newRender)
|
->setNewRender($this->newRender)
|
||||||
->setMissingOldLines($this->missingOld)
|
->setHunkStartLines($this->hunkStartLines)
|
||||||
->setMissingNewLines($this->missingNew)
|
|
||||||
->setOldChangesetID($this->leftSideChangesetID)
|
->setOldChangesetID($this->leftSideChangesetID)
|
||||||
->setNewChangesetID($this->rightSideChangesetID)
|
->setNewChangesetID($this->rightSideChangesetID)
|
||||||
->setOldAttachesToNewFile($this->leftSideAttachesToNewFile)
|
->setOldAttachesToNewFile($this->leftSideAttachesToNewFile)
|
||||||
|
|
|
@ -7,13 +7,32 @@ final class DifferentialHunkParser {
|
||||||
private $isDeleted;
|
private $isDeleted;
|
||||||
private $oldLines;
|
private $oldLines;
|
||||||
private $newLines;
|
private $newLines;
|
||||||
private $oldLineMarkerMap;
|
|
||||||
private $newLineMarkerMap;
|
|
||||||
private $skipIntraLines;
|
private $skipIntraLines;
|
||||||
private $whitespaceMode;
|
private $whitespaceMode;
|
||||||
private $intraLineDiffs;
|
private $intraLineDiffs;
|
||||||
private $visibleLinesMask;
|
private $visibleLinesMask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a map of lines on which hunks start, other than line 1. This
|
||||||
|
* datastructure is used to determine when to render "Context not available."
|
||||||
|
* in diffs with multiple hunks.
|
||||||
|
*
|
||||||
|
* @return dict<int, bool> Map of lines where hunks start, other than line 1.
|
||||||
|
*/
|
||||||
|
public function getHunkStartLines(array $hunks) {
|
||||||
|
assert_instances_of($hunks, 'DifferentialHunk');
|
||||||
|
|
||||||
|
$map = array();
|
||||||
|
foreach ($hunks as $hunk) {
|
||||||
|
$line = $hunk->getOldOffset();
|
||||||
|
if ($line > 1) {
|
||||||
|
$map[$line] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $map;
|
||||||
|
}
|
||||||
|
|
||||||
private function setVisibleLinesMask($mask) {
|
private function setVisibleLinesMask($mask) {
|
||||||
$this->visibleLinesMask = $mask;
|
$this->visibleLinesMask = $mask;
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -66,32 +85,6 @@ final class DifferentialHunkParser {
|
||||||
return $this->skipIntraLines;
|
return $this->skipIntraLines;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function setNewLineMarkerMap($new_line_marker_map) {
|
|
||||||
$this->newLineMarkerMap = $new_line_marker_map;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
public function getNewLineMarkerMap() {
|
|
||||||
if ($this->newLineMarkerMap === null) {
|
|
||||||
throw new Exception(
|
|
||||||
'You must parseHunksForLineData before accessing this data.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $this->newLineMarkerMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function setOldLineMarkerMap($old_line_marker_map) {
|
|
||||||
$this->oldLineMarkerMap = $old_line_marker_map;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
public function getOldLineMarkerMap() {
|
|
||||||
if ($this->oldLineMarkerMap === null) {
|
|
||||||
throw new Exception(
|
|
||||||
'You must parseHunksForLineData before accessing this data.'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return $this->oldLineMarkerMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function setNewLines($new_lines) {
|
private function setNewLines($new_lines) {
|
||||||
$this->newLines = $new_lines;
|
$this->newLines = $new_lines;
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -419,9 +412,6 @@ final class DifferentialHunkParser {
|
||||||
|
|
||||||
$old_lines = array();
|
$old_lines = array();
|
||||||
$new_lines = array();
|
$new_lines = array();
|
||||||
$old_line_marker_map = array();
|
|
||||||
$new_line_marker_map = array();
|
|
||||||
|
|
||||||
foreach ($hunks as $hunk) {
|
foreach ($hunks as $hunk) {
|
||||||
|
|
||||||
$lines = $hunk->getChanges();
|
$lines = $hunk->getChanges();
|
||||||
|
@ -443,11 +433,6 @@ final class DifferentialHunkParser {
|
||||||
|
|
||||||
$old_line = $hunk->getOldOffset();
|
$old_line = $hunk->getOldOffset();
|
||||||
$new_line = $hunk->getNewOffset();
|
$new_line = $hunk->getNewOffset();
|
||||||
if ($old_line > 1) {
|
|
||||||
$old_line_marker_map[$old_line] = true;
|
|
||||||
} else if ($new_line > 1) {
|
|
||||||
$new_line_marker_map[$new_line] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$num_lines = count($lines);
|
$num_lines = count($lines);
|
||||||
for ($cursor = 0; $cursor < $num_lines; $cursor++) {
|
for ($cursor = 0; $cursor < $num_lines; $cursor++) {
|
||||||
|
@ -484,8 +469,6 @@ final class DifferentialHunkParser {
|
||||||
|
|
||||||
$this->setOldLines($old_lines);
|
$this->setOldLines($old_lines);
|
||||||
$this->setNewLines($new_lines);
|
$this->setNewLines($new_lines);
|
||||||
$this->setOldLineMarkerMap($old_line_marker_map);
|
|
||||||
$this->setNewLineMarkerMap($new_line_marker_map);
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,19 @@ final class DifferentialHunkParserTestCase extends PhabricatorTestCase {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function createHunksFromFile($name) {
|
||||||
|
$data = Filesystem::readFile(dirname(__FILE__).'/data/'.$name);
|
||||||
|
|
||||||
|
$parser = new ArcanistDiffParser();
|
||||||
|
$changes = $parser->parseDiff($data);
|
||||||
|
if (count($changes) !== 1) {
|
||||||
|
throw new Exception("Expected 1 changeset for '{$name}'!");
|
||||||
|
}
|
||||||
|
|
||||||
|
$diff = DifferentialDiff::newFromRawChanges($changes);
|
||||||
|
return head($diff->getChangesets())->getHunks();
|
||||||
|
}
|
||||||
|
|
||||||
public function testOneLineOldComment() {
|
public function testOneLineOldComment() {
|
||||||
$parser = new DifferentialHunkParser();
|
$parser = new DifferentialHunkParser();
|
||||||
$hunks = $this->createSingleChange(1, 0, "-a");
|
$hunks = $this->createSingleChange(1, 0, "-a");
|
||||||
|
@ -232,5 +245,30 @@ final class DifferentialHunkParserTestCase extends PhabricatorTestCase {
|
||||||
"-o3\n".
|
"-o3\n".
|
||||||
"+n2", $context);
|
"+n2", $context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testMissingContext() {
|
||||||
|
$tests = array(
|
||||||
|
'missing_context.diff' => array(
|
||||||
|
4 => true,
|
||||||
|
),
|
||||||
|
'missing_context_2.diff' => array(
|
||||||
|
5 => true,
|
||||||
|
),
|
||||||
|
'missing_context_3.diff' => array(
|
||||||
|
4 => true,
|
||||||
|
13 => true,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($tests as $name => $expect) {
|
||||||
|
$hunks = $this->createHunksFromFile($name);
|
||||||
|
|
||||||
|
$parser = new DifferentialHunkParser();
|
||||||
|
$actual = $parser->getHunkStartLines($hunks);
|
||||||
|
|
||||||
|
$this->assertEqual($expect, $actual, $name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
diff --git a/fruit b/fruit
|
||||||
|
index a1f7255..b5fb7b8 100644
|
||||||
|
--- a/fruit
|
||||||
|
+++ b/fruit
|
||||||
|
@@ -4,6 +4,5 @@ cherry
|
||||||
|
date
|
||||||
|
elderberry
|
||||||
|
fig
|
||||||
|
-grape
|
||||||
|
honeydew
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff --git a/fruit b/fruit
|
||||||
|
index a1f7255..fa84742 100644
|
||||||
|
--- a/fruit
|
||||||
|
+++ b/fruit
|
||||||
|
@@ -5,5 +5,7 @@ date
|
||||||
|
elderberry
|
||||||
|
fig
|
||||||
|
grape
|
||||||
|
+guava
|
||||||
|
+gooseberry
|
||||||
|
honeydew
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
diff --git a/fruit b/fruit
|
||||||
|
index bf66874..071dd49 100644
|
||||||
|
--- a/fruit
|
||||||
|
+++ b/fruit
|
||||||
|
@@ -4,7 +4,6 @@ date
|
||||||
|
elderberry
|
||||||
|
fig
|
||||||
|
banana
|
||||||
|
-grape
|
||||||
|
honeydew
|
||||||
|
apple
|
||||||
|
cherry
|
||||||
|
@@ -13,5 +12,4 @@ elderberry
|
||||||
|
fig
|
||||||
|
banana
|
||||||
|
grape
|
||||||
|
-honeydew
|
||||||
|
|
|
@ -6,8 +6,7 @@ abstract class DifferentialChangesetRenderer {
|
||||||
private $changeset;
|
private $changeset;
|
||||||
private $renderingReference;
|
private $renderingReference;
|
||||||
private $renderPropertyChangeHeader;
|
private $renderPropertyChangeHeader;
|
||||||
private $missingOldLines;
|
private $hunkStartLines;
|
||||||
private $missingNewLines;
|
|
||||||
private $oldLines;
|
private $oldLines;
|
||||||
private $newLines;
|
private $newLines;
|
||||||
private $oldComments;
|
private $oldComments;
|
||||||
|
@ -205,20 +204,13 @@ abstract class DifferentialChangesetRenderer {
|
||||||
return $this->oldLines;
|
return $this->oldLines;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setMissingNewLines(array $missing_new_lines) {
|
public function setHunkStartLines(array $hunk_start_lines) {
|
||||||
$this->missingNewLines = $missing_new_lines;
|
$this->hunkStartLines = $hunk_start_lines;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
protected function getMissingNewLines() {
|
|
||||||
return $this->missingNewLines;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setMissingOldLines(array $missing_old_lines) {
|
protected function getHunkStartLines() {
|
||||||
$this->missingOldLines = $missing_old_lines;
|
return $this->hunkStartLines;
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
protected function getMissingOldLines() {
|
|
||||||
return $this->missingOldLines;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setUser(PhabricatorUser $user) {
|
public function setUser(PhabricatorUser $user) {
|
||||||
|
|
|
@ -44,11 +44,10 @@ final class DifferentialChangesetTwoUpRenderer
|
||||||
$range_len,
|
$range_len,
|
||||||
$rows) {
|
$rows) {
|
||||||
|
|
||||||
$missing_old = $this->getMissingOldLines();
|
$hunk_starts = $this->getHunkStartLines();
|
||||||
$missing_new = $this->getMissingNewLines();
|
|
||||||
|
|
||||||
$context_not_available = null;
|
$context_not_available = null;
|
||||||
if ($missing_old || $missing_new) {
|
if ($hunk_starts) {
|
||||||
$context_not_available = javelin_render_tag(
|
$context_not_available = javelin_render_tag(
|
||||||
'tr',
|
'tr',
|
||||||
array(
|
array(
|
||||||
|
@ -282,8 +281,7 @@ final class DifferentialChangesetTwoUpRenderer
|
||||||
}
|
}
|
||||||
$n_classes .= ' right'.$n_colspan;
|
$n_classes .= ' right'.$n_colspan;
|
||||||
|
|
||||||
if (($o_num && !empty($missing_old[$o_num])) ||
|
if (isset($hunk_starts[$o_num])) {
|
||||||
($n_num && !empty($missing_new[$n_num]))) {
|
|
||||||
$html[] = $context_not_available;
|
$html[] = $context_not_available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue