def __ValidateDependencies(self, config: Config, packages: List[Package]) -> None: exceptionList = [] # type: List[Exception] exceptionList2 = [] # type: List[Exception] for package in packages: try: #allDependenciesDict = {} #stack = [package] graph = DependencyGraph(package) #, True) orderedDependencyList = [] # type: List[Package] self.__ValidateDependenciesFor(orderedDependencyList, package, graph) orderedDependencyList.reverse() package.ResolvedBuildOrder = orderedDependencyList # NOTE: we can not filter the dependency list based on 'ExperimentalRecipes' here since we need to resolve it first # package.ResolvedExperimentalRecipeBuildOrder = [entry for entry in orderedDependencyList if not entry.DirectExperimentalRecipe is None] except CircularDependencyException as ex: if config.GroupException: exceptionList.append(ex) else: raise except CircularDependencyInDependentModuleException as ex: if config.GroupException: exceptionList2.append(ex) else: raise if len(exceptionList) > 0: raise GroupedException(exceptionList) # If the below exception is fired we have a internal error # as any entry in exceptionList2 should result in entries in # exceptionList if len(exceptionList2) > 0: raise GroupedException(exceptionList2)
def __SanityCheckDependencies(directDependencies: List[DependencyRecord], name: UnresolvedPackageName) -> None: if len(directDependencies) <= 0: return uniquePackageDict = dict() # type: Dict[UnresolvedPackageName, List[EvaluationPackage.DependencyRecord]] for record in directDependencies: if record.Package.Name == name: raise CircularDependencyException("Can not add dependency to self '{0}'".format(record.Package.Name)) if record.Package.Name not in uniquePackageDict: recordList = [] # type: List[EvaluationPackage.DependencyRecord] uniquePackageDict[record.Package.Name] = recordList else: recordList = uniquePackageDict[record.Package.Name] recordList.append(record) exceptionList = None # type: Optional[List[Exception]] for pairKey, pairValue in uniquePackageDict.items(): if EvaluationPackage.__IsDuplicatedDependency(pairValue): if exceptionList is None: exceptionList = [] helpStr = EvaluationPackage.__ToDuplicatedDependencyHelp(name, pairKey, pairValue) exceptionList.append(Exception("Package '{0}' has duplicate dependency to '{1}': [{2}]'".format(name, pairKey, helpStr))) if exceptionList is not None and len(exceptionList) > 0: if len(exceptionList) > 1: raise GroupedException(exceptionList) else: raise exceptionList[0]
def RaiseExceptionFromErrorRecords(self, sourcePackage: Package, errorRecordList: List[ErrorRecord]) -> None: self.__PackageRecipeResultManager.AddIfMissing(sourcePackage.Name) sourceRecipe = sourcePackage.ResolvedDirectExperimentalRecipe if sourceRecipe is None: raise Exception("Invalid recipe") exceptionList = [Exception("Installation validation failed for package '{0}' recipe '{1}'".format(sourcePackage.Name, sourceRecipe.Name))] for errorRecord in errorRecordList: exceptionList.append(Exception(errorRecord.ToString())) raise GroupedException(exceptionList)
def __ValidateRequirementExtends(log: Log, finalResolveOrder: List[PreResolvePackageResult]) -> None: errors = [] for package in finalResolveOrder: for requirement in package.ResolvedDirectRequirements: if requirement.Type != PackageRequirementTypeString.Feature or len(requirement.Extends) != 0: parent = PreResolver.__TryLocateRequiredFeature(package.ResolvedAllRequirements, requirement.Extends) if parent is None: errors.append((package, requirement)) if len(errors) > 0: exceptionList = [] # type: List[Exception] for error in errors: exceptionList.append(PackageRequirementExtendsUnusedFeatureException(error[1].Name, error[1].Extends, error[0].SourcePackage.NameInfo.FullName.Value)) raise GroupedException(exceptionList)
def __CheckForExceptions(exceptionList: Optional[List[Exception]]) -> None: if exceptionList is not None and len(exceptionList) > 0: if len(exceptionList) > 1: raise GroupedException(exceptionList) else: raise exceptionList[0]