From 5d29a1b7d0569537e745ff23157f669291c53a24 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Sat, 17 Nov 2018 20:41:17 +0200 Subject: [PATCH] dvc: properly build DAG for dependency directories Fixes #1338 Signed-off-by: Ruslan Kuprieiev --- dvc/project.py | 3 ++- tests/test_repro.py | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/dvc/project.py b/dvc/project.py index c82ba944f..67b3da604 100644 --- a/dvc/project.py +++ b/dvc/project.py @@ -1058,7 +1058,8 @@ class Project(object): for dep in stage.deps: for out in outs: if out.path != dep.path \ - and not dep.path.startswith(out.path + out.sep): + and not dep.path.startswith(out.path + out.sep) \ + and not out.path.startswith(dep.path + dep.sep): continue dep_stage = out.stage diff --git a/tests/test_repro.py b/tests/test_repro.py index 112386088..531379726 100644 --- a/tests/test_repro.py +++ b/tests/test_repro.py @@ -79,6 +79,47 @@ class TestReproDepUnderDir(TestDvc): self.assertTrue(filecmp.cmp(self.file1, self.FOO, shallow=False)) +class TestReproDepDirWithOutputsUnderIt(TestDvc): + def test(self): + stages = self.dvc.add(self.DATA) + self.assertEqual(len(stages), 1) + self.assertTrue(stages[0] is not None) + + sleep() + + stages = self.dvc.add(self.DATA_SUB) + self.assertEqual(len(stages), 1) + self.assertTrue(stages[0] is not None) + + sleep() + + stage = self.dvc.run(fname='Dvcfile', + deps=[self.DATA, self.DATA_SUB]) + self.assertTrue(stage is not None) + + sleep() + + file1 = 'file1' + file1_stage = file1 + '.dvc' + stage = self.dvc.run(fname=file1_stage, + deps=[self.DATA_DIR], + outs=[file1], + cmd='python {} {} {}'.format(self.CODE, + self.DATA, + file1)) + self.assertTrue(stage is not None) + + sleep() + + os.unlink(self.DATA) + shutil.copyfile(self.FOO, self.DATA) + + sleep() + + stages = self.dvc.reproduce(file1_stage) + self.assertEqual(len(stages), 2) + + class TestReproNoDeps(TestRepro): def test(self): out = 'out'