From 571713484b6bf8e749f056ce7bb52c00bf55e112 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Tue, 18 Sep 2018 07:25:33 +0300 Subject: [PATCH] run: check that -f doesn't contain any subdirs Fixes #1110 Signed-off-by: Ruslan Kuprieiev --- dvc/stage.py | 16 +++++++++++----- tests/test_run.py | 11 ++++++++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/dvc/stage.py b/dvc/stage.py index 25d2534e9..ec4c7e09f 100644 --- a/dvc/stage.py +++ b/dvc/stage.py @@ -36,10 +36,8 @@ class StageFileIsNotDvcFileError(DvcException): class StageFileBadNameError(DvcException): - def __init__(self, fname): - msg = "Bad stage filename '{}'. Stage files should be named " \ - "'Dvcfile' or have a '.dvc' suffix(e.g. '{}.dvc')." - super(StageFileBadNameError, self).__init__(msg.format(fname, fname)) + def __init__(self, msg): + super(StageFileBadNameError, self).__init__(msg) class MissingDep(DvcException): @@ -283,6 +281,11 @@ class Stage(object): use_cache=False, metric=True) stage.deps = dependency.loads_from(stage, deps) + if fname is not None and os.path.basename(fname) != fname: + msg = "Stage file name '{}' should not contain subdirectories. " \ + "Use '-c|--cwd' to change location of the stage file." + raise StageFileBadNameError(msg.format(fname)) + fname, cwd = Stage._stage_fname_cwd(fname, cwd, stage.outs, add=add) cwd = os.path.abspath(cwd) @@ -304,7 +307,10 @@ class Stage(object): @staticmethod def _check_dvc_filename(fname): if not Stage.is_stage_filename(fname): - raise StageFileBadNameError(os.path.relpath(fname)) + msg = "Bad stage filename '{}'. Stage files should be named " \ + "'Dvcfile' or have a '.dvc' suffix(e.g. '{}.dvc')." + raise StageFileBadNameError(msg.format(os.path.relpath(fname), + os.path.basename(fname))) @staticmethod def _check_dvc_file(fname): diff --git a/tests/test_run.py b/tests/test_run.py index 89f8674ce..32b908ee6 100644 --- a/tests/test_run.py +++ b/tests/test_run.py @@ -16,7 +16,7 @@ class TestRun(TestDvc): deps = [self.FOO, self.CODE] outs = [os.path.join(self.dvc.root_dir, 'out')] outs_no_cache = [] - fname = os.path.join(self.dvc.root_dir, 'out.dvc') + fname = 'out.dvc' cwd = os.curdir self.dvc.add(self.FOO) @@ -76,6 +76,15 @@ class TestRunBadStageFilename(TestDvc): fname='empty', cwd=os.curdir) + with self.assertRaises(StageFileBadNameError): + self.dvc.run(cmd='', + deps=[], + outs=[], + outs_no_cache=[], + fname=os.path.join(self.DATA_DIR, 'empty.dvc'), + cwd=os.curdir) + + class TestRunNoExec(TestDvc): def test(self):