From e4b9718f341ade516ca4f4f604f1a3fc675a72b4 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Mon, 8 Jan 2018 13:19:42 +0200 Subject: [PATCH] run: add --no-exec option Fixes #385 Signed-off-by: Ruslan Kuprieiev --- dvc/cli.py | 5 +++++ dvc/command/run.py | 21 ++++++++++++++------- dvc/project.py | 6 ++++-- tests/test_run.py | 7 +++++++ 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/dvc/cli.py b/dvc/cli.py index b771fe25e..4951e55e9 100644 --- a/dvc/cli.py +++ b/dvc/cli.py @@ -113,6 +113,11 @@ def parse_args(argv=None): '--cwd', default=os.path.curdir, help='Directory to run your command and place state file in') + run_parser.add_argument( + '--no-exec', + action='store_true', + default=False, + help="Only create stage file without actually running it") run_parser.add_argument( 'command', nargs=argparse.REMAINDER, diff --git a/dvc/command/run.py b/dvc/command/run.py index 81a4853ad..e97ca81d6 100644 --- a/dvc/command/run.py +++ b/dvc/command/run.py @@ -3,19 +3,26 @@ import os from dvc.command.common.base import CmdBase from dvc.logger import Logger from dvc.stage import Stage +from dvc.exceptions import DvcException class CmdRun(CmdBase): def run(self): fname = self.stage_file_name(self.args.file, self.args.outs, self.args.outs_no_cache) - self.project.run(cmd=' '.join(self.args.command), - outs=self.args.outs, - outs_no_cache=self.args.outs_no_cache, - deps=self.args.deps, - locked=self.args.lock, - fname=fname, - cwd=self.args.cwd) + try: + self.project.run(cmd=' '.join(self.args.command), + outs=self.args.outs, + outs_no_cache=self.args.outs_no_cache, + deps=self.args.deps, + locked=self.args.lock, + fname=fname, + cwd=self.args.cwd, + no_exec=self.args.no_exec) + except DvcException as ex: + self.project.logger.error('Failed to run command: {}'.format(str(ex))) + return 1 + return 0 @staticmethod diff --git a/dvc/project.py b/dvc/project.py index 8f2c4e7db..eaf80b57f 100644 --- a/dvc/project.py +++ b/dvc/project.py @@ -145,7 +145,8 @@ class Project(object): outs_no_cache=[], locked=False, fname=Stage.STAGE_FILE, - cwd=os.curdir): + cwd=os.curdir, + no_exec=False): cwd = os.path.abspath(cwd) path = os.path.join(cwd, fname) outputs = Output.loads_from(self, outs, use_cache=True, cwd=cwd) @@ -159,7 +160,8 @@ class Project(object): outs=outputs, deps=deps, locked=locked) - stage.run() + if not no_exec: + stage.run() stage.dump() return stage diff --git a/tests/test_run.py b/tests/test_run.py index fc984df7c..20dd33ab0 100644 --- a/tests/test_run.py +++ b/tests/test_run.py @@ -45,3 +45,10 @@ class TestRunEmpty(TestDvc): locked=False, fname='empty.dvc', cwd=os.curdir) + + +class TestRunNoExec(TestDvc): + def test(self): + self.dvc.run(cmd='python {} {} {}'.format(self.CODE, self.FOO, 'out'), + no_exec=True) + self.assertFalse(os.path.exists('out'))