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