# HG changeset patch # User Jun Wu # Date 1483719063 0 # Node ID dd897eb1699e84bf1ad5a6e79a2bddcc77cd8954 # Parent c2bd2f77965b7d23d05575596e4b30c04d5d5adf chg: send type information via S channel (BC) Previously S channel is only used to send system commands. It will also be used to send pager commands. So add a type parameter. This breaks older chg clients. But chg and hg should always come from a single commit and be packed into a single package. Supporting running inconsistent versions of chg and hg seems to be unnecessarily complicated with little benefit. So just make the change and assume people won't use inconsistent chg with hg. diff -r c2bd2f77965b -r dd897eb1699e contrib/chg/hgclient.c --- a/contrib/chg/hgclient.c Sun Jan 01 13:16:29 2017 +0100 +++ b/contrib/chg/hgclient.c Fri Jan 06 16:11:03 2017 +0000 @@ -237,10 +237,10 @@ ctx->data[ctx->datasize] = '\0'; /* terminate last string */ const char **args = unpackcmdargsnul(ctx); - if (!args[0] || !args[1]) - abortmsg("missing command or cwd in system request"); - debugmsg("run '%s' at '%s'", args[0], args[1]); - int32_t r = runshellcmd(args[0], args + 2, args[1]); + if (!args[0] || !args[1] || !args[2]) + abortmsg("missing type or command or cwd in system request"); + debugmsg("run '%s' at '%s'", args[1], args[2]); + int32_t r = runshellcmd(args[1], args + 3, args[2]); free(args); uint32_t r_n = htonl(r); diff -r c2bd2f77965b -r dd897eb1699e mercurial/chgserver.py --- a/mercurial/chgserver.py Sun Jan 01 13:16:29 2017 +0100 +++ b/mercurial/chgserver.py Fri Jan 06 16:11:03 2017 +0000 @@ -287,13 +287,14 @@ """Propagate ui.system() request in the following format: payload length (unsigned int), + type, '\0', cmd, '\0', cwd, '\0', envkey, '=', val, '\0', ... envkey, '=', val - and waits: + if type == 'system', waits for: exitcode length (unsigned int), exitcode (int) @@ -303,8 +304,8 @@ self.out = out self.channel = channel - def __call__(self, cmd, environ, cwd): - args = [util.quotecommand(cmd), os.path.abspath(cwd or '.')] + def __call__(self, cmd, environ, cwd, type='system'): + args = [type, util.quotecommand(cmd), os.path.abspath(cwd or '.')] args.extend('%s=%s' % (k, v) for k, v in environ.iteritems()) data = '\0'.join(args) self.out.write(struct.pack('>cI', self.channel, len(data)))