[PATCH 1 of 3 V5] chg: implement validate in hgclient

Jun Wu quark at fb.com
Sun Mar 6 14:24:45 UTC 2016


# HG changeset patch
# User Jun Wu <quark at fb.com>
# Date 1457274112 0
#      Sun Mar 06 14:21:52 2016 +0000
# Node ID 8452ba72202924cefc379370c47df80634987cbf
# 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 --git a/contrib/chg/hgclient.c b/contrib/chg/hgclient.c
--- a/contrib/chg/hgclient.c
+++ b/contrib/chg/hgclient.c
@@ -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");
+	readchannel(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 --git a/contrib/chg/hgclient.h b/contrib/chg/hgclient.h
--- a/contrib/chg/hgclient.h
+++ b/contrib/chg/hgclient.h
@@ -25,5 +25,7 @@
 const char *hgc_getpager(hgclient_t *hgc, const char *const args[],
 			 size_t argsize);
 void hgc_setenv(hgclient_t *hgc, const char *const envp[]);
+const char **hgc_validate(hgclient_t *hgc, const char *const args[],
+			  size_t argsize);
 
 #endif  /* HGCLIENT_H_ */


More information about the Mercurial-devel mailing list