diff --git a/dvc/project.py b/dvc/project.py index 2ea02a527..57b586c9f 100644 --- a/dvc/project.py +++ b/dvc/project.py @@ -566,10 +566,20 @@ class Project(object): def checkout( self, target=None, with_deps=False, force=False, recursive=False ): - if target and not recursive: + from dvc.stage import ( + StageFileDoesNotExistError, + StageFileBadNameError, + ) + all_stages = self.active_stages() - stages = self._collect(target, with_deps=with_deps) + try: + stages = self._collect(target, with_deps=with_deps) + except (StageFileDoesNotExistError, StageFileBadNameError) as exc: + raise DvcException( + str(exc) + + " Did you mean 'git checkout {}'?".format(target) + ) else: all_stages = self.active_stages(target) stages = all_stages diff --git a/dvc/stage.py b/dvc/stage.py index 2400b5b19..3a135e95d 100644 --- a/dvc/stage.py +++ b/dvc/stage.py @@ -415,7 +415,7 @@ class Stage(object): if not Stage.is_valid_filename(fname): raise StageFileBadNameError( "bad stage filename '{}'. Stage files should be named" - " 'Dvcfile' or have a '.dvc' suffix(e.g. '{}.dvc').".format( + " 'Dvcfile' or have a '.dvc' suffix (e.g. '{}.dvc').".format( os.path.relpath(fname), os.path.basename(fname) ) ) diff --git a/tests/test_checkout.py b/tests/test_checkout.py index cc2ea77dd..4f82a3bd3 100644 --- a/tests/test_checkout.py +++ b/tests/test_checkout.py @@ -370,3 +370,32 @@ class TestCheckoutHook(TestDvc): with self.assertRaises(ConfirmRemoveError): self.dvc.checkout() + + +class TestCheckoutSuggestGit(TestRepro): + def test(self): + + try: + self.dvc.checkout(target="gitbranch") + except DvcException as exc: + msg = str(exc) + self.assertEqual( + msg, + "'gitbranch' does not exist. Did you mean 'git checkout gitbranch'?", + ) + + try: + self.dvc.checkout(target=self.FOO) + except DvcException as exc: + msg = str(exc) + self.assertEqual( + msg, + ( + "bad stage filename '{}'." + " Stage files should be named 'Dvcfile'" + " or have a '.dvc' suffix (e.g. '{}.dvc')." + " Did you mean 'git checkout {}'?".format( + self.FOO, self.FOO, self.FOO + ) + ), + ) diff --git a/tests/unit/stage.py b/tests/unit/stage.py index 6c95a2aa4..c92f82940 100644 --- a/tests/unit/stage.py +++ b/tests/unit/stage.py @@ -1,6 +1,5 @@ import mock from unittest import TestCase - from dvc.stage import Stage