mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42:41 +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:
parent
c1bcccb227
commit
5256731262
2 changed files with 60 additions and 16 deletions
|
@ -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')
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue