mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
Improve sequencing of various content/header checks in abstract block diffs
Summary: Ref T13425. Some diff checks currently sequence incorrectly: - When we're rendering block lists, syntax highlighting isn't relevant. - The "large change" guard can prevent rendering of otherwise-renderable changes. - Actual errors in the document engine (like bad JSON in a ".ipynb" file) aren't surfaced properly. Improve sequencing somewhat to resolve these issues. Test Plan: - Viewed a notebook, no longer saw a "highlighting disabled" warning. - Forced a notebook to fail, got a useful inline error instead of a popup dialog error. - Forced a notebook to have a large number of differences, got a rendering out of it. Maniphest Tasks: T13425 Differential Revision: https://secure.phabricator.com/D20843
This commit is contained in:
parent
9944b669ad
commit
a7f3316aa3
7 changed files with 72 additions and 17 deletions
|
@ -868,8 +868,11 @@ final class DifferentialChangesetParser extends Phobject {
|
|||
->setHighlightingDisabled($this->highlightingDisabled)
|
||||
->setDepthOnlyLines($this->getDepthOnlyLines());
|
||||
|
||||
$engine_blocks = $this->newDocumentEngineBlocks();
|
||||
$has_document_engine = ($engine_blocks !== null);
|
||||
|
||||
$shield = null;
|
||||
if ($this->isTopLevel && !$this->comments) {
|
||||
if ($this->isTopLevel && !$this->comments && !$has_document_engine) {
|
||||
if ($this->isGenerated()) {
|
||||
$shield = $renderer->renderShield(
|
||||
pht(
|
||||
|
@ -1024,7 +1027,6 @@ final class DifferentialChangesetParser extends Phobject {
|
|||
->setOldComments($old_comments)
|
||||
->setNewComments($new_comments);
|
||||
|
||||
$engine_blocks = $this->newDocumentEngineChangesetView();
|
||||
if ($engine_blocks !== null) {
|
||||
$reference = $this->getRenderingReference();
|
||||
$parts = explode('/', $reference);
|
||||
|
@ -1041,6 +1043,8 @@ final class DifferentialChangesetParser extends Phobject {
|
|||
$vs = $id;
|
||||
}
|
||||
|
||||
$renderer->setDocumentEngineBlocks($engine_blocks);
|
||||
|
||||
return $renderer->renderDocumentEngineBlocks(
|
||||
$engine_blocks,
|
||||
(string)$id,
|
||||
|
@ -1653,7 +1657,7 @@ final class DifferentialChangesetParser extends Phobject {
|
|||
return $prefix.$line;
|
||||
}
|
||||
|
||||
private function newDocumentEngineChangesetView() {
|
||||
private function newDocumentEngineBlocks() {
|
||||
$changeset = $this->changeset;
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
|
@ -1724,7 +1728,7 @@ final class DifferentialChangesetParser extends Phobject {
|
|||
}
|
||||
|
||||
if ($document_engine) {
|
||||
return $document_engine->newDiffView(
|
||||
return $document_engine->newEngineBlocks(
|
||||
$old_ref,
|
||||
$new_ref);
|
||||
}
|
||||
|
|
|
@ -270,11 +270,20 @@ abstract class DifferentialChangesetHTMLRenderer
|
|||
}
|
||||
}
|
||||
|
||||
if ($this->getHighlightingDisabled()) {
|
||||
$messages[] = pht(
|
||||
'This file is larger than %s, so syntax highlighting is '.
|
||||
'disabled by default.',
|
||||
phutil_format_bytes(DifferentialChangesetParser::HIGHLIGHT_BYTE_LIMIT));
|
||||
$blocks = $this->getDocumentEngineBlocks();
|
||||
if ($blocks) {
|
||||
foreach ($blocks->getMessages() as $message) {
|
||||
$messages[] = $message;
|
||||
}
|
||||
} else {
|
||||
if ($this->getHighlightingDisabled()) {
|
||||
$byte_limit = DifferentialChangesetParser::HIGHLIGHT_BYTE_LIMIT;
|
||||
$byte_limit = phutil_format_bytes($byte_limit);
|
||||
$messages[] = pht(
|
||||
'This file is larger than %s, so syntax highlighting is '.
|
||||
'disabled by default.',
|
||||
$byte_limit);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->formatHeaderMessages($messages);
|
||||
|
|
|
@ -35,6 +35,7 @@ abstract class DifferentialChangesetRenderer extends Phobject {
|
|||
private $highlightingDisabled;
|
||||
private $scopeEngine = false;
|
||||
private $depthOnlyLines;
|
||||
private $documentEngineBlocks;
|
||||
|
||||
private $oldFile = false;
|
||||
private $newFile = false;
|
||||
|
@ -239,6 +240,16 @@ abstract class DifferentialChangesetRenderer extends Phobject {
|
|||
return $this->oldChangesetID;
|
||||
}
|
||||
|
||||
public function setDocumentEngineBlocks(
|
||||
PhabricatorDocumentEngineBlocks $blocks) {
|
||||
$this->documentEngineBlocks = $blocks;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getDocumentEngineBlocks() {
|
||||
return $this->documentEngineBlocks;
|
||||
}
|
||||
|
||||
public function setNewComments(array $new_comments) {
|
||||
foreach ($new_comments as $line_number => $comments) {
|
||||
assert_instances_of($comments, 'PhabricatorInlineCommentInterface');
|
||||
|
@ -355,6 +366,16 @@ abstract class DifferentialChangesetRenderer extends Phobject {
|
|||
$notice = null;
|
||||
if ($this->getIsTopLevel()) {
|
||||
$force = (!$content && !$props);
|
||||
|
||||
// If we have DocumentEngine messages about the blocks, assume they
|
||||
// explain why there's no content.
|
||||
$blocks = $this->getDocumentEngineBlocks();
|
||||
if ($blocks) {
|
||||
if ($blocks->getMessages()) {
|
||||
$force = false;
|
||||
}
|
||||
}
|
||||
|
||||
$notice = $this->renderChangeTypeHeader($force);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,16 @@ final class PhabricatorDocumentEngineBlocks
|
|||
extends Phobject {
|
||||
|
||||
private $lists = array();
|
||||
private $messages = array();
|
||||
|
||||
public function addMessage($message) {
|
||||
$this->messages[] = $message;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getMessages() {
|
||||
return $this->messages;
|
||||
}
|
||||
|
||||
public function addBlockList(PhabricatorDocumentRef $ref, array $blocks) {
|
||||
assert_instances_of($blocks, 'PhabricatorDocumentEngineBlock');
|
||||
|
@ -20,6 +30,10 @@ final class PhabricatorDocumentEngineBlocks
|
|||
$rows = array();
|
||||
$lists = $this->lists;
|
||||
|
||||
if (count($lists) != 2) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$specs = array();
|
||||
foreach ($this->lists as $list) {
|
||||
$specs[] = $this->newDiffSpec($list['blocks']);
|
||||
|
|
|
@ -37,7 +37,7 @@ abstract class PhabricatorDocumentEngine
|
|||
return false;
|
||||
}
|
||||
|
||||
public function newDiffView(
|
||||
public function newEngineBlocks(
|
||||
PhabricatorDocumentRef $uref,
|
||||
PhabricatorDocumentRef $vref) {
|
||||
throw new PhutilMethodNotImplementedException();
|
||||
|
|
|
@ -27,7 +27,7 @@ final class PhabricatorImageDocumentEngine
|
|||
return ($uref->getFile() && $vref->getFile());
|
||||
}
|
||||
|
||||
public function newDiffView(
|
||||
public function newEngineBlocks(
|
||||
PhabricatorDocumentRef $uref,
|
||||
PhabricatorDocumentRef $vref) {
|
||||
|
||||
|
|
|
@ -41,16 +41,23 @@ final class PhabricatorJupyterDocumentEngine
|
|||
return true;
|
||||
}
|
||||
|
||||
public function newDiffView(
|
||||
public function newEngineBlocks(
|
||||
PhabricatorDocumentRef $uref,
|
||||
PhabricatorDocumentRef $vref) {
|
||||
|
||||
$u_blocks = $this->newDiffBlocks($uref);
|
||||
$v_blocks = $this->newDiffBlocks($vref);
|
||||
$blocks = new PhabricatorDocumentEngineBlocks();
|
||||
|
||||
return id(new PhabricatorDocumentEngineBlocks())
|
||||
->addBlockList($uref, $u_blocks)
|
||||
->addBlockList($vref, $v_blocks);
|
||||
try {
|
||||
$u_blocks = $this->newDiffBlocks($uref);
|
||||
$v_blocks = $this->newDiffBlocks($vref);
|
||||
|
||||
$blocks->addBlockList($uref, $u_blocks);
|
||||
$blocks->addBlockList($vref, $v_blocks);
|
||||
} catch (Exception $ex) {
|
||||
$blocks->addMessage($ex->getMessage());
|
||||
}
|
||||
|
||||
return $blocks;
|
||||
}
|
||||
|
||||
private function newDiffBlocks(PhabricatorDocumentRef $ref) {
|
||||
|
|
Loading…
Reference in a new issue