On Mon, Jan 14, 2013 at 08:55:28AM -0800, Jonathan Nieder wrote:

> Jeff King wrote:
> 
> > --- a/convert.c
> > +++ b/convert.c
> > @@ -465,10 +465,8 @@ static int read_convert_config(const char *var, const 
> > char *value, void *cb)
> >      * External conversion drivers are configured using
> >      * "filter.<name>.variable".
> >      */
> > -   if (prefixcmp(var, "filter.") || (ep = strrchr(var, '.')) == var + 6)
> > +   if (match_config_key(var, "filter", &name, &namelen, &ep) < 0 || !name)
> >             return 0;
> 
> Hm, I actually find the preimage more readable here.

The big thing to me is getting rid of the manual "6" there, which is bad
for maintainability (it must match the length of "filter", and there is
no compile-time verification).

> Rename match_config_key() to something like parse_config_key()?
> match_ makes it sound like its main purpose is to match it against a
> pattern, but really it is more about decomposing into constituent
> parts.

There is already a git_config_parse_key, but it does something else. I
wanted to avoid confusion there. And I was trying to indicate that this
was not just about parsing, but also about matching the section.
Basically I was trying to encapsulate the current technique and have as
little code change as possible. But maybe:

  struct config_key k;
  parse_config_key(&k, var);
  if (strcmp(k.section, "filter") || k.subsection))
          return 0;

would be a better start (or having git_config do the first two lines
itself before triggering the callback).

> Rename ep to something like 'key' or 'filtertype'?  Without the
> explicit string processing, it is not obvious what ep is the end of.

Ah, so that is what "ep" stands for. I was thinking it is a terrible
variable name, but I was trying to keep the patch minimal.

> > -   if (prefixcmp(var, "diff."))
> > -           return NULL;
> > -   dot = strrchr(var, '.');
> > -   if (dot == var + 4)
> > -           return NULL;
> > -   if (strcmp(type, dot+1))
> > +   if (match_config_key(var, "diff", &name, &namelen, &key) < 0 ||
> > +       strcmp(type, key))
> >             return NULL;
> >  
> > -   name = var + 5;
> > -   namelen = dot - name;
> >     drv = userdiff_find_by_namelen(name, namelen);
> 
> What happens in the !name case?  (Honest question --- I haven't checked.)

Segfault, I expect. Thanks for catching.

I actually wrote this correctly once, coupled with patch 4, but screwed
it up when teasing it apart into two patches. It should be:

  if (match_config_key(var, "diff", &name, &namelen, &key) < 0 ||
      !name ||
      strcmp(type, key))
          return NULL;

Patch 4 replaces this with correct code (as it moves it into
userdiff_config).

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to