1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-22 13:30:55 +01:00

Don't show changes for commits which affect more than 1,000 files

Summary: @nh, does this do something reasonable on merges? We can refine the behavior ('click to show all 92 million files'), but I want to make sure it's at least feasible before we pursue it.

Test Plan: Set 1000 to "3" and looked at a change which touched 6 files.

Reviewers: nh, vrana, zjwsoft

Reviewed By: nh

CC: aran

Differential Revision: https://secure.phabricator.com/D4730
This commit is contained in:
epriestley 2013-01-30 12:01:49 -08:00
parent c1bcccb227
commit 5256731262
2 changed files with 60 additions and 16 deletions

View file

@ -113,10 +113,18 @@ final class DiffusionCommitController extends DiffusionController {
$content[] = $this->buildAuditTable($commit, $audit_requests); $content[] = $this->buildAuditTable($commit, $audit_requests);
$content[] = $this->buildComments($commit); $content[] = $this->buildComments($commit);
$hard_limit = 1000;
$change_query = DiffusionPathChangeQuery::newFromDiffusionRequest( $change_query = DiffusionPathChangeQuery::newFromDiffusionRequest(
$drequest); $drequest);
$change_query->setLimit($hard_limit + 1);
$changes = $change_query->loadChanges(); $changes = $change_query->loadChanges();
$was_limited = (count($changes) > $hard_limit);
if ($was_limited) {
$changes = array_slice($changes, 0, $hard_limit);
}
$content[] = $this->buildMergesTable($commit); $content[] = $this->buildMergesTable($commit);
$owners_paths = array(); $owners_paths = array();
@ -171,11 +179,20 @@ final class DiffusionCommitController extends DiffusionController {
"This commit hasn't been fully parsed yet (or doesn't affect any ". "This commit hasn't been fully parsed yet (or doesn't affect any ".
"paths)."); "paths).");
$content[] = $no_changes; $content[] = $no_changes;
} else if ($was_limited) {
$huge_commit = new AphrontErrorView();
$huge_commit->setSeverity(AphrontErrorView::SEVERITY_WARNING);
$huge_commit->setTitle(pht('Enormous Commit'));
$huge_commit->appendChild(
pht(
'This commit is enormous, and affects more than %d files. '.
'Changes are not shown.',
$hard_limit));
$content[] = $huge_commit;
} else { } else {
$change_panel = new AphrontPanelView(); $change_panel = new AphrontPanelView();
$change_panel->setHeader("Changes (".number_format($count).")"); $change_panel->setHeader("Changes (".number_format($count).")");
$change_panel->setID('toc'); $change_panel->setID('toc');
if ($count > self::CHANGES_LIMIT) { if ($count > self::CHANGES_LIMIT) {
$show_all_button = phutil_render_tag( $show_all_button = phutil_render_tag(
'a', 'a',
@ -307,7 +324,6 @@ final class DiffusionCommitController extends DiffusionController {
'commit' => true, 'commit' => true,
)); ));
if ($changesets) { if ($changesets) {
$nav = id(new DifferentialChangesetFileTreeSideNavBuilder()) $nav = id(new DifferentialChangesetFileTreeSideNavBuilder())
->setAnchorName('top') ->setAnchorName('top')

View file

@ -3,6 +3,16 @@
final class DiffusionPathChangeQuery { final class DiffusionPathChangeQuery {
private $request; private $request;
private $limit;
public function setLimit($limit) {
$this->limit = $limit;
return $this;
}
public function getLimit() {
return $this->limit;
}
final private function __construct() { final private function __construct() {
// <private> // <private>
@ -31,20 +41,36 @@ final class DiffusionPathChangeQuery {
$commit = $drequest->loadCommit(); $commit = $drequest->loadCommit();
$conn_r = $repository->establishConnection('r');
$limit = '';
if ($this->limit) {
$limit = qsprintf(
$conn_r,
'LIMIT %d',
$this->limit + 1);
}
$raw_changes = queryfx_all( $raw_changes = queryfx_all(
$repository->establishConnection('r'), $conn_r,
'SELECT c.*, p.path pathName, t.path targetPathName, 'SELECT c.*, p.path pathName, t.path targetPathName,
i.commitIdentifier targetCommitIdentifier i.commitIdentifier targetCommitIdentifier
FROM %T c FROM %T c
LEFT JOIN %T p ON c.pathID = p.id LEFT JOIN %T p ON c.pathID = p.id
LEFT JOIN %T t ON c.targetPathID = t.id LEFT JOIN %T t ON c.targetPathID = t.id
LEFT JOIN %T i ON c.targetCommitID = i.id LEFT JOIN %T i ON c.targetCommitID = i.id
WHERE c.commitID = %d AND isDirect = 1', WHERE c.commitID = %d AND isDirect = 1 %Q',
PhabricatorRepository::TABLE_PATHCHANGE, PhabricatorRepository::TABLE_PATHCHANGE,
PhabricatorRepository::TABLE_PATH, PhabricatorRepository::TABLE_PATH,
PhabricatorRepository::TABLE_PATH, PhabricatorRepository::TABLE_PATH,
$commit->getTableName(), $commit->getTableName(),
$commit->getID()); $commit->getID(),
$limit);
$limited = $this->limit && (count($raw_changes) > $this->limit);
if ($limited) {
$raw_changes = array_slice($raw_changes, 0, $this->limit);
}
$changes = array(); $changes = array();
@ -68,20 +94,22 @@ final class DiffusionPathChangeQuery {
$changes[$id] = $change; $changes[$id] = $change;
} }
// Deduce the away paths by examining all the changes. // Deduce the away paths by examining all the changes, if we loaded them
// all.
$away = array(); if (!$limited) {
foreach ($changes as $change) { $away = array();
if ($change->getTargetPath()) { foreach ($changes as $change) {
$away[$change->getTargetPath()][] = $change->getPath(); if ($change->getTargetPath()) {
$away[$change->getTargetPath()][] = $change->getPath();
}
}
foreach ($changes as $change) {
if (isset($away[$change->getPath()])) {
$change->setAwayPaths($away[$change->getPath()]);
}
} }
} }
foreach ($changes as $change) {
if (isset($away[$change->getPath()])) {
$change->setAwayPaths($away[$change->getPath()]);
}
}
return $changes; return $changes;
} }