userdiff: drop parse_driver function

When we parse userdiff config, we generally assume that diff.name.key will affect the "key" value of the "name" driver. However, without confirming that the key is a valid userdiff key, we may accidentally conflict with the ancient "diff.color.*" namespace. The current code is careful not to even create a driver struct if we do not see a key that is known by the diff-driver code. However, this carefulness is unnecessary; the default driver with no keys set behaves exactly the same as having no driver at all. We can simply set up the driver struct as soon as we see we have a config key that looks like a driver. This makes the code a bit more readable. Signed-off-by: Jeff King <peff@peff.net> Reviewed-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Jan 23, 2013 at 01:25 UTC 0a5987fe5e0cea23245e0beab6eb47131864b276
1 file changed +21 -29
userdiff.c
+21 -29
@@ -184,28 +184,6 @@ static struct userdiff_driver *userdiff_find_by_namelen(const char *k, int len)
184 return NULL;
185 }
186
187 -static struct userdiff_driver *parse_driver(const char *var,
188 - const char *value, const char *type)
189 -{
190 - struct userdiff_driver *drv;
191 - const char *name, *key;
192 - int namelen;
193 -
194 - if (parse_config_key(var, "diff", &name, &namelen, &key) < 0 ||
195 - !name || strcmp(type, key))
196 - return NULL;
197 -
198 - drv = userdiff_find_by_namelen(name, namelen);
199 - if (!drv) {
200 - ALLOC_GROW(drivers, ndrivers+1, drivers_alloc);
201 - drv = &drivers[ndrivers++];
202 - memset(drv, 0, sizeof(*drv));
203 - drv->name = xmemdupz(name, namelen);
204 - drv->binary = -1;
205 - }
206 - return drv;
207 -}
208 -
187 static int parse_funcname(struct userdiff_funcname *f, const char *k,
188 const char *v, int cflags)
189 {
@@ -233,20 +211,34 @@ static int parse_bool(int *b, const char *k, const char *v)
211 int userdiff_config(const char *k, const char *v)
212 {
213 struct userdiff_driver *drv;
214 + const char *name, *type;
215 + int namelen;
216 +
217 + if (parse_config_key(k, "diff", &name, &namelen, &type) || !name)
218 + return 0;
219 +
220 + drv = userdiff_find_by_namelen(name, namelen);
221 + if (!drv) {
222 + ALLOC_GROW(drivers, ndrivers+1, drivers_alloc);
223 + drv = &drivers[ndrivers++];
224 + memset(drv, 0, sizeof(*drv));
225 + drv->name = xmemdupz(name, namelen);
226 + drv->binary = -1;
227 + }
228
237 - if ((drv = parse_driver(k, v, "funcname")))
229 + if (!strcmp(type, "funcname"))
230 return parse_funcname(&drv->funcname, k, v, 0);
239 - if ((drv = parse_driver(k, v, "xfuncname")))
231 + if (!strcmp(type, "xfuncname"))
232 return parse_funcname(&drv->funcname, k, v, REG_EXTENDED);
241 - if ((drv = parse_driver(k, v, "binary")))
233 + if (!strcmp(type, "binary"))
234 return parse_tristate(&drv->binary, k, v);
243 - if ((drv = parse_driver(k, v, "command")))
235 + if (!strcmp(type, "command"))
236 return git_config_string(&drv->external, k, v);
245 - if ((drv = parse_driver(k, v, "textconv")))
237 + if (!strcmp(type, "textconv"))
238 return git_config_string(&drv->textconv, k, v);
247 - if ((drv = parse_driver(k, v, "cachetextconv")))
239 + if (!strcmp(type, "cachetextconv"))
240 return parse_bool(&drv->textconv_want_cache, k, v);
249 - if ((drv = parse_driver(k, v, "wordregex")))
241 + if (!strcmp(type, "wordregex"))
242 return git_config_string(&drv->word_regex, k, v);
243
244 return 0;