From 2c67b59fc029e11fbd6eea1d424d6b7529d4c7da Mon Sep 17 00:00:00 2001 From: Thibault de Boissiere Date: Tue, 5 Feb 2019 16:46:13 -0500 Subject: [PATCH] checkout: Suggest git checkout when dcv checkout fails (#1580) --- dvc/project.py | 14 ++++++++++++-- dvc/stage.py | 2 +- tests/test_checkout.py | 29 +++++++++++++++++++++++++++++ tests/unit/stage.py | 1 - 4 files changed, 42 insertions(+), 4 deletions(-) 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