diff --git a/readthedocs/projects/exceptions.py b/readthedocs/projects/exceptions.py index ba4196320a1..ef30d165f38 100644 --- a/readthedocs/projects/exceptions.py +++ b/readthedocs/projects/exceptions.py @@ -47,6 +47,10 @@ class RepositoryError(BuildEnvironmentError): 'You can not have two versions with the name latest or stable.' ) + FAILED_TO_CHECKOUT = _( + 'Failed to checkout revision: {}' + ) + def get_default_message(self): if settings.ALLOW_PRIVATE_REPOS: return self.PRIVATE_ALLOWED diff --git a/readthedocs/rtd_tests/tests/test_backend.py b/readthedocs/rtd_tests/tests/test_backend.py index ee3471528ca..8d92ab416e4 100644 --- a/readthedocs/rtd_tests/tests/test_backend.py +++ b/readthedocs/rtd_tests/tests/test_backend.py @@ -120,6 +120,17 @@ def test_git_update_and_checkout(self): self.assertEqual(code, 0) self.assertTrue(exists(repo.working_dir)) + def test_git_checkout_invalid_revision(self): + repo = self.project.vcs_repo() + repo.update() + version = 'invalid-revision' + with self.assertRaises(RepositoryError) as e: + repo.checkout(version) + self.assertEqual( + str(e.exception), + RepositoryError.FAILED_TO_CHECKOUT.format(version) + ) + def test_git_tags(self): repo_path = self.project.repo create_git_tag(repo_path, 'v01') @@ -254,6 +265,17 @@ def test_update_and_checkout(self): self.assertEqual(code, 0) self.assertTrue(exists(repo.working_dir)) + def test_checkout_invalid_revision(self): + repo = self.project.vcs_repo() + repo.update() + version = 'invalid-revision' + with self.assertRaises(RepositoryError) as e: + repo.checkout(version) + self.assertEqual( + str(e.exception), + RepositoryError.FAILED_TO_CHECKOUT.format(version) + ) + def test_parse_tags(self): data = """\ tip 13575:8e94a1b4e9a4 diff --git a/readthedocs/vcs_support/backends/bzr.py b/readthedocs/vcs_support/backends/bzr.py index 5ea817c1156..6ddbd3f1224 100644 --- a/readthedocs/vcs_support/backends/bzr.py +++ b/readthedocs/vcs_support/backends/bzr.py @@ -93,4 +93,9 @@ def checkout(self, identifier=None): super(Backend, self).checkout() if not identifier: return self.up() - return self.run('bzr', 'switch', identifier) + exit_code, stdout, stderr = self.run('bzr', 'switch', identifier) + if exit_code != 0: + raise RepositoryError( + RepositoryError.FAILED_TO_CHECKOUT.format(identifier) + ) + return exit_code, stdout, stderr diff --git a/readthedocs/vcs_support/backends/git.py b/readthedocs/vcs_support/backends/git.py index 0176e896afe..885d41e3e7f 100644 --- a/readthedocs/vcs_support/backends/git.py +++ b/readthedocs/vcs_support/backends/git.py @@ -147,7 +147,9 @@ def checkout_revision(self, revision=None): code, out, err = self.run('git', 'checkout', '--force', revision) if code != 0: - log.warning("Failed to checkout revision '%s': %s", revision, code) + raise RepositoryError( + RepositoryError.FAILED_TO_CHECKOUT.format(revision) + ) return [code, out, err] def clone(self): diff --git a/readthedocs/vcs_support/backends/hg.py b/readthedocs/vcs_support/backends/hg.py index 4a66624f1ae..dd02fbe2872 100644 --- a/readthedocs/vcs_support/backends/hg.py +++ b/readthedocs/vcs_support/backends/hg.py @@ -110,4 +110,11 @@ def checkout(self, identifier=None): super(Backend, self).checkout() if not identifier: identifier = 'tip' - return self.run('hg', 'update', '--clean', identifier) + exit_code, stdout, stderr = self.run( + 'hg', 'update', '--clean', identifier + ) + if exit_code != 0: + raise RepositoryError( + RepositoryError.FAILED_TO_CHECKOUT.format(identifier) + ) + return exit_code, stdout, stderr