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

Shusen LIU liushusen at fb.com
Sun Dec 20 23:45:50 UTC 2015


# HG changeset patch
# User Shusen LIU <liushusen at fb.com>
# Date 1450654456 28800
#      Sun Dec 20 15:34:16 2015 -0800
# Node ID a14a183b9457ba733bd04cec0662ef6ac957845d
# Parent  52c276d2ddb2f076c84ef8258038ef7b5ee00fe4
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
@@ -3692,3 +3692,35 @@
         repo._bookmarks[book] = dest.node()
     if oldbookmarks or destbookmarks:
         repo._bookmarks.recordchange(tr)
+
+## Parsing and writing of version "0"
+#
+# The file contains one line, seperated by '\0', orig hex, dest hex, and commit
+# message. Assuming commitmsg cannot contain '\0'.
+#
+
+_fm0evolvestateversion = 0
+
+def _fm0evolvestateread(repo):
+    orig, dest, commitmsg = repo.vfs.read('evolvestate').split('\0')
+    return { 'orig': orig,
+             'dest': dest,
+             'commitmsg': commitmsg, }
+
+def _fm0evolvestatewrite(repo, data):
+    repo.vfs.write('evolvestate',
+                    '\0'.join([data['orig'], data['dest'], data['commitmsg']]))
+
+# 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, version=defaultversion):
+    return formats[version][0](repo)
+
+def _evolvestatedelete(repo):
+    util.unlinkpath(repo.join('evolvestate'), ignoremissing=True)


More information about the Mercurial-devel mailing list