git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Matthieu Moy <Matthieu.Moy@imag.fr>
To: git@vger.kernel.org
Cc: Matthieu Moy <Matthieu.Moy@imag.fr>
Subject: [PATCH] Facility to have multiple kinds of drivers for diff.
Date: Sun, 28 Sep 2008 04:06:54 +0200	[thread overview]
Message-ID: <1222567618-22156-2-git-send-email-Matthieu.Moy@imag.fr> (raw)
In-Reply-To: <1222567618-22156-1-git-send-email-Matthieu.Moy@imag.fr>

We now have an array attr_cmd_specs describing the possible kinds of
drivers.
---
 diff.c |   63 +++++++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 41 insertions(+), 22 deletions(-)

diff --git a/diff.c b/diff.c
index 099ce3f..1c8dd19 100644
--- a/diff.c
+++ b/diff.c
@@ -56,11 +56,29 @@ static int parse_diff_color_slot(const char *var, int ofs)
 	die("bad config variable '%s'", var);
 }
 
-static struct ll_cmd_driver {
+struct ll_cmd_driver {
 	const char *name;
 	struct ll_cmd_driver *next;
 	const char *cmd;
-} *user_diff, **user_diff_tail;
+};
+
+struct attr_cmd_spec {
+	char * name;
+	struct git_attr * attr_cmd;
+	struct ll_cmd_driver *head;
+	struct ll_cmd_driver **tail;
+};
+
+enum driver_indices {
+	DIFF_DRIVER=0,
+	TEXTCONV_DRIVER=1,
+	DRIVER_COUNT,
+};
+
+static struct attr_cmd_spec attr_cmd_specs[DRIVER_COUNT] = {
+	{"diff", NULL},
+	{"textconv", NULL},
+};
 
 /*
  * Currently there is only "diff.<drivername>.command" variable;
@@ -68,24 +86,24 @@ static struct ll_cmd_driver {
  * this in a bit convoluted way to allow low level diff driver
  * called "color".
  */
-static int parse_ll_command(const char *var, const char *ep, const char *value)
+static int parse_ll_command(const char *var, const char *name,
+			    const char *ep, const char *value,
+			    int driver)
 {
-	const char *name;
 	int namelen;
 	struct ll_cmd_driver *drv;
 
-	name = var + 5;
 	namelen = ep - name;
-	for (drv = user_diff; drv; drv = drv->next)
+	for (drv = attr_cmd_specs[driver].head; drv; drv = drv->next)
 		if (!strncmp(drv->name, name, namelen) && !drv->name[namelen])
 			break;
 	if (!drv) {
 		drv = xcalloc(1, sizeof(struct ll_cmd_driver));
 		drv->name = xmemdupz(name, namelen);
-		if (!user_diff_tail)
-			user_diff_tail = &user_diff;
-		*user_diff_tail = drv;
-		user_diff_tail = &(drv->next);
+		if (!attr_cmd_specs[driver].tail)
+			attr_cmd_specs[driver].tail = &attr_cmd_specs[driver].head;
+		*attr_cmd_specs[driver].tail = drv;
+		attr_cmd_specs[driver].tail = &(drv->next);
 	}
 
 	return git_config_string(&(drv->cmd), var, value);
@@ -161,7 +179,7 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
 		const char *ep = strrchr(var, '.');
 
 		if (ep != var + 4 && !strcmp(ep, ".command"))
-			return parse_ll_command(var, ep, value);
+			return parse_ll_command(var, var + 5, ep, value, DIFF_DRIVER);
 	}
 
 	return git_diff_basic_config(var, value, cb);
@@ -1340,14 +1358,14 @@ static void emit_binary_diff(FILE *file, mmfile_t *one, mmfile_t *two)
 	emit_binary_diff_body(file, two, one);
 }
 
-static void setup_diff_attr_check(struct git_attr_check *check)
+/* driver_index must be among the values of "enum driver_indices" */
+static void setup_cmd_attr_check(struct git_attr_check *check, int driver_index)
 {
-	static struct git_attr *attr_diff;
-
-	if (!attr_diff) {
-		attr_diff = git_attr("diff", 4);
+	struct attr_cmd_spec * spec = &attr_cmd_specs[driver_index];
+	if (!spec->attr_cmd) {
+		spec->attr_cmd = git_attr(spec->name, strlen(spec->name));
 	}
-	check[0].attr = attr_diff;
+	check[0].attr = spec->attr_cmd;
 }
 
 static void diff_filespec_check_attr(struct diff_filespec *one)
@@ -1358,7 +1376,7 @@ static void diff_filespec_check_attr(struct diff_filespec *one)
 	if (one->checked_attr)
 		return;
 
-	setup_cmd_attr_check(&attr_cmd_check);
+	setup_cmd_attr_check(&attr_cmd_check, DIFF_DRIVER);
 	one->is_binary = 0;
 	one->funcname_pattern_ident = NULL;
 
@@ -2092,14 +2110,14 @@ static void run_external_diff(const char *pgm,
 	}
 }
 
-static const char *external_cmd_attr(const char *name)
+static const char *external_cmd_attr(const char *name, int driver_index)
 {
 	struct git_attr_check attr_cmd_check;
 
 	if (!name)
 		return NULL;
 
-	setup_diff_attr_check(&attr_cmd_check);
+	setup_cmd_attr_check(&attr_cmd_check, driver_index);
 	if (!git_checkattr(name, 1, &attr_cmd_check)) {
 		const char *value = attr_cmd_check.value;
 		if (!ATTR_TRUE(value) &&
@@ -2107,7 +2125,8 @@ static const char *external_cmd_attr(const char *name)
 		    !ATTR_UNSET(value)) {
 			struct ll_cmd_driver *drv;
 
-			for (drv = user_diff; drv; drv = drv->next)
+			for (drv = attr_cmd_specs[driver_index].head;
+			     drv; drv = drv->next)
 				if (!strcmp(drv->name, value))
 					return drv->cmd;
 		}
@@ -2128,7 +2147,7 @@ static void run_diff_cmd(const char *pgm,
 	if (!DIFF_OPT_TST(o, ALLOW_EXTERNAL))
 		pgm = NULL;
 	else {
-		const char *cmd = external_cmd_attr(attr_path);
+		const char *cmd = external_cmd_attr(attr_path, DIFF_DRIVER);
 		if (cmd)
 			pgm = cmd;
 	}
-- 
1.6.0.2.312.g1ef81a

  reply	other threads:[~2008-09-28  2:10 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-28  2:06 Implementation of a "textconv" filter for easy custom diff Matthieu Moy
2008-09-28  2:06 ` Matthieu Moy [this message]
2008-09-28  2:06   ` [PATCH] Implement run_command_to_buf (spawn a process and reads its stdout) Matthieu Moy
2008-09-28  2:06     ` [PATCH] Implement a textconv filter for "git diff" Matthieu Moy
2008-09-28  2:06       ` [PATCH] Document the textconv filter Matthieu Moy
2008-09-28  2:06         ` [PATCH] Add a basic test for " Matthieu Moy
2008-09-28 11:07         ` [PATCH] Document " Johannes Sixt
2008-09-28 12:29           ` Matthieu Moy
2008-09-28  4:15       ` [PATCH] Implement a textconv filter for "git diff" Jeff King
2008-09-28 10:00         ` Matthieu Moy
2008-09-28 16:12           ` Jeff King
2008-09-28  4:10 ` Implementation of a "textconv" filter for easy custom diff Jeff King
2008-09-28  9:57   ` Matthieu Moy
2008-09-28 16:11     ` Jeff King
2008-09-30 15:19       ` Matthieu Moy
2008-09-30 16:45         ` Jeff King
2008-10-05 21:41           ` [PATCH 0/4] diff text conversion filter Jeff King
2008-10-05 21:42             ` [PATCH 1/4] t4012: use test_cmp instead of cmp Jeff King
2008-10-05 21:43             ` [PATCH 2/4] diff: unify external diff and funcname parsing code Jeff King
2008-10-05 21:43             ` [PATCH 3/4] diff: introduce diff.<driver>.binary Jeff King
2008-10-07 15:17               ` Johannes Sixt
2008-10-07 15:35                 ` Jeff King
2008-10-07 15:54                   ` Johannes Sixt
2008-10-12  5:24                   ` Junio C Hamano
2008-10-13  1:23                     ` Jeff King
2008-10-13  4:00                       ` Junio C Hamano
2008-10-13  4:15                         ` Jeff King
2008-10-13  6:10                           ` Johannes Sixt
2008-10-13 13:54                           ` Junio C Hamano
2008-10-13  8:12                         ` Matthieu Moy
2008-10-24  2:46               ` Jeff King
2008-10-24  2:48                 ` [PATCH 1/5] diff: add missing static declaration Jeff King
2008-10-24  2:50                 ` [PATCH 2/5] add userdiff textconv tests Jeff King
2008-10-24  2:53                 ` [PATCH 3/5] refactor userdiff textconv code Jeff King
2008-10-24  7:15                   ` Johannes Sixt
2008-10-24 12:40                     ` Jeff King
2008-10-24 13:51                     ` Jeff King
2008-10-24 14:01                       ` Johannes Sixt
2008-10-24 14:08                         ` Jeff King
2008-10-24 21:12                   ` Junio C Hamano
2008-10-24 22:50                     ` Jeff King
2008-10-24 22:56                       ` Jeff King
2008-10-25  0:48                         ` Jeff King
2008-10-25  0:50                           ` [PATCH 1/7] diff: add missing static declaration Jeff King
2008-10-25  0:51                           ` [PATCH 2/7] add userdiff textconv tests Jeff King
2008-10-25  0:52                           ` [PATCH 3/7] textconv: assume text-converted contents are not binary Jeff King
2008-10-25  0:52                           ` [PATCH 4/7] textconv: don't convert for every operation Jeff King
2008-10-25  5:41                             ` Junio C Hamano
2008-10-25  7:19                               ` Jeff King
2008-10-25 18:32                                 ` Junio C Hamano
2008-10-25 19:35                                   ` Jeff King
2008-10-25 23:35                                     ` Junio C Hamano
2008-10-25 23:48                                     ` Junio C Hamano
2008-10-26  4:52                                       ` Jeff King
2008-10-26  4:38                                     ` Jeff King
2008-10-26  4:41                                       ` [PATCH v3 1/8] diff: add missing static declaration Jeff King
2008-10-26  4:41                                       ` [PATCH v3 2/8] document the diff driver textconv feature Jeff King
2008-10-26  4:42                                       ` [PATCH v3 3/8] add userdiff textconv tests Jeff King
2008-10-26  4:44                                       ` [PATCH v3 4/8] refactor userdiff textconv code Jeff King
2008-10-26  4:45                                       ` [PATCH v3 5/8] userdiff: require explicitly allowing textconv Jeff King
2008-10-26  4:46                                       ` [PATCH v3 6/8] only textconv regular files Jeff King
2008-10-26  4:49                                       ` [PATCH v3 7/8] wt-status: load diff ui config Jeff King
2008-10-27  5:30                                         ` Junio C Hamano
2008-10-27  8:23                                           ` Jeff King
2008-10-26  4:50                                       ` [PATCH v3 8/8] enable textconv for diff in verbose status/commit Jeff King
2008-10-25  0:54                           ` [PATCH 5/7] userdiff: require explicitly allowing textconv Jeff King
2008-10-25  0:54                           ` [PATCH 6/7] document the diff driver textconv feature Jeff King
2008-10-25  0:55                           ` [PATCH 7/7] only textconv regular files Jeff King
2008-10-24  2:55                 ` [PATCH 4/5] userdiff: require explicitly allowing textconv Jeff King
2008-10-24  7:04                   ` Johannes Sixt
2008-10-24  2:56                 ` [PATCH 5/5] document the diff driver textconv feature Jeff King
2008-10-24  7:02                 ` [PATCH 3/4] diff: introduce diff.<driver>.binary Johannes Sixt
2008-10-05 21:43             ` [PATCH 4/4] diff: add filter for converting binary to text Jeff King
2008-10-05 22:03             ` [PATCH 0/4] diff text conversion filter Jakub Narebski
2008-10-06  6:29             ` Johannes Sixt
2008-10-06  6:52               ` Jeff King
2008-10-06  8:55                 ` Johannes Sixt
2008-10-06 15:15               ` Matthieu Moy
2008-10-07  1:20                 ` Jeff King
2008-10-07  5:52                   ` Johannes Sixt
2008-10-07  6:00                     ` Jeff King
2008-10-07  6:15                       ` Matthieu Moy
2008-10-07 15:46                         ` Jeff King
2008-10-07 16:15                           ` Johannes Sixt
2008-10-13  1:29                             ` Jeff King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1222567618-22156-2-git-send-email-Matthieu.Moy@imag.fr \
    --to=matthieu.moy@imag.fr \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).