[PATCH] shelve: drop pickle usage

pierre-yves.david at ens-lyon.org pierre-yves.david at ens-lyon.org
Mon Oct 14 17:11:32 UTC 2013


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1381769952 -7200
#      Mon Oct 14 18:59:12 2013 +0200
# Node ID 1beaedd7faaa9cf2a645b4d9c7d19fd5b4e75523
# Parent  740bf14129972cc0c4406790785f392bec6aec52
shelve: drop pickle usage

Pickle was used to the `shelvedstate` file. However the content of the file is
very simple and we can handle serialisation ourself. Not using pickle is a net
win.

Note incrementing the format version as no releases have been done so far.

diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -19,17 +19,12 @@ conflicts if necessary.
 You can have more than one shelved change outstanding at a time; each
 shelved change has a distinct name. For details, see the help for "hg
 shelve".
 """
 
-try:
-    import cPickle as pickle
-    pickle.dump # import now
-except ImportError:
-    import pickle
 from mercurial.i18n import _
-from mercurial.node import nullid
+from mercurial.node import nullid, bin, hex
 from mercurial import changegroup, cmdutil, scmutil, phases
 from mercurial import error, hg, mdiff, merge, patch, repair, util
 from mercurial import templatefilters
 from mercurial import lock as lockmod
 import errno
@@ -90,15 +85,21 @@ class shelvedstate(object):
     _filename = 'shelvedstate'
 
     @classmethod
     def load(cls, repo):
         fp = repo.opener(cls._filename)
-        (version, name, parents, stripnodes) = pickle.load(fp)
+        try:
+            version = int(fp.readline().strip())
 
-        if version != cls._version:
-            raise util.Abort(_('this version of shelve is incompatible '
-                               'with the version used in this repo'))
+            if version != cls._version:
+                raise util.Abort(_('this version of shelve is incompatible '
+                                   'with the version used in this repo'))
+            name = fp.readline().strip()
+            parents = [bin(h) for h in fp.readline().split()]
+            stripnodes = [bin(h) for h in fp.readline().split()]
+        finally:
+            fp.close()
 
         obj = cls()
         obj.name = name
         obj.parents = parents
         obj.stripnodes = stripnodes
@@ -106,13 +107,14 @@ class shelvedstate(object):
         return obj
 
     @classmethod
     def save(cls, repo, name, stripnodes):
         fp = repo.opener(cls._filename, 'wb')
-        pickle.dump((cls._version, name,
-                     repo.dirstate.parents(),
-                     stripnodes), fp)
+        fp.write('%i\n' % cls._version)
+        fp.write('%s\n' % name)
+        fp.write('%s\n' % ' '.join([hex(p) for p in repo.dirstate.parents()]))
+        fp.write('%s\n' % ' '.join([hex(n) for n in stripnodes]))
         fp.close()
 
     @classmethod
     def clear(cls, repo):
         util.unlinkpath(repo.join(cls._filename), ignoremissing=True)



More information about the Mercurial-devel mailing list