Skip to content

Commit 0a5987f

Browse files
peffgitster
authored andcommitted
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 <[email protected]> Reviewed-by: Jonathan Nieder <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d731f0a commit 0a5987f

File tree

1 file changed

+21
-29
lines changed

1 file changed

+21
-29
lines changed

userdiff.c

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -184,28 +184,6 @@ static struct userdiff_driver *userdiff_find_by_namelen(const char *k, int len)
184184
return NULL;
185185
}
186186

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-
209187
static int parse_funcname(struct userdiff_funcname *f, const char *k,
210188
const char *v, int cflags)
211189
{
@@ -233,20 +211,34 @@ static int parse_bool(int *b, const char *k, const char *v)
233211
int userdiff_config(const char *k, const char *v)
234212
{
235213
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+
}
236228

237-
if ((drv = parse_driver(k, v, "funcname")))
229+
if (!strcmp(type, "funcname"))
238230
return parse_funcname(&drv->funcname, k, v, 0);
239-
if ((drv = parse_driver(k, v, "xfuncname")))
231+
if (!strcmp(type, "xfuncname"))
240232
return parse_funcname(&drv->funcname, k, v, REG_EXTENDED);
241-
if ((drv = parse_driver(k, v, "binary")))
233+
if (!strcmp(type, "binary"))
242234
return parse_tristate(&drv->binary, k, v);
243-
if ((drv = parse_driver(k, v, "command")))
235+
if (!strcmp(type, "command"))
244236
return git_config_string(&drv->external, k, v);
245-
if ((drv = parse_driver(k, v, "textconv")))
237+
if (!strcmp(type, "textconv"))
246238
return git_config_string(&drv->textconv, k, v);
247-
if ((drv = parse_driver(k, v, "cachetextconv")))
239+
if (!strcmp(type, "cachetextconv"))
248240
return parse_bool(&drv->textconv_want_cache, k, v);
249-
if ((drv = parse_driver(k, v, "wordregex")))
241+
if (!strcmp(type, "wordregex"))
250242
return git_config_string(&drv->word_regex, k, v);
251243

252244
return 0;

0 commit comments

Comments
 (0)