@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.

Open files in very large diffs inline

Summary: This allows writing inline comments and reduces different behavior between normal and very large diffs.

Test Plan:
Verify that normal diff works.
Verify that very large diff works.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Koolvin

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

vrana 826e5405 ec068ff4

+131 -81
+45 -38
src/__celerity_resource_map__.php
··· 308 308 'disk' => '/rsrc/image/icon/tango/edit.png', 309 309 'type' => 'png', 310 310 ), 311 + '/rsrc/image/icon/tango/go-down.png' => 312 + array( 313 + 'hash' => '96862812cbb0445573c264dc057b8300', 314 + 'uri' => '/res/96862812/rsrc/image/icon/tango/go-down.png', 315 + 'disk' => '/rsrc/image/icon/tango/go-down.png', 316 + 'type' => 'png', 317 + ), 311 318 '/rsrc/image/icon/tango/log.png' => 312 319 array( 313 320 'hash' => 'a6f72499bef279ff6807a7dbc5148f1e', ··· 431 438 ), 432 439 'aphront-headsup-action-list-view-css' => 433 440 array( 434 - 'uri' => '/res/9c5cd292/rsrc/css/aphront/headsup-action-list-view.css', 441 + 'uri' => '/res/665cdc49/rsrc/css/aphront/headsup-action-list-view.css', 435 442 'type' => 'css', 436 443 'requires' => 437 444 array( ··· 531 538 ), 532 539 'differential-changeset-view-css' => 533 540 array( 534 - 'uri' => '/res/c7edd492/rsrc/css/application/differential/changeset-view.css', 541 + 'uri' => '/res/a352da17/rsrc/css/application/differential/changeset-view.css', 535 542 'type' => 'css', 536 543 'requires' => 537 544 array( ··· 962 969 ), 963 970 'javelin-behavior-differential-populate' => 964 971 array( 965 - 'uri' => '/res/8ea8cb57/rsrc/js/application/differential/behavior-populate.js', 972 + 'uri' => '/res/c0979571/rsrc/js/application/differential/behavior-populate.js', 966 973 'type' => 'js', 967 974 'requires' => 968 975 array( ··· 2503 2510 'uri' => '/res/pkg/0c96375e/core.pkg.js', 2504 2511 'type' => 'js', 2505 2512 ), 2506 - '27683aba' => 2513 + '59d298c3' => 2507 2514 array( 2508 2515 'name' => 'differential.pkg.css', 2509 2516 'symbols' => ··· 2522 2529 11 => 'differential-local-commits-view-css', 2523 2530 12 => 'inline-comment-summary-css', 2524 2531 ), 2525 - 'uri' => '/res/pkg/27683aba/differential.pkg.css', 2532 + 'uri' => '/res/pkg/59d298c3/differential.pkg.css', 2526 2533 'type' => 'css', 2527 2534 ), 2528 - '5e9ae855' => 2535 + '5b7b36d7' => 2529 2536 array( 2530 2537 'name' => 'differential.pkg.js', 2531 2538 'symbols' => ··· 2549 2556 16 => 'javelin-behavior-differential-dropdown-menus', 2550 2557 17 => 'javelin-behavior-buoyant', 2551 2558 ), 2552 - 'uri' => '/res/pkg/5e9ae855/differential.pkg.js', 2559 + 'uri' => '/res/pkg/5b7b36d7/differential.pkg.js', 2553 2560 'type' => 'js', 2554 2561 ), 2555 2562 'c8ce2d88' => ··· 2645 2652 'aphront-dialog-view-css' => '9c4e265b', 2646 2653 'aphront-error-view-css' => '9c4e265b', 2647 2654 'aphront-form-view-css' => '9c4e265b', 2648 - 'aphront-headsup-action-list-view-css' => '27683aba', 2655 + 'aphront-headsup-action-list-view-css' => '59d298c3', 2649 2656 'aphront-headsup-view-css' => '9c4e265b', 2650 2657 'aphront-list-filter-view-css' => '9c4e265b', 2651 2658 'aphront-pager-view-css' => '9c4e265b', ··· 2655 2662 'aphront-tokenizer-control-css' => '9c4e265b', 2656 2663 'aphront-tooltip-css' => '9c4e265b', 2657 2664 'aphront-typeahead-control-css' => '9c4e265b', 2658 - 'differential-changeset-view-css' => '27683aba', 2659 - 'differential-core-view-css' => '27683aba', 2660 - 'differential-inline-comment-editor' => '5e9ae855', 2661 - 'differential-local-commits-view-css' => '27683aba', 2662 - 'differential-results-table-css' => '27683aba', 2663 - 'differential-revision-add-comment-css' => '27683aba', 2664 - 'differential-revision-comment-css' => '27683aba', 2665 - 'differential-revision-comment-list-css' => '27683aba', 2666 - 'differential-revision-history-css' => '27683aba', 2667 - 'differential-table-of-contents-css' => '27683aba', 2665 + 'differential-changeset-view-css' => '59d298c3', 2666 + 'differential-core-view-css' => '59d298c3', 2667 + 'differential-inline-comment-editor' => '5b7b36d7', 2668 + 'differential-local-commits-view-css' => '59d298c3', 2669 + 'differential-results-table-css' => '59d298c3', 2670 + 'differential-revision-add-comment-css' => '59d298c3', 2671 + 'differential-revision-comment-css' => '59d298c3', 2672 + 'differential-revision-comment-list-css' => '59d298c3', 2673 + 'differential-revision-history-css' => '59d298c3', 2674 + 'differential-table-of-contents-css' => '59d298c3', 2668 2675 'diffusion-commit-view-css' => 'c8ce2d88', 2669 2676 'diffusion-icons-css' => 'c8ce2d88', 2670 - 'inline-comment-summary-css' => '27683aba', 2677 + 'inline-comment-summary-css' => '59d298c3', 2671 2678 'javelin-behavior' => '8a5de8a3', 2672 2679 'javelin-behavior-aphront-basic-tokenizer' => '97f65640', 2673 - 'javelin-behavior-aphront-drag-and-drop' => '5e9ae855', 2674 - 'javelin-behavior-aphront-drag-and-drop-textarea' => '5e9ae855', 2680 + 'javelin-behavior-aphront-drag-and-drop' => '5b7b36d7', 2681 + 'javelin-behavior-aphront-drag-and-drop-textarea' => '5b7b36d7', 2675 2682 'javelin-behavior-aphront-form-disable-on-submit' => '0c96375e', 2676 2683 'javelin-behavior-audit-preview' => '5e68be89', 2677 - 'javelin-behavior-buoyant' => '5e9ae855', 2678 - 'javelin-behavior-differential-accept-with-errors' => '5e9ae855', 2679 - 'javelin-behavior-differential-add-reviewers-and-ccs' => '5e9ae855', 2680 - 'javelin-behavior-differential-comment-jump' => '5e9ae855', 2681 - 'javelin-behavior-differential-diff-radios' => '5e9ae855', 2682 - 'javelin-behavior-differential-dropdown-menus' => '5e9ae855', 2683 - 'javelin-behavior-differential-edit-inline-comments' => '5e9ae855', 2684 - 'javelin-behavior-differential-feedback-preview' => '5e9ae855', 2685 - 'javelin-behavior-differential-keyboard-navigation' => '5e9ae855', 2686 - 'javelin-behavior-differential-populate' => '5e9ae855', 2687 - 'javelin-behavior-differential-show-more' => '5e9ae855', 2684 + 'javelin-behavior-buoyant' => '5b7b36d7', 2685 + 'javelin-behavior-differential-accept-with-errors' => '5b7b36d7', 2686 + 'javelin-behavior-differential-add-reviewers-and-ccs' => '5b7b36d7', 2687 + 'javelin-behavior-differential-comment-jump' => '5b7b36d7', 2688 + 'javelin-behavior-differential-diff-radios' => '5b7b36d7', 2689 + 'javelin-behavior-differential-dropdown-menus' => '5b7b36d7', 2690 + 'javelin-behavior-differential-edit-inline-comments' => '5b7b36d7', 2691 + 'javelin-behavior-differential-feedback-preview' => '5b7b36d7', 2692 + 'javelin-behavior-differential-keyboard-navigation' => '5b7b36d7', 2693 + 'javelin-behavior-differential-populate' => '5b7b36d7', 2694 + 'javelin-behavior-differential-show-more' => '5b7b36d7', 2688 2695 'javelin-behavior-diffusion-commit-graph' => '5e68be89', 2689 2696 'javelin-behavior-diffusion-pull-lastmodified' => '5e68be89', 2690 2697 'javelin-behavior-maniphest-batch-selector' => '7707de41', ··· 2694 2701 'javelin-behavior-maniphest-transaction-preview' => '7707de41', 2695 2702 'javelin-behavior-phabricator-autofocus' => '0c96375e', 2696 2703 'javelin-behavior-phabricator-keyboard-shortcuts' => '0c96375e', 2697 - 'javelin-behavior-phabricator-object-selector' => '5e9ae855', 2704 + 'javelin-behavior-phabricator-object-selector' => '5b7b36d7', 2698 2705 'javelin-behavior-phabricator-oncopy' => '0c96375e', 2699 2706 'javelin-behavior-phabricator-tooltips' => '0c96375e', 2700 2707 'javelin-behavior-phabricator-watch-anchor' => '0c96375e', 2701 2708 'javelin-behavior-refresh-csrf' => '0c96375e', 2702 - 'javelin-behavior-repository-crossreference' => '5e9ae855', 2709 + 'javelin-behavior-repository-crossreference' => '5b7b36d7', 2703 2710 'javelin-behavior-workflow' => '0c96375e', 2704 2711 'javelin-dom' => '8a5de8a3', 2705 2712 'javelin-event' => '8a5de8a3', ··· 2721 2728 'maniphest-task-summary-css' => '7839ae2d', 2722 2729 'maniphest-transaction-detail-css' => '7839ae2d', 2723 2730 'phabricator-app-buttons-css' => '9c4e265b', 2724 - 'phabricator-content-source-view-css' => '27683aba', 2731 + 'phabricator-content-source-view-css' => '59d298c3', 2725 2732 'phabricator-core-buttons-css' => '9c4e265b', 2726 2733 'phabricator-core-css' => '9c4e265b', 2727 2734 'phabricator-directory-css' => '9c4e265b', 2728 - 'phabricator-drag-and-drop-file-upload' => '5e9ae855', 2735 + 'phabricator-drag-and-drop-file-upload' => '5b7b36d7', 2729 2736 'phabricator-dropdown-menu' => '0c96375e', 2730 2737 'phabricator-flag-css' => '9c4e265b', 2731 2738 'phabricator-jump-nav' => '9c4e265b', 2732 2739 'phabricator-keyboard-shortcut' => '0c96375e', 2733 2740 'phabricator-keyboard-shortcut-manager' => '0c96375e', 2734 2741 'phabricator-menu-item' => '0c96375e', 2735 - 'phabricator-object-selector-css' => '27683aba', 2742 + 'phabricator-object-selector-css' => '59d298c3', 2736 2743 'phabricator-paste-file-upload' => '0c96375e', 2737 2744 'phabricator-prefab' => '0c96375e', 2738 2745 'phabricator-project-tag-css' => '7839ae2d', 2739 2746 'phabricator-remarkup-css' => '9c4e265b', 2740 - 'phabricator-shaped-request' => '5e9ae855', 2747 + 'phabricator-shaped-request' => '5b7b36d7', 2741 2748 'phabricator-standard-page-view' => '9c4e265b', 2742 2749 'phabricator-tooltip' => '0c96375e', 2743 2750 'phabricator-transaction-view-css' => '9c4e265b',
+1
src/applications/differential/controller/diffview/DifferentialDiffViewController.php
··· 115 115 116 116 $details = id(new DifferentialChangesetListView()) 117 117 ->setChangesets($changesets) 118 + ->setVisibleChangesets($changesets) 118 119 ->setRenderingReferences($refs) 119 120 ->setStandaloneURI('/differential/changeset/') 120 121 ->setUser($request->getUser());
+3 -2
src/applications/differential/controller/revisionview/DifferentialRevisionViewController.php
··· 238 238 $comment_view->setVersusDiffID($diff_vs); 239 239 240 240 $changeset_view = new DifferentialChangesetListView(); 241 - $changeset_view->setChangesets($visible_changesets); 241 + $changeset_view->setChangesets($changesets); 242 + $changeset_view->setVisibleChangesets($visible_changesets); 242 243 243 244 if (!$viewer_is_anonymous) { 244 245 $changeset_view->setInlineCommentControllerURI( ··· 288 289 $toc_view = new DifferentialDiffTableOfContentsView(); 289 290 $toc_view->setChangesets($changesets); 290 291 $toc_view->setVisibleChangesets($visible_changesets); 292 + $toc_view->setRenderingReferences($rendering_references); 291 293 $toc_view->setUnitTestData(idx($props, 'arc:unit', array())); 292 294 if ($repository) { 293 295 $toc_view->setRepository($repository); 294 296 } 295 297 $toc_view->setDiff($target); 296 298 $toc_view->setUser($user); 297 - $toc_view->setStandaloneViewLink(empty($visible_changesets)); 298 299 $toc_view->setVsMap($vs_map); 299 300 $toc_view->setRevisionID($revision->getID()); 300 301 $toc_view->setWhitespace($whitespace);
+1 -2
src/applications/differential/field/specification/lint/DifferentialLintFieldSpecification.php
··· 88 88 89 89 $line_link = 'line '.phutil_escape_html($line); 90 90 if (isset($path_changesets[$path])) { 91 - // TODO: Create standalone links for large diffs. Logic is in 92 - // DifferentialDiffTableOfContentsView::renderChangesetLink(). 91 + // TODO: Load very large diff before linking to line. 93 92 $line_link = phutil_render_tag( 94 93 'a', 95 94 array(
+26 -4
src/applications/differential/view/changesetlistview/DifferentialChangesetListView.php
··· 19 19 final class DifferentialChangesetListView extends AphrontView { 20 20 21 21 private $changesets = array(); 22 + private $visibleChangesets = array(); 22 23 private $references = array(); 23 24 private $inlineURI; 24 25 private $renderURI = '/differential/changeset/'; ··· 36 37 37 38 public function setChangesets($changesets) { 38 39 $this->changesets = $changesets; 40 + return $this; 41 + } 42 + 43 + public function setVisibleChangesets($visible_changesets) { 44 + $this->visibleChangesets = $visible_changesets; 39 45 return $this; 40 46 } 41 47 ··· 130 136 $detail->setVsChangesetID(idx($this->vsMap, $changeset->getID())); 131 137 $detail->setEditable(true); 132 138 133 - $uniq_id = celerity_generate_unique_node_id(); 139 + $uniq_id = 'diff-'.$changeset->getAnchorName(); 140 + if (isset($this->visibleChangesets[$key])) { 141 + $load = 'Loading...'; 142 + $mapping[$uniq_id] = $ref; 143 + } else { 144 + $load = javelin_render_tag( 145 + 'a', 146 + array( 147 + 'href' => '#'.$uniq_id, 148 + 'meta' => array( 149 + 'id' => $uniq_id, 150 + 'ref' => $ref, 151 + 'kill' => true, 152 + ), 153 + 'sigil' => 'differential-load', 154 + 'mustcapture' => true, 155 + ), 156 + 'Load'); 157 + } 134 158 $detail->appendChild( 135 159 phutil_render_tag( 136 160 'div', 137 161 array( 138 162 'id' => $uniq_id, 139 163 ), 140 - '<div class="differential-loading">Loading...</div>')); 164 + '<div class="differential-loading">'.$load.'</div>')); 141 165 $output[] = $detail->render(); 142 - 143 - $mapping[$uniq_id] = $ref; 144 166 } 145 167 146 168 require_celerity_resource('aphront-tooltip-css');
+15 -30
src/applications/differential/view/difftableofcontents/DifferentialDiffTableOfContentsView.php
··· 20 20 21 21 private $changesets = array(); 22 22 private $visibleChangesets = array(); 23 + private $references = array(); 23 24 private $repository; 24 25 private $diff; 25 26 private $user; 26 - private $standaloneViewLink = null; 27 27 private $renderURI = '/differential/changeset/'; 28 28 private $revisionID; 29 29 private $whitespace; ··· 39 39 return $this; 40 40 } 41 41 42 + public function setRenderingReferences(array $references) { 43 + $this->references = $references; 44 + return $this; 45 + } 46 + 42 47 public function setRepository(PhabricatorRepository $repository) { 43 48 $this->repository = $repository; 44 49 return $this; ··· 56 61 57 62 public function setUser(PhabricatorUser $user) { 58 63 $this->user = $user; 59 - return $this; 60 - } 61 - 62 - public function setStandaloneViewLink($standalone_view_link) { 63 - $this->standaloneViewLink = $standalone_view_link; 64 64 return $this; 65 65 } 66 66 ··· 108 108 foreach ($changesets as $id => $changeset) { 109 109 $type = $changeset->getChangeType(); 110 110 $ftype = $changeset->getFileType(); 111 - $link = $this->renderChangesetLink($changeset); 111 + $ref = idx($this->references, $id); 112 + $link = $this->renderChangesetLink($changeset, $ref); 112 113 113 114 if (DifferentialChangeType::isOldLocationChangeType($type)) { 114 115 $away = $changeset->getAwayPaths(); ··· 253 254 } 254 255 255 256 256 - private function renderChangesetLink(DifferentialChangeset $changeset) { 257 + private function renderChangesetLink(DifferentialChangeset $changeset, $ref) { 257 258 $display_file = $changeset->getDisplayFilename(); 258 259 259 - if ($this->standaloneViewLink) { 260 - $id = $changeset->getID(); 261 - $vs_id = idx($this->vsMap, $id); 262 - 263 - $ref = $vs_id ? $id.'/'.$vs_id : $id; 264 - $detail_uri = new PhutilURI($this->renderURI); 265 - $detail_uri->setQueryParams( 266 - array( 267 - 'ref' => $ref, 268 - 'whitespace' => $this->whitespace, 269 - 'revision_id' => $this->revisionID, 270 - )); 271 - 272 - return phutil_render_tag( 273 - 'a', 274 - array( 275 - 'href' => $detail_uri, 276 - 'target' => '_blank', 277 - ), 278 - phutil_escape_html($display_file)); 279 - } 280 - return phutil_render_tag( 260 + return javelin_render_tag( 281 261 'a', 282 262 array( 283 263 'href' => '#'.$changeset->getAnchorName(), 264 + 'meta' => array( 265 + 'id' => 'diff-'.$changeset->getAnchorName(), 266 + 'ref' => $ref, 267 + ), 268 + 'sigil' => 'differential-load', 284 269 ), 285 270 phutil_escape_html($display_file)); 286 271 }
+1 -1
src/applications/differential/view/difftableofcontents/__init__.php
··· 10 10 11 11 phutil_require_module('phabricator', 'applications/differential/constants/changetype'); 12 12 phutil_require_module('phabricator', 'infrastructure/celerity/api'); 13 + phutil_require_module('phabricator', 'infrastructure/javelin/markup'); 13 14 phutil_require_module('phabricator', 'view/base'); 14 15 15 16 phutil_require_module('phutil', 'markup'); 16 - phutil_require_module('phutil', 'parser/uri'); 17 17 phutil_require_module('phutil', 'utils'); 18 18 19 19
+5 -4
src/applications/diffusion/controller/change/DiffusionChangeController.php
··· 32 32 } 33 33 34 34 $callsign = $drequest->getRepository()->getCallsign(); 35 + $changesets = array( 36 + 0 => $changeset, 37 + ); 35 38 36 39 $changeset_view = new DifferentialChangesetListView(); 37 - $changeset_view->setChangesets( 38 - array( 39 - 0 => $changeset, 40 - )); 40 + $changeset_view->setChangesets($changesets); 41 + $changeset_view->setVisibleChangesets($changesets); 41 42 $changeset_view->setRenderingReferences( 42 43 array( 43 44 0 => $diff_query->getRenderingReference(),
+1
src/applications/diffusion/controller/commit/DiffusionCommitController.php
··· 232 232 233 233 $change_list = new DifferentialChangesetListView(); 234 234 $change_list->setChangesets($changesets); 235 + $change_list->setVisibleChangesets($changesets); 235 236 $change_list->setRenderingReferences($references); 236 237 $change_list->setRenderURI('/diffusion/'.$callsign.'/diff/'); 237 238 $change_list->setRepository($repository);
+13
webroot/rsrc/css/application/differential/changeset-view.css
··· 379 379 display: block; 380 380 margin-top: -72px; 381 381 } 382 + 383 + .differential-loading a { 384 + color: #3b5998; 385 + } 386 + 387 + .differential-loading { 388 + color: #999966; 389 + background: #ffffee; 390 + border: 1px solid #ccccaa; 391 + padding: 1em; 392 + text-align: center; 393 + font-size: 11px; 394 + }
+20
webroot/rsrc/js/application/differential/behavior-populate.js
··· 38 38 var highlight_class = null; 39 39 40 40 JX.Stratcom.listen( 41 + 'click', 42 + 'differential-load', 43 + function(e) { 44 + var meta = e.getNodeData('differential-load'); 45 + JX.DOM.setContent( 46 + JX.$(meta.id), 47 + JX.$H('<div class="differential-loading">Loading...</div>')); 48 + var data = { 49 + ref : meta.ref, 50 + whitespace : config.whitespace 51 + }; 52 + new JX.Workflow(config.uri, data) 53 + .setHandler(JX.bind(null, onresponse, meta.id)) 54 + .start(); 55 + if (meta.kill) { 56 + e.kill(); 57 + } 58 + }); 59 + 60 + JX.Stratcom.listen( 41 61 ['mouseover', 'mouseout'], 42 62 ['differential-changeset', 'tag:td'], 43 63 function(e) {