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 @@ -101,7 +101,7 @@ ')(?P[a-f0-9]+)' => 'DiffusionCommitController', - '/source/(?P[^/.]+)(?P\.git)?' + '/source/(?P[^/]+)' => $repository_routes, '/diffusion/' => array( diff --git a/src/applications/diffusion/controller/DiffusionController.php b/src/applications/diffusion/controller/DiffusionController.php --- a/src/applications/diffusion/controller/DiffusionController.php +++ b/src/applications/diffusion/controller/DiffusionController.php @@ -92,6 +92,8 @@ $short_name = $request->getURIData('repositoryShortName'); if (strlen($short_name)) { + // If the short name ends in ".git", ignore it. + $short_name = preg_replace('/\\.git\z/', '', $short_name); return $short_name; } diff --git a/src/applications/diffusion/controller/DiffusionServeController.php b/src/applications/diffusion/controller/DiffusionServeController.php --- a/src/applications/diffusion/controller/DiffusionServeController.php +++ b/src/applications/diffusion/controller/DiffusionServeController.php @@ -88,13 +88,6 @@ } } - // If the request was for a path like "/source/libphutil.git" but the - // repository is not a Git repository, reject the request. - $type_git = PhabricatorRepositoryType::REPOSITORY_TYPE_GIT; - if ($request->getURIData('dotgit') && ($vcs !== $type_git)) { - return null; - } - return $vcs; } 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 @@ -442,6 +442,15 @@ 'short names may not contain only numbers.', $slug)); } + + if (preg_match('/\\.git/', $slug)) { + throw new Exception( + pht( + 'The name "%s" is not a valid repository short name. Repository '. + 'short names must not end in ".git". This suffix will be added '. + 'automatically in appropriate contexts.', + $slug)); + } } public static function assertValidCallsign($callsign) { @@ -592,21 +601,12 @@ } public static function parseRepositoryServicePath($request_path, $vcs) { - - // NOTE: In Mercurial over SSH, the path will begin without a leading "/", - // so we're matching it optionally. - - if ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_GIT) { - $maybe_git = '(?:\\.git)?'; - } else { - $maybe_git = null; - } + $is_git = ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_GIT); $patterns = array( '(^'. - '(?P/?(?:diffusion|source)/(?P[^/.]+))'. - $maybe_git. - '(?P(?:/|.*)?)'. + '(?P/?(?:diffusion|source)/(?P[^/]+))'. + '(?P.*)'. '\z)', ); @@ -618,6 +618,10 @@ } $identifier = $matches['identifier']; + if ($is_git) { + $identifier = preg_replace('/\\.git\z/', '', $identifier); + } + $base = $matches['base']; $path = $matches['path']; break; diff --git a/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php b/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php --- a/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php +++ b/src/applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php @@ -190,6 +190,9 @@ '-ated', '_underscores_', 'yes!', + 'quack.git', + 'git.git', + '.git.git.git', // 65-character names are no good. str_repeat('a', 65),