attr: avoid searching for basename on every match

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Nguyễn Thái Ngọc Duy committed Oct 5, 2012 at 11:41 UTC 4742d136e2c8423ce17ccd0ccf161d9f20d49847
1 file changed +9 -6
attr.c
+9 -6
@@ -639,13 +639,11 @@ static void prepare_attr_stack(const char *path)
639 }
640
641 static int path_matches(const char *pathname, int pathlen,
642 + const char *basename,
643 const char *pattern,
644 const char *base, int baselen)
645 {
646 if (!strchr(pattern, '/')) {
646 - /* match basename */
647 - const char *basename = strrchr(pathname, '/');
648 - basename = basename ? basename + 1 : pathname;
647 return (fnmatch_icase(pattern, basename, 0) == 0);
648 }
649 /*
@@ -687,7 +685,8 @@ static int fill_one(const char *what, struct match_attr *a, int rem)
685 return rem;
686 }
687
690 -static int fill(const char *path, int pathlen, struct attr_stack *stk, int rem)
688 +static int fill(const char *path, int pathlen, const char *basename,
689 + struct attr_stack *stk, int rem)
690 {
691 int i;
692 const char *base = stk->origin ? stk->origin : "";
@@ -696,7 +695,7 @@ static int fill(const char *path, int pathlen, struct attr_stack *stk, int rem)
695 struct match_attr *a = stk->attrs[i];
696 if (a->is_macro)
697 continue;
699 - if (path_matches(path, pathlen,
698 + if (path_matches(path, pathlen, basename,
699 a->u.pattern, base, stk->originlen))
700 rem = fill_one("fill", a, rem);
701 }
@@ -735,15 +734,19 @@ static void collect_all_attrs(const char *path)
734 {
735 struct attr_stack *stk;
736 int i, pathlen, rem;
737 + const char *basename;
738
739 prepare_attr_stack(path);
740 for (i = 0; i < attr_nr; i++)
741 check_all_attr[i].value = ATTR__UNKNOWN;
742
743 + basename = strrchr(path, '/');
744 + basename = basename ? basename + 1 : path;
745 +
746 pathlen = strlen(path);
747 rem = attr_nr;
748 for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
746 - rem = fill(path, pathlen, stk, rem);
749 + rem = fill(path, pathlen, basename, stk, rem);
750 }
751
752 int git_check_attr(const char *path, int num, struct git_attr_check *check)