mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-10 07:18:27 +01:00
repro: print help when Dvcfile doesn't exist
Fixes #1003 Signed-off-by: Ruslan Kuprieiev <[email protected]>
This commit is contained in:
+10
-1
@@ -336,7 +336,6 @@ def parse_args(argv=None):
|
||||
repro_parser.add_argument(
|
||||
'targets',
|
||||
nargs='*',
|
||||
default=['Dvcfile'],
|
||||
help='DVC file to reproduce.')
|
||||
repro_parser.add_argument(
|
||||
'-f',
|
||||
@@ -763,4 +762,14 @@ def parse_args(argv=None):
|
||||
|
||||
args = parser.parse_args(argv)
|
||||
|
||||
if args.cmd == 'repro' and len(args.targets) == 0:
|
||||
path = os.path.join(args.cwd, 'Dvcfile')
|
||||
if not os.path.exists(path):
|
||||
msg = "error: default target '{}' does not exist.\n"
|
||||
sys.stderr.write(msg.format(path))
|
||||
sys.stderr.flush()
|
||||
repro_parser.print_help()
|
||||
sys.exit(2)
|
||||
args.targets = ['Dvcfile']
|
||||
|
||||
return args
|
||||
|
||||
@@ -7,13 +7,12 @@ from dvc.command.base import CmdBase
|
||||
class CmdPipelineShow(CmdBase):
|
||||
def _show(self, target, commands, outs):
|
||||
import networkx
|
||||
from dvc.project import NotDvcFileError
|
||||
from dvc.stage import Stage
|
||||
|
||||
stage = Stage.load(self.project, target)
|
||||
G = self.project.graph()[0]
|
||||
stages = networkx.get_node_attributes(G, 'stage')
|
||||
node = os.path.relpath(os.path.abspath(target), self.project.root_dir)
|
||||
if node not in stages:
|
||||
raise NotDvcFileError(node)
|
||||
node = os.path.relpath(stage.path, self.project.root_dir)
|
||||
|
||||
for n in networkx.dfs_postorder_nodes(G, node):
|
||||
if commands:
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import os
|
||||
|
||||
from dvc.command.base import CmdBase
|
||||
from dvc.exceptions import DvcException
|
||||
|
||||
|
||||
class CmdRepro(CmdBase):
|
||||
def run(self):
|
||||
from dvc.project import ReproductionError
|
||||
|
||||
recursive = not self.args.single_item
|
||||
saved_dir = os.path.realpath(os.curdir)
|
||||
if self.args.cwd:
|
||||
|
||||
+17
-5
@@ -24,6 +24,18 @@ class StageFileFormatError(DvcException):
|
||||
super(StageFileFormatError, self).__init__('Stage file format error')
|
||||
|
||||
|
||||
class StageFileDoesNotExistError(DvcException):
|
||||
def __init__(self, fname):
|
||||
msg = "'{}' does not exist.".format(fname)
|
||||
super(StageFileDoesNotExistError, self).__init__(msg)
|
||||
|
||||
|
||||
class StageFileIsNotDvcFileError(DvcException):
|
||||
def __init__(self, fname):
|
||||
msg = "'{}' is not a dvc file".format(fname)
|
||||
super(StageFileIsNotDvcFileError, self).__init__(msg)
|
||||
|
||||
|
||||
class MissingDataSource(DvcException):
|
||||
def __init__(self, missing_files):
|
||||
assert len(missing_files) > 0
|
||||
@@ -266,18 +278,18 @@ class Stage(object):
|
||||
@staticmethod
|
||||
def _check_dvc_file(fname):
|
||||
sname = fname + Stage.STAGE_FILE_SUFFIX
|
||||
if Stage.is_stage_file(sname):
|
||||
self.info("Do you mean '{}'?".format(sname))
|
||||
if Stage.is_stage_file(sname):
|
||||
Logger.info("Do you mean '{}'?".format(sname))
|
||||
|
||||
@staticmethod
|
||||
def load(project, fname):
|
||||
if not os.path.exists(fname):
|
||||
Stage._check_dvc_file(fname)
|
||||
raise DvcException("'{}' does not exist.".format(fname))
|
||||
raise StageFileDoesNotExistError(fname)
|
||||
|
||||
if not self.is_stage_file(fname):
|
||||
if not Stage.is_stage_file(fname):
|
||||
Stage._check_dvc_file(fname)
|
||||
raise DvcException("'{}' is not a DVC file".format(fname))
|
||||
raise StageFileIsNotDvcFileError(fname)
|
||||
|
||||
with open(fname, 'r') as fd:
|
||||
return Stage.loadd(project, yaml.safe_load(fd), fname)
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import os
|
||||
|
||||
from dvc.main import main
|
||||
from dvc.stage import Stage
|
||||
from dvc.project import NotDvcFileError
|
||||
from dvc.stage import Stage, StageFileDoesNotExistError
|
||||
from dvc.command.remove import CmdRemove
|
||||
|
||||
from tests.basic_env import TestDvc
|
||||
@@ -26,7 +25,7 @@ class TestRemove(TestDvc):
|
||||
|
||||
class TestRemoveNonExistentFile(TestDvc):
|
||||
def test(self):
|
||||
with self.assertRaises(NotDvcFileError) as cx:
|
||||
with self.assertRaises(StageFileDoesNotExistError) as cx:
|
||||
self.dvc.remove('non_existent_dvc_file')
|
||||
|
||||
|
||||
|
||||
+5
-4
@@ -14,10 +14,10 @@ from google.cloud import storage as gc
|
||||
|
||||
from dvc.main import main
|
||||
from dvc.command.repro import CmdRepro
|
||||
from dvc.project import Project, ReproductionError, NotDvcFileError
|
||||
from dvc.project import Project, ReproductionError
|
||||
from dvc.utils import file_md5
|
||||
from dvc.remote.local import RemoteLOCAL
|
||||
from dvc.stage import Stage
|
||||
from dvc.stage import Stage, StageFileDoesNotExistError
|
||||
|
||||
from tests.basic_env import TestDvc
|
||||
from tests.test_data_cloud import _should_test_aws, TEST_AWS_REPO_BUCKET
|
||||
@@ -134,7 +134,8 @@ class TestReproDry(TestReproChangedData):
|
||||
self.assertTrue(len(stages), 2)
|
||||
self.assertFalse(filecmp.cmp(self.file1, self.BAR, shallow=False))
|
||||
|
||||
ret = main(['repro', '--dry'])
|
||||
ret = main(['repro', '--dry', self.file1_stage])
|
||||
self.assertEqual(ret, 0)
|
||||
self.assertFalse(filecmp.cmp(self.file1, self.BAR, shallow=False))
|
||||
|
||||
|
||||
@@ -180,7 +181,7 @@ class TestReproLocked(TestReproChangedData):
|
||||
self.assertEqual(len(stages), 3)
|
||||
|
||||
def test_non_existing(self):
|
||||
with self.assertRaises(NotDvcFileError):
|
||||
with self.assertRaises(StageFileDoesNotExistError):
|
||||
self.dvc.lock_stage('non-existing-stage')
|
||||
|
||||
ret = main(['lock', 'non-existing-stage'])
|
||||
|
||||
Reference in New Issue
Block a user