@@ -277,6 +277,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src,
277
277
static struct attr_stack {
278
278
struct attr_stack * prev ;
279
279
char * origin ;
280
+ size_t originlen ;
280
281
unsigned num_matches ;
281
282
unsigned alloc ;
282
283
struct match_attr * * attrs ;
@@ -535,6 +536,7 @@ static void bootstrap_attr_stack(void)
535
536
if (!is_bare_repository () || direction == GIT_ATTR_INDEX ) {
536
537
elem = read_attr (GITATTRIBUTES_FILE , 1 );
537
538
elem -> origin = xstrdup ("" );
539
+ elem -> originlen = 0 ;
538
540
elem -> prev = attr_stack ;
539
541
attr_stack = elem ;
540
542
debug_push (elem );
@@ -628,7 +630,7 @@ static void prepare_attr_stack(const char *path)
628
630
strbuf_addstr (& pathbuf , GITATTRIBUTES_FILE );
629
631
elem = read_attr (pathbuf .buf , 0 );
630
632
strbuf_setlen (& pathbuf , cp - path );
631
- elem -> origin = strbuf_detach (& pathbuf , NULL );
633
+ elem -> origin = strbuf_detach (& pathbuf , & elem -> originlen );
632
634
elem -> prev = attr_stack ;
633
635
attr_stack = elem ;
634
636
debug_push (elem );
@@ -645,13 +647,11 @@ static void prepare_attr_stack(const char *path)
645
647
}
646
648
647
649
static int path_matches (const char * pathname , int pathlen ,
650
+ const char * basename ,
648
651
const char * pattern ,
649
652
const char * base , int baselen )
650
653
{
651
654
if (!strchr (pattern , '/' )) {
652
- /* match basename */
653
- const char * basename = strrchr (pathname , '/' );
654
- basename = basename ? basename + 1 : pathname ;
655
655
return (fnmatch_icase (pattern , basename , 0 ) == 0 );
656
656
}
657
657
/*
@@ -693,7 +693,8 @@ static int fill_one(const char *what, struct match_attr *a, int rem)
693
693
return rem ;
694
694
}
695
695
696
- static int fill (const char * path , int pathlen , struct attr_stack * stk , int rem )
696
+ static int fill (const char * path , int pathlen , const char * basename ,
697
+ struct attr_stack * stk , int rem )
697
698
{
698
699
int i ;
699
700
const char * base = stk -> origin ? stk -> origin : "" ;
@@ -702,8 +703,8 @@ static int fill(const char *path, int pathlen, struct attr_stack *stk, int rem)
702
703
struct match_attr * a = stk -> attrs [i ];
703
704
if (a -> is_macro )
704
705
continue ;
705
- if (path_matches (path , pathlen ,
706
- a -> u .pattern , base , strlen ( base ) ))
706
+ if (path_matches (path , pathlen , basename ,
707
+ a -> u .pattern , base , stk -> originlen ))
707
708
rem = fill_one ("fill" , a , rem );
708
709
}
709
710
return rem ;
@@ -741,15 +742,19 @@ static void collect_all_attrs(const char *path)
741
742
{
742
743
struct attr_stack * stk ;
743
744
int i , pathlen , rem ;
745
+ const char * basename ;
744
746
745
747
prepare_attr_stack (path );
746
748
for (i = 0 ; i < attr_nr ; i ++ )
747
749
check_all_attr [i ].value = ATTR__UNKNOWN ;
748
750
751
+ basename = strrchr (path , '/' );
752
+ basename = basename ? basename + 1 : path ;
753
+
749
754
pathlen = strlen (path );
750
755
rem = attr_nr ;
751
756
for (stk = attr_stack ; 0 < rem && stk ; stk = stk -> prev )
752
- rem = fill (path , pathlen , stk , rem );
757
+ rem = fill (path , pathlen , basename , stk , rem );
753
758
}
754
759
755
760
int git_check_attr (const char * path , int num , struct git_attr_check * check )
0 commit comments