[PATCH evolve-ext-V5] evolve: add new methods _evolvestatewrite, _evolvestateread, _evolvestatedelete

Shusen LIU liushusen at fb.com
Tue Jan 26 23:43:07 UTC 2016


# HG changeset patch
# User Shusen LIU <liushusen at fb.com>
# Date 1453329104 28800
#      Wed Jan 20 14:31:44 2016 -0800
# Node ID c82a0edf16d90727e307e2c4b17bd1202e414fb7
# Parent  ea7523380efa894213582ca1600dc472baa7b25e
evolve: add new methods _evolvestatewrite, _evolvestateread, _evolvestatedelete

This patch introduces three new methods to read/write/delete data in vfs file
'evolvestate'. Provide the first version of impl of these methods, the
_fm0evolvestateversion = 0.
This enable us to persist evolvestate data, restore evolvestate data, and
delete it after it's no longer needed. And allows us to support a continued
keywork to implement evolve state.

diff --git a/hgext/evolve.py b/hgext/evolve.py
--- a/hgext/evolve.py
+++ b/hgext/evolve.py
@@ -67,6 +67,7 @@
 import collections
 import socket
 import errno
+import json
 sha1re = re.compile(r'\b[0-9a-f]{6,40}\b')
 
 import mercurial
@@ -3723,3 +3724,40 @@
         repo._bookmarks[book] = dest.node()
     if oldbookmarks or destbookmarks:
         repo._bookmarks.recordchange(tr)
+
+## Parsing and writing of version "0"
+#
+# The file contains two line.
+# First line is the version number.
+# Second line is the the data in json format
+
+_fm0evolvestateversion = 0
+
+def _fm0evolvestateread(repo):
+    serialized_data = repo.vfs.read('evolvestate').split('\n')[1]
+    data = dict([(str(k), str(v))
+                 for k,v in json.loads(serialized_data).iteritems()])
+    return data
+
+def _fm0evolvestatewrite(repo, data):
+    serialized_data = json.dumps(data)
+    repo.vfs.write('evolvestate',
+                   '\n'.join([str(_fm0evolvestateversion), serialized_data]))
+
+# mapping to read/write various evolvestate formats
+# <version> -> (reader, writer)
+formats = {_fm0evolvestateversion: (_fm0evolvestateread, _fm0evolvestatewrite),}
+defaultversion = _fm0evolvestateversion
+
+def _evolvestatewrite(repo, data, version=defaultversion):
+    formats[version][1](repo, data)
+
+def _evolvestateread(repo):
+    diskversion = int(repo.vfs.read('evolvestate').split('\n')[0])
+    if diskversion not in formats:
+        raise error.Abort(_('parsing evolvestate: unknown version %r')
+                         % diskversion)
+    return formats[diskversion][0](repo)
+
+def _evolvestatedelete(repo):
+    util.unlinkpath(repo.join('evolvestate'), ignoremissing=True)


More information about the Mercurial-devel mailing list