dvc.command.diff: add renamed detection feature (#5160)

fixes #5150
This commit is contained in:
Dmitry Kropachev
2021-01-09 13:49:03 +09:00
committed by GitHub
parent 388eccad13
commit 6b05cc5e24
5 changed files with 306 additions and 35 deletions
+130
View File
@@ -1,3 +1,7 @@
import os
import pytest
from dvc.utils import relpath
from dvc.utils.serialize import dump_yaml
@@ -14,6 +18,132 @@ def test_diff_no_changes(tmp_dir, scm, dvc):
assert dvc.params.diff() == {}
@pytest.mark.parametrize("commit_last", [True, False])
def test_diff_add_similar_files(tmp_dir, scm, dvc, commit_last):
if commit_last:
last_commit_msg = "commit #2"
a_rev = "HEAD~1"
else:
last_commit_msg = None
a_rev = "HEAD"
tmp_dir.dvc_gen(
{"dir": {"file": "text1", "subdir": {"file2": "text2"}}},
commit="commit #1",
)
tmp_dir.dvc_gen(
{"dir2": {"file": "text1", "subdir": {"file2": "text2"}}},
commit=last_commit_msg,
)
assert dvc.diff(a_rev) == {
"added": [
{
"path": os.path.join("dir2", ""),
"hash": "cb58ee07cb01044db229e4d6121a0dfc.dir",
},
{
"path": os.path.join("dir2", "file"),
"hash": "cef7ccd89dacf1ced6f5ec91d759953f",
},
{
"path": os.path.join("dir2", "subdir", "file2"),
"hash": "fe6123a759017e4a2af4a2d19961ed71",
},
],
"deleted": [],
"modified": [],
"renamed": [],
"not in cache": [],
}
@pytest.mark.parametrize("commit_last", [True, False])
def test_diff_rename_folder(tmp_dir, scm, dvc, commit_last):
if commit_last:
last_commit_msg = "commit #2"
a_rev = "HEAD~1"
else:
last_commit_msg = None
a_rev = "HEAD"
tmp_dir.dvc_gen(
{"dir": {"file": "text1", "subdir": {"file2": "text2"}}},
commit="commit #1",
)
(tmp_dir / "dir").replace(tmp_dir / "dir2")
tmp_dir.dvc_add("dir2", commit=last_commit_msg)
assert dvc.diff(a_rev) == {
"added": [],
"deleted": [],
"modified": [],
"renamed": [
{
"path": {
"old": os.path.join("dir", ""),
"new": os.path.join("dir2", ""),
},
"hash": "cb58ee07cb01044db229e4d6121a0dfc.dir",
},
{
"path": {
"old": os.path.join("dir", "file"),
"new": os.path.join("dir2", "file"),
},
"hash": "cef7ccd89dacf1ced6f5ec91d759953f",
},
{
"path": {
"old": os.path.join("dir", "subdir", "file2"),
"new": os.path.join("dir2", "subdir", "file2"),
},
"hash": "fe6123a759017e4a2af4a2d19961ed71",
},
],
"not in cache": [],
}
@pytest.mark.parametrize("commit_last", [True, False])
def test_diff_rename_file(tmp_dir, scm, dvc, commit_last):
if commit_last:
last_commit_msg = "commit #2"
a_rev = "HEAD~1"
else:
last_commit_msg = None
a_rev = "HEAD"
paths = tmp_dir.gen(
{"dir": {"file": "text1", "subdir": {"file2": "text2"}}}
)
tmp_dir.dvc_add(paths, commit="commit #1")
(tmp_dir / "dir" / "file").replace(tmp_dir / "dir" / "subdir" / "file3")
tmp_dir.dvc_add(paths, commit=last_commit_msg)
assert dvc.diff(a_rev) == {
"added": [],
"deleted": [],
"modified": [
{
"path": os.path.join("dir", ""),
"hash": {
"old": "cb58ee07cb01044db229e4d6121a0dfc.dir",
"new": "a4ac9c339aacc60b6a3152e362c319c8.dir",
},
}
],
"renamed": [
{
"path": {
"old": os.path.join("dir", "file"),
"new": os.path.join("dir", "subdir", "file3"),
},
"hash": "cef7ccd89dacf1ced6f5ec91d759953f",
}
],
"not in cache": [],
}
def test_diff(tmp_dir, scm, dvc):
tmp_dir.gen("params.yaml", "foo: bar")
dvc.run(cmd="echo params.yaml", params=["foo"], single_stage=True)
+18
View File
@@ -29,6 +29,7 @@ def test_added(tmp_dir, scm, dvc):
"deleted": [],
"modified": [],
"not in cache": [],
"renamed": [],
}
@@ -57,6 +58,7 @@ def test_no_cache_entry(tmp_dir, scm, dvc):
}
],
"not in cache": [],
"renamed": [],
}
@@ -72,6 +74,7 @@ def test_deleted(tmp_dir, scm, dvc, delete_data):
"deleted": [{"path": "file", "hash": digest("text")}],
"modified": [],
"not in cache": [],
"renamed": [],
}
@@ -89,6 +92,7 @@ def test_modified(tmp_dir, scm, dvc):
}
],
"not in cache": [],
"renamed": [],
}
@@ -106,6 +110,7 @@ def test_refs(tmp_dir, scm, dvc):
"deleted": [],
"modified": [{"path": "file", "hash": {"old": HEAD_1, "new": HEAD}}],
"not in cache": [],
"renamed": [],
}
assert dvc.diff("HEAD~2", "HEAD~1") == {
@@ -113,6 +118,7 @@ def test_refs(tmp_dir, scm, dvc):
"deleted": [],
"modified": [{"path": "file", "hash": {"old": HEAD_2, "new": HEAD_1}}],
"not in cache": [],
"renamed": [],
}
with pytest.raises(DvcException, match=r"unknown Git revision 'missing'"):
@@ -144,6 +150,7 @@ def test_directories(tmp_dir, scm, dvc):
"deleted": [],
"modified": [],
"not in cache": [],
"renamed": [],
}
assert dvc.diff(":/directory", ":/modify") == {
@@ -163,6 +170,7 @@ def test_directories(tmp_dir, scm, dvc):
},
],
"not in cache": [],
"renamed": [],
}
assert dvc.diff(":/modify", ":/delete") == {
@@ -180,6 +188,7 @@ def test_directories(tmp_dir, scm, dvc):
}
],
"not in cache": [],
"renamed": [],
}
@@ -208,6 +217,7 @@ def test_diff_no_cache(tmp_dir, scm, dvc):
diff = dvc.diff()
assert diff["added"] == []
assert diff["deleted"] == []
assert diff["renamed"] == []
assert diff["modified"] == []
assert diff["not in cache"] == [
{
@@ -250,6 +260,7 @@ def test_diff_dirty(tmp_dir, scm, dvc):
}
],
"not in cache": [],
"renamed": [],
}
@@ -300,6 +311,7 @@ def test_targets_single_file(tmp_dir, scm, dvc):
}
],
"not in cache": [],
"renamed": [],
}
@@ -317,6 +329,7 @@ def test_targets_single_dir(tmp_dir, scm, dvc):
"deleted": [],
"modified": [],
"not in cache": [],
"renamed": [],
}
assert dvc.diff(targets=["dir"]) == expected_result
@@ -331,6 +344,7 @@ def test_targets_single_file_in_dir(tmp_dir, scm, dvc):
"deleted": [],
"modified": [],
"not in cache": [],
"renamed": [],
}
@@ -347,6 +361,7 @@ def test_targets_two_files_in_dir(tmp_dir, scm, dvc):
"deleted": [],
"modified": [],
"not in cache": [],
"renamed": [],
}
@@ -369,6 +384,7 @@ def test_targets_file_and_dir(tmp_dir, scm, dvc):
}
],
"not in cache": [],
"renamed": [],
}
@@ -385,6 +401,7 @@ def test_targets_single_dir_with_file(tmp_dir, scm, dvc):
"deleted": [],
"modified": [],
"not in cache": [],
"renamed": [],
}
assert dvc.diff(targets=["dir_with"]) == expected_result
@@ -404,4 +421,5 @@ def test_targets_single_file_in_dir_with_file(tmp_dir, scm, dvc):
"deleted": [],
"modified": [],
"not in cache": [],
"renamed": [],
}