Skip to content

Commit 4742d13

Browse files
pcloudsgitster
authored andcommitted
attr: avoid searching for basename on every match
Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent cd6a0b2 commit 4742d13

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

attr.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -639,13 +639,11 @@ static void prepare_attr_stack(const char *path)
639639
}
640640

641641
static int path_matches(const char *pathname, int pathlen,
642+
const char *basename,
642643
const char *pattern,
643644
const char *base, int baselen)
644645
{
645646
if (!strchr(pattern, '/')) {
646-
/* match basename */
647-
const char *basename = strrchr(pathname, '/');
648-
basename = basename ? basename + 1 : pathname;
649647
return (fnmatch_icase(pattern, basename, 0) == 0);
650648
}
651649
/*
@@ -687,7 +685,8 @@ static int fill_one(const char *what, struct match_attr *a, int rem)
687685
return rem;
688686
}
689687

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)
691690
{
692691
int i;
693692
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)
696695
struct match_attr *a = stk->attrs[i];
697696
if (a->is_macro)
698697
continue;
699-
if (path_matches(path, pathlen,
698+
if (path_matches(path, pathlen, basename,
700699
a->u.pattern, base, stk->originlen))
701700
rem = fill_one("fill", a, rem);
702701
}
@@ -735,15 +734,19 @@ static void collect_all_attrs(const char *path)
735734
{
736735
struct attr_stack *stk;
737736
int i, pathlen, rem;
737+
const char *basename;
738738

739739
prepare_attr_stack(path);
740740
for (i = 0; i < attr_nr; i++)
741741
check_all_attr[i].value = ATTR__UNKNOWN;
742742

743+
basename = strrchr(path, '/');
744+
basename = basename ? basename + 1 : path;
745+
743746
pathlen = strlen(path);
744747
rem = attr_nr;
745748
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);
747750
}
748751

749752
int git_check_attr(const char *path, int num, struct git_attr_check *check)

0 commit comments

Comments
 (0)