@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Support rich diff rendering with DocumentEngine for added/removed files

Summary: Ref T13425. When a file (like a Jupyter notebook) is added or removed, we can still render a useful line-by-line diff.

Test Plan:
- Viewed add/modify/remove of Jupyter, source code, and images in 2up/1up mode, everything looked okay.

Maniphest Tasks: T13425

Differential Revision: https://secure.phabricator.com/D20865

+115 -44
+59 -27
src/applications/differential/parser/DifferentialChangesetParser.php
··· 1686 1686 break; 1687 1687 } 1688 1688 1689 - $old_ref = id(new PhabricatorDocumentRef()) 1690 - ->setName($changeset->getOldFile()); 1691 - if ($old_file) { 1692 - $old_ref->setFile($old_file); 1689 + $type_delete = DifferentialChangeType::TYPE_DELETE; 1690 + $type_add = DifferentialChangeType::TYPE_ADD; 1691 + $change_type = $changeset->getChangeType(); 1692 + 1693 + $no_old = ($change_type == $type_add); 1694 + $no_new = ($change_type == $type_delete); 1695 + 1696 + if ($no_old) { 1697 + $old_ref = null; 1693 1698 } else { 1694 - $old_data = $this->old; 1695 - $old_data = ipull($old_data, 'text'); 1696 - $old_data = implode('', $old_data); 1699 + $old_ref = id(new PhabricatorDocumentRef()) 1700 + ->setName($changeset->getOldFile()); 1701 + if ($old_file) { 1702 + $old_ref->setFile($old_file); 1703 + } else { 1704 + $old_data = $this->old; 1705 + $old_data = ipull($old_data, 'text'); 1706 + $old_data = implode('', $old_data); 1697 1707 1698 - $old_ref->setData($old_data); 1708 + $old_ref->setData($old_data); 1709 + } 1699 1710 } 1700 1711 1701 - $new_ref = id(new PhabricatorDocumentRef()) 1702 - ->setName($changeset->getFilename()); 1703 - if ($new_file) { 1704 - $new_ref->setFile($new_file); 1712 + if ($no_new) { 1713 + $new_ref = null; 1705 1714 } else { 1706 - $new_data = $this->new; 1707 - $new_data = ipull($new_data, 'text'); 1708 - $new_data = implode('', $new_data); 1715 + $new_ref = id(new PhabricatorDocumentRef()) 1716 + ->setName($changeset->getFilename()); 1717 + if ($new_file) { 1718 + $new_ref->setFile($new_file); 1719 + } else { 1720 + $new_data = $this->new; 1721 + $new_data = ipull($new_data, 'text'); 1722 + $new_data = implode('', $new_data); 1709 1723 1710 - $new_ref->setData($new_data); 1724 + $new_ref->setData($new_data); 1725 + } 1711 1726 } 1712 1727 1713 - $old_engines = PhabricatorDocumentEngine::getEnginesForRef( 1714 - $viewer, 1715 - $old_ref); 1716 1728 1717 - $new_engines = PhabricatorDocumentEngine::getEnginesForRef( 1718 - $viewer, 1719 - $new_ref); 1729 + $old_engines = null; 1730 + if ($old_ref) { 1731 + $old_engines = PhabricatorDocumentEngine::getEnginesForRef( 1732 + $viewer, 1733 + $old_ref); 1734 + } 1735 + 1736 + $new_engines = null; 1737 + if ($new_ref) { 1738 + $new_engines = PhabricatorDocumentEngine::getEnginesForRef( 1739 + $viewer, 1740 + $new_ref); 1741 + } 1720 1742 1721 - $shared_engines = array_intersect_key($new_engines, $old_engines); 1722 - $default_engine = head_key($new_engines); 1743 + if ($new_engines !== null && $old_engines !== null) { 1744 + $shared_engines = array_intersect_key($new_engines, $old_engines); 1745 + $default_engine = head_key($new_engines); 1723 1746 1724 - foreach ($shared_engines as $key => $shared_engine) { 1725 - if (!$shared_engine->canDiffDocuments($old_ref, $new_ref)) { 1726 - unset($shared_engines[$key]); 1747 + foreach ($shared_engines as $key => $shared_engine) { 1748 + if (!$shared_engine->canDiffDocuments($old_ref, $new_ref)) { 1749 + unset($shared_engines[$key]); 1750 + } 1727 1751 } 1752 + } else if ($new_engines !== null) { 1753 + $shared_engines = $new_engines; 1754 + $default_engine = head_key($shared_engines); 1755 + } else if ($old_engines !== null) { 1756 + $shared_engines = $old_engines; 1757 + $default_engine = head_key($shared_engines); 1758 + } else { 1759 + return null; 1728 1760 } 1729 1761 1730 1762 $engine_key = $this->getDocumentEngineKey();
+10
src/applications/differential/render/DifferentialChangesetOneUpRenderer.php
··· 371 371 $cell_classes = $block_diff->getNewClasses(); 372 372 } 373 373 } else if ($row_type === 'old') { 374 + if (!$old_ref) { 375 + continue; 376 + } 377 + 374 378 $cell_content = $engine->newBlockContentView( 375 379 $old_ref, 376 380 $old); 381 + 377 382 $cell_classes[] = 'old'; 378 383 $cell_classes[] = 'old-full'; 379 384 380 385 $new_key = null; 381 386 } else if ($row_type === 'new') { 387 + if (!$new_ref) { 388 + continue; 389 + } 390 + 382 391 $cell_content = $engine->newBlockContentView( 383 392 $new_ref, 384 393 $new); 394 + 385 395 $cell_classes[] = 'new'; 386 396 $cell_classes[] = 'new-full'; 387 397
+4 -1
src/applications/files/diff/PhabricatorDocumentEngineBlocks.php
··· 15 15 return $this->messages; 16 16 } 17 17 18 - public function addBlockList(PhabricatorDocumentRef $ref, array $blocks) { 18 + public function addBlockList( 19 + PhabricatorDocumentRef $ref = null, 20 + array $blocks = array()) { 21 + 19 22 assert_instances_of($blocks, 'PhabricatorDocumentEngineBlock'); 20 23 21 24 $this->lists[] = array(
+2 -2
src/applications/files/document/PhabricatorDocumentEngine.php
··· 32 32 } 33 33 34 34 public function canDiffDocuments( 35 - PhabricatorDocumentRef $uref, 36 - PhabricatorDocumentRef $vref) { 35 + PhabricatorDocumentRef $uref = null, 36 + PhabricatorDocumentRef $vref = null) { 37 37 return false; 38 38 } 39 39
+25 -8
src/applications/files/document/PhabricatorImageDocumentEngine.php
··· 18 18 } 19 19 20 20 public function canDiffDocuments( 21 - PhabricatorDocumentRef $uref, 22 - PhabricatorDocumentRef $vref) { 21 + PhabricatorDocumentRef $uref = null, 22 + PhabricatorDocumentRef $vref = null) { 23 23 24 - // For now, we can only render a rich image diff if both documents have 24 + // For now, we can only render a rich image diff if the documents have 25 25 // their data stored in Files already. 26 26 27 - return ($uref->getFile() && $vref->getFile()); 27 + if ($uref && !$uref->getFile()) { 28 + return false; 29 + } 30 + 31 + if ($vref && !$vref->getFile()) { 32 + return false; 33 + } 34 + 35 + return true; 28 36 } 29 37 30 38 public function newEngineBlocks( 31 - PhabricatorDocumentRef $uref, 32 - PhabricatorDocumentRef $vref) { 39 + PhabricatorDocumentRef $uref = null, 40 + PhabricatorDocumentRef $vref = null) { 33 41 34 - $u_blocks = $this->newDiffBlocks($uref); 35 - $v_blocks = $this->newDiffBlocks($vref); 42 + if ($uref) { 43 + $u_blocks = $this->newDiffBlocks($uref); 44 + } else { 45 + $u_blocks = array(); 46 + } 47 + 48 + if ($vref) { 49 + $v_blocks = $this->newDiffBlocks($vref); 50 + } else { 51 + $v_blocks = array(); 52 + } 36 53 37 54 return id(new PhabricatorDocumentEngineBlocks()) 38 55 ->addBlockList($uref, $u_blocks)
+15 -6
src/applications/files/document/PhabricatorJupyterDocumentEngine.php
··· 36 36 } 37 37 38 38 public function canDiffDocuments( 39 - PhabricatorDocumentRef $uref, 40 - PhabricatorDocumentRef $vref) { 39 + PhabricatorDocumentRef $uref = null, 40 + PhabricatorDocumentRef $vref = null) { 41 41 return true; 42 42 } 43 43 44 44 public function newEngineBlocks( 45 - PhabricatorDocumentRef $uref, 46 - PhabricatorDocumentRef $vref) { 45 + PhabricatorDocumentRef $uref = null, 46 + PhabricatorDocumentRef $vref = null) { 47 47 48 48 $blocks = new PhabricatorDocumentEngineBlocks(); 49 49 50 50 try { 51 - $u_blocks = $this->newDiffBlocks($uref); 52 - $v_blocks = $this->newDiffBlocks($vref); 51 + if ($uref) { 52 + $u_blocks = $this->newDiffBlocks($uref); 53 + } else { 54 + $u_blocks = array(); 55 + } 56 + 57 + if ($vref) { 58 + $v_blocks = $this->newDiffBlocks($vref); 59 + } else { 60 + $v_blocks = array(); 61 + } 53 62 54 63 $blocks->addBlockList($uref, $u_blocks); 55 64 $blocks->addBlockList($vref, $v_blocks);