From c95432b534118e0c0214ef13d518f3eeed8ba033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Wed, 25 Mar 2020 13:39:46 +0100 Subject: [PATCH] diff: analyse working tree when dirty --- dvc/repo/diff.py | 16 +++++++++++++++- tests/func/test_diff.py | 42 +++++++++++++++++++++++++++++++++++------ 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/dvc/repo/diff.py b/dvc/repo/diff.py index 9c54e7bc1c..d18389e05c 100644 --- a/dvc/repo/diff.py +++ b/dvc/repo/diff.py @@ -3,6 +3,7 @@ from dvc.exceptions import DvcException from dvc.repo import locked from dvc.scm.git import Git +from dvc.scm.tree import is_working_tree @locked @@ -36,10 +37,23 @@ def _to_path(output): else os.path.join(str(output), "") ) + on_working_tree = is_working_tree(self.tree) + + def _to_checksum(output): + if on_working_tree: + return self.cache.local.get_checksum(output.path_info) + return output.checksum + + def _exists(output): + if on_working_tree: + return output.exists + return True + return { - _to_path(output): output.checksum + _to_path(output): _to_checksum(output) for stage in self.stages for output in stage.outs + if _exists(output) } working_tree = self.tree diff --git a/tests/func/test_diff.py b/tests/func/test_diff.py index bb474cd240..918f5ba40e 100644 --- a/tests/func/test_diff.py +++ b/tests/func/test_diff.py @@ -159,21 +159,51 @@ def test_directories(tmp_dir, scm, dvc): def test_diff_no_cache(tmp_dir, scm, dvc): - (stage,) = tmp_dir.dvc_gen( - {"dir": {"file": "file content"}}, commit="first" - ) + tmp_dir.dvc_gen({"dir": {"file": "file content"}}, commit="first") scm.tag("v1") + tmp_dir.dvc_gen( {"dir": {"file": "modified file content"}}, commit="second" ) + scm.tag("v2") - remove(first(stage.outs).cache_path) - remove("dir") + remove(dvc.cache.local.cache_dir) # invalidate_dir_info to force cache loading dvc.cache.local._dir_info = {} - diff = dvc.diff("v1") + diff = dvc.diff("v1", "v2") assert diff["added"] == [] assert diff["deleted"] == [] assert first(diff["modified"])["path"] == os.path.join("dir", "") + + +def test_diff_dirty(tmp_dir, scm, dvc): + tmp_dir.dvc_gen( + {"file": "file_content", "dir": {"dir_file1": "dir file content"}}, + commit="initial", + ) + + (tmp_dir / "file").unlink() + tmp_dir.gen({"dir": {"dir_file2": "dir file 2 content"}}) + tmp_dir.dvc_gen("new_file", "new_file_content") + + result = dvc.diff() + + assert result == { + "added": [ + {"hash": "86d049de17c76ac44cdcac146042ec9b", "path": "new_file"} + ], + "deleted": [ + {"hash": "7f0b6bb0b7e951b7fd2b2a4a326297e1", "path": "file"} + ], + "modified": [ + { + "hash": { + "new": "38175ad60f0e58ac94e0e2b7688afd81.dir", + "old": "92daf39af116ca2fb245acaeb2ae65f7.dir", + }, + "path": os.path.join("dir", ""), + } + ], + }