On 03/10, Jonathan Tan wrote:
> Thanks - I don't think I have any more comments on this patch set
> after these.
>
> On 03/10/2017 10:59 AM, Brandon Williams wrote:
> >diff --git a/pathspec.c b/pathspec.c
> >index b961f00c8..7cd5f6e3d 100644
> >--- a/pathspec.c
> >+++ b/pathspec.c
> >@@ -87,6 +89,74 @@ static void prefix_magic(struct strbuf *sb, int
> >prefixlen, unsigned magic)
> > strbuf_addf(sb, ",prefix:%d)", prefixlen);
> > }
> >
> >+static void parse_pathspec_attr_match(struct pathspec_item *item, const
> >char *value)
> >+{
> >+ struct string_list_item *si;
> >+ struct string_list list = STRING_LIST_INIT_DUP;
> >+
> >+ if (item->attr_check)
> >+ die(_("Only one 'attr:' specification is allowed."));
> >+
> >+ if (!value || !*value)
> >+ die(_("attr spec must not be empty"));
> >+
> >+ string_list_split(&list, value, ' ', -1);
> >+ string_list_remove_empty_items(&list, 0);
> >+
> >+ item->attr_check = attr_check_alloc();
> >+ ALLOC_GROW(item->attr_match,
> >+ list.nr,
> >+ item->attr_match_alloc);
>
> If item->attr_match always starts empty, then I think an xmalloc or
> xcalloc suffices (and we don't need item->attr_match_alloc anymore).
>
> We should probably also check item->attr_match above - that is, `if
> (item->attr_check || item->attr_match)`.
Correct, I'll make these changes.
>
> >+
> >+ for_each_string_list_item(si, &list) {
> >+ size_t attr_len;
> >+ char *attr_name;
> >+ const struct git_attr *a;
> >+
> >+ int j = item->attr_match_nr++;
> >+ const char *attr = si->string;
> >+ struct attr_match *am = &item->attr_match[j];
> >+
> >+ switch (*attr) {
> >+ case '!':
> >+ am->match_mode = MATCH_UNSPECIFIED;
> >+ attr++;
> >+ attr_len = strlen(attr);
> >+ break;
> >+ case '-':
> >+ am->match_mode = MATCH_UNSET;
> >+ attr++;
> >+ attr_len = strlen(attr);
> >+ break;
> >+ default:
> >+ attr_len = strcspn(attr, "=");
> >+ if (attr[attr_len] != '=')
> >+ am->match_mode = MATCH_SET;
> >+ else {
> >+ am->match_mode = MATCH_VALUE;
> >+ am->value = xstrdup(&attr[attr_len + 1]);
> >+ if (strchr(am->value, '\\'))
> >+ die(_("attr spec values must not
> >contain backslashes"));
> >+ }
> >+ break;
> >+ }
> >+
> >+ attr_name = xmemdupz(attr, attr_len);
> >+ a = git_attr(attr_name);
> >+ if (!a)
> >+ die(_("invalid attribute name %s"), attr_name);
> >+
> >+ attr_check_append(item->attr_check, a);
> >+
> >+ free(attr_name);
> >+ }
> >+
> >+ if (item->attr_check->nr != item->attr_match_nr)
> >+ die("BUG: should have same number of entries");
>
> I think such postcondition checks are usually not worth it, but
> others might differ.
yeah probably not, but its just an assert check for just in case so I'll
leave it in.
>
> >+
> >+ string_list_clear(&list, 0);
> >+}
> >+
> > static inline int get_literal_global(void)
> > {
> > static int literal = -1;
--
Brandon Williams