Mercurial > hg
changeset 28350:8f9661d1637b
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.
author | Jun Wu <quark@fb.com> |
---|---|
date | Sat, 05 Mar 2016 13:56:59 +0000 |
parents | 7cb2f2438f85 |
children | 42a7301fb4d5 |
files | hgext/chgserver.py |
diffstat | 1 files changed, 31 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/hgext/chgserver.py Sun Feb 14 13:58:46 2016 +0900 +++ b/hgext/chgserver.py Sat Mar 05 13:56:59 2016 +0000 @@ -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 @@ 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 @@ 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