[PATCH RFC v3] scmutil: add a simple key-value file helper

Yuya Nishihara yuya at tcha.org
Tue Dec 6 08:04:21 EST 2016


On Mon, 5 Dec 2016 15:03:35 -0800, Kostia Balytskyi wrote:
> # HG changeset patch
> # User Kostia Balytskyi <ikostia at fb.com>
> # Date 1480978778 28800
> #      Mon Dec 05 14:59:38 2016 -0800
> # Node ID bdc49209b0b926214e865f9a98ea987866f64d68
> # Parent  243ecbd4f5c9f452275d4435866359cf84dc03ff
> scmutil: add a simple key-value file helper
> 
> The purpose of the added class is to serve purposes like save files of shelve
> or state files of shelve, rebase and histedit. Keys of these files can be
> alphanumeric and start with letters, while values must not contain newlines.
> Keys which start with an uppercase letter are required, while other keys
> are optional.

> +class simplekeyvaluefile(object):
> +    """A simple file with key=value lines
> +
> +    Keys must be alphanumerics and start with a letter, values might not
> +    contain '\n' characters
> +    """
> +    class InvalidKeyValueFile(Exception): pass
> +    class InvalidKeyInFileException(Exception): pass
> +    class InvalidValueInFileException(Exception): pass
> +    class MissingRequiredKeyInFileException(Exception): pass
> +
> +    # if KEYS is non-empty, read values are validated against it:
> +    # each key is a tuple (keyname, required)
> +    KEYS = []

If we want to define a required key back to older Mercurial versions (like
mergestate), we'll need a static rule such as "uppercase is required" seen in
your V1 patch.

> +    def __init__(self, vfs, path):
> +        self.vfs = vfs
> +        self.path = path
> +
> +    def validate(self, d):
> +        for key, req in self.KEYS:
> +            if req and key not in d:
> +                e = _("missing a required key: '%s'") % key
> +                raise self.MissingRequiredKeyInFileException(e)

_() is necessary only for user-facing errors.

I don't think nested classes are useful unless we want to give a room for
sub classes to override them.

> +            lines.append("%s=%s\n" % (k, v))
> +        with self.vfs(self.path, mode='wb', atomictemp=True) as fp:
> +            fp.write(''.join(lines))

BTW, the syntax of this file seems somewhat similar to config.config.


More information about the Mercurial-devel mailing list