diff --git a/dvc/command/import_file.py b/dvc/command/import_file.py index e820cdada..55e552633 100644 --- a/dvc/command/import_file.py +++ b/dvc/command/import_file.py @@ -137,7 +137,7 @@ class CmdImportFile(CmdBase): System.symlink(data_item.symlink_file, data_item.data.relative) state_file = StateFile(StateFile.COMMAND_IMPORT_FILE, - data_item.state.relative, + data_item, self.settings, argv=[input, output], input_files=[], diff --git a/dvc/command/init.py b/dvc/command/init.py index f1a8043c1..bf8ee12bb 100644 --- a/dvc/command/init.py +++ b/dvc/command/init.py @@ -131,13 +131,12 @@ ProjectName = empty_data_path = os.path.join(self.parsed_args.data_dir, self.EMPTY_FILE_NAME) cache_file_suffix = self.EMPTY_FILE_NAME + '_' + self.EMPTY_FILE_CHECKSUM empty_cache_path = os.path.join(Config.CONFIG_DIR, Config.CACHE_DIR, cache_file_suffix) - empty_state_path = os.path.join(Config.CONFIG_DIR, Config.STATE_DIR, self.EMPTY_FILE_NAME + '.state') open(empty_cache_path, 'w').close() System.symlink(os.path.join('..', empty_cache_path), empty_data_path) StateFile(StateFile.COMMAND_EMPTY_FILE, - empty_state_path, + self.settings.path_factory.data_item(empty_data_path), self.settings, input_files=[], output_files=[], diff --git a/dvc/command/lock.py b/dvc/command/lock.py index b2dc9e0be..9b8f8a674 100644 --- a/dvc/command/lock.py +++ b/dvc/command/lock.py @@ -18,7 +18,7 @@ class CmdLock(CmdBase): for file in files: try: data_item = self.settings.path_factory.existing_data_item(file) - state = StateFile.load(data_item.state.relative, self.settings) + state = StateFile.load(data_item, self.settings) if state.locked and target: Logger.warn('Data item {} is already locked'.format(data_item.data.relative)) diff --git a/dvc/command/repro.py b/dvc/command/repro.py index 6f9662cbb..e96f79dfb 100644 --- a/dvc/command/repro.py +++ b/dvc/command/repro.py @@ -123,7 +123,7 @@ class ReproChange(object): raise ReproError('data item {} is not symlink'.format(data_item.data.relative)) try: - self._state = StateFile.load(data_item.state.relative, self.git) + self._state = StateFile.load(data_item, self.git) except Exception as ex: raise ReproError('Error: state file "{}" cannot be loaded: {}'. format(data_item.state.relative, ex)) @@ -257,7 +257,7 @@ class ReproChange(object): return result def is_repro_required(self, changed_files, data_item): - state_file = StateFile.load(data_item.state.relative, self._settings) + state_file = StateFile.load(data_item, self._settings) if state_file.locked: Logger.debug(u'Repro is not required for locked data item {}'.format(data_item.data.relative)) return False diff --git a/dvc/command/run.py b/dvc/command/run.py index 489345e49..662d4499c 100644 --- a/dvc/command/run.py +++ b/dvc/command/run.py @@ -123,7 +123,7 @@ class CmdRun(CmdBase): Logger.debug('Create state file "{}"'.format(data_item.state.relative)) state_file = StateFile(StateFile.COMMAND_RUN, - data_item.state.relative, + data_item, self.settings, input_files_dvc, output_files_dvc, diff --git a/dvc/command/show_pipeline.py b/dvc/command/show_pipeline.py index e8e168bf4..55f0c6e03 100644 --- a/dvc/command/show_pipeline.py +++ b/dvc/command/show_pipeline.py @@ -68,7 +68,7 @@ class CmdShowPipeline(Traverse): def process_file(self, target): data_item = self._get_data_item(target) name = data_item.data.relative - state = StateFile.load(data_item.state.relative, self.git) + state = StateFile.load(data_item, self.git) if name == os.path.join(self.settings.config.data_dir, CmdInit.EMPTY_FILE_NAME): return diff --git a/dvc/state_file.py b/dvc/state_file.py index 39a6b5be2..b474dac4b 100644 --- a/dvc/state_file.py +++ b/dvc/state_file.py @@ -42,7 +42,7 @@ class StateFile(object): def __init__(self, command, - file, + data_item, settings, input_files, output_files, @@ -54,7 +54,8 @@ class StateFile(object): created_at=time.strftime('%Y-%m-%d %H:%M:%S %z'), cwd=None, shell=False): - self.file = file + self.data_item = data_item + self.file = data_item.state.relative self.settings = settings self.input_files = input_files self.output_files = output_files @@ -123,12 +124,12 @@ class StateFile(object): return StateFile.encode_paths([p])[0] @staticmethod - def load(filename, settings): - with open(filename, 'r') as fd: + def load(data_item, settings): + with open(data_item.state.relative, 'r') as fd: data = json.load(fd) return StateFile(StateFile.decode_path(data.get(StateFile.PARAM_COMMAND)), - filename, + data_item, settings, StateFile.decode_paths(data.get(StateFile.PARAM_INPUT_FILES, [])), StateFile.decode_paths(data.get(StateFile.PARAM_OUTPUT_FILES, [])),