diff --git a/dvc/runtime.py b/dvc/runtime.py index e54439f4b..0b3f1abcd 100644 --- a/dvc/runtime.py +++ b/dvc/runtime.py @@ -36,8 +36,11 @@ class Runtime(object): if not os.path.exists(path): return False - # Definitely ont the best way to check a symlink. - output = Executor.exec_cmd_only_success("dir", path) + if not os.path.isfile(path): + return False + + # It is definitely not the best way to check a symlink. + output = Executor.exec_cmd_only_success(["dir", path]) return '' in output @staticmethod diff --git a/dvc/utils.py b/dvc/utils.py index 4528a937d..e9f4e4276 100644 --- a/dvc/utils.py +++ b/dvc/utils.py @@ -1,3 +1,6 @@ +import os +import stat +import shutil def cached_property(f): def get(self): @@ -12,3 +15,14 @@ def cached_property(f): return x return property(get) + + +def rmtree(dir): + '''Cross platform rmtree()''' + if os.name == 'nt': + if not os.access(dir, os.W_OK): + os.chmod(dir, stat.S_IWUSR) + else: + raise + + shutil.rmtree(dir, ignore_errors=True) diff --git a/tests/basic_env.py b/tests/basic_env.py index 9895a38a2..3bf6b1b3f 100644 --- a/tests/basic_env.py +++ b/tests/basic_env.py @@ -1,5 +1,4 @@ import os -import shutil from unittest import TestCase from dvc.config import ConfigI @@ -7,6 +6,7 @@ from dvc.git_wrapper import GitWrapperI from dvc.path.data_item import DataItem from dvc.path.factory import PathFactory from dvc.settings import Settings +from dvc.utils import rmtree class BasicEnvironment(TestCase): @@ -16,7 +16,7 @@ class BasicEnvironment(TestCase): self._test_git_dir = os.path.join(self._test_dir, self._proj_dir) self._old_curr_dir_abs = os.path.realpath(os.curdir) - shutil.rmtree(self._test_dir, ignore_errors=True) + rmtree(self._test_dir) if curr_dir: self._curr_dir = os.path.realpath(curr_dir) @@ -39,7 +39,7 @@ class BasicEnvironment(TestCase): if self._old_curr_dir_abs: os.chdir(self._old_curr_dir_abs) if self._test_git_dir: - shutil.rmtree(self._test_dir, ignore_errors=True) + rmtree(self._test_dir) pass diff --git a/tests/test_cmd_run.py b/tests/test_cmd_run.py index 748b6e745..0e79d8ac7 100644 --- a/tests/test_cmd_run.py +++ b/tests/test_cmd_run.py @@ -1,5 +1,4 @@ import os -import shutil import tempfile from unittest import TestCase @@ -10,6 +9,7 @@ from dvc.path.data_item import DataItem from dvc.path.factory import PathFactory from dvc.git_wrapper import GitWrapper from dvc.settings import Settings +from dvc.utils import rmtree class RunBasicTest(TestCase): @@ -46,7 +46,7 @@ class RunBasicTest(TestCase): fd.close() def tearDown(self): - shutil.rmtree(self.test_dir, ignore_errors=True) + rmtree(self.test_dir) os.chdir(self._old_curr_dir_abs)