in contrib/server-side/fsfsverify.py [0:0]
def __init__(self, f, currentRev):
self.pred = None
self.text = None
self.props = None
self.cpath = None
self.copyroot = None
self.copyfrom = None
self.dir = []
self.nodeOffset = f.tell()
while True:
currentOffset = f.tell()
line = f.readline()
if line == '':
raise IOError, "Unexpected end of file at offset %d" % currentOffset
if line == '\n':
break
# break apart the line
try:
(field, value) = line.split(':', 1)
except:
print("line: '%s'" % repr(line))
print("Node revision offset: %i" % self.nodeOffset)
print("Current file position: %i" % f.tell())
raise
if field == "":
print("line: '%s'" % repr(line))
print("Node revision offset: %i" % self.nodeOffset)
print("Current file position: %i" % f.tell())
raise Exception("Empty field in node revision")
# pull of the leading space and trailing new line
if len(value) < 2:
raise FsfsVerifyException("value needs to contain 2 or more bytes (%d)" % currentOffset)
value = value[1:-1]
assert value != ""
if field == 'id':
self.id = NodeId(value)
elif field == 'type':
self.type = NodeType(value)
elif field == 'pred':
self.pred = NodeId(value)
elif field == 'text':
values = value.split(' ')
rev = int(values[0])
offset = int(values[1])
length = int(values[2])
size = int(values[3])
digest = values[4]
if len(values) > 5:
sha1 = values[5]
else:
sha1 = None
if len(values) > 6:
uniquifier = values[6]
else:
uniquifier = None
if rev != currentRev:
contentType = None
else:
savedOffset = f.tell()
f.seek(offset)
contentType = f.read(5)
f.seek(savedOffset)
self.text = TextRep(rev, offset, length, size, digest,
contentType, currentRev, self, sha1, uniquifier)
elif field == 'props':
if len(value.split(' ')) == 5:
(rev, offset, length, size, digest) = value.split(' ')
else:
(rev, offset, length, size, digest, sha1, uniquifier) = value.split(' ')
rev = int(rev)
offset = int(offset)
length = int(length)
size = int(size)
if rev != currentRev:
contentType = None
else:
savedOffset = f.tell()
f.seek(offset)
contentType = f.read(5)
f.seek(savedOffset)
self.props = PropRep(rev, offset, length, size, digest,
contentType, currentRev, self)
elif field == 'cpath':
self.cpath = value
elif field == 'copyroot':
self.copyroot = value
elif field == 'copyfrom':
self.copyfrom = value
elif field == 'count' or field == 'minfo-cnt' or field == 'minfo-here':
pass
else:
raise Exception("Unrecognized field '%s'\n" % field)
if self.type.type == 'dir':
if self.text:
if self.id.rev == self.text.rev:
offset = f.tell()
f.seek(self.text.offset)
self.dir = getDirHash(f)
for k,v in self.dir.items():
nodeType, nodeId = v
if nodeId.rev != self.id.rev:
if not os.path.exists(str(nodeId.rev)):
print("Can't check %s" % repr(nodeId))
continue
tmp = open(str(nodeId.rev),'rb')
tmp.seek(nodeId.offset)
idLine = tmp.readline()
tmp.close()
else:
f.seek(nodeId.offset)
idLine = f.readline()
if idLine != ("id: %s\n" % nodeId):
raise DataCorrupt(
("Entry for '%s' at " % k ) +
("offset %d is pointing to an " % self.text.offset) +
("invalid location (node claims to be at offset %d)" % (
nodeId.offset))
)
f.seek(offset)
else:
# The directory entries are stored in another file.
print("Warning: dir entries are stored in rev %d for noderev %s" % (
self.text.rev, repr(self.id)))