diff --git a/dvc/output/local.py b/dvc/output/local.py index ecdeafdae3..f698a123a9 100644 --- a/dvc/output/local.py +++ b/dvc/output/local.py @@ -7,9 +7,11 @@ from dvc.istextfile import istextfile from dvc.output.base import OutputBase from dvc.remote.local import RemoteLOCAL +from dvc.utils import relpath from dvc.utils.compat import fspath_py35 from dvc.utils.compat import str from dvc.utils.compat import urlparse +from dvc.utils.fs import path_isin logger = logging.getLogger(__name__) @@ -38,7 +40,14 @@ def _parse_path(self, remote, path): return self.REMOTE.path_cls(abs_p) def __str__(self): - return str(self.path_info) + if not self.is_in_repo: + return str(self.def_path) + + cur_dir = os.getcwd() + if path_isin(cur_dir, self.repo.root_dir): + return relpath(self.path_info, cur_dir) + + return relpath(self.path_info, self.repo.root_dir) @property def fspath(self): diff --git a/tests/unit/output/test_local.py b/tests/unit/output/test_local.py index 0999472c6f..82d671cf73 100644 --- a/tests/unit/output/test_local.py +++ b/tests/unit/output/test_local.py @@ -1,8 +1,10 @@ -from mock import patch +import os +from mock import patch from dvc.output import OutputLOCAL from dvc.remote.local import RemoteLOCAL from dvc.stage import Stage +from dvc.utils import relpath from tests.basic_env import TestDvc @@ -21,6 +23,34 @@ def test_save_missing(self): o.save() +def test_str_workdir_outside_repo(erepo): + stage = Stage(erepo.dvc) + output = OutputLOCAL(stage, "path", cache=False) + + assert relpath("path", erepo.dvc.root_dir) == str(output) + + +def test_str_workdir_inside_repo(dvc_repo): + stage = Stage(dvc_repo) + output = OutputLOCAL(stage, "path", cache=False) + + assert "path" == str(output) + + stage = Stage(dvc_repo, wdir="some_folder") + output = OutputLOCAL(stage, "path", cache=False) + + assert os.path.join("some_folder", "path") == str(output) + + +def test_str_on_absolute_path(dvc_repo): + stage = Stage(dvc_repo) + + path = os.path.abspath(os.path.join("path", "to", "file")) + output = OutputLOCAL(stage, path, cache=False) + + assert path == str(output) + + class TestGetFilesNumber(TestDvc): def _get_output(self): stage = Stage(self.dvc)