From 641edacef695ebddb53df8644e12d345e8c00369 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Mon, 22 Jul 2019 16:10:41 +0300 Subject: [PATCH] import-url: lock by-default Fixes #2238 Signed-off-by: Ruslan Kuprieiev --- dvc/dependency/base.py | 2 +- dvc/repo/imp_url.py | 2 +- dvc/stage.py | 2 +- tests/func/test_repro.py | 9 +++++---- tests/func/test_update.py | 27 +++++++++++++++++++++++++++ 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/dvc/dependency/base.py b/dvc/dependency/base.py index ecd4a3b5d5..f76f4e022e 100644 --- a/dvc/dependency/base.py +++ b/dvc/dependency/base.py @@ -22,4 +22,4 @@ class DependencyBase(object): IsNotFileOrDirError = DependencyIsNotFileOrDirError def update(self): - raise NotImplementedError + pass diff --git a/dvc/repo/imp_url.py b/dvc/repo/imp_url.py index 8d42d6bb17..9125c9340a 100644 --- a/dvc/repo/imp_url.py +++ b/dvc/repo/imp_url.py @@ -3,7 +3,7 @@ @scm_context -def imp_url(self, url, out=None, fname=None, erepo=None, locked=False): +def imp_url(self, url, out=None, fname=None, erepo=None, locked=True): from dvc.stage import Stage out = out or pathlib.PurePath(url).name diff --git a/dvc/stage.py b/dvc/stage.py index 0ec0f9f8ac..509d49a624 100644 --- a/dvc/stage.py +++ b/dvc/stage.py @@ -334,7 +334,7 @@ def reproduce(self, interactive=False, **kwargs): return self def update(self): - if not self.is_repo_import: + if not self.is_repo_import and not self.is_import: raise StageUpdateError(self.relpath) self.deps[0].update() diff --git a/tests/func/test_repro.py b/tests/func/test_repro.py index 7c8fc60ba7..a827e64418 100644 --- a/tests/func/test_repro.py +++ b/tests/func/test_repro.py @@ -837,7 +837,9 @@ def check_already_cached(self, stage): with patch_download as mock_download: with patch_checkout as mock_checkout: with patch_run as mock_run: + stage.locked = False stage.run() + stage.locked = True mock_run.assert_not_called() mock_download.assert_not_called() @@ -918,14 +920,12 @@ def test(self, mock_prompt): self.assertNotEqual(self.dvc.status(), {}) - stages = self.dvc.reproduce(import_stage.path) - self.assertEqual(len(stages), 1) + self.dvc.update(import_stage.path) self.assertTrue(os.path.exists("import")) self.assertTrue(filecmp.cmp("import", self.BAR, shallow=False)) self.assertEqual(self.dvc.status(import_stage.path), {}) - stages = self.dvc.reproduce(import_remote_stage.path) - self.assertEqual(len(stages), 1) + self.dvc.update(import_remote_stage.path) self.assertEqual(self.dvc.status(import_remote_stage.path), {}) stages = self.dvc.reproduce(cmd_stage.path) @@ -1323,6 +1323,7 @@ def test_force_import(self): with patch_download as mock_download: with patch_checkout as mock_checkout: + assert main(["unlock", "bar.dvc"]) == 0 ret = main(["repro", "--force", "bar.dvc"]) self.assertEqual(ret, 0) self.assertEqual(mock_download.call_count, 1) diff --git a/tests/func/test_update.py b/tests/func/test_update.py index 9234b0ed43..7345627aac 100644 --- a/tests/func/test_update.py +++ b/tests/func/test_update.py @@ -1,4 +1,6 @@ import os +import shutil +import filecmp from dvc.repo import Repo @@ -40,3 +42,28 @@ def test_update_import(dvc_repo, erepo): assert os.path.isfile(dst) with open(dst, "r+") as fobj: assert fobj.read() == "updated" + + +def test_update_import_url(repo_dir, dvc_repo): + src = "file" + dst = src + "_imported" + + shutil.copyfile(repo_dir.FOO, src) + + stage = dvc_repo.imp_url(src, dst) + + assert os.path.exists(dst) + assert os.path.isfile(dst) + assert filecmp.cmp(src, dst, shallow=False) + + # update data + os.unlink(src) + shutil.copyfile(repo_dir.BAR, src) + + assert dvc_repo.status(stage.path) == {} + dvc_repo.update(stage.path) + assert dvc_repo.status(stage.path) == {} + + assert os.path.exists(dst) + assert os.path.isfile(dst) + assert filecmp.cmp(src, dst, shallow=False)