|
5 | 5 |
|
6 | 6 | import re
|
7 | 7 |
|
| 8 | +from anytree.iterators.preorderiter import PreOrderIter |
| 9 | + |
8 | 10 | _MAXCACHE = 20
|
9 | 11 |
|
10 | 12 |
|
@@ -204,26 +206,39 @@ def __start(self, node, path, cmp_):
|
204 | 206 |
|
205 | 207 | def __glob(self, node, parts):
|
206 | 208 | assert node is not None
|
207 |
| - nodes = [] |
208 |
| - if parts: |
209 |
| - name = parts[0] |
210 |
| - remainder = parts[1:] |
211 |
| - # handle relative |
212 |
| - if name == "..": |
213 |
| - parent = node.parent |
214 |
| - if parent is None: |
215 |
| - raise RootResolverError(node) |
216 |
| - nodes += self.__glob(parent, remainder) |
217 |
| - elif name in ("", "."): |
218 |
| - nodes += self.__glob(node, remainder) |
219 |
| - else: |
220 |
| - matches = self.__find(node, name, remainder) |
221 |
| - if not matches and not Resolver.is_wildcard(name): |
222 |
| - raise ChildResolverError(node, name, self.pathattr) |
223 |
| - nodes += matches |
224 |
| - else: |
225 |
| - nodes = [node] |
226 |
| - return nodes |
| 209 | + |
| 210 | + if not parts: |
| 211 | + return [node] |
| 212 | + |
| 213 | + name = parts[0] |
| 214 | + remainder = parts[1:] |
| 215 | + |
| 216 | + # handle relative |
| 217 | + if name == "..": |
| 218 | + parent = node.parent |
| 219 | + if parent is None: |
| 220 | + raise RootResolverError(node) |
| 221 | + return self.__glob(parent, remainder) |
| 222 | + |
| 223 | + if name in ("", "."): |
| 224 | + return self.__glob(node, remainder) |
| 225 | + |
| 226 | + # handle recursive |
| 227 | + if name == "**": |
| 228 | + matches = [] |
| 229 | + for n in PreOrderIter(node): |
| 230 | + try: |
| 231 | + matches += self.__glob(n, remainder) |
| 232 | + except ChildResolverError: |
| 233 | + pass |
| 234 | + return matches |
| 235 | + |
| 236 | + print(node, name, remainder) |
| 237 | + |
| 238 | + matches = self.__find(node, name, remainder) |
| 239 | + if not matches and not Resolver.is_wildcard(name): |
| 240 | + raise ChildResolverError(node, name, self.pathattr) |
| 241 | + return matches |
227 | 242 |
|
228 | 243 | def __find(self, node, pat, remainder):
|
229 | 244 | matches = []
|
|
0 commit comments