Patchwork D2855: graft: add a version number to the state file formats

login
register
mail settings
Submitter phabricator
Date March 14, 2018, 8:55 a.m.
Message ID <differential-rev-PHID-DREV-b7vmky5nfo54sm7jfs64-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/29484/
State Superseded
Headers show

Comments

phabricator - March 14, 2018, 8:55 a.m.
pulkit created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  Adding version number to state file formats can help us in preventing an older
  mercurial try to read a newer graft state file which can cause issues.
  Moreover, the version numbers can help in lot of other ways also.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/commands.py
  mercurial/state.py

CHANGE DETAILS




To: pulkit, #hg-reviewers
Cc: mercurial-devel
phabricator - March 27, 2018, 1:12 p.m.
yuja added a comment.


  Perhaps the version shouldn't be in the CBOR data structure, because future
  state file might not be a superset of CBOR.

REPOSITORY
  rHG Mercurial

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

To: pulkit, #hg-reviewers
Cc: yuja, mercurial-devel
phabricator - June 14, 2018, 8:13 p.m.
pulkit abandoned this revision.
pulkit added a comment.


  In https://phab.mercurial-scm.org/D2855#47833, @yuja wrote:
  
  > Perhaps the version shouldn't be in the CBOR data structure, because future
  >  state file might not be a superset of CBOR.
  
  
  That was a very nice suggestion. Thanks!
  
  Abandoning since it's not required anymore because now by default, state.cmdstate() write version numbers in plain text.

REPOSITORY
  rHG Mercurial

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

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

Patch

diff --git a/mercurial/state.py b/mercurial/state.py
--- a/mercurial/state.py
+++ b/mercurial/state.py
@@ -117,4 +117,4 @@ 
 @readoldstatefile('graftstate')
 def oldgraftstate(fp):
     nodes = fp.read().splitlines()
-    return {'nodes': nodes}
+    return {'version': 0, 'nodes': nodes}
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -2177,8 +2177,13 @@ 
         # read in unfinished revisions
         if cmdstate:
             cmdstate.load()
-            nodes = cmdstate['nodes']
-            revs = [repo[node].rev() for node in nodes]
+            if cmdstate['version'] < 2:
+                nodes = cmdstate['nodes']
+                revs = [repo[node].rev() for node in nodes]
+            else:
+                # state-file is written by a newer mercurial than what we are
+                # using
+                raise error.Abort(_("unable to read to read the state file"))
         else:
             cmdutil.wrongtooltocontinue(repo, _('graft'))
     else:
@@ -2305,7 +2310,7 @@ 
             if stats and stats[3] > 0:
                 # write out state for --continue
                 nodelines = [repo[rev].hex() for rev in revs[pos:]]
-                cmdstate.addopts({'nodes': nodelines})
+                cmdstate.addopts({'version': 1, 'nodes': nodelines})
                 cmdstate.save()
                 extra = ''
                 if opts.get('user'):