def find_any(self, queries, types=None): nodes = set() for query in utils.listify(queries): result = self._resolve_partial(query, None) if result is None: raise le.LbuildParserNodeNotFoundException(self, query, types) nodes |= set(result) if types: types = utils.listify(types) nodes = [n for n in nodes if any(n.type == t for t in types)] return list(nodes)
def merge_module_options(self): # only deal with repo options that contain one `:` resolver = self.option_resolver for name, value in {n: v for n, v in self.config.options.items() if n.count(":") > 1}.items(): try: resolver[name].value = value except le.LbuildOptionException as error: raise le.LbuildDumpConfigException( "Failed to validate module options!\n{}".format(error), self) except le.LbuildResolverNoMatchException as error: raise le.LbuildParserNodeNotFoundException(self, name, self.Type.OPTION)
def merge_module_options(self): # only deal with repo options that contain one `:` resolver = self.option_resolver for name, (value, filename) in filter(lambda i: i[0].count(":") > 1, self.config.options.items()): try: option = resolver[name] option._filename = filename option.value = value except le.LbuildOptionException as error: raise le.LbuildParserOptionInvalidException( self, error, filename) except le.LbuildResolverNoMatchException as error: raise le.LbuildParserNodeNotFoundException( self, name, self.Type.OPTION, filename)
def build_modules(self, build_modules, buildlog=None, simulate=False): undefined = self._undefined_options(self.all_options()) if undefined: raise le.LbuildOptionRequiredInputsException(undefined) if not build_modules: raise le.LbuildConfigNoModulesException(self) if buildlog is None and simulate: buildlog = BuildLog() # Create a buildlog for simulation # Update subtree build order self._update_order() groups = collections.defaultdict(lambda: collections.defaultdict(list)) # Build environments for all modules and repos for node in (build_modules | {m.repository for m in build_modules}): env = lbuild.environment.Environment(node, buildlog) groups[node._build_order][node.depth].append(Runner(node, env)) def walk_modules(): # Enforce that the submodules are always build before their parent modules for group in (groups[index] for index in sorted(groups)): for modules in (group[index] for index in sorted(group, reverse=True)): random.shuffle(modules) for module in modules: yield module # Merge config collectors values resolver = self.collector_available_resolver for (name, value, filename) in self.config.collectors: try: collector = resolver[name] collector.add_values(value, collector.repository.fullname, filename=filename) except le.LbuildOptionException as error: raise le.LbuildParserOptionInvalidException( self, error, filename) except le.LbuildResolverNoMatchException as error: raise le.LbuildParserNodeNotFoundException( self, name, self.Type.COLLECTOR, filename) exceptions = [] for runner in walk_modules(): try: runner.validate() except le.LbuildException as error: exceptions.append(error) if exceptions: raise le.LbuildAggregateException(exceptions) # Cannot build without a buildlog if buildlog is None: return lbuild.environment.SIMULATE = simulate # Build modules for runner in walk_modules(): runner.build() # Post-build modules for runner in walk_modules(): runner.post_build(buildlog)