diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index b253ac0d31..7590abb228 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -623,6 +623,7 @@ phutil_register_library_map(array( 'PhabricatorRepositoryEditController' => 'applications/repository/controller/edit', 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/git', 'PhabricatorRepositoryGitCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/git', + 'PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase' => 'applications/repository/daemon/commitdiscovery/git/__tests__', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/git', 'PhabricatorRepositoryGitFetchDaemon' => 'applications/repository/daemon/gitfetch', 'PhabricatorRepositoryGitHubNotification' => 'applications/repository/storage/githubnotification', @@ -638,6 +639,7 @@ phutil_register_library_map(array( 'PhabricatorRepositorySvnCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/svn', 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/svn', 'PhabricatorRepositorySymbol' => 'applications/repository/storage/symbol', + 'PhabricatorRepositoryTestCase' => 'applications/repository/storage/repository/__tests__', 'PhabricatorRepositoryType' => 'applications/repository/constants/repositorytype', 'PhabricatorS3FileStorageEngine' => 'applications/files/engine/s3', 'PhabricatorSQLPatchList' => 'infrastructure/setup/sql', @@ -1267,6 +1269,7 @@ phutil_register_library_map(array( 'PhabricatorRepositoryEditController' => 'PhabricatorRepositoryController', 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositoryGitCommitDiscoveryDaemon' => 'PhabricatorRepositoryCommitDiscoveryDaemon', + 'PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase' => 'PhabricatorTestCase', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 'PhabricatorRepositoryGitFetchDaemon' => 'PhabricatorRepositoryPullLocalDaemon', 'PhabricatorRepositoryGitHubNotification' => 'PhabricatorRepositoryDAO', @@ -1282,6 +1285,7 @@ phutil_register_library_map(array( 'PhabricatorRepositorySvnCommitDiscoveryDaemon' => 'PhabricatorRepositoryCommitDiscoveryDaemon', 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO', + 'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase', 'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine', 'PhabricatorSearchAttachController' => 'PhabricatorSearchController', 'PhabricatorSearchBaseController' => 'PhabricatorController', diff --git a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php index 72e487086c..3fffe8d4e3 100644 --- a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php +++ b/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php @@ -39,14 +39,10 @@ class PhabricatorRepositoryGitCommitDiscoveryDaemon "Expected 'Fetch URL' in 'git remote show -n origin'."); } - $remote = $matches[1]; - $expect = $repository->getRemoteURI(); - if ($remote != $expect) { - $local_path = $repository->getLocalPath(); - throw new Exception( - "Working copy '{$local_path}' has origin URL '{$remote}', but the ". - "configured URL '{$expect}' is expected. Refusing to proceed."); - } + self::verifySameGitOrigin( + $matches[1], + $repository->getRemoteURI(), + $repository->getLocalPath()); list($stdout) = $repository->execxLocalCommand( 'branch -r --verbose --no-abbrev'); @@ -118,4 +114,21 @@ class PhabricatorRepositoryGitCommitDiscoveryDaemon } } + public static function verifySameGitOrigin($remote, $expect, $where) { + $remote_uri = PhabricatorRepository::newPhutilURIFromGitURI($remote); + $expect_uri = PhabricatorRepository::newPhutilURIFromGitURI($expect); + + $remote_path = $remote_uri->getPath(); + $expect_path = $expect_uri->getPath(); + + if ($remote_path != $expect_path) { + throw new Exception( + "Working copy at '{$where}' has a mismatched origin URL. It has ". + "origin URL '{$remote}' (with remote path '{$remote_path}'), but the ". + "configured URL '{$expect}' (with remote path '{$expect_path}') is ". + "expected. Refusing to proceed because this may indicate that the ". + "working copy is actually some other repository."); + } + } + } diff --git a/src/applications/repository/daemon/commitdiscovery/git/__init__.php b/src/applications/repository/daemon/commitdiscovery/git/__init__.php index 685253a440..5900f05893 100644 --- a/src/applications/repository/daemon/commitdiscovery/git/__init__.php +++ b/src/applications/repository/daemon/commitdiscovery/git/__init__.php @@ -9,6 +9,7 @@ phutil_require_module('phabricator', 'applications/diffusion/query/branch/git'); phutil_require_module('phabricator', 'applications/repository/constants/repositorytype'); phutil_require_module('phabricator', 'applications/repository/daemon/commitdiscovery/base'); +phutil_require_module('phabricator', 'applications/repository/storage/repository'); phutil_require_source('PhabricatorRepositoryGitCommitDiscoveryDaemon.php'); diff --git a/src/applications/repository/daemon/commitdiscovery/git/__tests__/PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase.php b/src/applications/repository/daemon/commitdiscovery/git/__tests__/PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase.php new file mode 100644 index 0000000000..0c31c4462e --- /dev/null +++ b/src/applications/repository/daemon/commitdiscovery/git/__tests__/PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase.php @@ -0,0 +1,89 @@ +assertEqual( + $expect, + !$ex, + "Verification that '{$remote}' and '{$config}' are the same origin ". + "had a different outcome than expected: {$message}"); + } + } + +} diff --git a/src/applications/repository/daemon/commitdiscovery/git/__tests__/__init__.php b/src/applications/repository/daemon/commitdiscovery/git/__tests__/__init__.php new file mode 100644 index 0000000000..d72145acfd --- /dev/null +++ b/src/applications/repository/daemon/commitdiscovery/git/__tests__/__init__.php @@ -0,0 +1,13 @@ +getProtocol()) { + list($domain, $path) = explode(':', $raw_uri, 2); + $uri = new PhutilURI('ssh://'.$domain.'/'.$path); + } + + return $uri; + } + public function getRemoteURI() { $raw_uri = $this->getDetail('remote-uri'); $vcs = $this->getVersionControlSystem(); $is_git = ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_GIT); - // If there's no protocol (git implicit SSH) reformat the URI to be a - // normal URI. These git URIs look like "user@domain.com:path" instead of - // "ssh://user@domain/path". - $uri = new PhutilURI($raw_uri); - if ($is_git && !$uri->getProtocol()) { - list($domain, $path) = explode(':', $raw_uri, 2); - $uri = new PhutilURI('ssh://'.$domain.'/'.$path); + if ($is_git) { + $uri = self::newPhutilURIFromGitURI($raw_uri); + } else { + $uri = new PhutilURI($raw_uri); } if ($this->isSSHProtocol($uri->getProtocol())) { diff --git a/src/applications/repository/storage/repository/__tests__/PhabricatorRepositoryTestCase.php b/src/applications/repository/storage/repository/__tests__/PhabricatorRepositoryTestCase.php new file mode 100644 index 0000000000..0bc70a892c --- /dev/null +++ b/src/applications/repository/storage/repository/__tests__/PhabricatorRepositoryTestCase.php @@ -0,0 +1,37 @@ + 'ssh://user@domain.com/path.git', + 'user@domain.com:path.git' => 'ssh://user@domain.com/path.git', + ); + + foreach ($map as $raw => $expect) { + $uri = PhabricatorRepository::newPhutilURIFromGitURI($raw); + $this->assertEqual( + $expect, + (string)$uri, + "Normalized Git URI '{$raw}'"); + } + } + +} diff --git a/src/applications/repository/storage/repository/__tests__/__init__.php b/src/applications/repository/storage/repository/__tests__/__init__.php new file mode 100644 index 0000000000..8676e844d1 --- /dev/null +++ b/src/applications/repository/storage/repository/__tests__/__init__.php @@ -0,0 +1,13 @@ +