diff --git a/dvc/state.py b/dvc/state.py index 836b59ec3..655d9dfd9 100644 --- a/dvc/state.py +++ b/dvc/state.py @@ -245,24 +245,19 @@ class State(object): @staticmethod def mtime_and_size(path): - size = 0 + size = os.path.getsize(path) mtime = os.path.getmtime(path) if os.path.isdir(path): for root, dirs, files in os.walk(path): - for dname in dirs: - p = os.path.join(root, dname) - m = os.path.getmtime(p) - if m > mtime: - mtime = m - - for fname in files: - p = os.path.join(root, fname) + for name in dirs + files: + p = os.path.join(root, name) st = os.stat(p) size += st.st_size m = st.st_mtime if m > mtime: mtime = m + # State of files handled by dvc is stored in db as TEXT. # We cast results to string for later comparisons with stored values. return str(int(nanotime.timestamp(mtime))), str(size) diff --git a/tests/unit/state.py b/tests/unit/state.py index b1608df10..18d6060a6 100644 --- a/tests/unit/state.py +++ b/tests/unit/state.py @@ -1,13 +1,23 @@ +import os + from dvc.state import State from tests.basic_env import TestDvc -class TestMtimeAndSizeReturnType(TestDvc): +class TestMtimeAndSize(TestDvc): def test(self): file_time, file_size = State.mtime_and_size(self.DATA) dir_time, dir_size = State.mtime_and_size(self.DATA_DIR) + actual_file_size = os.path.getsize(self.DATA) + actual_dir_size = (os.path.getsize(self.DATA_DIR) + + os.path.getsize(self.DATA) + + os.path.getsize(self.DATA_SUB_DIR) + + os.path.getsize(self.DATA_SUB)) + self.assertIs(type(file_time), str) self.assertIs(type(file_size), str) + self.assertEqual(file_size, str(actual_file_size)) self.assertIs(type(dir_time), str) self.assertIs(type(dir_size), str) + self.assertEqual(dir_size, str(actual_dir_size))