mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-10 07:18:27 +01:00
Merge pull request #418 from efiop/master
state: don't forget to track inode
This commit is contained in:
+5
-2
@@ -94,6 +94,9 @@ class Dependency(object):
|
||||
def mtime(self):
|
||||
return os.path.getmtime(self.path)
|
||||
|
||||
def inode(self):
|
||||
return os.stat(self.path).st_ino
|
||||
|
||||
def update(self):
|
||||
if not os.path.exists(self.path):
|
||||
raise CmdOutputDoesNotExistError(self.rel_path)
|
||||
@@ -101,14 +104,14 @@ class Dependency(object):
|
||||
raise CmdOutputIsNotFileError(self.path)
|
||||
|
||||
state = self.project.state.get(self.path)
|
||||
if state and state.mtime == self.mtime():
|
||||
if state and state.mtime == self.mtime() and state.inode == self.inode():
|
||||
md5 = state.md5
|
||||
msg = '{} using md5 {} from state file'
|
||||
self.project.logger.debug(msg.format(self.path, md5))
|
||||
self.md5 = md5
|
||||
else:
|
||||
self.md5 = file_md5(self.path)[0]
|
||||
self.project.state.update(self.path, self.md5, self.mtime())
|
||||
self.project.state.update(self.path, self.md5, self.mtime(), self.inode())
|
||||
|
||||
def dumpd(self, cwd):
|
||||
return {
|
||||
|
||||
+14
-9
@@ -8,30 +8,35 @@ class StateEntry(object):
|
||||
PARAM_PATH = 'path'
|
||||
PARAM_MTIME = 'mtime'
|
||||
PARAM_MD5 = 'md5'
|
||||
PARAM_INODE = 'inode'
|
||||
|
||||
def __init__(self, root_dir, path, md5, mtime):
|
||||
def __init__(self, root_dir, path, md5, mtime, inode):
|
||||
self.root_dir = root_dir
|
||||
self.path = path
|
||||
self.mtime = mtime
|
||||
self.md5 = md5
|
||||
self.inode = inode
|
||||
self.dvc_path = os.path.relpath(self.path, self.root_dir)
|
||||
|
||||
def update(self, md5, mtime):
|
||||
def update(self, md5, mtime, inode):
|
||||
self.mtime = mtime
|
||||
self.md5 = md5
|
||||
self.inode = inode
|
||||
|
||||
@staticmethod
|
||||
def loadd(root_dir, d):
|
||||
path = os.path.join(root_dir, d[StateEntry.PARAM_PATH])
|
||||
mtime = d[StateEntry.PARAM_MTIME]
|
||||
md5 = d[StateEntry.PARAM_MD5]
|
||||
return StateEntry(root_dir, path, md5, mtime)
|
||||
inode = d[StateEntry.PARAM_INODE]
|
||||
return StateEntry(root_dir, path, md5, mtime, inode)
|
||||
|
||||
def dumpd(self):
|
||||
return {
|
||||
self.PARAM_PATH: self.dvc_path,
|
||||
self.PARAM_MD5: self.md5,
|
||||
self.PARAM_MTIME: self.mtime
|
||||
self.PARAM_MTIME: self.mtime,
|
||||
self.PARAM_INODE: self.inode
|
||||
}
|
||||
|
||||
|
||||
@@ -53,18 +58,18 @@ class State(object):
|
||||
def init(root_dir, dvc_dir):
|
||||
return State(root_dir, dvc_dir)
|
||||
|
||||
def update(self, path, md5, mtime):
|
||||
def update(self, path, md5, mtime, inode):
|
||||
existing = self.get(path)
|
||||
if not existing:
|
||||
return self.add(path, md5, mtime)
|
||||
return self.add(path, md5, mtime, inode)
|
||||
|
||||
state = StateEntry(self.root_dir, path, md5, mtime)
|
||||
state = StateEntry(self.root_dir, path, md5, mtime, inode)
|
||||
self._db.update(state.dumpd(), self._q.path == state.dvc_path)
|
||||
|
||||
return state
|
||||
|
||||
def add(self, path, md5, mtime):
|
||||
entry = StateEntry(self.root_dir, path, md5, mtime)
|
||||
def add(self, path, md5, mtime, inode):
|
||||
entry = StateEntry(self.root_dir, path, md5, mtime, inode)
|
||||
self._db.insert(entry.dumpd())
|
||||
return entry
|
||||
|
||||
|
||||
+6
-2
@@ -12,20 +12,24 @@ class TestState(TestDvc):
|
||||
md5_2 = '2'
|
||||
mtime_1 = 1
|
||||
mtime_2 = 2
|
||||
inode_1 = 1
|
||||
inode_2 = 2
|
||||
|
||||
state = State(self.dvc.root_dir, self.dvc.dvc_dir)
|
||||
self.assertIsNone(state.get(path))
|
||||
|
||||
state.add(path, md5_1, mtime_1)
|
||||
state.add(path, md5_1, mtime_1, inode_1)
|
||||
entry = state.get(path)
|
||||
self.assertIsInstance(entry, StateEntry)
|
||||
self.assertEqual(entry.path, path)
|
||||
self.assertEqual(entry.md5, md5_1)
|
||||
self.assertEqual(entry.mtime, mtime_1)
|
||||
self.assertEqual(entry.inode, inode_1)
|
||||
|
||||
state.update(path, md5_2, mtime_2)
|
||||
state.update(path, md5_2, mtime_2, inode_2)
|
||||
entry = state.get(path)
|
||||
self.assertIsInstance(entry, StateEntry)
|
||||
self.assertEqual(entry.path, path)
|
||||
self.assertEqual(entry.md5, md5_2)
|
||||
self.assertEqual(entry.mtime, mtime_2)
|
||||
self.assertEqual(entry.inode, inode_2)
|
||||
|
||||
Reference in New Issue
Block a user