[PATCH 1 of 2 v2] histedit: only use pickle if not using the modern save format

Bryan O'Sullivan bos at serpentine.com
Wed Dec 23 07:21:11 UTC 2015


# HG changeset patch
# User Bryan O'Sullivan <bos at serpentine.com>
# Date 1450855191 28800
#      Tue Dec 22 23:19:51 2015 -0800
# Node ID e50f16d18a6b2c295dba7819cc4de7a2a3c531e1
# Parent  eae73721d41a0242f285a39f61da85eb8b62ac2e
histedit: only use pickle if not using the modern save format

This avoids a case where PyPy's cPickle module throws a more confusing
error than CPython's.

diff --git a/hgext/histedit.py b/hgext/histedit.py
--- a/hgext/histedit.py
+++ b/hgext/histedit.py
@@ -252,19 +252,19 @@ class histeditstate(object):
     def read(self):
         """Load histedit state from disk and set fields appropriately."""
         try:
-            fp = self.repo.vfs('histedit-state', 'r')
+            state = self.repo.vfs.read('histedit-state')
         except IOError as err:
             if err.errno != errno.ENOENT:
                 raise
             raise error.Abort(_('no histedit in progress'))
 
-        try:
-            data = pickle.load(fp)
+        if state.startswith('v1\n'):
+            data = self._load()
+            parentctxnode, rules, keep, topmost, replacements, backupfile = data
+        else:
+            data = pickle.loads(state)
             parentctxnode, rules, keep, topmost, replacements = data
             backupfile = None
-        except pickle.UnpicklingError:
-            data = self._load()
-            parentctxnode, rules, keep, topmost, replacements, backupfile = data
 
         self.parentctxnode = parentctxnode
         rules = "\n".join(["%s %s" % (verb, rest) for [verb, rest] in rules])


More information about the Mercurial-devel mailing list