diff --git a/tests/test_checkout.py b/tests/test_checkout.py index 62bc25193..1bb9c29b9 100644 --- a/tests/test_checkout.py +++ b/tests/test_checkout.py @@ -4,11 +4,7 @@ import shutil import filecmp from dvc.main import main -from dvc.data_cloud import file_md5 -from dvc.stage import Stage, CmdOutputNoCacheError, CmdOutputOutsideOfRepoError -from dvc.stage import CmdOutputDoesNotExistError, CmdOutputIsNotFileError -from dvc.project import StageNotFoundError - +from tests.basic_env import TestDvc from tests.test_repro import TestRepro @@ -35,3 +31,93 @@ class TestCmdCheckout(TestCheckout): ret = main(['checkout']) self.assertEqual(ret, 0) self._test_checkout() + + +class CheckoutBase(TestDvc): + GIT_IGNORE = '.gitignore' + + def commit_data_file(self, fname, content='random text'): + with open(fname, 'w') as fd: + fd.write(content) + self.dvc.add(fname) + self.dvc.scm.add([fname + '.dvc', '.gitignore']) + self.dvc.scm.commit('adding ' + fname) + + def read_ignored(self): + return map(lambda s: s.strip('\n'), open(self.GIT_IGNORE).readlines()) + + +class TestRemoveFilesWhenCheckout(CheckoutBase): + def test(self): + fname = 'file_in_a_branch' + branch_master = 'master' + branch_1 = 'b1' + + self.dvc.scm.add(self.dvc.scm.untracked_files()) + self.dvc.scm.commit('add all files') + + # add the file into a separate branch + self.dvc.scm.checkout(branch_1, True) + main(['checkout']) + self.commit_data_file(fname) + + # Checkout back in master + self.dvc.scm.checkout(branch_master) + self.assertTrue(os.path.exists(fname)) + + # Make sure `dvc checkout` removes the file + # self.dvc.checkout() + main(['checkout']) + self.assertFalse(os.path.exists(fname)) + + +class TestGitIgnoreBasic(CheckoutBase): + def test(self): + fname1 = 'file_1' + fname2 = 'file_2' + + self.dvc.scm.add(self.dvc.scm.untracked_files()) + self.dvc.scm.commit('add all files') + + self.assertFalse(os.path.exists(self.GIT_IGNORE)) + + self.commit_data_file(fname1) + self.commit_data_file(fname2) + + self.assertTrue(os.path.exists(self.GIT_IGNORE)) + + ignored = self.read_ignored() + + self.assertEqual(len(ignored), 2) # FAILS!!! + + self.assertIn(fname1, ignored) + self.assertIn(fname2, ignored) # FAILS!!! + + +class TestGitIgnoreWhenCheckout(CheckoutBase): + def test(self): + fname_master = 'file_in_a_master' + branch_master = 'master' + fname_branch = 'file_in_a_branch' + branch_1 = 'b1' + + self.dvc.scm.add(self.dvc.scm.untracked_files()) + self.dvc.scm.commit('add all files') + self.commit_data_file(fname_master) + + self.dvc.scm.checkout(branch_1, True) + main(['checkout']) + self.commit_data_file(fname_branch) + + self.dvc.scm.checkout(branch_master) + main(['checkout']) + + ignored = self.read_ignored() + + self.assertEqual(len(ignored), 1) + self.assertIn(fname_master, ignored) + + self.dvc.scm.checkout(branch_1) + main(['checkout']) + ignored = self.read_ignored() + self.assertIn(fname_branch, ignored) # FAILS!!!