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
next prev parent 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).