diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -619,6 +619,7 @@ 'DiffusionCachedResolveRefsQuery' => 'applications/diffusion/query/DiffusionCachedResolveRefsQuery.php', 'DiffusionChangeController' => 'applications/diffusion/controller/DiffusionChangeController.php', 'DiffusionChangeHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionChangeHeraldFieldGroup.php', + 'DiffusionCloneController' => 'applications/diffusion/controller/DiffusionCloneController.php', 'DiffusionCloneURIView' => 'applications/diffusion/view/DiffusionCloneURIView.php', 'DiffusionCommandEngine' => 'applications/diffusion/protocol/DiffusionCommandEngine.php', 'DiffusionCommandEngineTestCase' => 'applications/diffusion/protocol/__tests__/DiffusionCommandEngineTestCase.php', @@ -5610,6 +5611,7 @@ 'DiffusionCachedResolveRefsQuery' => 'DiffusionLowLevelQuery', 'DiffusionChangeController' => 'DiffusionController', 'DiffusionChangeHeraldFieldGroup' => 'HeraldFieldGroup', + 'DiffusionCloneController' => 'DiffusionController', 'DiffusionCloneURIView' => 'AphrontView', 'DiffusionCommandEngine' => 'Phobject', 'DiffusionCommandEngineTestCase' => 'PhabricatorTestCase', diff --git a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php --- a/src/applications/diffusion/application/PhabricatorDiffusionApplication.php +++ b/src/applications/diffusion/application/PhabricatorDiffusionApplication.php @@ -55,6 +55,7 @@ '' => 'DiffusionRepositoryController', 'repository/(?P.*)' => 'DiffusionRepositoryController', 'change/(?P.*)' => 'DiffusionChangeController', + 'clone/' => 'DiffusionCloneController', 'history/(?P.*)' => 'DiffusionHistoryController', 'graph/(?P.*)' => 'DiffusionGraphController', 'browse/(?P.*)' => 'DiffusionBrowseController', diff --git a/src/applications/diffusion/controller/DiffusionCloneController.php b/src/applications/diffusion/controller/DiffusionCloneController.php new file mode 100644 --- /dev/null +++ b/src/applications/diffusion/controller/DiffusionCloneController.php @@ -0,0 +1,122 @@ +getViewer(); + $response = $this->loadDiffusionContext(); + if ($response) { + return $response; + } + + $drequest = $this->getDiffusionRequest(); + $repository = $drequest->getRepository(); + + $view = id(new PHUIPropertyListView()) + ->setUser($viewer); + + $display_never = PhabricatorRepositoryURI::DISPLAY_NEVER; + $warning = null; + + $uris = $repository->getURIs(); + foreach ($uris as $uri) { + if ($uri->getIsDisabled()) { + continue; + } + + if ($uri->getEffectiveDisplayType() == $display_never) { + continue; + } + + if ($repository->isSVN()) { + $label = phutil_tag_div('diffusion-clone-label', pht('Checkout')); + } else { + $label = phutil_tag_div('diffusion-clone-label', pht('Clone')); + } + + $view->addProperty( + $label, + $this->renderCloneURI($repository, $uri)); + } + + if (!$view->hasAnyProperties()) { + $view = id(new PHUIInfoView()) + ->setSeverity(PHUIInfoView::SEVERITY_NOTICE) + ->appendChild(pht('Repository has no URIs set.')); + } + + $info = null; + + // 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) { + $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); + + $warning = id(new PHUIInfoView()) + ->setSeverity(PHUIInfoView::SEVERITY_WARNING) + ->setErrors(array($message)); + } + + $cancel_uri = $drequest->generateURI( + array( + 'action' => 'branch', + 'path' => '/', + )); + + return $this->newDialog() + ->setTitle(pht('Clone Repository')) + ->setWidth(AphrontDialogView::WIDTH_FORM) + ->addCancelButton($cancel_uri, pht('Close')) + ->appendChild(array($view, $warning)); + } + + private function renderCloneURI( + PhabricatorRepository $repository, + PhabricatorRepositoryURI $uri) { + + if ($repository->isSVN()) { + $display = csprintf( + 'svn checkout %R %R', + (string)$uri->getDisplayURI(), + $repository->getCloneName()); + } else { + $display = csprintf('%R', (string)$uri->getDisplayURI()); + } + + $display = (string)$display; + $viewer = $this->getViewer(); + + return id(new DiffusionCloneURIView()) + ->setViewer($viewer) + ->setRepository($repository) + ->setRepositoryURI($uri) + ->setDisplayURI($display); + } + +} diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php --- a/src/applications/diffusion/controller/DiffusionRepositoryController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php @@ -27,7 +27,6 @@ $crumbs->setBorder(true); $header = $this->buildHeaderView($repository); - $property_table = $this->buildPropertiesTable($repository); $actions = $this->buildActionList($repository); $description = $this->buildDescriptionView($repository); $locate_file = $this->buildLocateFile(); @@ -90,12 +89,28 @@ $tabs = $this->buildTabsView('home'); + $clone_uri = $drequest->generateURI( + array( + 'action' => 'clone', + )); + + $clone_button = id(new PHUIButtonView()) + ->setTag('a') + ->setText('Clone') + ->setColor(PHUIButtonView::GREEN) + ->setIcon('fa-download') + ->setWorkflow(true) + ->setHref($clone_uri); + + $bar = id(new PHUILeftRightView()) + ->setLeft($locate_file) + ->setRight($clone_button); + $view = id(new PHUITwoColumnView()) ->setHeader($header) ->setTabs($tabs) ->setFooter(array( - $locate_file, - $property_table, + $bar, $description, $content, )); @@ -302,87 +317,6 @@ return null; } - private function buildPropertiesTable(PhabricatorRepository $repository) { - $viewer = $this->getViewer(); - - $view = id(new PHUIPropertyListView()) - ->setUser($viewer); - - $display_never = PhabricatorRepositoryURI::DISPLAY_NEVER; - - $uris = $repository->getURIs(); - foreach ($uris as $uri) { - if ($uri->getIsDisabled()) { - continue; - } - - if ($uri->getEffectiveDisplayType() == $display_never) { - continue; - } - - if ($repository->isSVN()) { - $label = phutil_tag_div('diffusion-clone-label', pht('Checkout')); - } else { - $label = phutil_tag_div('diffusion-clone-label', pht('Clone')); - } - - $view->addProperty( - $label, - $this->renderCloneURI($repository, $uri)); - } - - if (!$view->hasAnyProperties()) { - $view = id(new PHUIInfoView()) - ->setSeverity(PHUIInfoView::SEVERITY_NOTICE) - ->appendChild(pht('Repository has no URIs set.')); - } - - $box = id(new PHUIObjectBoxView()) - ->setHeaderText(pht('Details')) - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) - ->appendChild($view); - - $info = null; - $drequest = $this->getDiffusionRequest(); - - // 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) { - $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; - } - private function buildHistoryTable( $history_results, $history, @@ -504,52 +438,13 @@ } $browse_uri = $drequest->generateURI(array('action' => 'browse')); - - $browse_panel = id(new PHUIObjectBoxView()) - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); - $header = id(new PHUIHeaderView()) - ->setHeader($repository->getName()); - - $button = id(new PHUIButtonView()) - ->setText(pht('Browse')) - ->setTag('a') - ->setIcon('fa-code') - ->setHref($browse_uri); - - $header->addActionLink($button); - $browse_panel->setHeader($header); - $browse_panel->setTable($browse_table); - $pager->setURI($browse_uri, 'offset'); - if ($pager->willShowPagingControls()) { - $browse_panel->setPager($pager); - } - - return $browse_panel; - } - - private function renderCloneURI( - PhabricatorRepository $repository, - PhabricatorRepositoryURI $uri) { - - if ($repository->isSVN()) { - $display = csprintf( - 'svn checkout %R %R', - (string)$uri->getDisplayURI(), - $repository->getCloneName()); - } else { - $display = csprintf('%R', (string)$uri->getDisplayURI()); - } - - $display = (string)$display; - $viewer = $this->getViewer(); - - return id(new DiffusionCloneURIView()) - ->setViewer($viewer) - ->setRepository($repository) - ->setRepositoryURI($uri) - ->setDisplayURI($display); + return id(new PHUIObjectBoxView()) + ->setHeaderText($repository->getName()) + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) + ->setTable($browse_table) + ->setPager($pager); } private function getTagLimit() { diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php --- a/src/applications/repository/storage/PhabricatorRepository.php +++ b/src/applications/repository/storage/PhabricatorRepository.php @@ -700,6 +700,7 @@ switch ($action) { case 'history': case 'graph': + case 'clone': case 'browse': case 'change': case 'lastmodified': @@ -818,6 +819,9 @@ // it came from a URI. $uri = rawurldecode("{$path}{$commit}"); break; + case 'clone': + $uri = $this->getPathURI("/{$action}/"); + break; } if ($action == 'rendering-ref') {