def __init__()

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)))