Correctly remove source duplicates.

Duplicate sources must be detected from their classes.
So add a optional arguments key_function to remove_duplicates to use
a custom key to compare elems and use it to remove duplicate sources
using their classes.
This commit is contained in:
Matthieu Gautier 2017-01-31 14:38:36 +01:00
parent 14d609d007
commit ea3ea77256
1 changed files with 8 additions and 4 deletions

View File

@ -23,12 +23,15 @@ class Defaultdict(defaultdict):
def __getattr__(self, name): def __getattr__(self, name):
return self[name] return self[name]
def remove_duplicates(iterable): def remove_duplicates(iterable, key_function=None):
seen = set() seen = set()
if key_function is None:
key_function = lambda e:e
for elem in iterable: for elem in iterable:
if elem in seen: key = key_function(elem)
if key in seen:
continue continue
seen.add(elem) seen.add(key)
yield elem yield elem
def get_sha256(path): def get_sha256(path):
@ -778,7 +781,8 @@ class Builder:
yield targetName yield targetName
def prepare_sources(self): def prepare_sources(self):
sources = remove_duplicates(dep.source for dep in self.targets.values()) sources = (dep.source for dep in self.targets.values())
sources = remove_duplicates(sources, lambda s:s.__class__)
for source in sources: for source in sources:
print("prepare sources {} :".format(source.name)) print("prepare sources {} :".format(source.name))
source.prepare() source.prepare()