[PATCH 07 of 10] chgserver: implement validate command

Yuya Nishihara yuya at tcha.org
Thu Mar 3 11:06:22 EST 2016


On Wed, 2 Mar 2016 10:44:09 +0000, Jun Wu wrote:
> # HG changeset patch
> # User Jun Wu <quark at fb.com>
> # Date 1456914735 0
> #      Wed Mar 02 10:32:15 2016 +0000
> # Node ID 7a0eaf66c464e1fcab9b8470811de0d88ef754ff
> # Parent  9821d8ed7874129231a85e86131d37d02f01f129
> chgserver: implement validate command
> 
> validate will load the repo config and check if the server has up-to-date
> config to continue serve the client. In case it does not, the server will
> send instructions to the client about what to do next, including to retry
> with a different address or to unlink an outdated socket file to stop an
> old server.
> 
> diff --git a/hgext/chgserver.py b/hgext/chgserver.py
> --- a/hgext/chgserver.py
> +++ b/hgext/chgserver.py
> @@ -25,6 +25,9 @@
>  'setumask' command
>      set umask
>  
> +'validate' command
> +    reload the config and check if the server is up to date
> +
>  'SIGHUP' signal
>      reload configuration files
>  
> @@ -339,6 +342,8 @@
>          self._oldios = []  # original (self.ch, ui.fp, fd) before "attachio"
>          self.hashstate = hashstate
>          self.baseaddress = baseaddress
> +        if hashstate is not None:
> +            self.capabilities['validate'] = chgcmdserver.validate

self.capabilities is statically defined. We'll need to copy it before updating.

> +    def validate(self):
> +        """reload the config and check if the server is up to date
> +
> +        read a list of NULL terminated arguments.
> +        write a list of NULL terminated instruction strings.
> +        an instruction string could be either:
> +            - "unlink $path", the client should unlink the path to stop the
> +              outdated server.
> +            - "redirect $path", the client should try to connect to another
> +              server instead.
> +        """
> +        args = self._readlist()
> +        self.ui = _renewui(self.ui, args)
> +        newhash = hashstate.fromui(self.ui, self.hashstate.mtimepaths)
> +        insts = []
> +        if newhash.mtimehash != self.hashstate.mtimehash:
> +            addr = _hashaddress(self.baseaddress, self.hashstate.confighash)
> +            insts.append('unlink %s' % addr)
> +        if newhash.confighash != self.hashstate.confighash:
> +            addr = _hashaddress(self.baseaddress, newhash.confighash)
> +            insts.append('redirect %s' % addr)
> +        _log('validate: %s\n' % insts)
> +        self.cresult.write('\0'.join(insts) + '\0')

It seems awkward that the input has no last '\0', but the output has, though
I know validate() have to return something even if insts is empty.


More information about the Mercurial-devel mailing list