[PATCH 1 of 2 shelve-ext v6] shelve: refactor shelvestate loading
Kostia Balytskyi
ikostia at fb.com
Sat May 13 21:58:47 UTC 2017
# HG changeset patch
# User Kostia Balytskyi <ikostia at fb.com>
# Date 1494712349 25200
# Sat May 13 14:52:29 2017 -0700
# Node ID 67ce9ac16f64d8547d06c87bd8492f6ed6b63daa
# Parent 78496ac300255e9996b3e282086661afc08af37c
shelve: refactor shelvestate loading
This is a preparatory patch which separates file reading from the
minimal validation we have (like turning version into int and
checking that this version is supported). The purpose of this patch
is to be able to read statefile form simplekeyvaluefile, which is
implemented in the following patch.
diff --git a/hgext/shelve.py b/hgext/shelve.py
--- a/hgext/shelve.py
+++ b/hgext/shelve.py
@@ -176,39 +176,47 @@ class shelvedstate(object):
@classmethod
def load(cls, repo):
+ # Order is important, because old shelvestate file uses it
+ # to detemine values of fields (i.g. version is on the first line,
+ # name is on the second and so forth). Please do not change.
+ keys = ['version', 'name', 'originalwctx', 'pendingctx', 'parents',
+ 'nodestoremove', 'branchtorestore', 'keep', 'activebook']
+ d = {}
fp = repo.vfs(cls._filename)
try:
- version = int(fp.readline().strip())
-
- if version != cls._version:
- raise error.Abort(_('this version of shelve is incompatible '
- 'with the version used in this repo'))
- name = fp.readline().strip()
- wctx = nodemod.bin(fp.readline().strip())
- pendingctx = nodemod.bin(fp.readline().strip())
- parents = [nodemod.bin(h) for h in fp.readline().split()]
- nodestoremove = [nodemod.bin(h) for h in fp.readline().split()]
- branchtorestore = fp.readline().strip()
- keep = fp.readline().strip() == cls._keep
- activebook = fp.readline().strip()
- except (ValueError, TypeError) as err:
- raise error.CorruptedState(str(err))
+ for key in keys:
+ d[key] = fp.readline().strip()
finally:
fp.close()
+ # some basic syntactic verification and transformation
+ try:
+ d['version'] = int(d['version'])
+ if d['version'] != cls._version:
+ raise error.Abort(_('this version of shelve is incompatible '
+ 'with the version used in this repo'))
+ d['originalwctx'] = nodemod.bin(d['originalwctx'])
+ d['pendingctx'] = nodemod.bin(d['pendingctx'])
+ d['parents'] = [nodemod.bin(h)
+ for h in d['parents'].split(' ')]
+ d['nodestoremove'] = [nodemod.bin(h)
+ for h in d['nodestoremove'].split(' ')]
+ except (ValueError, TypeError, KeyError) as err:
+ raise error.CorruptedState(str(err))
+
try:
obj = cls()
- obj.name = name
- obj.wctx = repo[wctx]
- obj.pendingctx = repo[pendingctx]
- obj.parents = parents
- obj.nodestoremove = nodestoremove
- obj.branchtorestore = branchtorestore
- obj.keep = keep
+ obj.name = d['name']
+ obj.wctx = repo[d['originalwctx']]
+ obj.pendingctx = repo[d['pendingctx']]
+ obj.parents = d['parents']
+ obj.nodestoremove = d.get('nodestoremove')
+ obj.branchtorestore = d.get('branchtorestore')
+ obj.keep = d.get('keep') == cls._keep
obj.activebookmark = ''
- if activebook != cls._noactivebook:
- obj.activebookmark = activebook
- except error.RepoLookupError as err:
+ if d.get('activebook', '') != cls._noactivebook:
+ obj.activebookmark = d.get('activebook')
+ except (error.RepoLookupError, KeyError) as err:
raise error.CorruptedState(str(err))
return obj
More information about the Mercurial-devel
mailing list