1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-25 16:22:43 +01:00

Recover inline comments which are "adjusted" off the end of a diff

Summary:
See PHI1834. Currently, the inline adjustment engine can sometime "adjust" an inline off the end of a diff. If it does, we lay it out on an invalid display line here and never render it.

Instead, make sure that layout never puts a comment on an invalid line, so the UI is robust against questionable decisions by the adjustment engine: no adjustment should be able to accidentally discard an inline.

Test Plan:
  - Created a two diff revision, where Diffs 1 and 2 have "alphabet.txt" with A-Z on one line each. The file is unchanged across diffs; some other file is changed.
  - Added a comment to lines P-Z of Diff 1.
  - Before: comment is adjusted out of range on Diff 2 and not shown in the UI.
  - After: comment is still adjusted out of range internally, but now corrected into the display range and shown.

Differential Revision: https://secure.phabricator.com/D21435
This commit is contained in:
epriestley 2020-08-05 12:56:04 -07:00
parent 2db1955159
commit dbdfac1e07

View file

@ -1053,14 +1053,30 @@ final class DifferentialChangesetParser extends Phobject {
$this->comments = id(new PHUIDiffInlineThreader()) $this->comments = id(new PHUIDiffInlineThreader())
->reorderAndThreadCommments($this->comments); ->reorderAndThreadCommments($this->comments);
$old_max_display = 1;
foreach ($this->old as $old) {
if (isset($old['line'])) {
$old_max_display = $old['line'];
}
}
$new_max_display = 1;
foreach ($this->new as $new) {
if (isset($new['line'])) {
$new_max_display = $new['line'];
}
}
foreach ($this->comments as $comment) { foreach ($this->comments as $comment) {
$final = $comment->getLineNumber() + $display_line = $comment->getLineNumber() + $comment->getLineLength();
$comment->getLineLength(); $display_line = max(1, $display_line);
$final = max(1, $final);
if ($this->isCommentOnRightSideWhenDisplayed($comment)) { if ($this->isCommentOnRightSideWhenDisplayed($comment)) {
$new_comments[$final][] = $comment; $display_line = min($new_max_display, $display_line);
$new_comments[$display_line][] = $comment;
} else { } else {
$old_comments[$final][] = $comment; $display_line = min($old_max_display, $display_line);
$old_comments[$display_line][] = $comment;
} }
} }
} }