# HG changeset patch # User Jun Wu # Date 1457274112 0 # Node ID a5c773acb01877c12b19a27f508251b334e562d0 # Parent 897a4bbd578b1f97e12a5fe9d5a1f6d280496bb8 chg: implement validate in hgclient This patch implements the corresponding validate method in hgclient. It will return instruction strings as is without taking any real action. diff -r 897a4bbd578b -r a5c773acb018 contrib/chg/hgclient.c --- a/contrib/chg/hgclient.c Sun Mar 06 03:15:45 2016 +0530 +++ b/contrib/chg/hgclient.c Sun Mar 06 14:21:52 2016 +0000 @@ -34,6 +34,7 @@ CAP_GETPAGER = 0x0400, CAP_SETENV = 0x0800, CAP_SETUMASK = 0x1000, + CAP_VALIDATE = 0x2000, }; typedef struct { @@ -49,6 +50,7 @@ {"getpager", CAP_GETPAGER}, {"setenv", CAP_SETENV}, {"setumask", CAP_SETUMASK}, + {"validate", CAP_VALIDATE}, {NULL, 0}, /* terminator */ }; @@ -463,6 +465,40 @@ } /*! + * Send command line arguments to let the server load the repo config and check + * whether it can process our request directly or not. + * Make sure hgc_setenv is called before calling this. + * + * @return - NULL, the server believes it can handle our request, or does not + * support "validate" command. + * - a list of strings, the server cannot handle our request and it + * sent instructions telling us how to fix the issue. See + * chgserver.py for possible instruction formats. + * the list should be freed by the caller. + * the last string is guaranteed to be NULL. + */ +const char **hgc_validate(hgclient_t *hgc, const char *const args[], + size_t argsize) +{ + assert(hgc); + if (!(hgc->capflags & CAP_VALIDATE)) + return NULL; + + packcmdargs(&hgc->ctx, args, argsize); + writeblockrequest(hgc, "validate"); + handleresponse(hgc); + + /* the server returns '\0' if it can handle our request */ + if (hgc->ctx.datasize <= 1) + return NULL; + + /* make sure the buffer is '\0' terminated */ + enlargecontext(&hgc->ctx, hgc->ctx.datasize + 1); + hgc->ctx.data[hgc->ctx.datasize] = '\0'; + return unpackcmdargsnul(&hgc->ctx); +} + +/*! * Execute the specified Mercurial command * * @return result code diff -r 897a4bbd578b -r a5c773acb018 contrib/chg/hgclient.h --- a/contrib/chg/hgclient.h Sun Mar 06 03:15:45 2016 +0530 +++ b/contrib/chg/hgclient.h Sun Mar 06 14:21:52 2016 +0000 @@ -20,6 +20,8 @@ pid_t hgc_peerpid(const hgclient_t *hgc); +const char **hgc_validate(hgclient_t *hgc, const char *const args[], + size_t argsize); int hgc_runcommand(hgclient_t *hgc, const char *const args[], size_t argsize); void hgc_attachio(hgclient_t *hgc); const char *hgc_getpager(hgclient_t *hgc, const char *const args[],