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
|
|
|
|
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
|
|
|
|
|
|
|
$content = array();
|
|
|
|
|
|
|
|
$crumbs = $this->buildCrumbs();
|
|
|
|
|
2012-03-08 21:46:19 +01:00
|
|
|
$content[] = $this->buildPropertiesTable($drequest->getRepository());
|
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) {
|
|
|
|
$content[] = $this->buildNormalContent($drequest);
|
|
|
|
} else {
|
2015-03-01 23:45:56 +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-01-05 19:34:04 +01:00
|
|
|
return $this->newPage()
|
|
|
|
->setTitle(
|
|
|
|
array(
|
|
|
|
$repository->getName(),
|
|
|
|
$repository->getDisplayName(),
|
|
|
|
))
|
|
|
|
->setCrumbs($crumbs)
|
|
|
|
->appendChild($content);
|
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();
|
|
|
|
|
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 {
|
|
|
|
$history_results = $this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.historyquery',
|
Diffusion - move DiffusionBrowseQuery => Conduit
Summary: see title. Ref T2784.
Test Plan:
In diffusion, for each of SVN, Mercurial, and Git, I loaded up /diffusion/CALLSIGN/. I verified the README was displayed and things looked good. Next I clicked on "browse" on the top-most commit and verified things looked correct. Also clicked through to a file for a good measure and things looked good.
In owners, for each of SVN, Mercurial, and Git, I played around with the path typeahead / validator. It worked correctly!
Reviewers: epriestley
Reviewed By: epriestley
CC: chad, aran, Korvin
Maniphest Tasks: T2784
Differential Revision: https://secure.phabricator.com/D5883
2013-05-10 20:02:58 +02:00
|
|
|
array(
|
|
|
|
'commit' => $drequest->getCommit(),
|
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
|
|
|
'path' => $drequest->getPath(),
|
|
|
|
'offset' => 0,
|
2014-10-07 15:01:04 +02:00
|
|
|
'limit' => 15,
|
|
|
|
));
|
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
|
|
|
}
|
|
|
|
|
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_pager = id(new PHUIPagerView())
|
|
|
|
->readFromRequest($request);
|
|
|
|
|
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 {
|
|
|
|
$browse_results = DiffusionBrowseResultSet::newFromConduit(
|
|
|
|
$this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.browsequery',
|
|
|
|
array(
|
|
|
|
'path' => $drequest->getPath(),
|
|
|
|
'commit' => $drequest->getCommit(),
|
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
|
|
|
'limit' => $browse_pager->getPageSize() + 1,
|
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
|
|
|
}
|
|
|
|
|
2012-03-08 21:46:19 +01:00
|
|
|
private function buildPropertiesTable(PhabricatorRepository $repository) {
|
2013-05-24 21:38:44 +02:00
|
|
|
$user = $this->getRequest()->getUser();
|
2012-03-08 21:46:19 +01:00
|
|
|
|
2013-09-17 18:12:37 +02:00
|
|
|
$header = id(new PHUIHeaderView())
|
2013-09-19 20:57:09 +02:00
|
|
|
->setHeader($repository->getName())
|
|
|
|
->setUser($user)
|
|
|
|
->setPolicyObject($repository);
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-19 20:57:09 +02:00
|
|
|
$actions = $this->buildActionList($repository);
|
2013-05-24 19:48:10 +02:00
|
|
|
|
2013-10-11 16:53:56 +02:00
|
|
|
$view = id(new PHUIPropertyListView())
|
2015-07-08 16:00:17 +02:00
|
|
|
->setObject($repository)
|
2013-05-24 21:38:44 +02:00
|
|
|
->setUser($user);
|
2013-05-24 19:48:10 +02:00
|
|
|
|
2013-11-02 01:35:43 +01:00
|
|
|
if ($repository->isHosted()) {
|
2014-01-30 20:41:21 +01:00
|
|
|
$ssh_uri = $repository->getSSHCloneURIObject();
|
|
|
|
if ($ssh_uri) {
|
2014-01-30 20:42:10 +01:00
|
|
|
$clone_uri = $this->renderCloneCommand(
|
|
|
|
$repository,
|
2014-01-30 20:41:21 +01:00
|
|
|
$ssh_uri,
|
|
|
|
$repository->getServeOverSSH(),
|
2013-11-02 01:35:43 +01:00
|
|
|
'/settings/panel/ssh/');
|
|
|
|
|
2014-01-30 20:42:10 +01:00
|
|
|
$view->addProperty(
|
|
|
|
$repository->isSVN()
|
|
|
|
? pht('Checkout (SSH)')
|
|
|
|
: pht('Clone (SSH)'),
|
|
|
|
$clone_uri);
|
2013-11-02 01:35:43 +01:00
|
|
|
}
|
|
|
|
|
2014-01-30 20:41:21 +01:00
|
|
|
$http_uri = $repository->getHTTPCloneURIObject();
|
|
|
|
if ($http_uri) {
|
2014-01-30 20:42:10 +01:00
|
|
|
$clone_uri = $this->renderCloneCommand(
|
|
|
|
$repository,
|
2013-11-02 01:35:43 +01:00
|
|
|
$http_uri,
|
2014-01-30 20:41:21 +01:00
|
|
|
$repository->getServeOverHTTP(),
|
2013-11-02 01:35:43 +01:00
|
|
|
PhabricatorEnv::getEnvConfig('diffusion.allow-http-auth')
|
|
|
|
? '/settings/panel/vcspassword/'
|
|
|
|
: null);
|
|
|
|
|
2014-01-30 20:42:10 +01:00
|
|
|
$view->addProperty(
|
|
|
|
$repository->isSVN()
|
|
|
|
? pht('Checkout (HTTP)')
|
|
|
|
: pht('Clone (HTTP)'),
|
|
|
|
$clone_uri);
|
2013-11-02 01:35:43 +01:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
switch ($repository->getVersionControlSystem()) {
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
|
|
|
|
$view->addProperty(
|
2014-01-30 20:42:10 +01:00
|
|
|
pht('Clone'),
|
|
|
|
$this->renderCloneCommand(
|
|
|
|
$repository,
|
2014-01-30 20:41:21 +01:00
|
|
|
$repository->getPublicCloneURI()));
|
2013-11-02 01:35:43 +01:00
|
|
|
break;
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
|
|
|
$view->addProperty(
|
2014-01-30 20:42:10 +01:00
|
|
|
pht('Checkout'),
|
|
|
|
$this->renderCloneCommand(
|
|
|
|
$repository,
|
2014-01-30 20:41:21 +01:00
|
|
|
$repository->getPublicCloneURI()));
|
2013-11-02 01:35:43 +01:00
|
|
|
break;
|
|
|
|
}
|
2012-03-08 21:46:19 +01:00
|
|
|
}
|
|
|
|
|
2015-07-08 16:00:17 +02:00
|
|
|
$view->invokeWillRenderEvent();
|
|
|
|
|
2013-05-24 19:48:10 +02:00
|
|
|
$description = $repository->getDetail('description');
|
|
|
|
if (strlen($description)) {
|
2013-05-24 21:38:44 +02:00
|
|
|
$description = PhabricatorMarkupEngine::renderOneObject(
|
|
|
|
$repository,
|
|
|
|
'description',
|
|
|
|
$user);
|
2015-09-19 20:29:01 +02:00
|
|
|
$view->addSectionHeader(
|
|
|
|
pht('Description'), PHUIPropertyListView::ICON_SUMMARY);
|
2013-05-24 19:48:10 +02:00
|
|
|
$view->addTextContent($description);
|
2012-03-08 21:46:19 +01:00
|
|
|
}
|
|
|
|
|
2013-10-11 16:53:56 +02:00
|
|
|
$view->setActionList($actions);
|
|
|
|
|
2015-04-27 12:49:57 +02:00
|
|
|
$box = id(new PHUIObjectBoxView())
|
2013-09-29 00:55:38 +02:00
|
|
|
->setHeader($header)
|
2013-10-11 16:53:56 +02:00
|
|
|
->addPropertyList($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) {
|
2013-10-30 21:06:28 +01:00
|
|
|
$viewer = $this->getRequest()->getUser();
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2013-10-30 21:06:28 +01:00
|
|
|
if ($drequest->getBranch() === null) {
|
|
|
|
return null;
|
|
|
|
}
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2013-10-30 21:06:28 +01:00
|
|
|
$limit = 15;
|
2012-05-10 09:28:19 +02:00
|
|
|
|
2014-01-18 01:10:56 +01:00
|
|
|
$branches = $this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.branchquery',
|
|
|
|
array(
|
2015-04-27 12:51:21 +02:00
|
|
|
'closed' => false,
|
2014-01-18 01:10:56 +01:00
|
|
|
'limit' => $limit + 1,
|
|
|
|
));
|
2013-10-30 21:06:28 +01:00
|
|
|
if (!$branches) {
|
|
|
|
return null;
|
|
|
|
}
|
2012-05-10 09:28:19 +02:00
|
|
|
|
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
|
|
|
|
2014-01-07 20:57:37 +01:00
|
|
|
$panel = new PHUIObjectBoxView();
|
|
|
|
$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) {
|
2014-01-07 20:57:37 +01:00
|
|
|
$header->setSubHeader(pht('Showing %d branches.', $limit));
|
2012-05-10 09:28:19 +02:00
|
|
|
}
|
|
|
|
|
2014-01-07 20:57:37 +01:00
|
|
|
$button = new PHUIButtonView();
|
2014-06-09 20:36:49 +02:00
|
|
|
$button->setText(pht('Show All Branches'));
|
2014-01-07 20:57:37 +01:00
|
|
|
$button->setTag('a');
|
2016-01-28 05:38:01 +01:00
|
|
|
$button->setIcon('fa-code-fork');
|
2014-01-07 20:57:37 +01:00
|
|
|
$button->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) {
|
2013-10-30 21:06:43 +01:00
|
|
|
$viewer = $this->getRequest()->getUser();
|
2015-02-17 23:01:17 +01:00
|
|
|
$repository = $drequest->getRepository();
|
2013-10-30 21:06:43 +01:00
|
|
|
|
2015-02-17 23:01:17 +01:00
|
|
|
switch ($repository->getVersionControlSystem()) {
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
|
|
|
// no tags in SVN
|
|
|
|
return null;
|
|
|
|
}
|
2012-05-10 09:28:19 +02:00
|
|
|
$tag_limit = 15;
|
2013-05-11 00:22:35 +02:00
|
|
|
$tags = array();
|
2015-02-17 23:01:17 +01:00
|
|
|
$tags = DiffusionRepositoryTag::newFromConduit(
|
|
|
|
$this->callConduitWithDiffusionRequest(
|
|
|
|
'diffusion.tagsquery',
|
|
|
|
array(
|
|
|
|
// On the home page, we want to find tags on any branch.
|
|
|
|
'commit' => null,
|
|
|
|
'limit' => $tag_limit + 1,
|
|
|
|
)));
|
2012-04-18 17:02:08 +02:00
|
|
|
|
|
|
|
if (!$tags) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
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();
|
|
|
|
|
2013-10-30 21:06:43 +01:00
|
|
|
$view = id(new DiffusionTagListView())
|
|
|
|
->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) {
|
2014-01-20 22:12:30 +01:00
|
|
|
$header->setSubHeader(
|
|
|
|
pht('Showing the %d most recent tags.', $tag_limit));
|
2012-04-19 18:39:19 +02:00
|
|
|
}
|
|
|
|
|
2014-01-20 22:12:30 +01:00
|
|
|
$button = new PHUIButtonView();
|
2014-06-09 20:36:49 +02:00
|
|
|
$button->setText(pht('Show All Tags'));
|
2014-01-20 22:12:30 +01:00
|
|
|
$button->setTag('a');
|
2016-01-28 05:38:01 +01:00
|
|
|
$button->setIcon('fa-tag');
|
2014-01-20 22:12:30 +01:00
|
|
|
$button->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);
|
2012-04-18 17:02:08 +02:00
|
|
|
|
|
|
|
return $panel;
|
|
|
|
}
|
|
|
|
|
2013-09-19 20:57:09 +02:00
|
|
|
private function buildActionList(PhabricatorRepository $repository) {
|
|
|
|
$viewer = $this->getRequest()->getUser();
|
|
|
|
|
2016-01-02 21:21:13 +01:00
|
|
|
$edit_uri = $repository->getPathURI('edit/');
|
2013-09-19 20:57:09 +02:00
|
|
|
|
|
|
|
$view = id(new PhabricatorActionListView())
|
|
|
|
->setUser($viewer)
|
Remove all setObjectURI() from ActionListViews
Summary:
Ref T10004. After D14804, we get this behavior by default and no longer need to set it explicitly.
(If some endpoint did eventually need to set it explicitly, it could just change what it passes to `setHref()`, but I believe we currently have no such endpoints and do not foresee ever having any.)
Test Plan:
- As a logged out user, clicked various links in Differential, Maniphest, Files, etc., always got redirected to a sensible place after login.
- Grepped for `setObjectURI()`, `getObjectURI()` (there are a few remaining callsites, but to a different method with the same name in Doorkeeper).
Reviewers: chad
Reviewed By: chad
Subscribers: hach-que
Maniphest Tasks: T10004
Differential Revision: https://secure.phabricator.com/D14805
2015-12-17 15:31:33 +01:00
|
|
|
->setObject($repository);
|
2013-09-19 20:57:09 +02:00
|
|
|
|
|
|
|
$can_edit = PhabricatorPolicyFilter::hasCapability(
|
|
|
|
$viewer,
|
|
|
|
$repository,
|
|
|
|
PhabricatorPolicyCapability::CAN_EDIT);
|
|
|
|
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName(pht('Edit Repository'))
|
2014-05-12 19:08:32 +02:00
|
|
|
->setIcon('fa-pencil')
|
2013-09-19 20:57:09 +02:00
|
|
|
->setHref($edit_uri)
|
|
|
|
->setWorkflow(!$can_edit)
|
|
|
|
->setDisabled(!$can_edit));
|
|
|
|
|
2013-12-05 20:59:33 +01:00
|
|
|
if ($repository->isHosted()) {
|
|
|
|
$push_uri = $this->getApplicationURI(
|
2016-01-02 20:28:31 +01:00
|
|
|
'pushlog/?repositories='.$repository->getMonogram());
|
2013-12-05 20:59:33 +01:00
|
|
|
|
|
|
|
$view->addAction(
|
|
|
|
id(new PhabricatorActionView())
|
|
|
|
->setName(pht('View Push Logs'))
|
2014-05-12 19:08:32 +02:00
|
|
|
->setIcon('fa-list-alt')
|
2013-12-05 20:59:33 +01:00
|
|
|
->setHref($push_uri));
|
|
|
|
}
|
|
|
|
|
2013-09-19 20:57:09 +02:00
|
|
|
return $view;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
|
|
|
$icon = id(new PHUIIconView())
|
2016-01-28 05:38:01 +01:00
|
|
|
->setIcon('fa-list-alt');
|
2014-01-09 17:51:57 +01:00
|
|
|
|
|
|
|
$button = id(new PHUIButtonView())
|
|
|
|
->setText(pht('View Full History'))
|
|
|
|
->setHref($drequest->generateURI(
|
|
|
|
array(
|
|
|
|
'action' => 'history',
|
|
|
|
)))
|
|
|
|
->setTag('a')
|
|
|
|
->setIcon($icon);
|
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-01-07 20:57:37 +01:00
|
|
|
$panel = new PHUIObjectBoxView();
|
2014-01-09 17:51:57 +01:00
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('Recent Commits'))
|
|
|
|
->addActionLink($button);
|
|
|
|
$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;
|
|
|
|
}
|
|
|
|
|
|
|
|
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'));
|
|
|
|
|
2014-01-07 20:57:37 +01:00
|
|
|
$browse_panel = new PHUIObjectBoxView();
|
2014-01-09 17:51:57 +01:00
|
|
|
$header = id(new PHUIHeaderView())
|
|
|
|
->setHeader(pht('Repository'));
|
|
|
|
|
|
|
|
$icon = id(new PHUIIconView())
|
2016-01-28 05:38:01 +01:00
|
|
|
->setIcon('fa-folder-open');
|
2014-01-09 17:51:57 +01:00
|
|
|
|
|
|
|
$button = new PHUIButtonView();
|
|
|
|
$button->setText(pht('Browse Repository'));
|
|
|
|
$button->setTag('a');
|
|
|
|
$button->setIcon($icon);
|
|
|
|
$button->setHref($browse_uri);
|
|
|
|
|
|
|
|
$header->addActionLink($button);
|
|
|
|
$browse_panel->setHeader($header);
|
2014-05-13 23:08:21 +02:00
|
|
|
|
2015-07-03 19:19:43 +02:00
|
|
|
$locate_panel = null;
|
2014-05-13 23:08:21 +02:00
|
|
|
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')));
|
2014-06-13 20:36:01 +02:00
|
|
|
$form_box = id(new PHUIBoxView())
|
|
|
|
->appendChild($form->buildLayoutView());
|
2015-05-22 17:22:25 +02:00
|
|
|
$locate_panel = id(new PHUIObjectBoxView())
|
|
|
|
->setHeaderText('Locate File')
|
|
|
|
->appendChild($form_box);
|
2014-05-13 23:08:21 +02:00
|
|
|
}
|
|
|
|
|
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()) {
|
|
|
|
$pager_box = $this->renderTablePagerBox($pager);
|
|
|
|
} else {
|
|
|
|
$pager_box = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return array(
|
|
|
|
$locate_panel,
|
|
|
|
$browse_panel,
|
|
|
|
$pager_box,
|
|
|
|
);
|
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-01-30 20:42:10 +01:00
|
|
|
private function renderCloneCommand(
|
|
|
|
PhabricatorRepository $repository,
|
2013-11-02 01:35:43 +01:00
|
|
|
$uri,
|
|
|
|
$serve_mode = null,
|
|
|
|
$manage_uri = null) {
|
|
|
|
|
|
|
|
require_celerity_resource('diffusion-icons-css');
|
|
|
|
|
|
|
|
Javelin::initBehavior('select-on-click');
|
|
|
|
|
2014-01-30 20:42:10 +01:00
|
|
|
switch ($repository->getVersionControlSystem()) {
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
|
|
|
|
$command = csprintf(
|
2014-01-30 20:42:33 +01:00
|
|
|
'git clone %R',
|
2014-01-30 20:42:25 +01:00
|
|
|
$uri);
|
2014-01-30 20:42:10 +01:00
|
|
|
break;
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
|
|
|
|
$command = csprintf(
|
2014-01-30 20:42:33 +01:00
|
|
|
'hg clone %R',
|
2014-01-30 20:42:25 +01:00
|
|
|
$uri);
|
2014-01-30 20:42:10 +01:00
|
|
|
break;
|
|
|
|
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
|
2014-02-28 22:04:41 +01:00
|
|
|
if ($repository->isHosted()) {
|
|
|
|
$command = csprintf(
|
|
|
|
'svn checkout %R %R',
|
|
|
|
$uri,
|
|
|
|
$repository->getCloneName());
|
|
|
|
} else {
|
|
|
|
$command = csprintf(
|
|
|
|
'svn checkout %R',
|
|
|
|
$uri);
|
|
|
|
}
|
2014-01-30 20:42:10 +01:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-11-02 01:35:43 +01:00
|
|
|
$input = javelin_tag(
|
|
|
|
'input',
|
|
|
|
array(
|
|
|
|
'type' => 'text',
|
2014-01-30 20:42:10 +01:00
|
|
|
'value' => (string)$command,
|
2013-11-02 01:35:43 +01:00
|
|
|
'class' => 'diffusion-clone-uri',
|
|
|
|
'sigil' => 'select-on-click',
|
2013-12-20 20:47:25 +01:00
|
|
|
'readonly' => 'true',
|
2013-11-02 01:35:43 +01:00
|
|
|
));
|
|
|
|
|
|
|
|
$extras = array();
|
|
|
|
if ($serve_mode) {
|
|
|
|
if ($serve_mode === PhabricatorRepository::SERVE_READONLY) {
|
|
|
|
$extras[] = pht('(Read Only)');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($manage_uri) {
|
|
|
|
if ($this->getRequest()->getUser()->isLoggedIn()) {
|
|
|
|
$extras[] = phutil_tag(
|
|
|
|
'a',
|
|
|
|
array(
|
|
|
|
'href' => $manage_uri,
|
|
|
|
),
|
|
|
|
pht('Manage Credentials'));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($extras) {
|
|
|
|
$extras = phutil_implode_html(' ', $extras);
|
|
|
|
$extras = phutil_tag(
|
|
|
|
'div',
|
|
|
|
array(
|
|
|
|
'class' => 'diffusion-clone-extras',
|
|
|
|
),
|
|
|
|
$extras);
|
|
|
|
}
|
|
|
|
|
|
|
|
return array($input, $extras);
|
|
|
|
}
|
|
|
|
|
2011-03-13 01:17:34 +01:00
|
|
|
}
|