diff --git a/remotefilelog/datapack.py b/remotefilelog/datapack.py --- a/remotefilelog/datapack.py +++ b/remotefilelog/datapack.py @@ -145,28 +145,7 @@ # Read chain data deltachain = [] for node, deltabaseoffset, offset, size in chain: - rawentry = self._data[offset:offset + size] - self._pagedin += len(rawentry) - - # <2 byte len> + - lengthsize = 2 - filenamelen = struct.unpack('!H', rawentry[:2])[0] - filename = rawentry[lengthsize:lengthsize + filenamelen] - - # <20 byte node> + <20 byte deltabase> - nodestart = lengthsize + filenamelen - deltabasestart = nodestart + NODELENGTH - node = rawentry[nodestart:deltabasestart] - deltabasenode = rawentry[deltabasestart:deltabasestart + NODELENGTH] - - # <8 byte len> + - deltastart = deltabasestart + NODELENGTH - rawdeltalen = rawentry[deltastart:deltastart + 8] - deltalen = struct.unpack('!Q', rawdeltalen)[0] - - delta = rawentry[deltastart + 8:deltastart + 8 + deltalen] - delta = lz4decompress(delta) - + filename, node, deltabasenode, delta = self._readentry(offset, size) deltachain.append((filename, node, filename, deltabasenode, delta)) # If we've read a lot of data from the mmap, free some memory. @@ -174,6 +153,42 @@ return deltachain + def _readentry(self, offset, size, getmeta=False): + rawentry = self._data[offset:offset + size] + self._pagedin += len(rawentry) + + # <2 byte len> + + lengthsize = 2 + filenamelen = struct.unpack('!H', rawentry[:2])[0] + filename = rawentry[lengthsize:lengthsize + filenamelen] + + # <20 byte node> + <20 byte deltabase> + nodestart = lengthsize + filenamelen + deltabasestart = nodestart + NODELENGTH + node = rawentry[nodestart:deltabasestart] + deltabasenode = rawentry[deltabasestart:deltabasestart + NODELENGTH] + + # <8 byte len> + + deltastart = deltabasestart + NODELENGTH + rawdeltalen = rawentry[deltastart:deltastart + 8] + deltalen = struct.unpack('!Q', rawdeltalen)[0] + + delta = rawentry[deltastart + 8:deltastart + 8 + deltalen] + delta = lz4decompress(delta) + + if getmeta: + if self.VERSION == 0: + meta = {} + else: + metastart = deltastart + 8 + deltalen + metalen = struct.unpack_from('!I', rawentry, metastart)[0] + + rawmeta = rawentry[metastart + 4:metastart + 4 + metalen] + meta = shallowutil.parsepackmeta(rawmeta) + return filename, node, deltabasenode, delta, meta + else: + return filename, node, deltabasenode, delta + def add(self, name, node, data): raise RuntimeError("cannot add to datapack (%s:%s)" % (name, node))