Mercurial > hg
diff hgext/remotefilelog/historypack.py @ 40506:10c10da14c5d
remotefilelog: bump pack file formats to version 2
Drop support for format 0 and 1 packs. Version 2 will be different in
that it'll use zlib compression instead of lz4, as the latter isn't
really suitable for core.
If I can make it work, I'll make compression engines pluggable, but
the logic for handling these files is spread out enough it's a little
tricky to get that right.
Test changes are only due to pack files being renamed. The contents of
the packs are the same.
Differential Revision: https://phab.mercurial-scm.org/D4943
author | Augie Fackler <augie@google.com> |
---|---|
date | Wed, 03 Oct 2018 23:25:31 -0400 |
parents | 3a333a582d7b |
children | e0b485a76009 |
line wrap: on
line diff
--- a/hgext/remotefilelog/historypack.py Wed Oct 03 23:47:43 2018 -0400 +++ b/hgext/remotefilelog/historypack.py Wed Oct 03 23:25:31 2018 -0400 @@ -15,10 +15,8 @@ ) # (filename hash, offset, size) -INDEXFORMAT0 = '!20sQQ' -INDEXENTRYLENGTH0 = struct.calcsize(INDEXFORMAT0) -INDEXFORMAT1 = '!20sQQII' -INDEXENTRYLENGTH1 = struct.calcsize(INDEXFORMAT1) +INDEXFORMAT2 = '!20sQQII' +INDEXENTRYLENGTH2 = struct.calcsize(INDEXFORMAT2) NODELENGTH = 20 NODEINDEXFORMAT = '!20sQ' @@ -84,17 +82,12 @@ INDEXSUFFIX = INDEXSUFFIX PACKSUFFIX = PACKSUFFIX - SUPPORTED_VERSIONS = [0, 1] + SUPPORTED_VERSIONS = [2] def __init__(self, path): super(historypack, self).__init__(path) - - if self.VERSION == 0: - self.INDEXFORMAT = INDEXFORMAT0 - self.INDEXENTRYLENGTH = INDEXENTRYLENGTH0 - else: - self.INDEXFORMAT = INDEXFORMAT1 - self.INDEXENTRYLENGTH = INDEXENTRYLENGTH1 + self.INDEXFORMAT = INDEXFORMAT2 + self.INDEXENTRYLENGTH = INDEXENTRYLENGTH2 def getmissing(self, keys): missing = [] @@ -215,22 +208,17 @@ raise KeyError(name) rawentry = struct.unpack(self.INDEXFORMAT, entry) - if self.VERSION == 0: - x, offset, size = rawentry - nodeindexoffset = None - nodeindexsize = None - else: - x, offset, size, nodeindexoffset, nodeindexsize = rawentry - rawnamelen = self._index[nodeindexoffset:nodeindexoffset + - constants.FILENAMESIZE] - actualnamelen = struct.unpack('!H', rawnamelen)[0] - nodeindexoffset += constants.FILENAMESIZE - actualname = self._index[nodeindexoffset:nodeindexoffset + - actualnamelen] - if actualname != name: - raise KeyError("found file name %s when looking for %s" % - (actualname, name)) - nodeindexoffset += actualnamelen + x, offset, size, nodeindexoffset, nodeindexsize = rawentry + rawnamelen = self._index[nodeindexoffset:nodeindexoffset + + constants.FILENAMESIZE] + actualnamelen = struct.unpack('!H', rawnamelen)[0] + nodeindexoffset += constants.FILENAMESIZE + actualname = self._index[nodeindexoffset:nodeindexoffset + + actualnamelen] + if actualname != name: + raise KeyError("found file name %s when looking for %s" % + (actualname, name)) + nodeindexoffset += actualnamelen filenamelength = struct.unpack('!H', self._data[offset:offset + constants.FILENAMESIZE])[0] @@ -406,24 +394,16 @@ INDEXSUFFIX = INDEXSUFFIX PACKSUFFIX = PACKSUFFIX - SUPPORTED_VERSIONS = [0, 1] + SUPPORTED_VERSIONS = [2] - def __init__(self, ui, packpath, version=0): - # internal config: remotefilelog.historypackv1 - if version == 0 and ui.configbool('remotefilelog', 'historypackv1'): - version = 1 - + def __init__(self, ui, packpath, version=2): super(mutablehistorypack, self).__init__(ui, packpath, version=version) self.files = {} self.entrylocations = {} self.fileentries = {} - if version == 0: - self.INDEXFORMAT = INDEXFORMAT0 - self.INDEXENTRYLENGTH = INDEXENTRYLENGTH0 - else: - self.INDEXFORMAT = INDEXFORMAT1 - self.INDEXENTRYLENGTH = INDEXENTRYLENGTH1 + self.INDEXFORMAT = INDEXFORMAT2 + self.INDEXENTRYLENGTH = INDEXENTRYLENGTH2 self.NODEINDEXFORMAT = NODEINDEXFORMAT self.NODEINDEXENTRYLENGTH = NODEINDEXENTRYLENGTH @@ -499,7 +479,6 @@ fileindexlength = self.INDEXENTRYLENGTH nodeindexformat = self.NODEINDEXFORMAT nodeindexlength = self.NODEINDEXENTRYLENGTH - version = self.VERSION files = ((hashlib.sha1(filename).digest(), filename, offset, size) for filename, (offset, size) in self.files.iteritems()) @@ -515,31 +494,27 @@ nodecount = 0 for namehash, filename, offset, size in files: # File section index - if version == 0: - rawentry = struct.pack(fileindexformat, namehash, offset, size) - else: - nodelocations = self.entrylocations[filename] + nodelocations = self.entrylocations[filename] - nodeindexsize = len(nodelocations) * nodeindexlength + nodeindexsize = len(nodelocations) * nodeindexlength - rawentry = struct.pack(fileindexformat, namehash, offset, size, - nodeindexoffset, nodeindexsize) - # Node index - nodeindexentries.append(struct.pack(constants.FILENAMESTRUCT, - len(filename)) + filename) - nodeindexoffset += constants.FILENAMESIZE + len(filename) + rawentry = struct.pack(fileindexformat, namehash, offset, size, + nodeindexoffset, nodeindexsize) + # Node index + nodeindexentries.append(struct.pack(constants.FILENAMESTRUCT, + len(filename)) + filename) + nodeindexoffset += constants.FILENAMESIZE + len(filename) - for node, location in sorted(nodelocations.iteritems()): - nodeindexentries.append(struct.pack(nodeindexformat, node, - location)) - nodecount += 1 + for node, location in sorted(nodelocations.iteritems()): + nodeindexentries.append(struct.pack(nodeindexformat, node, + location)) + nodecount += 1 - nodeindexoffset += len(nodelocations) * nodeindexlength + nodeindexoffset += len(nodelocations) * nodeindexlength fileindexentries.append(rawentry) nodecountraw = '' - if version == 1: - nodecountraw = struct.pack('!Q', nodecount) + nodecountraw = struct.pack('!Q', nodecount) return (''.join(fileindexentries) + nodecountraw + ''.join(nodeindexentries))