1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-26 08:42:41 +01:00

Add a branch selector to Diffusion

Summary: Fixes T12931. Adds a branch selector that's always visible if the repo has commits.

Test Plan:
Test a plain hg, svn, git repository. Test setting a bad default branch. Test a good default branch. Test on desktop, mobile layouts.

{F5058061}

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Maniphest Tasks: T12931

Differential Revision: https://secure.phabricator.com/D18267
This commit is contained in:
Chad Little 2017-07-24 13:27:19 -07:00
parent 0d8f4170f4
commit 69a7d57c3f
4 changed files with 147 additions and 16 deletions

View file

@ -9,7 +9,7 @@ return array(
'names' => array( 'names' => array(
'conpherence.pkg.css' => 'e68cf1fa', 'conpherence.pkg.css' => 'e68cf1fa',
'conpherence.pkg.js' => 'b5b51108', 'conpherence.pkg.js' => 'b5b51108',
'core.pkg.css' => 'f1c7630f', 'core.pkg.css' => 'c0a7ecfd',
'core.pkg.js' => '5d80e0db', 'core.pkg.js' => '5d80e0db',
'darkconsole.pkg.js' => '1f9a31bc', 'darkconsole.pkg.js' => '1f9a31bc',
'differential.pkg.css' => '45951e9e', 'differential.pkg.css' => '45951e9e',
@ -75,7 +75,7 @@ return array(
'rsrc/css/application/diffusion/diffusion-readme.css' => '419dd5b6', 'rsrc/css/application/diffusion/diffusion-readme.css' => '419dd5b6',
'rsrc/css/application/diffusion/diffusion-repository.css' => 'ee6f20ec', 'rsrc/css/application/diffusion/diffusion-repository.css' => 'ee6f20ec',
'rsrc/css/application/diffusion/diffusion-source.css' => '750add59', 'rsrc/css/application/diffusion/diffusion-source.css' => '750add59',
'rsrc/css/application/diffusion/diffusion.css' => '8d01932f', 'rsrc/css/application/diffusion/diffusion.css' => '67bd971b',
'rsrc/css/application/feed/feed.css' => 'ecd4ec57', 'rsrc/css/application/feed/feed.css' => 'ecd4ec57',
'rsrc/css/application/files/global-drag-and-drop.css' => 'b556a948', 'rsrc/css/application/files/global-drag-and-drop.css' => 'b556a948',
'rsrc/css/application/flag/flag.css' => 'bba8f811', 'rsrc/css/application/flag/flag.css' => 'bba8f811',
@ -127,7 +127,7 @@ return array(
'rsrc/css/layout/phabricator-source-code-view.css' => 'aea41829', 'rsrc/css/layout/phabricator-source-code-view.css' => 'aea41829',
'rsrc/css/phui/button/phui-button-bar.css' => 'f1ff5494', 'rsrc/css/phui/button/phui-button-bar.css' => 'f1ff5494',
'rsrc/css/phui/button/phui-button-simple.css' => '8e1baf68', 'rsrc/css/phui/button/phui-button-simple.css' => '8e1baf68',
'rsrc/css/phui/button/phui-button.css' => '022581b4', 'rsrc/css/phui/button/phui-button.css' => '3a744520',
'rsrc/css/phui/calendar/phui-calendar-day.css' => '572b1893', 'rsrc/css/phui/calendar/phui-calendar-day.css' => '572b1893',
'rsrc/css/phui/calendar/phui-calendar-list.css' => '576be600', 'rsrc/css/phui/calendar/phui-calendar-list.css' => '576be600',
'rsrc/css/phui/calendar/phui-calendar-month.css' => '21154caf', 'rsrc/css/phui/calendar/phui-calendar-month.css' => '21154caf',
@ -571,7 +571,7 @@ return array(
'differential-revision-history-css' => '0e8eb855', 'differential-revision-history-css' => '0e8eb855',
'differential-revision-list-css' => 'f3c47d33', 'differential-revision-list-css' => 'f3c47d33',
'differential-table-of-contents-css' => 'ae4b7a55', 'differential-table-of-contents-css' => 'ae4b7a55',
'diffusion-css' => '8d01932f', 'diffusion-css' => '67bd971b',
'diffusion-icons-css' => '0c15255e', 'diffusion-icons-css' => '0c15255e',
'diffusion-readme-css' => '419dd5b6', 'diffusion-readme-css' => '419dd5b6',
'diffusion-repository-css' => 'ee6f20ec', 'diffusion-repository-css' => 'ee6f20ec',
@ -825,7 +825,7 @@ return array(
'phui-big-info-view-css' => 'd13afcde', 'phui-big-info-view-css' => 'd13afcde',
'phui-box-css' => '745e881d', 'phui-box-css' => '745e881d',
'phui-button-bar-css' => 'f1ff5494', 'phui-button-bar-css' => 'f1ff5494',
'phui-button-css' => '022581b4', 'phui-button-css' => '3a744520',
'phui-button-simple-css' => '8e1baf68', 'phui-button-simple-css' => '8e1baf68',
'phui-calendar-css' => 'f1ddf11c', 'phui-calendar-css' => 'f1ddf11c',
'phui-calendar-day-css' => '572b1893', 'phui-calendar-day-css' => '572b1893',

View file

@ -4,7 +4,7 @@ final class DiffusionRepositoryController extends DiffusionController {
private $historyFuture; private $historyFuture;
private $browseFuture; private $browseFuture;
private $tagFuture; private $branchButton = null;
private $branchFuture; private $branchFuture;
public function shouldAllowPublic() { public function shouldAllowPublic() {
@ -53,15 +53,25 @@ final class DiffusionRepositoryController extends DiffusionController {
// This is a valid branch, so we necessarily have some content. // This is a valid branch, so we necessarily have some content.
$page_has_content = true; $page_has_content = true;
} else { } else {
$default = $repository->getDefaultBranch();
if ($default != $drequest->getBranch()) {
$empty_title = pht('No Such Branch'); $empty_title = pht('No Such Branch');
$empty_message = pht( $empty_message = pht(
'There is no branch named "%s" in this repository.', 'There is no branch named "%s" in this repository.',
$drequest->getBranch()); $drequest->getBranch());
} else {
$empty_title = pht('No Default Branch');
$empty_message = pht(
'This repository is configured with default branch "%s" but '.
'there is no branch with that name in this repository.',
$default);
}
} }
} }
// If we didn't find any branches, check if there are any commits at all. // If we didn't find any branches, check if there are any commits at all.
// This can tailor the message for empty repositories. // This can tailor the message for empty repositories.
$any_commit = null;
if (!$page_has_content) { if (!$page_has_content) {
$any_commit = id(new DiffusionCommitQuery()) $any_commit = id(new DiffusionCommitQuery())
->setViewer($viewer) ->setViewer($viewer)
@ -81,6 +91,9 @@ final class DiffusionRepositoryController extends DiffusionController {
if ($page_has_content) { if ($page_has_content) {
$content = $this->buildNormalContent($drequest); $content = $this->buildNormalContent($drequest);
} else { } else {
// If we have a commit somewhere, find branches.
// TODO: Evan will replace
// $this->buildNormalContent($drequest);
$content = id(new PHUIInfoView()) $content = id(new PHUIInfoView())
->setTitle($empty_title) ->setTitle($empty_title)
->setSeverity(PHUIInfoView::SEVERITY_WARNING) ->setSeverity(PHUIInfoView::SEVERITY_WARNING)
@ -110,7 +123,7 @@ final class DiffusionRepositoryController extends DiffusionController {
$bar = id(new PHUILeftRightView()) $bar = id(new PHUILeftRightView())
->setLeft($locate_file) ->setLeft($locate_file)
->setRight($clone_button) ->setRight(array($this->branchButton, $clone_button))
->addClass('diffusion-action-bar'); ->addClass('diffusion-action-bar');
$view = id(new PHUITwoColumnView()) $view = id(new PHUITwoColumnView())
@ -145,6 +158,7 @@ final class DiffusionRepositoryController extends DiffusionController {
$commit = $drequest->getCommit(); $commit = $drequest->getCommit();
$path = $drequest->getPath(); $path = $drequest->getPath();
$futures = array();
$this->historyFuture = $this->callConduitMethod( $this->historyFuture = $this->callConduitMethod(
'diffusion.historyquery', 'diffusion.historyquery',
array( array(
@ -153,6 +167,7 @@ final class DiffusionRepositoryController extends DiffusionController {
'offset' => 0, 'offset' => 0,
'limit' => 15, 'limit' => 15,
)); ));
$futures[] = $this->historyFuture;
$browse_pager = id(new PHUIPagerView()) $browse_pager = id(new PHUIPagerView())
->readFromRequest($request); ->readFromRequest($request);
@ -164,11 +179,19 @@ final class DiffusionRepositoryController extends DiffusionController {
'path' => $path, 'path' => $path,
'limit' => $browse_pager->getPageSize() + 1, 'limit' => $browse_pager->getPageSize() + 1,
)); ));
$futures[] = $this->browseFuture;
if ($this->needBranchFuture()) {
$branch_limit = $this->getBranchLimit();
$this->branchFuture = $this->callConduitMethod(
'diffusion.branchquery',
array(
'closed' => false,
'limit' => $branch_limit + 1,
));
$futures[] = $this->branchFuture;
}
$futures = array(
$this->historyFuture,
$this->browseFuture,
);
$futures = array_filter($futures); $futures = array_filter($futures);
$futures = new FutureIterator($futures); $futures = new FutureIterator($futures);
foreach ($futures as $future) { foreach ($futures as $future) {
@ -253,6 +276,18 @@ final class DiffusionRepositoryController extends DiffusionController {
$content[] = $readme; $content[] = $readme;
} }
try {
$branch_button = $this->buildBranchList($drequest);
$this->branchButton = $branch_button;
} catch (Exception $ex) {
if (!$repository->isImporting()) {
$content[] = $this->renderStatusMessage(
pht('Unable to Load Branches'),
$ex->getMessage());
}
}
return $content; return $content;
} }
@ -375,6 +410,67 @@ final class DiffusionRepositoryController extends DiffusionController {
return $panel; return $panel;
} }
private function buildBranchList(DiffusionRequest $drequest) {
$viewer = $this->getViewer();
if (!$this->needBranchFuture()) {
return null;
}
$branches = $this->branchFuture->resolve();
if (!$branches) {
return null;
}
$limit = $this->getBranchLimit();
$more_branches = (count($branches) > $limit);
$branches = array_slice($branches, 0, $limit);
$branches = DiffusionRepositoryRef::loadAllFromDictionaries($branches);
$actions = id(new PhabricatorActionListView())
->setViewer($viewer);
foreach ($branches as $branch) {
$branch_uri = $drequest->generateURI(
array(
'action' => 'browse',
'branch' => $branch->getShortname(),
));
$actions->addAction(
id(new PhabricatorActionView())
->setName($branch->getShortname())
->setIcon('fa-code-fork')
->setHref($branch_uri));
}
if ($more_branches) {
$more_uri = $drequest->generateURI(
array(
'action' => 'branches',
));
$actions->addAction(
id(new PhabricatorActionView())
->setType(PhabricatorActionView::TYPE_DIVIDER));
$actions->addAction(
id(new PhabricatorActionView())
->setName(pht('See More Branches'))
->setIcon('fa-external-link')
->setHref($more_uri));
}
$button = id(new PHUIButtonView())
->setText(pht('Branch: %s', $drequest->getBranch()))
->setTag('a')
->addClass('mmr')
->setIcon('fa-code-fork')
->setColor(PHUIButtonView::GREY)
->setDropdown(true)
->setDropdownMenu($actions);
return $button;
}
private function buildLocateFile() { private function buildLocateFile() {
$request = $this->getRequest(); $request = $this->getRequest();
$viewer = $request->getUser(); $viewer = $request->getUser();
@ -457,7 +553,17 @@ final class DiffusionRepositoryController extends DiffusionController {
->setPager($pager); ->setPager($pager);
} }
private function getTagLimit() { private function needBranchFuture() {
$drequest = $this->getDiffusionRequest();
if ($drequest->getBranch() === null) {
return false;
}
return true;
}
private function getBranchLimit() {
return 15; return 15;
} }

View file

@ -16,6 +16,23 @@
margin-bottom: 16px; margin-bottom: 16px;
} }
.device-phone .diffusion-action-bar {
display: block;
}
.device-phone .diffusion-action-bar .phui-lr-container {
display: block;
}
.device-phone .diffusion-action-bar .phui-lr-container .phui-left-view {
display: block;
}
.device-phone .diffusion-action-bar .phui-lr-container .phui-right-view {
padding-top: 12px;
display: block;
}
.diffusion-profile-locate .phui-form-view { .diffusion-profile-locate .phui-form-view {
margin: 0; margin: 0;
padding: 0; padding: 0;

View file

@ -265,6 +265,14 @@ a.policy-control .phui-button-text {
right: 10px; right: 10px;
} }
.phui-button-text {
display: inline-block;
}
.dropdown .phui-button-text {
margin-right: 16px;
}
.button.has-icon .phui-button-text { .button.has-icon .phui-button-text {
margin-left: 16px; margin-left: 16px;
} }