def classlistFromClassRecursive(depsItem, excludeWithDeps, variants, result, warn_deps, allowBlockLoaddeps=True): # support blocking if depsItem.name in excludeWithDeps: if depsItem.isLoadDep and not allowBlockLoaddeps: raise DependencyError() return # check if already in if depsItem.name in resultNames: # string compares are perceivably faster than object compares (as DependencyItem defines __eq__) return # add self result.append(depsItem) resultNames.append(depsItem.name) # reading dependencies self._console.debug("Gathering dependencies: %s" % depsItem.name) self._console.indent() deps, cached = self.getCombinedDeps(depsItem.name, variants, buildType) self._console.outdent() if logInfos: self._console.dot("%s" % "." if cached else "*") # and evaluate them deps["warn"] = self._checkDepsAreKnown(deps) # add 'warn' key to deps ignore_names = [x.name for x in deps["ignore"]] if verifyDeps: for dep in deps["warn"]: if dep.name not in ignore_names: warn_deps.append(dep) # process lists try: skipNames = [x.name for x in deps["warn"] + deps["ignore"]] for subitem in deps["load"]: if subitem.name not in resultNames and subitem.name not in skipNames: classlistFromClassRecursive(subitem, excludeWithDeps, variants, result, warn_deps, allowBlockLoaddeps) ## # putting this here allows sorting and expanding of the class # list in one go! what's missing from sortClassesRecursor is # the cycle check #if depsItem.name not in resultNames: # result.append(depsItem) # resultNames.append(depsItem.name) for subitem in deps["run"]: if subitem.name not in resultNames and subitem.name not in skipNames: classlistFromClassRecursive(subitem, excludeWithDeps, variants, result, warn_deps, allowBlockLoaddeps) except DependencyError, detail: raise ValueError("Attempt to block load-time dependency of class %s to %s" % (depsItem.name, subitem.name))
def classlistFromClassRecursive(depsItem, excludeWithDeps, variants, result, warn_deps, loadDepsChain, allowBlockLoaddeps=True): # support blocking if depsItem.name in excludeWithDeps: if depsItem.isLoadDep and not allowBlockLoaddeps: raise DependencyError() return # check if already in if depsItem.name in resultNames: # string compares are perceivably faster than object compares (as DependencyItem defines __eq__) return # reading dependencies self._console.debug("Gathering dependencies: %s" % depsItem.name) self._console.indent() classObj = self._classesObj[depsItem.name] # get class from depsItem deps, cached = classObj.getCombinedDeps(self._classesObj, variants, self._jobconf, genProxy=genProxyIter.next()) self._console.outdent() if logInfos: self._console.dot("%s" % "." if cached else "*") # and evaluate them deps["warn"] = self._checkDepsAreKnown(deps) # add 'warn' key to deps ignore_names = [x.name for x in deps["ignore"]] if verifyDeps: for dep in deps["warn"]: if dep.name not in ignore_names: warn_deps.append(dep) # process lists try: skipNames = [x.name for x in deps["warn"] + deps["ignore"]] # cycle detection assert depsItem.name not in loadDepsChain loadDepsChain.append(depsItem.name) for subitem in deps["load"]: # cycle check if subitem.name in loadDepsChain: self._console.warn("Detected circular dependency between: %s and %s" % (depsItem.name, subitem.name)) self._console.indent() self._console.debug("currently explored dependency path: %r" % loadDepsChain) self._console.outdent() raise RuntimeError("Circular class dependencies") if subitem.name not in resultNames and subitem.name not in skipNames: classlistFromClassRecursive(subitem, excludeWithDeps, variants, result, warn_deps, loadDepsChain, allowBlockLoaddeps) ## # putting this here allows expanding and partially sorting of the class # list in one go if depsItem.name not in resultNames: result.append(depsItem) resultNames.append(depsItem.name) # cycle check loadDepsChain.remove(depsItem.name) for subitem in deps["run"]: if subitem.name not in resultNames and subitem.name not in skipNames: classlistFromClassRecursive(subitem, excludeWithDeps, variants, result, warn_deps, [], allowBlockLoaddeps) except DependencyError, detail: raise ValueError("Attempt to block load-time dependency of class %s to %s" % (depsItem.name, subitem.name))