@@ -88,15 +88,17 @@ impl Pattern {
88
88
base_path. map_or( true , |p| p. ends_with( b"/" ) ) ,
89
89
"base must end with a trailing slash"
90
90
) ;
91
- debug_assert ! (
92
- base_path. map_or( true , |p| !p. starts_with( b"/" ) ) ,
93
- "base must be relative"
94
- ) ;
91
+ debug_assert ! ( !path. starts_with( b"/" ) , "input path must be relative" ) ;
95
92
debug_assert ! (
96
93
base_path. map( |base| path. starts_with( base) ) . unwrap_or( true ) ,
97
94
"repo-relative paths must be pre-filtered to match our base."
98
95
) ;
99
96
97
+ let ( text, first_wildcard_pos) = self
98
+ . mode
99
+ . contains ( pattern:: Mode :: ABSOLUTE )
100
+ . then ( || ( self . text [ 1 ..] . as_bstr ( ) , self . first_wildcard_pos . map ( |p| p - 1 ) ) )
101
+ . unwrap_or ( ( self . text . as_bstr ( ) , self . first_wildcard_pos ) ) ;
100
102
if self . mode . contains ( pattern:: Mode :: NO_SUB_DIR ) {
101
103
let basename = if self . mode . contains ( pattern:: Mode :: ABSOLUTE ) {
102
104
base_path
@@ -105,7 +107,7 @@ impl Pattern {
105
107
} else {
106
108
& path[ basename_start_pos. unwrap_or_default ( ) ..]
107
109
} ;
108
- self . matches ( basename, flags)
110
+ self . matches_inner ( text , first_wildcard_pos , basename, flags)
109
111
} else {
110
112
let path = match base_path {
111
113
Some ( base) => match path. strip_prefix ( base. as_ref ( ) ) {
@@ -114,7 +116,7 @@ impl Pattern {
114
116
} ,
115
117
None => path,
116
118
} ;
117
- self . matches ( path, flags)
119
+ self . matches_inner ( text , first_wildcard_pos , path, flags)
118
120
}
119
121
}
120
122
@@ -125,11 +127,21 @@ impl Pattern {
125
127
///
126
128
/// Note that this method uses some shortcuts to accelerate simple patterns.
127
129
pub fn matches < ' a > ( & self , value : impl Into < & ' a BStr > , mode : wildmatch:: Mode ) -> bool {
130
+ self . matches_inner ( self . text . as_bstr ( ) , self . first_wildcard_pos , value, mode)
131
+ }
132
+
133
+ fn matches_inner < ' a > (
134
+ & self ,
135
+ text : & BStr ,
136
+ first_wildcard_pos : Option < usize > ,
137
+ value : impl Into < & ' a BStr > ,
138
+ mode : wildmatch:: Mode ,
139
+ ) -> bool {
128
140
let value = value. into ( ) ;
129
- match self . first_wildcard_pos {
141
+ match first_wildcard_pos {
130
142
// "*literal" case, overrides starts-with
131
143
Some ( pos) if self . mode . contains ( pattern:: Mode :: ENDS_WITH ) && !value. contains ( & b'/' ) => {
132
- let text = & self . text [ pos + 1 ..] ;
144
+ let text = & text[ pos + 1 ..] ;
133
145
if mode. contains ( wildmatch:: Mode :: IGNORE_CASE ) {
134
146
value
135
147
. len ( )
@@ -144,20 +156,20 @@ impl Pattern {
144
156
if mode. contains ( wildmatch:: Mode :: IGNORE_CASE ) {
145
157
if !value
146
158
. get ( ..pos)
147
- . map_or ( false , |value| value. eq_ignore_ascii_case ( & self . text [ ..pos] ) )
159
+ . map_or ( false , |value| value. eq_ignore_ascii_case ( & text[ ..pos] ) )
148
160
{
149
161
return false ;
150
162
}
151
- } else if !value. starts_with ( & self . text [ ..pos] ) {
163
+ } else if !value. starts_with ( & text[ ..pos] ) {
152
164
return false ;
153
165
}
154
- crate :: wildmatch ( self . text . as_bstr ( ) , value, mode)
166
+ crate :: wildmatch ( text. as_bstr ( ) , value, mode)
155
167
}
156
168
None => {
157
169
if mode. contains ( wildmatch:: Mode :: IGNORE_CASE ) {
158
- self . text . eq_ignore_ascii_case ( value)
170
+ text. eq_ignore_ascii_case ( value)
159
171
} else {
160
- self . text == value
172
+ text == value
161
173
}
162
174
}
163
175
}
0 commit comments