def test(self): with open(self.CODE, "w+", encoding="utf-8") as fobj: fobj.write("import sys\n") fobj.write("import os\n") fobj.write("with open(sys.argv[1], 'a+') as fobj:\n") fobj.write(" fobj.write('foo')\n") ret = main(["config", "cache.type", "hardlink"]) self.assertEqual(ret, 0) self.assertEqual(ret, 0) ret = main([ "run", "-d", self.CODE, "-o", self.FOO, "--single-stage", "python", self.CODE, self.FOO, ]) self.assertEqual(ret, 0) self.assertFalse(os.access(self.FOO, os.W_OK)) self.assertTrue(system.is_hardlink(self.FOO)) with open(self.FOO, encoding="utf-8") as fd: self.assertEqual(fd.read(), "foo") ret = main([ "run", "--force", "--no-run-cache", "--single-stage", "-d", self.CODE, "-o", self.FOO, "python", self.CODE, self.FOO, ]) self.assertEqual(ret, 0) self.assertFalse(os.access(self.FOO, os.W_OK)) self.assertTrue(system.is_hardlink(self.FOO)) with open(self.FOO, encoding="utf-8") as fd: self.assertEqual(fd.read(), "foo")
def test(self): ret = main(["config", "cache.type", "hardlink"]) self.assertEqual(ret, 0) ret = main(["add", self.FOO]) self.assertEqual(ret, 0) self.assertFalse(os.access(self.FOO, os.W_OK)) self.assertTrue(system.is_hardlink(self.FOO)) ret = main(["unprotect", self.FOO]) self.assertEqual(ret, 0) ret = main(["add", self.FOO]) self.assertEqual(ret, 0) self.assertFalse(os.access(self.FOO, os.W_OK)) self.assertTrue(system.is_hardlink(self.FOO))
def test_add_optimization_for_hardlink_on_empty_files(tmp_dir, dvc, mocker): dvc.odb.local.cache_types = ["hardlink"] tmp_dir.gen({"foo": "", "bar": "", "lorem": "lorem", "ipsum": "ipsum"}) m = mocker.spy(LocalFileSystem, "is_hardlink") stages = dvc.add(["foo", "bar", "lorem", "ipsum"]) assert m.call_count == 8 assert m.call_args != call(tmp_dir / "foo") assert m.call_args != call(tmp_dir / "bar") for stage in stages[:2]: # hardlinks are not created for empty files assert not system.is_hardlink(stage.outs[0].fs_path) for stage in stages[2:]: assert system.is_hardlink(stage.outs[0].fs_path) for stage in stages: assert os.path.exists(stage.path) assert os.path.exists(stage.outs[0].cache_path)
tmp_dir.dvc_gen({"foo": "foo", "bar": "bar"}) shutil.copy("bar", "foo") copy_spy = mocker.spy(dvc.odb.local.fs, "copy") dvc.add("foo") assert copy_spy.mock.call_count == 0 @pytest.mark.parametrize( "link,new_link,link_test_func", [ ("hardlink", "copy", lambda path: not system.is_hardlink(path)), ("symlink", "copy", lambda path: not system.is_symlink(path)), ("copy", "hardlink", system.is_hardlink), ("copy", "symlink", system.is_symlink), ], ) def test_should_relink_on_repeated_add(link, new_link, link_test_func, tmp_dir, dvc): dvc.config["cache"]["type"] = link tmp_dir.dvc_gen({"foo": "foo", "bar": "bar"}) os.remove("foo") getattr(dvc.odb.local.fs, link)((tmp_dir / "bar").fs_path, (tmp_dir / "foo").fs_path)