|
37 | 37 | from collections import namedtuple, defaultdict
|
38 | 38 | from copy import copy
|
39 | 39 | from itertools import chain
|
40 |
| -from os import walk |
| 40 | +from os import walk, sep |
41 | 41 | from os.path import (join, splitext, dirname, relpath, basename, split, normcase,
|
42 | 42 | abspath, exists)
|
43 | 43 |
|
@@ -131,7 +131,7 @@ def __init__(self, notify, collect_ignores=False):
|
131 | 131 | self._collect_ignores = collect_ignores
|
132 | 132 |
|
133 | 133 | # Storage for file references, indexed by file type
|
134 |
| - self._file_refs = defaultdict(list) |
| 134 | + self._file_refs = defaultdict(set) |
135 | 135 |
|
136 | 136 | # Incremental scan related
|
137 | 137 | self._label_paths = []
|
@@ -266,17 +266,35 @@ def add_file_ref(self, file_type, file_name, file_path):
|
266 | 266 | ref = FileRef(file_name.replace("\\", "/"), file_path)
|
267 | 267 | else:
|
268 | 268 | ref = FileRef(file_name, file_path)
|
269 |
| - self._file_refs[file_type].append(ref) |
| 269 | + self._file_refs[file_type].add(ref) |
270 | 270 |
|
271 | 271 | def get_file_refs(self, file_type):
|
272 | 272 | """Return a list of FileRef for every file of the given type"""
|
273 |
| - return self._file_refs[file_type] |
| 273 | + return list(self._file_refs[file_type]) |
| 274 | + |
| 275 | + @staticmethod |
| 276 | + def _all_parents(files): |
| 277 | + for name in files: |
| 278 | + components = name.split(sep) |
| 279 | + for n in range(1, len(components)): |
| 280 | + parent = join(*components[:n]) |
| 281 | + yield parent |
| 282 | + |
| 283 | + def _get_from_refs(self, file_type, key): |
| 284 | + if file_type is FileType.INC_DIR: |
| 285 | + parents = set(self._all_parents(self._get_from_refs( |
| 286 | + FileType.HEADER, key))) |
| 287 | + parents.add(".") |
| 288 | + else: |
| 289 | + parents = set() |
| 290 | + return list(parents) + [key(f) for f in self.get_file_refs(file_type)] |
| 291 | + |
274 | 292 |
|
275 | 293 | def get_file_names(self, file_type):
|
276 |
| - return [f.name for f in self.get_file_refs(file_type)] |
| 294 | + return self._get_from_refs(file_type, lambda f: f.name) |
277 | 295 |
|
278 | 296 | def get_file_paths(self, file_type):
|
279 |
| - return [f.path for f in self.get_file_refs(file_type)] |
| 297 | + return self._get_from_refs(file_type, lambda f: f.path) |
280 | 298 |
|
281 | 299 | def add_files_to_type(self, file_type, files):
|
282 | 300 | for f in files:
|
@@ -406,8 +424,6 @@ def add_directory(
|
406 | 424 |
|
407 | 425 | # Add root to include paths
|
408 | 426 | root = root.rstrip("/")
|
409 |
| - fake_root = join(into_path, relpath(root, base_path)) |
410 |
| - self.add_file_ref(FileType.INC_DIR, fake_root, root) |
411 | 427 |
|
412 | 428 | for file in files:
|
413 | 429 | file_path = join(root, file)
|
|
0 commit comments