diff --git a/src/applications/diffusion/ssh/DiffusionSSHWorkflow.php b/src/applications/diffusion/ssh/DiffusionSSHWorkflow.php --- a/src/applications/diffusion/ssh/DiffusionSSHWorkflow.php +++ b/src/applications/diffusion/ssh/DiffusionSSHWorkflow.php @@ -222,8 +222,10 @@ pht('No repository "%s" exists!', $identifier)); } + $is_cluster = $this->getIsClusterRequest(); + $protocol = PhabricatorRepositoryURI::BUILTIN_PROTOCOL_SSH; - if (!$repository->canServeProtocol($protocol, false)) { + if (!$repository->canServeProtocol($protocol, false, $is_cluster)) { throw new Exception( pht( 'This repository ("%s") is not available over SSH.', 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 @@ -1506,9 +1506,18 @@ return $this->setDetail('hosting-enabled', $enabled); } - public function canServeProtocol($protocol, $write) { - if (!$this->isTracked()) { - return false; + public function canServeProtocol( + $protocol, + $write, + $is_intracluster = false) { + + // See T13192. If a repository is inactive, don't serve it to users. We + // still synchronize it within the cluster and serve it to other repository + // nodes. + if (!$is_intracluster) { + if (!$this->isTracked()) { + return false; + } } $clone_uris = $this->getCloneURIs();