2011-03-13 01:17:34 +01:00
|
|
|
<?php
|
|
|
|
|
2012-03-10 00:46:25 +01:00
|
|
|
final class DiffusionRepositoryController extends DiffusionController {
|
2011-03-13 01:17:34 +01:00
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
private $historyFuture;
|
|
|
|
private $browseFuture;
|
|
|
|
private $tagFuture;
|
|
|
|
private $branchFuture;
|
|
|
|
|
2013-09-23 21:53:41 +02:00
|
|
|
public function shouldAllowPublic() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-01-05 19:34:04 +01:00
|
|
|
public function handleRequest(AphrontRequest $request) {
|
|
|
|
$response = $this->loadDiffusionContext();
|
|
|
|
if ($response) {
|
|
|
|
return $response;
|
|
|
|
}
|
2014-07-12 16:05:19 +02:00
|
|
|
|
2016-01-05 19:34:04 +01:00
|
|
|
$viewer = $this->getViewer();
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
2011-03-13 01:17:34 +01:00
|
|
|
|
|
|
|
$crumbs = $this->buildCrumbs();
|
2016-03-17 20:01:22 +01:00
|
|
|
$crumbs->setBorder(true);
|
2011-03-13 01:17:34 +01:00
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
$header = $this->buildHeaderView($repository);
|
|
|
|
$curtain = $this->buildCurtain($repository);
|
|
|
|
$property_table = $this->buildPropertiesTable($repository);
|
|
|
|
$description = $this->buildDescriptionView($repository);
|
|
|
|
$locate_file = $this->buildLocateFile();
|
2014-07-12 16:05:19 +02:00
|
|
|
|
|
|
|
// Before we do any work, make sure we're looking at a some content: we're
|
|
|
|
// on a valid branch, and the repository is not empty.
|
|
|
|
$page_has_content = false;
|
|
|
|
$empty_title = null;
|
|
|
|
$empty_message = null;
|
|
|
|
|
|
|
|
// If this VCS supports branches, check that the selected branch actually
|
|
|
|
// exists.
|
|
|
|
if ($drequest->supportsBranches()) {
|
2014-07-13 15:55:04 +02:00
|
|
|
// NOTE: Mercurial may have multiple branch heads with the same name.
|
|
|
|
$ref_cursors = id(new PhabricatorRepositoryRefCursorQuery())
|
2014-07-12 16:05:19 +02:00
|
|
|
->setViewer($viewer)
|
|
|
|
->withRepositoryPHIDs(array($repository->getPHID()))
|
|
|
|
->withRefTypes(array(PhabricatorRepositoryRefCursor::TYPE_BRANCH))
|
|
|
|
->withRefNames(array($drequest->getBranch()))
|
2014-07-13 15:55:04 +02:00
|
|
|
->execute();
|
|
|
|
if ($ref_cursors) {
|
2014-07-12 16:05:19 +02:00
|
|
|
// This is a valid branch, so we necessarily have some content.
|
|
|
|
$page_has_content = true;
|
|
|
|
} else {
|
|
|
|
$empty_title = pht('No Such Branch');
|
|
|
|
$empty_message = pht(
|
|
|
|
'There is no branch named "%s" in this repository.',
|
|
|
|
$drequest->getBranch());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If we didn't find any branches, check if there are any commits at all.
|
|
|
|
// This can tailor the message for empty repositories.
|
|
|
|
if (!$page_has_content) {
|
|
|
|
$any_commit = id(new DiffusionCommitQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->withRepository($repository)
|
|
|
|
->setLimit(1)
|
|
|
|
->execute();
|
|
|
|
if ($any_commit) {
|
|
|
|
if (!$drequest->supportsBranches()) {
|
|
|
|
$page_has_content = true;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$empty_title = pht('Empty Repository');
|
2015-05-22 09:27:56 +02:00
|
|
|
$empty_message = pht('This repository does not have any commits yet.');
|
2014-07-12 16:05:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($page_has_content) {
|
2016-03-17 20:01:22 +01:00
|
|
|
$content = $this->buildNormalContent($drequest);
|
2014-07-12 16:05:19 +02:00
|
|
|
} else {
|
2016-03-17 20:01:22 +01:00
|
|
|
$content = id(new PHUIInfoView())
|
2014-07-12 16:05:19 +02:00
|
|
|
->setTitle($empty_title)
|
2015-03-01 23:45:56 +01:00
|
|
|
->setSeverity(PHUIInfoView::SEVERITY_WARNING)
|
2014-07-12 16:05:19 +02:00
|
|
|
->setErrors(array($empty_message));
|
|
|
|
}
|
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
$view = id(new PHUITwoColumnView())
|
|
|
|
->setHeader($header)
|
|
|
|
->setCurtain($curtain)
|
|
|
|
->setMainColumn(array(
|
|
|
|
$property_table,
|
|
|
|
$description,
|
|
|
|
$locate_file,
|
|
|
|
))
|
|
|
|
->setFooter($content);
|
|
|
|
|
2016-01-05 19:34:04 +01:00
|
|
|
return $this->newPage()
|
|
|
|
->setTitle(
|
|
|
|
array(
|
|
|
|
$repository->getName(),
|
|
|
|
$repository->getDisplayName(),
|
|
|
|
))
|
|
|
|
->setCrumbs($crumbs)
|
2016-03-17 20:01:22 +01:00
|
|
|
->appendChild(array(
|
|
|
|
$view,
|
|
|
|
));
|
2014-07-12 16:05:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private function buildNormalContent(DiffusionRequest $drequest) {
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
$request = $this->getRequest();
|
2014-07-12 16:05:19 +02:00
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
$commit = $drequest->getCommit();
|
|
|
|
$path = $drequest->getPath();
|
|
|
|
|
|
|
|
$this->historyFuture = $this->callConduitMethod(
|
|
|
|
'diffusion.historyquery',
|
|
|
|
array(
|
|
|
|
'commit' => $commit,
|
|
|
|
'path' => $path,
|
|
|
|
'offset' => 0,
|
|
|
|
'limit' => 15,
|
|
|
|
));
|
|
|
|
|
|
|
|
$browse_pager = id(new PHUIPagerView())
|
|
|
|
->readFromRequest($request);
|
|
|
|
|
|
|
|
$this->browseFuture = $this->callConduitMethod(
|
|
|
|
'diffusion.browsequery',
|
|
|
|
array(
|
|
|
|
'commit' => $commit,
|
|
|
|
'path' => $path,
|
|
|
|
'limit' => $browse_pager->getPageSize() + 1,
|
|
|
|
));
|
|
|
|
|
|
|
|
if ($this->needTagFuture()) {
|
|
|
|
$tag_limit = $this->getTagLimit();
|
|
|
|
$this->tagFuture = $this->callConduitMethod(
|
|
|
|
'diffusion.tagsquery',
|
|
|
|
array(
|
|
|
|
// On the home page, we want to find tags on any branch.
|
|
|
|
'commit' => null,
|
|
|
|
'limit' => $tag_limit + 1,
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->needBranchFuture()) {
|
|
|
|
$branch_limit = $this->getBranchLimit();
|
|
|
|
$this->branchFuture = $this->callConduitMethod(
|
|
|
|
'diffusion.branchquery',
|
|
|
|
array(
|
|
|
|
'closed' => false,
|
|
|
|
'limit' => $branch_limit + 1,
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
$futures = array(
|
|
|
|
$this->historyFuture,
|
|
|
|
$this->browseFuture,
|
|
|
|
$this->tagFuture,
|
|
|
|
$this->branchFuture,
|
|
|
|
);
|
|
|
|
$futures = array_filter($futures);
|
|
|
|
$futures = new FutureIterator($futures);
|
|
|
|
foreach ($futures as $future) {
|
|
|
|
// Just resolve all the futures before continuing.
|
|
|
|
}
|
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
$phids = array();
|
2014-07-12 16:05:19 +02:00
|
|
|
$content = array();
|
2012-03-08 21:46:19 +01:00
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
try {
|
2016-12-08 15:39:33 +01:00
|
|
|
$history_results = $this->historyFuture->resolve();
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
$history = DiffusionPathChange::newFromConduit(
|
|
|
|
$history_results['pathChanges']);
|
|
|
|
|
|
|
|
foreach ($history as $item) {
|
|
|
|
$data = $item->getCommitData();
|
|
|
|
if ($data) {
|
|
|
|
if ($data->getCommitDetail('authorPHID')) {
|
|
|
|
$phids[$data->getCommitDetail('authorPHID')] = true;
|
|
|
|
}
|
|
|
|
if ($data->getCommitDetail('committerPHID')) {
|
|
|
|
$phids[$data->getCommitDetail('committerPHID')] = true;
|
|
|
|
}
|
2012-05-23 17:34:36 +02:00
|
|
|
}
|
2011-04-03 01:39:23 +02:00
|
|
|
}
|
2013-10-27 05:08:24 +01:00
|
|
|
$history_exception = null;
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
} catch (Exception $ex) {
|
|
|
|
$history_results = null;
|
|
|
|
$history = null;
|
|
|
|
$history_exception = $ex;
|
2011-04-03 01:39:23 +02:00
|
|
|
}
|
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
try {
|
2016-12-08 15:39:33 +01:00
|
|
|
$browse_results = $this->browseFuture->resolve();
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
$browse_results = DiffusionBrowseResultSet::newFromConduit(
|
2016-12-08 15:39:33 +01:00
|
|
|
$browse_results);
|
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
$browse_paths = $browse_results->getPaths();
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
$browse_paths = $browse_pager->sliceResults($browse_paths);
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
|
|
|
foreach ($browse_paths as $item) {
|
|
|
|
$data = $item->getLastCommitData();
|
|
|
|
if ($data) {
|
|
|
|
if ($data->getCommitDetail('authorPHID')) {
|
|
|
|
$phids[$data->getCommitDetail('authorPHID')] = true;
|
|
|
|
}
|
|
|
|
if ($data->getCommitDetail('committerPHID')) {
|
|
|
|
$phids[$data->getCommitDetail('committerPHID')] = true;
|
|
|
|
}
|
2012-05-23 17:34:36 +02:00
|
|
|
}
|
2011-04-03 01:39:23 +02:00
|
|
|
}
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
2013-10-27 05:08:24 +01:00
|
|
|
$browse_exception = null;
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
} catch (Exception $ex) {
|
|
|
|
$browse_results = null;
|
|
|
|
$browse_paths = null;
|
|
|
|
$browse_exception = $ex;
|
2011-04-03 01:39:23 +02:00
|
|
|
}
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
2011-04-03 01:39:23 +02:00
|
|
|
$phids = array_keys($phids);
|
2012-09-05 04:02:56 +02:00
|
|
|
$handles = $this->loadViewerHandles($phids);
|
2011-04-03 01:39:23 +02:00
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
if ($browse_results) {
|
2016-01-07 12:50:16 +01:00
|
|
|
$readme = $this->renderDirectoryReadme($browse_results);
|
|
|
|
} else {
|
|
|
|
$readme = null;
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
}
|
2013-05-21 22:47:06 +02:00
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
$content[] = $this->buildBrowseTable(
|
|
|
|
$browse_results,
|
|
|
|
$browse_paths,
|
|
|
|
$browse_exception,
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
$handles,
|
|
|
|
$browse_pager);
|
2011-03-13 01:17:34 +01:00
|
|
|
|
2014-05-13 04:57:12 +02:00
|
|
|
$content[] = $this->buildHistoryTable(
|
|
|
|
$history_results,
|
|
|
|
$history,
|
2015-09-11 04:28:49 +02:00
|
|
|
$history_exception);
|
2014-05-13 04:57:12 +02:00
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
try {
|
|
|
|
$content[] = $this->buildTagListTable($drequest);
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
if (!$repository->isImporting()) {
|
|
|
|
$content[] = $this->renderStatusMessage(
|
|
|
|
pht('Unable to Load Tags'),
|
|
|
|
$ex->getMessage());
|
|
|
|
}
|
|
|
|
}
|
2012-04-18 17:02:08 +02:00
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
try {
|
|
|
|
$content[] = $this->buildBranchListTable($drequest);
|
|
|
|
} catch (Exception $ex) {
|
|
|
|
if (!$repository->isImporting()) {
|
|
|
|
$content[] = $this->renderStatusMessage(
|
|
|
|
pht('Unable to Load Branches'),
|
|
|
|
$ex->getMessage());
|
|
|
|
}
|
|
|
|
}
|
2011-03-13 01:17:34 +01:00
|
|
|
|
2012-04-30 16:47:41 +02:00
|
|
|
if ($readme) {
|
2014-12-31 20:54:52 +01:00
|
|
|
$content[] = $readme;
|
2012-04-30 16:47:41 +02:00
|
|
|
}
|
|
|
|
|
2014-07-12 16:05:19 +02:00
|
|
|
return $content;
|
2011-03-13 01:17:34 +01:00
|
|
|
}
|
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
private function buildHeaderView(PhabricatorRepository $repository) {
|
|
|
|
$viewer = $this->getViewer();
|
2013-09-17 18:12:37 +02:00
|
|
|
$header = id(new PHUIHeaderView())
|
2013-09-19 20:57:09 +02:00
|
|
|
->setHeader($repository->getName())
|
2016-03-17 20:01:22 +01:00
|
|
|
->setUser($viewer)
|
|
|
|
->setPolicyObject($repository)
|
2017-06-12 16:51:16 +02:00
|
|
|
->setProfileHeader(true)
|
|
|
|
->setImage($repository->getProfileImageURI())
|
|
|
|
->setImageEditURL('/diffusion/picture/'.$repository->getID().'/');
|
2013-09-19 20:57:09 +02:00
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
if (!$repository->isTracked()) {
|
2014-05-19 01:10:54 +02:00
|
|
|
$header->setStatus('fa-ban', 'dark', pht('Inactive'));
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
} else if ($repository->isImporting()) {
|
2016-01-05 22:36:32 +01:00
|
|
|
$ratio = $repository->loadImportProgress();
|
|
|
|
$percentage = sprintf('%.2f%%', 100 * $ratio);
|
|
|
|
$header->setStatus(
|
|
|
|
'fa-clock-o',
|
|
|
|
'indigo',
|
|
|
|
pht('Importing (%s)...', $percentage));
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
} else {
|
2014-05-19 01:10:54 +02:00
|
|
|
$header->setStatus('fa-check', 'bluegrey', pht('Active'));
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
}
|
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
return $header;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildCurtain(PhabricatorRepository $repository) {
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
|
2016-05-03 23:26:09 +02:00
|
|
|
$edit_uri = $repository->getPathURI('manage/');
|
2016-03-17 20:01:22 +01:00
|
|
|
$curtain = $this->newCurtainView($repository);
|
|
|
|
|
|
|
|
$curtain->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
2016-05-03 23:26:09 +02:00
|
|
|
->setName(pht('Manage Repository'))
|
|
|
|
->setIcon('fa-cogs')
|
|
|
|
->setHref($edit_uri));
|
2016-03-17 20:01:22 +01:00
|
|
|
|
|
|
|
if ($repository->isHosted()) {
|
|
|
|
$push_uri = $this->getApplicationURI(
|
|
|
|
'pushlog/?repositories='.$repository->getMonogram());
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
$curtain->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName(pht('View Push Logs'))
|
|
|
|
->setIcon('fa-list-alt')
|
|
|
|
->setHref($push_uri));
|
|
|
|
}
|
2013-05-24 19:48:10 +02:00
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
return $curtain;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildDescriptionView(PhabricatorRepository $repository) {
|
|
|
|
$viewer = $this->getViewer();
|
2013-10-11 16:53:56 +02:00
|
|
|
$view = id(new PHUIPropertyListView())
|
2016-03-17 20:01:22 +01:00
|
|
|
->setUser($viewer);
|
|
|
|
|
|
|
|
$description = $repository->getDetail('description');
|
|
|
|
if (strlen($description)) {
|
|
|
|
$description = new PHUIRemarkupView($viewer, $description);
|
|
|
|
$view->addTextContent($description);
|
|
|
|
return id(new PHUIObjectBoxView())
|
2016-04-07 00:20:53 +02:00
|
|
|
->setHeaderText(pht('Description'))
|
2016-03-17 20:01:22 +01:00
|
|
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
|
|
->appendChild($view);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function buildPropertiesTable(PhabricatorRepository $repository) {
|
|
|
|
$viewer = $this->getViewer();
|
|
|
|
|
|
|
|
$view = id(new PHUIPropertyListView())
|
|
|
|
->setUser($viewer);
|
2013-05-24 19:48:10 +02:00
|
|
|
|
2016-05-03 23:26:09 +02:00
|
|
|
$display_never = PhabricatorRepositoryURI::DISPLAY_NEVER;
|
|
|
|
|
|
|
|
$uris = $repository->getURIs();
|
|
|
|
foreach ($uris as $uri) {
|
|
|
|
if ($uri->getIsDisabled()) {
|
|
|
|
continue;
|
2013-11-02 01:35:43 +01:00
|
|
|
}
|
|
|
|
|
2016-05-03 23:26:09 +02:00
|
|
|
if ($uri->getEffectiveDisplayType() == $display_never) {
|
|
|
|
continue;
|
2013-11-02 01:35:43 +01:00
|
|
|
}
|
2016-05-03 23:26:09 +02:00
|
|
|
|
|
|
|
if ($repository->isSVN()) {
|
2017-04-21 20:22:06 +02:00
|
|
|
$label = phutil_tag_div('diffusion-clone-label', pht('Checkout'));
|
2016-05-03 23:26:09 +02:00
|
|
|
} else {
|
2017-04-21 20:22:06 +02:00
|
|
|
$label = phutil_tag_div('diffusion-clone-label', pht('Clone'));
|
2013-11-02 01:35:43 +01:00
|
|
|
}
|
2016-05-03 23:26:09 +02:00
|
|
|
|
|
|
|
$view->addProperty(
|
|
|
|
$label,
|
|
|
|
$this->renderCloneURI($repository, $uri));
|
2012-03-08 21:46:19 +01:00
|
|
|
}
|
|
|
|
|
2015-04-27 12:49:57 +02:00
|
|
|
$box = id(new PHUIObjectBoxView())
|
2016-04-07 00:20:53 +02:00
|
|
|
->setHeaderText(pht('Details'))
|
2016-03-17 20:01:22 +01:00
|
|
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
|
|
->appendChild($view);
|
2013-09-29 00:55:38 +02:00
|
|
|
|
2015-04-27 12:49:57 +02:00
|
|
|
$info = null;
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
2015-09-03 19:03:31 +02:00
|
|
|
|
|
|
|
// Try to load alternatives. This may fail for repositories which have not
|
|
|
|
// cloned yet. If it does, just ignore it and continue.
|
|
|
|
try {
|
|
|
|
$alternatives = $drequest->getRefAlternatives();
|
|
|
|
} catch (ConduitClientException $ex) {
|
|
|
|
$alternatives = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($alternatives) {
|
2015-04-27 12:49:57 +02:00
|
|
|
$message = array(
|
|
|
|
pht(
|
|
|
|
'The ref "%s" is ambiguous in this repository.',
|
|
|
|
$drequest->getBranch()),
|
|
|
|
' ',
|
|
|
|
phutil_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'href' => $drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'refs',
|
|
|
|
)),
|
|
|
|
),
|
|
|
|
pht('View Alternatives')),
|
|
|
|
);
|
|
|
|
|
|
|
|
$messages = array($message);
|
|
|
|
|
|
|
|
$info = id(new PHUIInfoView())
|
|
|
|
->setSeverity(PHUIInfoView::SEVERITY_WARNING)
|
|
|
|
->setErrors(array($message));
|
|
|
|
|
|
|
|
$box->setInfoView($info);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return $box;
|
2012-03-08 21:46:19 +01:00
|
|
|
}
|
|
|
|
|
2012-05-10 09:28:19 +02:00
|
|
|
private function buildBranchListTable(DiffusionRequest $drequest) {
|
2016-03-17 20:01:22 +01:00
|
|
|
$viewer = $this->getViewer();
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
if (!$this->needBranchFuture()) {
|
2013-10-30 21:06:28 +01:00
|
|
|
return null;
|
|
|
|
}
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
$branches = $this->branchFuture->resolve();
|
2013-10-30 21:06:28 +01:00
|
|
|
if (!$branches) {
|
|
|
|
return null;
|
|
|
|
}
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
$limit = $this->getBranchLimit();
|
2013-10-30 21:06:28 +01:00
|
|
|
$more_branches = (count($branches) > $limit);
|
|
|
|
$branches = array_slice($branches, 0, $limit);
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2014-01-18 01:10:56 +01:00
|
|
|
$branches = DiffusionRepositoryRef::loadAllFromDictionaries($branches);
|
|
|
|
|
2013-10-30 21:06:28 +01:00
|
|
|
$commits = id(new DiffusionCommitQuery())
|
|
|
|
->setViewer($viewer)
|
2014-01-18 01:10:56 +01:00
|
|
|
->withIdentifiers(mpull($branches, 'getCommitIdentifier'))
|
2013-11-07 21:10:43 +01:00
|
|
|
->withRepository($drequest->getRepository())
|
2013-10-30 21:06:28 +01:00
|
|
|
->execute();
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2013-10-30 21:06:43 +01:00
|
|
|
$table = id(new DiffusionBranchTableView())
|
|
|
|
->setUser($viewer)
|
|
|
|
->setDiffusionRequest($drequest)
|
|
|
|
->setBranches($branches)
|
|
|
|
->setCommits($commits);
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
$panel = id(new PHUIObjectBoxView())
|
|
|
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);
|
2014-01-07 20:57:37 +01:00
|
|
|
$header = new PHUIHeaderView();
|
|
|
|
$header->setHeader(pht('Branches'));
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2013-10-30 21:06:28 +01:00
|
|
|
if ($more_branches) {
|
2017-02-18 10:24:56 +01:00
|
|
|
$header->setSubheader(pht('Showing %d branches.', $limit));
|
2012-05-10 09:28:19 +02:00
|
|
|
}
|
|
|
|
|
2017-06-18 09:53:43 +02:00
|
|
|
$button = id(new PHUIButtonView())
|
|
|
|
->setText(pht('Show All'))
|
|
|
|
->setTag('a')
|
|
|
|
->setIcon('fa-code-fork')
|
|
|
|
->setHref($drequest->generateURI(
|
2015-05-22 09:27:56 +02:00
|
|
|
array(
|
|
|
|
'action' => 'branches',
|
|
|
|
)));
|
2013-10-30 21:06:28 +01:00
|
|
|
|
2014-01-07 20:57:37 +01:00
|
|
|
$header->addActionLink($button);
|
|
|
|
$panel->setHeader($header);
|
2015-05-20 08:14:22 +02:00
|
|
|
$panel->setTable($table);
|
2013-10-30 21:06:28 +01:00
|
|
|
|
|
|
|
return $panel;
|
2012-05-10 09:28:19 +02:00
|
|
|
}
|
|
|
|
|
2012-04-18 17:02:08 +02:00
|
|
|
private function buildTagListTable(DiffusionRequest $drequest) {
|
2016-03-17 20:01:22 +01:00
|
|
|
$viewer = $this->getViewer();
|
2015-02-17 23:01:17 +01:00
|
|
|
$repository = $drequest->getRepository();
|
2013-10-30 21:06:43 +01:00
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
if (!$this->needTagFuture()) {
|
|
|
|
return null;
|
2015-02-17 23:01:17 +01:00
|
|
|
}
|
2012-04-18 17:02:08 +02:00
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
$tags = $this->tagFuture->resolve();
|
|
|
|
$tags = DiffusionRepositoryTag::newFromConduit($tags);
|
2012-04-18 17:02:08 +02:00
|
|
|
if (!$tags) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
$tag_limit = $this->getTagLimit();
|
2012-04-19 18:39:19 +02:00
|
|
|
$more_tags = (count($tags) > $tag_limit);
|
|
|
|
$tags = array_slice($tags, 0, $tag_limit);
|
|
|
|
|
2013-10-30 21:06:43 +01:00
|
|
|
$commits = id(new DiffusionCommitQuery())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->withIdentifiers(mpull($tags, 'getCommitIdentifier'))
|
2015-02-17 23:01:17 +01:00
|
|
|
->withRepository($repository)
|
2012-04-18 17:02:08 +02:00
|
|
|
->needCommitData(true)
|
|
|
|
->execute();
|
|
|
|
|
2017-06-13 20:16:57 +02:00
|
|
|
$view = id(new DiffusionTagTableView())
|
2013-10-30 21:06:43 +01:00
|
|
|
->setUser($viewer)
|
|
|
|
->setDiffusionRequest($drequest)
|
|
|
|
->setTags($tags)
|
|
|
|
->setCommits($commits);
|
2012-04-18 17:02:08 +02:00
|
|
|
|
|
|
|
$phids = $view->getRequiredHandlePHIDs();
|
2012-09-05 04:02:56 +02:00
|
|
|
$handles = $this->loadViewerHandles($phids);
|
2012-04-18 17:02:08 +02:00
|
|
|
$view->setHandles($handles);
|
|
|
|
|
2014-01-20 22:12:30 +01:00
|
|
|
$panel = new PHUIObjectBoxView();
|
|
|
|
$header = new PHUIHeaderView();
|
|
|
|
$header->setHeader(pht('Tags'));
|
2012-04-19 18:39:19 +02:00
|
|
|
|
|
|
|
if ($more_tags) {
|
2017-02-18 10:24:56 +01:00
|
|
|
$header->setSubheader(
|
2014-01-20 22:12:30 +01:00
|
|
|
pht('Showing the %d most recent tags.', $tag_limit));
|
2012-04-19 18:39:19 +02:00
|
|
|
}
|
|
|
|
|
2017-06-18 09:53:43 +02:00
|
|
|
$button = id(new PHUIButtonView())
|
|
|
|
->setText(pht('Show All Tags'))
|
|
|
|
->setTag('a')
|
|
|
|
->setIcon('fa-tag')
|
|
|
|
->setHref($drequest->generateURI(
|
2014-05-13 23:08:21 +02:00
|
|
|
array(
|
|
|
|
'action' => 'tags',
|
|
|
|
)));
|
2014-01-20 22:12:30 +01:00
|
|
|
|
|
|
|
$header->addActionLink($button);
|
|
|
|
|
|
|
|
$panel->setHeader($header);
|
2015-05-22 17:22:25 +02:00
|
|
|
$panel->setTable($view);
|
2016-03-17 20:01:22 +01:00
|
|
|
$panel->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);
|
2012-04-18 17:02:08 +02:00
|
|
|
|
|
|
|
return $panel;
|
|
|
|
}
|
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
private function buildHistoryTable(
|
|
|
|
$history_results,
|
|
|
|
$history,
|
2015-09-11 04:28:49 +02:00
|
|
|
$history_exception) {
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
|
|
|
$request = $this->getRequest();
|
|
|
|
$viewer = $request->getUser();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
if ($history_exception) {
|
|
|
|
if ($repository->isImporting()) {
|
|
|
|
return $this->renderStatusMessage(
|
|
|
|
pht('Still Importing...'),
|
|
|
|
pht(
|
|
|
|
'This repository is still importing. History is not yet '.
|
|
|
|
'available.'));
|
|
|
|
} else {
|
|
|
|
return $this->renderStatusMessage(
|
|
|
|
pht('Unable to Retrieve History'),
|
|
|
|
$history_exception->getMessage());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$history_table = id(new DiffusionHistoryTableView())
|
|
|
|
->setUser($viewer)
|
|
|
|
->setDiffusionRequest($drequest)
|
|
|
|
->setHistory($history);
|
|
|
|
|
|
|
|
// TODO: Super sketchy.
|
|
|
|
$history_table->loadRevisions();
|
|
|
|
|
|
|
|
if ($history_results) {
|
|
|
|
$history_table->setParents($history_results['parents']);
|
|
|
|
}
|
|
|
|
|
|
|
|
$history_table->setIsHead(true);
|
2014-01-09 17:51:57 +01:00
|
|
|
|
2017-06-18 09:53:43 +02:00
|
|
|
$history = id(new PHUIButtonView())
|
|
|
|
->setText(pht('History'))
|
2014-01-09 17:51:57 +01:00
|
|
|
->setHref($drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'history',
|
|
|
|
)))
|
|
|
|
->setTag('a')
|
2017-06-18 09:53:43 +02:00
|
|
|
->setIcon('fa-history');
|
|
|
|
|
|
|
|
$graph = id(new PHUIButtonView())
|
|
|
|
->setText(pht('Graph'))
|
|
|
|
->setHref($drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'graph',
|
|
|
|
)))
|
|
|
|
->setTag('a')
|
|
|
|
->setIcon('fa-code-fork');
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
$panel = id(new PHUIObjectBoxView())
|
|
|
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);
|
2014-01-09 17:51:57 +01:00
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('Recent Commits'))
|
2017-06-18 09:53:43 +02:00
|
|
|
->addActionLink($graph)
|
|
|
|
->addActionLink($history);
|
2014-01-09 17:51:57 +01:00
|
|
|
$panel->setHeader($header);
|
2015-05-20 08:14:22 +02:00
|
|
|
$panel->setTable($history_table);
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
|
|
|
return $panel;
|
|
|
|
}
|
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
private function buildLocateFile() {
|
|
|
|
$request = $this->getRequest();
|
|
|
|
$viewer = $request->getUser();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
$locate_panel = null;
|
|
|
|
if ($repository->canUsePathTree()) {
|
|
|
|
Javelin::initBehavior(
|
|
|
|
'diffusion-locate-file',
|
|
|
|
array(
|
|
|
|
'controlID' => 'locate-control',
|
|
|
|
'inputID' => 'locate-input',
|
|
|
|
'browseBaseURI' => (string)$drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'browse',
|
|
|
|
)),
|
|
|
|
'uri' => (string)$drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'pathtree',
|
|
|
|
)),
|
|
|
|
));
|
|
|
|
|
|
|
|
$form = id(new AphrontFormView())
|
|
|
|
->setUser($viewer)
|
|
|
|
->appendChild(
|
|
|
|
id(new AphrontFormTypeaheadControl())
|
|
|
|
->setHardpointID('locate-control')
|
|
|
|
->setID('locate-input')
|
|
|
|
->setLabel(pht('Locate File')));
|
|
|
|
$form_box = id(new PHUIBoxView())
|
|
|
|
->appendChild($form->buildLayoutView());
|
|
|
|
$locate_panel = id(new PHUIObjectBoxView())
|
|
|
|
->setHeaderText(pht('Locate File'))
|
|
|
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
|
|
->appendChild($form_box);
|
|
|
|
}
|
|
|
|
return $locate_panel;
|
|
|
|
}
|
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
private function buildBrowseTable(
|
|
|
|
$browse_results,
|
|
|
|
$browse_paths,
|
|
|
|
$browse_exception,
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
array $handles,
|
|
|
|
PHUIPagerView $pager) {
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
2014-06-13 20:36:01 +02:00
|
|
|
require_celerity_resource('diffusion-icons-css');
|
|
|
|
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
$request = $this->getRequest();
|
|
|
|
$viewer = $request->getUser();
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
if ($browse_exception) {
|
|
|
|
if ($repository->isImporting()) {
|
|
|
|
// The history table renders a useful message.
|
|
|
|
return null;
|
|
|
|
} else {
|
|
|
|
return $this->renderStatusMessage(
|
|
|
|
pht('Unable to Retrieve Paths'),
|
|
|
|
$browse_exception->getMessage());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$browse_table = id(new DiffusionBrowseTableView())
|
|
|
|
->setUser($viewer)
|
|
|
|
->setDiffusionRequest($drequest)
|
|
|
|
->setHandles($handles);
|
|
|
|
if ($browse_paths) {
|
|
|
|
$browse_table->setPaths($browse_paths);
|
|
|
|
} else {
|
|
|
|
$browse_table->setPaths(array());
|
|
|
|
}
|
|
|
|
|
|
|
|
$browse_uri = $drequest->generateURI(array('action' => 'browse'));
|
|
|
|
|
2016-03-17 20:01:22 +01:00
|
|
|
$browse_panel = id(new PHUIObjectBoxView())
|
|
|
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);
|
2014-01-09 17:51:57 +01:00
|
|
|
$header = id(new PHUIHeaderView())
|
2016-03-17 20:01:22 +01:00
|
|
|
->setHeader($repository->getName());
|
2014-01-09 17:51:57 +01:00
|
|
|
|
2017-06-18 09:53:43 +02:00
|
|
|
$button = id(new PHUIButtonView())
|
|
|
|
->setText(pht('Browse'))
|
|
|
|
->setTag('a')
|
|
|
|
->setIcon('fa-code')
|
|
|
|
->setHref($browse_uri);
|
2014-01-09 17:51:57 +01:00
|
|
|
|
|
|
|
$header->addActionLink($button);
|
|
|
|
$browse_panel->setHeader($header);
|
2015-05-20 08:14:22 +02:00
|
|
|
$browse_panel->setTable($browse_table);
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
$pager->setURI($browse_uri, 'offset');
|
|
|
|
|
|
|
|
if ($pager->willShowPagingControls()) {
|
2017-04-21 20:22:06 +02:00
|
|
|
$browse_panel->setPager($pager);
|
Improve Diffusion behavior for directories with impressive numbers of files
Summary:
Fixes T4366. Two years ago, Facebook put 16,000 files in a directory. Today, the page has nearly loaded.
Paginate large directories.
Test Plan:
- Viewed home and browse views in Git, Mercurial and Subversion.
I put an artificially small page size (5) on home:
{F1055653}
I pushed 16,000 files to a directory and paged through them. Here's the last page, which rendered in about 200ms:
{F1055655}
Our behavior is a bit better than GitHub here, which shows only the first 1,000 files, disables pagination, and can't retrieve history for the files:
{F1055656}
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T4366
Differential Revision: https://secure.phabricator.com/D14956
2016-01-06 12:57:57 +01:00
|
|
|
}
|
|
|
|
|
2017-04-21 20:22:06 +02:00
|
|
|
return $browse_panel;
|
Add an "importing" state to repositories and clean up the UI
Summary:
Fixes T3217. Ref T776. Ref T1493. Broadly, this introduces a mechanism which works like this:
- When a repository is created, we set an "importing" flag.
- After discovery completes, we check if a repository has no importing commits. Basically, this is the first time we catch up to HEAD.
- If we're caught up, clear the "importing" flag.
This flag lets us fix some issues:
- T3217. Currently, when you import a new repository and users have rules like "Email me on every commit ever" or "trigger an audit on every commit", we take a bunch of publish actions. Instead, implicitly disable publishing during import.
- An imported but un-pulled repository currently has an incomprehensible error on `/diffusion/X/`. Fix that.
- Show more cues in the UI about importing.
- Made some exceptions more specific.
Test Plan:
This is the new screen for a completely new repo, replacing a giant exception:
{F75443}
- Created a repository, saw it "importing".
- Pulled and discovered it.
- Processed its commits.
- Ran discovery again, saw import flag clear.
- Also this repository was empty, which hit some of the other code.
This is the new "parsed empty repository" UI, which isn't good, but is less broken:
{F75446}
Reviewers: btrahan
Reviewed By: btrahan
CC: aran, hach-que
Maniphest Tasks: T3607, T1493, T776, T3217
Differential Revision: https://secure.phabricator.com/D7429
2013-10-27 03:59:57 +01:00
|
|
|
}
|
|
|
|
|
2016-05-03 23:26:09 +02:00
|
|
|
private function renderCloneURI(
|
2014-01-30 20:42:10 +01:00
|
|
|
PhabricatorRepository $repository,
|
2016-05-03 23:26:09 +02:00
|
|
|
PhabricatorRepositoryURI $uri) {
|
2013-11-02 01:35:43 +01:00
|
|
|
|
In Subversion, show "svn checkout <uri> <directory>" in Diffusion
Summary:
Ref T10923. The old behavior was to show a full command in SVN, Mercurial, and Git, like this:
- `git clone <uri>`
- `hg clone <uri>`
- `svn checkout <uri> <directory>`
In Git and Mercurial, the `<uri>` ends in something like `/nice-repository-name.git` so the default directory it creates is called `nice-repository-name/`.
In Subversion, we don't (and can't easily) do that for various reasons so we provide an explicit `<directory>` with the nice name.
In the update, I've changed things to just show the URI. I often found that I wanted the URI alone, not the whole clone command (for example, to `fetch`, `remote-add`, etc). This is also consistent with GitHub. Because we have nice URIs for Git and Mercurial, `git clone <uri>` has good behavior.
In Subversion, `svn checkout <uri>` has bad beahvior (you get a directory named `47/` or whatever). So continue showing the whole command there.
We can possibly tailor this after T4245 finishes up and we get access to `/source/nice-repository-name/` URIs.
Test Plan:
- Viewed a Subversion repository, saw a full command.
- Viewed a Git repository, saw only a clone URI.
Reviewers: chad
Reviewed By: chad
Maniphest Tasks: T10923
Differential Revision: https://secure.phabricator.com/D15888
2016-05-11 16:22:07 +02:00
|
|
|
if ($repository->isSVN()) {
|
|
|
|
$display = csprintf(
|
|
|
|
'svn checkout %R %R',
|
|
|
|
(string)$uri->getDisplayURI(),
|
|
|
|
$repository->getCloneName());
|
|
|
|
} else {
|
|
|
|
$display = csprintf('%R', (string)$uri->getDisplayURI());
|
|
|
|
}
|
|
|
|
|
|
|
|
$display = (string)$display;
|
2016-05-11 19:17:33 +02:00
|
|
|
$viewer = $this->getViewer();
|
2014-01-30 20:42:10 +01:00
|
|
|
|
2016-05-11 19:17:33 +02:00
|
|
|
return id(new DiffusionCloneURIView())
|
|
|
|
->setViewer($viewer)
|
|
|
|
->setRepository($repository)
|
|
|
|
->setRepositoryURI($uri)
|
|
|
|
->setDisplayURI($display);
|
2013-11-02 01:35:43 +01:00
|
|
|
}
|
|
|
|
|
2016-12-08 15:39:33 +01:00
|
|
|
private function needTagFuture() {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
$repository = $drequest->getRepository();
|
|
|
|
|
|
|
|
switch ($repository->getVersionControlSystem()) {
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
|
|
|
// No tags in SVN.
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function getTagLimit() {
|
|
|
|
return 15;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function needBranchFuture() {
|
|
|
|
$drequest = $this->getDiffusionRequest();
|
|
|
|
|
|
|
|
if ($drequest->getBranch() === null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function getBranchLimit() {
|
|
|
|
return 15;
|
|
|
|
}
|
|
|
|
|
2011-03-13 01:17:34 +01:00
|
|
|
}
|