marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Having a unique index will allow for ambiguity less rewriting of revlog 
content,
  something useful to clarify handling of some operation like censoring or
  stripping.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D10771

AFFECTED FILES
  mercurial/revlogutils/docket.py
  tests/test-revlog-v2.t

CHANGE DETAILS

diff --git a/tests/test-revlog-v2.t b/tests/test-revlog-v2.t
--- a/tests/test-revlog-v2.t
+++ b/tests/test-revlog-v2.t
@@ -67,3 +67,19 @@
   $ f --hexdump --bytes 4 .hg/store/data/foo.i
   .hg/store/data/foo.i:
   0000: 00 00 de ad                                     |....|
+
+The expected files are generated
+--------------------------------
+
+We should have have:
+- a docket
+- a index file with a unique name
+- a data file
+
+  $ ls .hg/store/00changelog* .hg/store/00manifest*
+  .hg/store/00changelog-b870a51b.idx
+  .hg/store/00changelog.d
+  .hg/store/00changelog.i
+  .hg/store/00manifest-88698448.idx
+  .hg/store/00manifest.d
+  .hg/store/00manifest.i
diff --git a/mercurial/revlogutils/docket.py b/mercurial/revlogutils/docket.py
--- a/mercurial/revlogutils/docket.py
+++ b/mercurial/revlogutils/docket.py
@@ -88,12 +88,13 @@
 # * 4 bytes: revlog version
 #          |   This is mandatory as docket must be compatible with the previous
 #          |   revlog index header.
+# * 1 bytes: size of index uuid
 # * 8 bytes: size of index-data
 # * 8 bytes: pending size of index-data
 # * 8 bytes: size of data
 # * 8 bytes: pending size of data
 # * 1 bytes: default compression header
-S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'LLLLc')
+S_HEADER = struct.Struct(constants.INDEX_HEADER.format + 'BLLLLc')
 
 
 class RevlogDocket(object):
@@ -104,6 +105,7 @@
         revlog,
         use_pending=False,
         version_header=None,
+        index_uuid=None,
         index_end=0,
         pending_index_end=0,
         data_end=0,
@@ -116,6 +118,7 @@
         self._radix = revlog.radix
         self._path = revlog._docket_file
         self._opener = revlog.opener
+        self._index_uuid = index_uuid
         # thes asserts should be True as long as we have a single index 
filename
         assert index_end <= pending_index_end
         assert data_end <= pending_data_end
@@ -134,7 +137,9 @@
     def index_filepath(self):
         """file path to the current index file associated to this docket"""
         # very simplistic version at first
-        return b"%s.idx" % self._radix
+        if self._index_uuid is None:
+            self._index_uuid = make_uid()
+        return b"%s-%s.idx" % (self._radix, self._index_uuid)
 
     @property
     def index_end(self):
@@ -189,13 +194,17 @@
         assert official_data_end <= self._data_end
         data = (
             self._version_header,
+            len(self._index_uuid),
             official_index_end,
             self._index_end,
             official_data_end,
             self._data_end,
             self.default_compression_header,
         )
-        return S_HEADER.pack(*data)
+        s = []
+        s.append(S_HEADER.pack(*data))
+        s.append(self._index_uuid)
+        return b''.join(s)
 
 
 def default_docket(revlog, version_header):
@@ -216,16 +225,21 @@
 def parse_docket(revlog, data, use_pending=False):
     """given some docket data return a docket object for the given revlog"""
     header = S_HEADER.unpack(data[: S_HEADER.size])
+    offset = S_HEADER.size
     version_header = header[0]
-    index_size = header[1]
-    pending_index_size = header[2]
-    data_size = header[3]
-    pending_data_size = header[4]
-    default_compression_header = header[5]
+    index_uuid_size = header[1]
+    index_uuid = data[offset : offset + index_uuid_size]
+    offset += index_uuid_size
+    index_size = header[2]
+    pending_index_size = header[3]
+    data_size = header[4]
+    pending_data_size = header[5]
+    default_compression_header = header[6]
     docket = RevlogDocket(
         revlog,
         use_pending=use_pending,
         version_header=version_header,
+        index_uuid=index_uuid,
         index_end=index_size,
         pending_index_end=pending_index_size,
         data_end=data_size,



To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to