D3579: state: write the version number in plain text on top of state files

pulkit (Pulkit Goyal) phabricator at mercurial-scm.org
Fri May 18 11:18:41 UTC 2018


pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We will soon be using CBOR format to write the data in state files. But we
  should not write the version number of the state files in CBOR format and we
  should rather write it in plain text because in future we can change the format
  of state files and we should be able to parse the version number of state file
  without requiring to understand a certain format.
  
  This will help us in making sure we have a good compatibility story with other
  versions of state files.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/state.py

CHANGE DETAILS

diff --git a/mercurial/state.py b/mercurial/state.py
--- a/mercurial/state.py
+++ b/mercurial/state.py
@@ -22,6 +22,7 @@
 from .thirdparty import cbor
 
 from . import (
+    error,
     util,
 )
 
@@ -51,18 +52,30 @@
         """read the existing state file and return a dict of data stored"""
         return self._read()
 
-    def save(self, data):
+    def save(self, version, data):
         """write all the state data stored to .hg/<filename> file
 
         we use third-party library cbor to serialize data to write in the file.
         """
+        try:
+            iv = int(version)
+        except ValueError:
+            raise error.ProgrammingError("version of state file should be"
+                                         " an integer")
+
         with self._repo.vfs(self.fname, 'wb', atomictemp=True) as fp:
+            fp.write('%d\n' % iv)
             cbor.dump(self.opts, fp, canonical=True)
 
     def _read(self):
         """reads the state file and returns a dictionary which contain
         data in the same format as it was before storing"""
         with self._repo.vfs(self.fname, 'rb') as fp:
+            try:
+                version = int(fp.readline())
+            except ValueError:
+                raise error.ProgrammingError("unknown version of state file"
+                                             " found")
             return cbor.load(fp)
 
     def delete(self):



To: pulkit, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list