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.
This commit is contained in:
Jun Wu 2016-03-05 13:56:59 +00:00
parent e7f2a2e46a
commit 76d7a8fda5

View File

@ -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
@ -341,6 +344,9 @@ class chgcmdserver(commandserver.server):
self._oldios = [] # original (self.ch, ui.fp, fd) before "attachio"
self.hashstate = hashstate
self.baseaddress = baseaddress
if hashstate is not None:
self.capabilities = self.capabilities.copy()
self.capabilities['validate'] = chgcmdserver.validate
def cleanup(self):
# dispatch._runcatch() does not flush outputs if exception is not
@ -413,6 +419,31 @@ class chgcmdserver(commandserver.server):
setattr(ui, fn, fp)
del self._oldios[:]
def validate(self):
"""Reload the config and check if the server is up to date
Read a list of '\0' separated arguments.
Write a non-empty list of '\0' separated instruction strings or '\0'
if the list is empty.
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) or '\0')
def chdir(self):
"""Change current directory