diff --git a/dvc/command/remove.py b/dvc/command/remove.py index aa7b9785d..426d358f8 100644 --- a/dvc/command/remove.py +++ b/dvc/command/remove.py @@ -37,13 +37,16 @@ class CmdDataRemove(CmdBase): return 1 try: - return self.remove_all_targets() + if not self.remove_all_targets(): + return 1 finally: lock.release() + return 0 + def remove_all_targets(self): if not self.skip_git_actions and not self.git.is_ready_to_go(): - return 1 + return False error = False for target in self.parsed_args.target: @@ -53,7 +56,7 @@ class CmdDataRemove(CmdBase): message = 'DVC data remove: {}'.format(' '.join(self.parsed_args.target)) self.commit_if_needed(message, error) - return 0 if error == 0 else 1 + return error == 0 def remove_target(self, target): try: @@ -105,26 +108,25 @@ class CmdDataRemove(CmdBase): def _remove_state_file(self, data_item): if os.path.isfile(data_item.state.relative): - Logger.debug(u'[Cmd-Remove] Remove state {}.'.format(data_item.state.relative)) - os.remove(data_item.state.relative) - self.remove_dir_if_empty(data_item.state.relative) - Logger.debug(u'[Cmd-Remove] Remove state. Success.') + self._remove_dvc_path(data_item.state, 'state') else: Logger.warn(u'[Cmd-Remove] State file {} for data instance {} does not exist'.format( data_item.state.relative, data_item.data.relative)) def _remove_cache_file(self, data_item): if not self.parsed_args.keep_in_cache and os.path.isfile(data_item.cache.relative): - Logger.debug(u'[Cmd-Remove] Remove cache {}.'.format(data_item.cache.relative)) - - os.remove(data_item.cache.relative) - self.remove_dir_if_empty(data_item.cache.relative) - Logger.debug(u'[Cmd-Remove] Remove cache. Success.') + self._remove_dvc_path(data_item.cache, 'cache') else: if not self.parsed_args.keep_in_cache: Logger.warn(u'[Cmd-Remove] Unable to find cache file for data item %s' % data_item.data.relative) pass + def _remove_dvc_path(self, dvc_path, name): + Logger.debug(u'[Cmd-Remove] Remove {} {}.'.format(name, dvc_path.relative)) + os.remove(dvc_path.relative) + self.remove_dir_if_empty(dvc_path.relative) + Logger.debug(u'[Cmd-Remove] Remove {}. Success.'.format(name)) + def remove_from_cloud(self, aws_file_name): Logger.debug(u'[Cmd-Remove] Remove from cloud {}.'.format(aws_file_name)) diff --git a/dvc/command/repro.py b/dvc/command/repro.py index 9e497dde0..44a085f06 100644 --- a/dvc/command/repro.py +++ b/dvc/command/repro.py @@ -52,21 +52,25 @@ class CmdRepro(CmdRun): return 1 try: - if not self.skip_git_actions and not self.git.is_ready_to_go(): - return 1 - - data_item_list, external_files_names = self.settings.path_factory.to_data_items(self.parsed_args.target) - if external_files_names: - Logger.error('Files from outside of the data directory "{}" could not be reproduced: {}'. - format(self.config.data_dir, ' '.join(external_files_names))) - return 1 - - if self.repro_data_items(data_item_list): - return self.commit_if_needed('DVC repro: {}'.format(' '.join(self.parsed_args.target))) + return self.repro_target(self.parsed_args.target) finally: lock.release() - return 1 + pass + + def repro_target(self, target): + if not self.skip_git_actions and not self.git.is_ready_to_go(): + return 1 + + data_item_list, external_files_names = self.settings.path_factory.to_data_items(target) + if external_files_names: + Logger.error('Files from outside of the data directory "{}" could not be reproduced: {}'. + format(self.config.data_dir, ' '.join(external_files_names))) + return 1 + + if self.repro_data_items(data_item_list): + return self.commit_if_needed('DVC repro: {}'.format(' '.join(target))) + pass def repro_data_items(self, data_item_list): error = False @@ -146,12 +150,11 @@ class ReproChange(object): self._data_item.data.dvc, ', '.join([x.data.dvc for x in self.dependencies]))) - were_input_files_changed = False - if not self.state.is_reproducible: Logger.debug('Data item "{}" is not reproducible'.format(self._data_item.data.relative)) return False + were_input_files_changed = False for data_item in self.dependencies: change = ReproChange(data_item, self._cmd_obj) if change.reproduce(force): @@ -161,7 +164,7 @@ class ReproChange(object): self.state.code_dependencies + self.state.input_files, self.cmd_obj.settings.path_factory) if was_source_code_changed: - Logger.debug('Source code was changed for "{}"'.format(self._data_item.data.dvc)) + Logger.debug('Dependencies were changed for "{}"'.format(self._data_item.data.dvc)) if not force and not was_source_code_changed and not were_input_files_changed: Logger.debug('Data item "{}" is up to date'.format( diff --git a/tests/test_cmd_data_remove.py b/tests/test_cmd_data_remove.py index 1a8f91c0b..2a0c082e8 100644 --- a/tests/test_cmd_data_remove.py +++ b/tests/test_cmd_data_remove.py @@ -121,7 +121,7 @@ class TestRemoveEndToEnd(DirHierarchyEnvironment): self.assertTrue(os.path.exists(self.file1)) self.assertTrue(os.path.exists(self.file6)) - self.assertEqual(cmd.remove_all_targets(), 1) + self.assertFalse(cmd.remove_all_targets()) self.assertFalse(os.path.exists(dir11_full)) self.assertFalse(os.path.exists(self.file5)) @@ -146,7 +146,7 @@ class TestRemoveEndToEnd(DirHierarchyEnvironment): self.assertTrue(os.path.exists(dir2_full)) self.assertTrue(os.path.exists(self.file1)) - self.assertEqual(cmd.remove_all_targets(), 0) + self.assertTrue(cmd.remove_all_targets()) self.assertFalse(os.path.exists(dir11_full)) self.assertFalse(os.path.exists(self.file5))