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

When a revision changes more than 1,000 files, don't show the changes on the main page

Summary: Depends on D19295. Ref T13110. Degrade the review UX when users try to interact with changes which are too large to receive human review.

Test Plan: Reduced the "very large" limit, browsed some changes, saw various elements degrade.

Maniphest Tasks: T13110

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

+75 -35
+75 -35
src/applications/differential/controller/DifferentialRevisionViewController.php
··· 3 3 final class DifferentialRevisionViewController extends DifferentialController { 4 4 5 5 private $revisionID; 6 + private $veryLargeDiff; 6 7 7 8 public function shouldAllowPublic() { 8 9 return true; 9 10 } 10 11 12 + public function isVeryLargeDiff() { 13 + return $this->veryLargeDiff; 14 + } 15 + 16 + public function getVeryLargeDiffLimit() { 17 + return 1000; 18 + } 19 + 11 20 public function handleRequest(AphrontRequest $request) { 12 21 $viewer = $this->getViewer(); 13 22 $this->revisionID = $request->getURIData('id'); ··· 72 81 $target, 73 82 idx($diffs, $diff_vs), 74 83 $repository); 84 + 85 + if (count($rendering_references) > $this->getVeryLargeDiffLimit()) { 86 + $this->veryLargeDiff = true; 87 + } 75 88 76 89 if ($request->getExists('download')) { 77 90 return $this->buildRawDiffResponse( ··· 150 163 $warning->appendChild(hsprintf( 151 164 '%s <strong>%s</strong>', 152 165 pht( 153 - 'This diff is very large and affects %s files. '. 166 + 'This diff is large and affects %s files. '. 154 167 'You may load each file individually or ', 155 168 new PhutilNumber($count)), 156 169 phutil_tag( ··· 265 278 266 279 $timeline->setQuoteRef($revision->getMonogram()); 267 280 268 - $changeset_view = id(new DifferentialChangesetListView()) 269 - ->setChangesets($changesets) 270 - ->setVisibleChangesets($visible_changesets) 271 - ->setStandaloneURI('/differential/changeset/') 272 - ->setRawFileURIs( 273 - '/differential/changeset/?view=old', 274 - '/differential/changeset/?view=new') 275 - ->setUser($viewer) 276 - ->setDiff($target) 277 - ->setRenderingReferences($rendering_references) 278 - ->setVsMap($vs_map) 279 - ->setWhitespace($whitespace) 280 - ->setSymbolIndexes($symbol_indexes) 281 - ->setTitle(pht('Diff %s', $target->getID())) 282 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); 281 + if ($this->isVeryLargeDiff()) { 282 + $messages = array(); 283 283 284 + $messages[] = pht( 285 + 'This very large diff affects more than %s files. Use the %s to '. 286 + 'browse changes.', 287 + new PhutilNumber($this->getVeryLargeDiffLimit()), 288 + phutil_tag( 289 + 'a', 290 + array( 291 + 'href' => '/differential/diff/'.$target->getID().'/changesets/', 292 + ), 293 + phutil_tag('strong', array(), pht('Changeset List')))); 284 294 285 - $revision_id = $revision->getID(); 286 - $inline_list_uri = "/revision/inlines/{$revision_id}/"; 287 - $inline_list_uri = $this->getApplicationURI($inline_list_uri); 288 - $changeset_view->setInlineListURI($inline_list_uri); 295 + $changeset_view = id(new PHUIInfoView()) 296 + ->setErrors($messages); 297 + } else { 298 + $changeset_view = id(new DifferentialChangesetListView()) 299 + ->setChangesets($changesets) 300 + ->setVisibleChangesets($visible_changesets) 301 + ->setStandaloneURI('/differential/changeset/') 302 + ->setRawFileURIs( 303 + '/differential/changeset/?view=old', 304 + '/differential/changeset/?view=new') 305 + ->setUser($viewer) 306 + ->setDiff($target) 307 + ->setRenderingReferences($rendering_references) 308 + ->setVsMap($vs_map) 309 + ->setWhitespace($whitespace) 310 + ->setSymbolIndexes($symbol_indexes) 311 + ->setTitle(pht('Diff %s', $target->getID())) 312 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); 289 313 290 - if ($repository) { 291 - $changeset_view->setRepository($repository); 292 - } 314 + 315 + $revision_id = $revision->getID(); 316 + $inline_list_uri = "/revision/inlines/{$revision_id}/"; 317 + $inline_list_uri = $this->getApplicationURI($inline_list_uri); 318 + $changeset_view->setInlineListURI($inline_list_uri); 319 + 320 + if ($repository) { 321 + $changeset_view->setRepository($repository); 322 + } 293 323 294 - if (!$viewer_is_anonymous) { 295 - $changeset_view->setInlineCommentControllerURI( 296 - '/differential/comment/inline/edit/'.$revision->getID().'/'); 324 + if (!$viewer_is_anonymous) { 325 + $changeset_view->setInlineCommentControllerURI( 326 + '/differential/comment/inline/edit/'.$revision->getID().'/'); 327 + } 297 328 } 298 329 299 330 $broken_diffs = $this->loadHistoryDiffStatus($diffs); ··· 312 343 ->setLocalCommits(idx($props, 'local:commits')) 313 344 ->setCommitsForLinks($commits_for_links); 314 345 315 - if ($repository) { 346 + if ($repository && !$this->isVeryLargeDiff()) { 316 347 $other_revisions = $this->loadOtherRevisions( 317 348 $changesets, 318 349 $target, ··· 328 359 329 360 $this->buildPackageMaps($changesets); 330 361 331 - $toc_view = $this->buildTableOfContents( 332 - $changesets, 333 - $visible_changesets, 334 - $target->loadCoverageMap($viewer)); 362 + if ($this->isVeryLargeDiff()) { 363 + $toc_view = null; 364 + } else { 365 + $toc_view = $this->buildTableOfContents( 366 + $changesets, 367 + $visible_changesets, 368 + $target->loadCoverageMap($viewer)); 369 + } 335 370 336 371 // Attach changesets to each reviewer so we can show which Owners package 337 372 // reviewers own no files. ··· 341 376 $reviewer->attachChangesets($reviewer_changesets); 342 377 } 343 378 344 - $tab_group = id(new PHUITabGroupView()) 345 - ->addTab( 379 + $tab_group = id(new PHUITabGroupView()); 380 + 381 + if ($toc_view) { 382 + $tab_group->addTab( 346 383 id(new PHUITabView()) 347 384 ->setName(pht('Files')) 348 385 ->setKey('files') 349 - ->appendChild($toc_view)) 386 + ->appendChild($toc_view)); 387 + } 388 + 389 + $tab_group 350 390 ->addTab( 351 391 id(new PHUITabView()) 352 392 ->setName(pht('History')) ··· 479 519 PhabricatorShowFiletreeSetting::VALUE_ENABLE_FILETREE); 480 520 481 521 $nav = null; 482 - if ($filetree_on) { 522 + if ($filetree_on && !$this->isVeryLargeDiff()) { 483 523 $collapsed_key = PhabricatorFiletreeVisibleSetting::SETTINGKEY; 484 524 $collapsed_value = $viewer->getUserSetting($collapsed_key); 485 525