[PATCH 3 of 4 shelve-ext v3] shelve: refactor shelvestate loading

Yuya Nishihara yuya at tcha.org
Wed Apr 12 10:41:48 EDT 2017


On Mon, 10 Apr 2017 16:28:35 -0700, Kostia Balytskyi wrote:
> # HG changeset patch
> # User Kostia Balytskyi <ikostia at fb.com>
> # Date 1491865552 25200
> #      Mon Apr 10 16:05:52 2017 -0700
> # Node ID 961539160565df5052d1c770788cacb2d76e9752
> # Parent  1f3af1e9d43286254237417adf26ecc97efa62e6
> 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,38 +176,46 @@ 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.get('version'))
> +            if d.get('version') != cls._version:
> +                raise error.Abort(_('this version of shelve is incompatible '
> +                                    'with the version used in this repo'))
> +            d['originalwctx'] = nodemod.bin(d.get('originalwctx'))
> +            d['pendingctx'] = nodemod.bin(d.get('pendingctx'))
> +            d['parents'] = [nodemod.bin(h)
> +                            for h in d.get('parents').split(' ')]
> +            d['nodestoremove'] = [nodemod.bin(h)
> +                                  for h in d.get('nodestoremove').split(' ')]
> +        except (ValueError, TypeError, AttributeError) as err:

With d.get('parents', '').split(), you can avoid suppressing AttributeError.

>          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.get('name')
> +            obj.wctx = repo[d.get('originalwctx')]
> +            obj.pendingctx = repo[d.get('pendingctx')]
> +            obj.parents = d.get('parents')
> +            obj.nodestoremove = d.get('nodestoremove')
> +            obj.branchtorestore = d.get('branchtorestore')

Perhaps we shouldn't ignore missing key here. obj.wctx = repo[None] would
be wrong for example.


More information about the Mercurial-devel mailing list