@@ -657,24 +657,24 @@ static void prepare_attr_stack(const char *path, int dirlen)
657657}
658658
659659static int path_matches (const char * pathname , int pathlen ,
660- const char * basename ,
660+ int basename_offset ,
661661 const struct pattern * pat ,
662662 const char * base , int baselen )
663663{
664664 const char * pattern = pat -> pattern ;
665665 int prefix = pat -> nowildcardlen ;
666+ int isdir = (pathlen && pathname [pathlen - 1 ] == '/' );
666667
667- if ((pat -> flags & EXC_FLAG_MUSTBEDIR ) &&
668- ((!pathlen ) || (pathname [pathlen - 1 ] != '/' )))
668+ if ((pat -> flags & EXC_FLAG_MUSTBEDIR ) && !isdir )
669669 return 0 ;
670670
671671 if (pat -> flags & EXC_FLAG_NODIR ) {
672- return match_basename (basename ,
673- pathlen - ( basename - pathname ) ,
672+ return match_basename (pathname + basename_offset ,
673+ pathlen - basename_offset - isdir ,
674674 pattern , prefix ,
675675 pat -> patternlen , pat -> flags );
676676 }
677- return match_pathname (pathname , pathlen ,
677+ return match_pathname (pathname , pathlen - isdir ,
678678 base , baselen ,
679679 pattern , prefix , pat -> patternlen , pat -> flags );
680680}
@@ -703,7 +703,7 @@ static int fill_one(const char *what, struct match_attr *a, int rem)
703703 return rem ;
704704}
705705
706- static int fill (const char * path , int pathlen , const char * basename ,
706+ static int fill (const char * path , int pathlen , int basename_offset ,
707707 struct attr_stack * stk , int rem )
708708{
709709 int i ;
@@ -713,7 +713,7 @@ static int fill(const char *path, int pathlen, const char *basename,
713713 struct match_attr * a = stk -> attrs [i ];
714714 if (a -> is_macro )
715715 continue ;
716- if (path_matches (path , pathlen , basename ,
716+ if (path_matches (path , pathlen , basename_offset ,
717717 & a -> u .pat , base , stk -> originlen ))
718718 rem = fill_one ("fill" , a , rem );
719719 }
@@ -752,18 +752,19 @@ static void collect_all_attrs(const char *path)
752752{
753753 struct attr_stack * stk ;
754754 int i , pathlen , rem , dirlen ;
755- const char * basename , * cp , * last_slash = NULL ;
755+ const char * cp , * last_slash = NULL ;
756+ int basename_offset ;
756757
757758 for (cp = path ; * cp ; cp ++ ) {
758759 if (* cp == '/' && cp [1 ])
759760 last_slash = cp ;
760761 }
761762 pathlen = cp - path ;
762763 if (last_slash ) {
763- basename = last_slash + 1 ;
764+ basename_offset = last_slash + 1 - path ;
764765 dirlen = last_slash - path ;
765766 } else {
766- basename = path ;
767+ basename_offset = 0 ;
767768 dirlen = 0 ;
768769 }
769770
@@ -773,7 +774,7 @@ static void collect_all_attrs(const char *path)
773774
774775 rem = attr_nr ;
775776 for (stk = attr_stack ; 0 < rem && stk ; stk = stk -> prev )
776- rem = fill (path , pathlen , basename , stk , rem );
777+ rem = fill (path , pathlen , basename_offset , stk , rem );
777778}
778779
779780int git_check_attr (const char * path , int num , struct git_attr_check * check )
0 commit comments