diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php index 95841e54bf..34937bde11 100644 --- a/src/applications/diffusion/controller/DiffusionRepositoryController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php @@ -560,10 +560,16 @@ final class DiffusionRepositoryController extends DiffusionController { $uri); break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: - $command = csprintf( - 'svn checkout %R %R', - $uri, - $repository->getCloneName()); + if ($repository->isHosted()) { + $command = csprintf( + 'svn checkout %R %R', + $uri, + $repository->getCloneName()); + } else { + $command = csprintf( + 'svn checkout %R', + $uri); + } break; } diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditBasicController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditBasicController.php index 039edcb9a8..401f5ddcbf 100644 --- a/src/applications/diffusion/controller/DiffusionRepositoryEditBasicController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryEditBasicController.php @@ -36,7 +36,10 @@ final class DiffusionRepositoryEditBasicController $v_name = $request->getStr('name'); $v_desc = $request->getStr('description'); $v_projects = $request->getArr('projectPHIDs'); - $v_clone_name = $request->getStr('cloneName'); + + if ($repository->isHosted()) { + $v_clone_name = $request->getStr('cloneName'); + } if (!strlen($v_name)) { $e_name = pht('Required'); @@ -99,16 +102,22 @@ final class DiffusionRepositoryEditBasicController ->setName('name') ->setLabel(pht('Name')) ->setValue($v_name) - ->setError($e_name)) - ->appendChild( - id(new AphrontFormTextControl()) - ->setName('cloneName') - ->setLabel(pht('Clone/Checkout As')) - ->setValue($v_clone_name) - ->setCaption( - pht( - 'Optional directory name to use when cloning or checking out '. - 'this repository.'))) + ->setError($e_name)); + + if ($repository->isHosted()) { + $form + ->appendChild( + id(new AphrontFormTextControl()) + ->setName('cloneName') + ->setLabel(pht('Clone/Checkout As')) + ->setValue($v_clone_name) + ->setCaption( + pht( + 'Optional directory name to use when cloning or checking out '. + 'this repository.'))); + } + + $form ->appendChild( id(new PhabricatorRemarkupControl()) ->setName('description') diff --git a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php index 4ca2b301ca..b62451d4c3 100644 --- a/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryEditMainController.php @@ -256,11 +256,13 @@ final class DiffusionRepositoryEditMainController $clone_name = $repository->getDetail('clone-name'); - $view->addProperty( - pht('Clone/Checkout As'), - $clone_name - ? $clone_name.'/' - : phutil_tag('em', array(), $repository->getCloneName().'/')); + if ($repository->isHosted()) { + $view->addProperty( + pht('Clone/Checkout As'), + $clone_name + ? $clone_name.'/' + : phutil_tag('em', array(), $repository->getCloneName().'/')); + } $project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( $repository->getPHID(), diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php index 8661f56f60..19b1e1999c 100644 --- a/src/applications/repository/storage/PhabricatorRepository.php +++ b/src/applications/repository/storage/PhabricatorRepository.php @@ -789,7 +789,28 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO */ public function getCloneURIObject() { if (!$this->isHosted()) { - return $this->getRemoteURIObject(); + if ($this->isSVN()) { + // Make sure we pick up the "Import Only" path for Subversion, so + // the user clones the repository starting at the correct path, not + // from the root. + $base_uri = $this->getSubversionBaseURI(); + $base_uri = new PhutilURI($base_uri); + $path = $base_uri->getPath(); + if (!$path) { + $path = '/'; + } + + // If the trailing "@" is not required to escape the URI, strip it for + // readability. + if (!preg_match('/@.*@/', $path)) { + $path = rtrim($path, '@'); + } + + $base_uri->setPath($path); + return $base_uri; + } else { + return $this->getRemoteURIObject(); + } } // Choose the best URI: pick a read/write URI over a URI which is not diff --git a/src/applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php b/src/applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php index 5c5d0f87c5..4d0384fe93 100644 --- a/src/applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php +++ b/src/applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php @@ -90,6 +90,19 @@ final class PhabricatorRepositoryURITestCase $this->assertEqual('git@example.com:path.git', $repo->getRemoteURIEnvelope()->openEnvelope()); + // Test SVN "Import Only" paths. + + $repo->setDetail('remote-uri', 'http://example.com/'); + $repo->setVersionControlSystem($svn); + $repo->setDetail('svn-subpath', 'projects/example/'); + + $this->assertEqual('http://example.com/', $repo->getRemoteURI()); + $this->assertEqual( + 'http://example.com/projects/example/', + $repo->getPublicCloneURI()); + $this->assertEqual('http://example.com/', + $repo->getRemoteURIEnvelope()->openEnvelope()); + } }