Skip to content

Commit

Permalink
diff: analyse working tree when dirty (iterative#3534)
Browse files Browse the repository at this point in the history
  • Loading branch information
pared authored Mar 27, 2020
1 parent f69cb7a commit eee3d76
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 7 deletions.
16 changes: 15 additions & 1 deletion dvc/repo/diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
42 changes: 36 additions & 6 deletions tests/func/test_diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -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", ""),
}
],
}

0 comments on commit eee3d76

Please sign in to comment.