diff --git a/dvc/hash_info.py b/dvc/hash_info.py index cfba288ca8..043bc01c36 100644 --- a/dvc/hash_info.py +++ b/dvc/hash_info.py @@ -11,12 +11,14 @@ class HashInfo: PARAM_SIZE = "size" PARAM_NFILES = "nfiles" + PARAM_MODE = "mode" name: Optional[str] value: Optional[str] dir_info: Optional[DirInfo] = field(default=None, compare=False) size: Optional[int] = field(default=None, compare=False) nfiles: Optional[int] = field(default=None, compare=False) + mode: Optional[str] = field(default=None, compare=False) def __bool__(self): return bool(self.value) @@ -43,6 +45,9 @@ def to_dict(self): ret[self.PARAM_SIZE] = self.size if self.nfiles is not None: ret[self.PARAM_NFILES] = self.nfiles + if self.mode is not None: + ret[self.PARAM_MODE] = self.mode + return ret @property diff --git a/dvc/stage/__init__.py b/dvc/stage/__init__.py index 533e995fe7..18adad6b04 100644 --- a/dvc/stage/__init__.py +++ b/dvc/stage/__init__.py @@ -135,6 +135,7 @@ def __init__( dvcfile=None, desc=None, meta=None, + mode=None, ): if deps is None: deps = [] @@ -154,6 +155,7 @@ def __init__( self._dvcfile = dvcfile self.desc = desc self.meta = meta + self.mode = mode self.raw_data = RawData() @property diff --git a/dvc/stage/params.py b/dvc/stage/params.py index 14ca18b250..70f9496137 100644 --- a/dvc/stage/params.py +++ b/dvc/stage/params.py @@ -12,3 +12,4 @@ class StageParams: PARAM_METRICS = "metrics" PARAM_PLOTS = "plots" PARAM_DESC = "desc" + PARAM_MODE = "mode" diff --git a/dvc/stage/utils.py b/dvc/stage/utils.py index c59503458b..bf419925ff 100644 --- a/dvc/stage/utils.py +++ b/dvc/stage/utils.py @@ -210,6 +210,7 @@ def get_dump(stage): stage.PARAM_OUTS: [o.dumpd() for o in stage.outs], stage.PARAM_ALWAYS_CHANGED: stage.always_changed, stage.PARAM_META: stage.meta, + stage.PARAM_MODE: stage.mode, }.items() if value } diff --git a/dvc/state.py b/dvc/state.py index a7702066d9..b084deefd5 100644 --- a/dvc/state.py +++ b/dvc/state.py @@ -455,7 +455,10 @@ def get(self, path_info): return None self._update_state_record_timestamp_for_inode(actual_inode) - return HashInfo("md5", value, size=int(actual_size)) + + mode = oct(os.stat(path).st_mode) + + return HashInfo("md5", value, size=int(actual_size), mode=mode) def save_link(self, path_info): """Adds the specified path to the list of links created by dvc. This diff --git a/tests/func/test_add.py b/tests/func/test_add.py index 216d742fc2..93598e4c75 100644 --- a/tests/func/test_add.py +++ b/tests/func/test_add.py @@ -38,6 +38,8 @@ def test_add(tmp_dir, dvc): assert stage is not None + mode = oct(os.stat(stage.path).st_mode) + assert isinstance(stage, Stage) assert os.path.isfile(stage.path) assert len(stage.outs) == 1 @@ -52,6 +54,7 @@ def test_add(tmp_dir, dvc): "md5": "acbd18db4cc2f85cedef654fccc4a4d8", "path": "foo", "size": 3, + "mode": mode } ], }