diff --git a/dvc/command/repro.py b/dvc/command/repro.py index c9ef91839..3d8daa8fd 100644 --- a/dvc/command/repro.py +++ b/dvc/command/repro.py @@ -22,16 +22,11 @@ class CmdRepro(CmdBase): interactive=self.args.interactive) if self.args.metrics: self.project.metrics_show() - except ReproductionError as ex: + except DvcException as ex: msg = 'Failed to reproduce \'{}\''.format(target) self.project.logger.error(msg, ex) ret = 1 break - except Exception as ex: - msg = 'Failed to reproduce \'{}\' - unexpected error' - self.project.logger.error(msg.format(target), ex) - ret = 1 - break os.chdir(saved_dir) return ret diff --git a/dvc/project.py b/dvc/project.py index e39bebe27..ef81d8fd1 100644 --- a/dvc/project.py +++ b/dvc/project.py @@ -9,15 +9,6 @@ class InitError(DvcException): super(InitError, self).__init__(msg) -class NotDvcFileError(DvcException): - def __init__(self, path): - msg = '\'{}\' is not a DVC file'.format(path) - p = path + Stage.STAGE_FILE_SUFFIX - if Stage.is_stage_file(p): - msg += '. Maybe you meant \'{}\'?'.format(p) - super(NotDvcFileError, self).__init__(msg) - - class ReproductionError(DvcException): def __init__(self, dvc_file_name, ex): self.path = dvc_file_name @@ -153,9 +144,6 @@ class Project(object): return stage def remove(self, target, outs_only=False): - if not Stage.is_stage_file(target): - raise NotDvcFileError(target) - stage = Stage.load(self, target) if outs_only: stage.remove_outs() @@ -165,9 +153,6 @@ class Project(object): return stage def lock_stage(self, target, unlock=False): - if not Stage.is_stage_file(target): - raise NotDvcFileError(target) - stage = Stage.load(self, target) stage.locked = False if unlock else True stage.dump() @@ -277,11 +262,10 @@ class Project(object): interactive=False): import networkx as nx + stage = Stage.load(self, target) G = self.graph()[1] stages = nx.get_node_attributes(G, 'stage') - node = os.path.relpath(os.path.abspath(target), self.root_dir) - if node not in stages: - raise NotDvcFileError(target) + node = os.path.relpath(stage.path, self.root_dir) if not interactive: config = self.config @@ -324,8 +308,6 @@ class Project(object): all_stages = self.active_stages() if target: - if not Stage.is_stage_file(target): - raise NotDvcFileError(target) stages = [Stage.load(self, target)] else: stages = all_stages diff --git a/dvc/stage.py b/dvc/stage.py index 413d2e54e..31d2b2d47 100644 --- a/dvc/stage.py +++ b/dvc/stage.py @@ -263,8 +263,22 @@ class Stage(object): return stage + @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)) + @staticmethod def load(project, fname): + if not os.path.exists(fname): + Stage._check_dvc_file(fname) + raise DvcException("'{}' does not exist.".format(fname)) + + if not self.is_stage_file(fname): + Stage._check_dvc_file(fname) + raise DvcException("'{}' is not a DVC file".format(fname)) + with open(fname, 'r') as fd: return Stage.loadd(project, yaml.safe_load(fd), fname)