def _findMergeTarget(self, mergePackage, packages): ## # if another package id has the same bits turned on, it is available # in the same parts. def areInSameParts(mergePackage, package): return (mergePackage.id & package.id) == mergePackage.id ## # check if any of the deps of mergePackage depend on targetPackage - # if merging mergePackage into targetPackage, this would be creating # circular dependencies def noCircularDeps(mergePackage, targetPackage): for package in mergePackage.packageDeps: if targetPackage in package.packageDeps: return False return True ## # check that the targetPackage is loaded in those parts # where mergePackage's deps are loaded def depsAvailWhereTarget(mergePackage, targetPackage): for depsPackage in mergePackage.packageDeps: if not areInSameParts(targetPackage, depsPackage): return False return True # ---------------------------------------------------------------------- allPackages = reversed(Package.sort(packages)) # sorting and reversing assures we try "smaller" package id's first addtl_merge_constraints = self._jobconf.get( "packages/additional-merge-constraints", True) for targetPackage in allPackages: if mergePackage.id == targetPackage.id: # no self-merging ;) continue if not areInSameParts(mergePackage, targetPackage): self._console.debug("Problematic #%d (different parts using)" % targetPackage.id) continue if not noCircularDeps(mergePackage, targetPackage): self._console.debug("Problematic #%d (circular dependencies)" % targetPackage.id) if addtl_merge_constraints: continue # why accept this by default? if not depsAvailWhereTarget(mergePackage, targetPackage): self._console.debug( "Problematic #%d (dependencies not always available)" % targetPackage.id) if addtl_merge_constraints: continue # why accept this by default? yield targetPackage yield None
def getPackagesFromClasses(allClasses): packages = {} for classId in allClasses: pkgId = allClasses[classId] # create a Package if necessary if pkgId not in packages: package = Package(pkgId) packages[pkgId] = package # store classId with this package #packages[pkgId].classes.append(classId) packages[pkgId].classes.append(classesObj[classId]) return packages.values()
def _findMergeTarget(self, mergePackage, packages): ## # if another package id has the same bits turned on, it is available # in the same parts. def areInSameParts(mergePackage, package): return (mergePackage.id & package.id) == mergePackage.id ## # check if any of the deps of mergePackage depend on targetPackage - # if merging mergePackage into targetPackage, this would be creating # circular dependencies def noCircularDeps(mergePackage, targetPackage): for package in mergePackage.packageDeps: if targetPackage in package.packageDeps: return False return True ## # check that the targetPackage is loaded in those parts # where mergePackage's deps are loaded def depsAvailWhereTarget (mergePackage, targetPackage): for depsPackage in mergePackage.packageDeps: if not areInSameParts(targetPackage, depsPackage): return False return True # ---------------------------------------------------------------------- allPackages = reversed(Package.sort(packages)) # sorting and reversing assures we try "smaller" package id's first addtl_merge_constraints = self._jobconf.get("packages/additional-merge-constraints", True) for targetPackage in allPackages: if mergePackage.id == targetPackage.id: # no self-merging ;) continue if not areInSameParts(mergePackage, targetPackage): self._console.debug("Problematic #%d (different parts using)" % targetPackage.id) continue if not noCircularDeps(mergePackage, targetPackage): self._console.debug("Problematic #%d (circular dependencies)" % targetPackage.id) if addtl_merge_constraints: continue # why accept this by default? if not depsAvailWhereTarget(mergePackage, targetPackage): self._console.debug("Problematic #%d (dependencies not always available)" % targetPackage.id) if addtl_merge_constraints: continue # why accept this by default? yield targetPackage yield None
def packagesSorted(self): return Package.sort(self.packages)
def packagesSortedSimple(self): return Package.simpleSort(self.packages)
def partsConfigFromClassList(includeWithDeps, excludeWithDeps, script): def evalPackagesConfig(excludeWithDeps, classList, variants): # Reading configuration partsCfg = self._job.get("packages/parts", {}) # Expanding expressions self._console.debug("Expanding include expressions...") partIncludes = {} for partId in partsCfg: partIncludes[partId] = textutil.expandGlobs(partsCfg[partId]['include'], self._classesObj) # Computing packages #boot, partPackages, packageClasses = self._partBuilder.getPackages(partIncludes, excludeWithDeps, self._context, script) partPackages, _ = self._partBuilder.getPackages(partIncludes, excludeWithDeps, self._context, script) packageClasses = script.packagesSorted() #return boot, partPackages, packageClasses return script.boot, script.parts, packageClasses # ----------------------------------------------------------- classList = script.classes variants = script.variants self._partBuilder = PartBuilder(self._console, self._depLoader) # Check for a 'packages' configuration in the job if 0: # this branch should work, but doesn't; # create a synthetic job key and let evalPackagesConfig do the rest if not self._job.get("packages"): package_config = { "parts" : { "boot" : { "include" : includeWithDeps } }, "init" : "boot" } self._job.setFeature("packages", package_config) (boot, partPackages, # partPackages[partId]=[0,1,3] packageClasses # packageClasses[0]=['qx.Class','qx.bom.Stylesheet',...] ) = evalPackagesConfig(excludeWithDeps, classList, variants) else: if self._job.get("packages"): (boot, partPackages, # partPackages[partId]=[0,1,3] packageClasses # packageClasses[0]=['qx.Class','qx.bom.Stylesheet',...] ) = evalPackagesConfig(excludeWithDeps, classList, variants) else: # Emulate a 'boot' part boot = "boot" partPackages = { "boot" : [0] } packageClasses = [classList] # patch script object script.boot = boot packageObj = Package(0) packageObj.classes = script.classesObj script.packages.append(packageObj) partObj = Part("boot") partObj.packages.append(packageObj) initial_deps = list(set(includeWithDeps).difference(script.excludes)) # defining classes from config minus expanded excludes partObj.initial_deps = initial_deps partObj.deps = initial_deps[:] script.parts = { "boot" : partObj } return boot, partPackages, packageClasses
def partsConfigFromClassList(includeWithDeps, excludeWithDeps, script): def evalPackagesConfig(excludeWithDeps, classList, variants): # Reading configuration partsCfg = self._job.get("packages/parts", {}) # Expanding expressions self._console.debug("Expanding include expressions...") partIncludes = {} for partId in partsCfg: partIncludes[partId] = textutil.expandGlobs(partsCfg[partId]['include'], self._classesObj) # Computing packages #boot, partPackages, packageClasses = self._partBuilder.getPackages(partIncludes, excludeWithDeps, self._context, script) partPackages, _ = self._partBuilder.getPackages(partIncludes, excludeWithDeps, self._context, script) packageClasses = script.packagesSorted() #return boot, partPackages, packageClasses return script.boot, script.parts, packageClasses # ----------------------------------------------------------- classList = script.classes variants = script.variants self._partBuilder = PartBuilder(self._console, self._depLoader) # Use the 'packages' configuration in the job or fake it dynamically. # Using a synthetic config object and running evalPackagesConfig() # in any case doesn't pay off, because the Generator then prints # out messages regarding parts which irritates the user and assumes # that includeWithDeps is used (and fails with includeNoDeps). if self._job.get("packages"): (boot, partPackages, # partPackages[partId]=[0,1,3] packageClasses # packageClasses[0]=['qx.Class','qx.bom.Stylesheet',...] ) = evalPackagesConfig(excludeWithDeps, classList, variants) else: # bug#7667: Tried to consolidate with if body above, but the # codebase needs too many adaptions to be also compatible with # includeNoDeps (e.g. "=myClass" in config). Therefore this # code branch is kept: Instead of computing the deps, the # classes from script.classesObj are used. # Emulate a 'boot' part boot = "boot" partPackages = { "boot" : [0] } packageClasses = [classList] # patch script object script.boot = boot packageObj = Package(0) packageObj.classes = script.classesObj script.packages.append(packageObj) partObj = Part("boot") partObj.packages.append(packageObj) initial_deps = list(set(includeWithDeps).difference(script.excludes)) # defining classes from config minus expanded excludes partObj.initial_deps = initial_deps partObj.deps = initial_deps[:] script.parts = { "boot" : partObj } return boot, partPackages, packageClasses
def partsConfigFromClassList(includeWithDeps, excludeWithDeps, script): def evalPackagesConfig(excludeWithDeps, classList, variants): # Reading configuration partsCfg = self._job.get("packages/parts", {}) # Expanding expressions self._console.debug("Expanding include expressions...") partIncludes = {} for partId in partsCfg: partIncludes[partId] = textutil.expandGlobs( partsCfg[partId]['include'], self._classesObj) # Computing packages #boot, partPackages, packageClasses = self._partBuilder.getPackages(partIncludes, excludeWithDeps, self._context, script) partPackages, _ = self._partBuilder.getPackages( partIncludes, excludeWithDeps, self._context, script) packageClasses = script.packagesSorted() #return boot, partPackages, packageClasses return script.boot, script.parts, packageClasses # ----------------------------------------------------------- classList = script.classes variants = script.variants self._partBuilder = PartBuilder(self._console, self._depLoader) # Check for a 'packages' configuration in the job if 0: # this branch should work, but doesn't; # create a synthetic job key and let evalPackagesConfig do the rest if not self._job.get("packages"): package_config = { "parts": { "boot": { "include": includeWithDeps } }, "init": "boot" } self._job.setFeature("packages", package_config) ( boot, partPackages, # partPackages[partId]=[0,1,3] packageClasses # packageClasses[0]=['qx.Class','qx.bom.Stylesheet',...] ) = evalPackagesConfig(excludeWithDeps, classList, variants) else: if self._job.get("packages"): ( boot, partPackages, # partPackages[partId]=[0,1,3] packageClasses # packageClasses[0]=['qx.Class','qx.bom.Stylesheet',...] ) = evalPackagesConfig(excludeWithDeps, classList, variants) else: # Emulate a 'boot' part boot = "boot" partPackages = {"boot": [0]} packageClasses = [classList] # patch script object script.boot = boot packageObj = Package(0) packageObj.classes = script.classesObj script.packages.append(packageObj) partObj = Part("boot") partObj.packages.append(packageObj) initial_deps = list( set(includeWithDeps).difference(script.excludes) ) # defining classes from config minus expanded excludes partObj.initial_deps = initial_deps partObj.deps = initial_deps[:] script.parts = {"boot": partObj} return boot, partPackages, packageClasses
def partsConfigFromClassList(includeWithDeps, excludeWithDeps, script): def evalPackagesConfig(excludeWithDeps, classList, variants): # Reading configuration partsCfg = self._job.get("packages/parts", {}) # Expanding expressions self._console.debug("Expanding include expressions...") partIncludes = {} for partId in partsCfg: partIncludes[partId] = textutil.expandGlobs( partsCfg[partId]['include'], self._classesObj) # Computing packages #boot, partPackages, packageClasses = self._partBuilder.getPackages(partIncludes, excludeWithDeps, self._context, script) partPackages, _ = self._partBuilder.getPackages( partIncludes, excludeWithDeps, self._context, script) packageClasses = script.packagesSorted() #return boot, partPackages, packageClasses return script.boot, script.parts, packageClasses # ----------------------------------------------------------- classList = script.classes variants = script.variants self._partBuilder = PartBuilder(self._console, self._depLoader) # Use the 'packages' configuration in the job or fake it dynamically. # Using a synthetic config object and running evalPackagesConfig() # in any case doesn't pay off, because the Generator then prints # out messages regarding parts which irritates the user and assumes # that includeWithDeps is used (and fails with includeNoDeps). if self._job.get("packages"): ( boot, partPackages, # partPackages[partId]=[0,1,3] packageClasses # packageClasses[0]=['qx.Class','qx.bom.Stylesheet',...] ) = evalPackagesConfig(excludeWithDeps, classList, variants) else: # bug#7667: Tried to consolidate with if body above, but the # codebase needs too many adaptions to be also compatible with # includeNoDeps (e.g. "=myClass" in config). Therefore this # code branch is kept: Instead of computing the deps, the # classes from script.classesObj are used. # Emulate a 'boot' part boot = "boot" partPackages = {"boot": [0]} packageClasses = [classList] # patch script object script.boot = boot packageObj = Package(0) packageObj.classes = script.classesObj script.packages.append(packageObj) partObj = Part("boot") partObj.packages.append(packageObj) initial_deps = list( set(includeWithDeps).difference(script.excludes) ) # defining classes from config minus expanded excludes partObj.initial_deps = initial_deps partObj.deps = initial_deps[:] script.parts = {"boot": partObj} return boot, partPackages, packageClasses