Added Multiversion support for dependent packages in 2.0 branch.
Aditionally, Fixed the container part of the code which was not working.
Change-Id: I771794b220588d84cfdab91fc1f0cc5e608b1bc8
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5379
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>
| ... | ... |
@@ -14,7 +14,7 @@ from SpecData import SPECS |
| 14 | 14 |
class BuildContainer(PackageBuilderBase): |
| 15 | 15 |
|
| 16 | 16 |
def __init__(self, mapPackageToCycles, listAvailableCyclicPackages, listBuildOptionPackages, pkgBuildOptionFile, logName=None, logPath=None): |
| 17 |
- PackageBuilderBase.__init__(self, mapPackageToCycles, "continer") |
|
| 17 |
+ PackageBuilderBase.__init__(self, mapPackageToCycles, "container") |
|
| 18 | 18 |
if logName is None: |
| 19 | 19 |
logName = "BuildContainer" |
| 20 | 20 |
if logPath is None: |
| ... | ... |
@@ -146,10 +146,11 @@ class BuildContainer(PackageBuilderBase): |
| 146 | 146 |
listInstalledPackages, listInstalledRPMs = self.findInstalledPackages(containerID) |
| 147 | 147 |
self.logger.info(listInstalledPackages) |
| 148 | 148 |
listDependentPackages = self.findBuildTimeRequiredPackages(index) |
| 149 |
+ listTestPackages=[] |
|
| 149 | 150 |
if constants.rpmCheck and package in constants.testForceRPMS: |
| 150 | 151 |
listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages(index)) |
| 151 | 152 |
testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([package]) |
| 152 |
- listDependentPackages.extend(testPackages) |
|
| 153 |
+ listTestPackages = list(set(testPackages)) |
|
| 153 | 154 |
listDependentPackages=list(set(listDependentPackages)) |
| 154 | 155 |
|
| 155 | 156 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
| ... | ... |
@@ -157,15 +158,36 @@ class BuildContainer(PackageBuilderBase): |
| 157 | 157 |
self.logger.info("BuildContainer-buildPackage: Installing dependent packages..")
|
| 158 | 158 |
self.logger.info(listDependentPackages) |
| 159 | 159 |
for pkg in listDependentPackages: |
| 160 |
- self.installPackage(pkgUtils, pkg, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 160 |
+ properVersion=pkgUtils.getProperVersion(pkg.package,pkg) |
|
| 161 |
+ self.installPackage(pkgUtils, pkg.package, properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 162 |
+ for pkg in listTestPackages: |
|
| 163 |
+ flag = False |
|
| 164 |
+ for lineContent in listDependentPackages: |
|
| 165 |
+ if lineContent.package == pkg: |
|
| 166 |
+ properVersion=pkgUtils.getProperVersion(pkg,lineContent) |
|
| 167 |
+ self.installPackage(pkgUtils, pkg, properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 168 |
+ flag = True |
|
| 169 |
+ break; |
|
| 170 |
+ if flag == False: |
|
| 171 |
+ self.installPackage(pkgUtils, pkg,"*", containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 161 | 172 |
# Special case sqlite due to package renamed from sqlite-autoconf to sqlite |
| 162 | 173 |
if "sqlite" in listInstalledPackages or "sqlite-devel" in listInstalledPackages or "sqlite-libs" in listInstalledPackages: |
| 174 |
+ properVersion = "*" |
|
| 163 | 175 |
if "sqlite" not in listInstalledPackages: |
| 164 |
- self.installPackage(pkgUtils, "sqlite", containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 176 |
+ for lineContent in listDependentPackages: |
|
| 177 |
+ if lineContent.package == "sqlite": |
|
| 178 |
+ properVersion=pkgUtils.getProperVersion(lineContent.package,lineContent) |
|
| 179 |
+ self.installPackage(pkgUtils, "sqlite",properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 165 | 180 |
if "sqlite-devel" not in listInstalledPackages: |
| 166 |
- self.installPackage(pkgUtils, "sqlite-devel", containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 181 |
+ for lineContent in listDependentPackages: |
|
| 182 |
+ if lineContent.package == "sqlite": |
|
| 183 |
+ properVersion=pkgUtils.getProperVersion(lineContent.package,lineContent) |
|
| 184 |
+ self.installPackage(pkgUtils, "sqlite-devel",properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 167 | 185 |
if "sqlite-libs" not in listInstalledPackages: |
| 168 |
- self.installPackage(pkgUtils, "sqlite-libs", containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 186 |
+ for lineContent in listDependentPackages: |
|
| 187 |
+ if lineContent.package == "sqlite": |
|
| 188 |
+ properVersion=pkgUtils.getProperVersion(lineContent.package,lineContent) |
|
| 189 |
+ self.installPackage(pkgUtils, "sqlite-libs", properVersion,containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 169 | 190 |
pkgUtils.installRPMSInAOneShotInContainer(containerID, destLogPath) |
| 170 | 191 |
|
| 171 | 192 |
pkgUtils.adjustGCCSpecsInContainer(package, containerID, destLogPath, index) |
| ... | ... |
@@ -195,9 +217,8 @@ class BuildContainer(PackageBuilderBase): |
| 195 | 195 |
chrUtils = ChrootUtils(self.logName,self.logPath) |
| 196 | 196 |
chrUtils.destroyChroot(chrootID) |
| 197 | 197 |
|
| 198 |
- def installPackage(self, pkgUtils, package, containerID, destLogPath, listInstalledPackages, listInstalledRPMs): |
|
| 199 |
- latestRPM = os.path.basename(pkgUtils.findRPMFileForGivenPackage(package)).replace(".rpm", "")
|
|
| 200 |
- if package in listInstalledPackages and latestRPM in listInstalledRPMs: |
|
| 198 |
+ def installPackage(self, pkgUtils, package,packageVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs): |
|
| 199 |
+ if package in listInstalledPackages: |
|
| 201 | 200 |
return |
| 202 | 201 |
self.installDependentRunTimePackages(pkgUtils, package, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
| 203 | 202 |
noDeps = False |
| ... | ... |
@@ -207,12 +228,14 @@ class BuildContainer(PackageBuilderBase): |
| 207 | 207 |
noDeps = True |
| 208 | 208 |
if package in constants.noDepsPackageList: |
| 209 | 209 |
noDeps = True |
| 210 |
- pkgUtils.prepRPMforInstallInContainer(package, containerID, noDeps, destLogPath) |
|
| 210 |
+ pkgUtils.prepRPMforInstallInContainer(package,packageVersion, containerID, noDeps, destLogPath) |
|
| 211 | 211 |
listInstalledPackages.append(package) |
| 212 |
- listInstalledRPMs.append(latestRPM) |
|
| 212 |
+ specificRPM = os.path.basename(pkgUtils.findRPMFileForGivenPackage(package,packageVersion)).replace(".rpm", "")
|
|
| 213 |
+ listInstalledRPMs.append(specificRPM) |
|
| 213 | 214 |
|
| 214 | 215 |
def installDependentRunTimePackages(self, pkgUtils, package, containerID, destLogPath, listInstalledPackages, listInstalledRPMs): |
| 215 | 216 |
listRunTimeDependentPackages = self.findRunTimeRequiredRPMPackages(package) |
| 217 |
+ listRunTimeDependentPackagesLineContent=self.findRunTimeRequiredRPMPackagesLineContent(package) |
|
| 216 | 218 |
if len(listRunTimeDependentPackages) != 0: |
| 217 | 219 |
for pkg in listRunTimeDependentPackages: |
| 218 | 220 |
if self.mapPackageToCycles.has_key(pkg) and pkg not in self.listAvailableCyclicPackages: |
| ... | ... |
@@ -220,4 +243,12 @@ class BuildContainer(PackageBuilderBase): |
| 220 | 220 |
latestPkgRPM = os.path.basename(pkgUtils.findRPMFileForGivenPackage(pkg)).replace(".rpm", "")
|
| 221 | 221 |
if pkg in listInstalledPackages and latestPkgRPM in listInstalledRPMs: |
| 222 | 222 |
continue |
| 223 |
- self.installPackage(pkgUtils, pkg, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 223 |
+ flag = False |
|
| 224 |
+ for lineContent in listRunTimeDependentPackagesLineContent: |
|
| 225 |
+ if lineContent.package == pkg: |
|
| 226 |
+ properVersion=pkgUtils.getProperVersion(pkg,lineContent) |
|
| 227 |
+ self.installPackage(pkgUtils, pkg,properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
|
| 228 |
+ flag = True |
|
| 229 |
+ break; |
|
| 230 |
+ if flag == False: |
|
| 231 |
+ self.installPackage(pkgUtils, pkg, "*",containerID, destLogPath, listInstalledPackages, listInstalledRPMs) |
| ... | ... |
@@ -12,11 +12,11 @@ def removeDuplicateEntriesInList(myList): |
| 12 | 12 |
if p not in myListCopy: |
| 13 | 13 |
myListCopy.append(p) |
| 14 | 14 |
return myListCopy |
| 15 |
- |
|
| 15 |
+ |
|
| 16 | 16 |
class PackageBuildDataGenerator(object): |
| 17 |
- |
|
| 17 |
+ |
|
| 18 | 18 |
cycleCount=0 |
| 19 |
- |
|
| 19 |
+ |
|
| 20 | 20 |
def __init__(self,logName=None,logPath=None): |
| 21 | 21 |
if logName is None: |
| 22 | 22 |
logName = "PackageBuildDataGenerator" |
| ... | ... |
@@ -31,46 +31,46 @@ class PackageBuildDataGenerator(object): |
| 31 | 31 |
self.__runTimeDependencyGraph={}
|
| 32 | 32 |
self.__sortedPackageList=[] |
| 33 | 33 |
self.__sortedBuildDependencyGraph={}
|
| 34 |
- |
|
| 34 |
+ |
|
| 35 | 35 |
def getPackageBuildData(self,listPackages): |
| 36 | 36 |
self.__readDependencyGraphAndCyclesForGivenPackages(listPackages) |
| 37 | 37 |
self.__getSortedBuildOrderListForGivenPackages(listPackages) |
| 38 | 38 |
return self.__mapCyclesToPackageList, self.__mapPackageToCycle, self.__sortedPackageList |
| 39 | 39 |
|
| 40 |
- #todo |
|
| 40 |
+ #todo |
|
| 41 | 41 |
def findCompleteListOfPackagesRequiredToBuildGivenPackages(self,listPackages): |
| 42 |
- return self.__buildDependencyGraph.keys() |
|
| 43 |
- |
|
| 42 |
+ return self.__buildDependencyGraph.keys() |
|
| 43 |
+ |
|
| 44 | 44 |
def createSortListForPkg(self,pkg): |
| 45 | 45 |
runTimeDepPkgList=self.__runTimeDependencyGraph[pkg] |
| 46 | 46 |
runTimeDepPkgList.append(pkg) |
| 47 | 47 |
sortListForPkg=[] |
| 48 |
- |
|
| 48 |
+ |
|
| 49 | 49 |
for p in runTimeDepPkgList: |
| 50 | 50 |
basePkg=SPECS.getData().getSpecName(p) |
| 51 | 51 |
for bPkg in self.__sortedBuildDependencyGraph[basePkg]: |
| 52 | 52 |
if bPkg not in sortListForPkg: |
| 53 | 53 |
sortListForPkg.append(bPkg) |
| 54 |
- |
|
| 54 |
+ |
|
| 55 | 55 |
return sortListForPkg |
| 56 |
- |
|
| 56 |
+ |
|
| 57 | 57 |
def getCircularDependentPackages(self,pkg): |
| 58 | 58 |
circularDependentPackages=[] |
| 59 | 59 |
if self.__mapPackageToCycle.has_key(pkg): |
| 60 | 60 |
circularDependentPackages.extend(self.__mapCyclesToPackageList[self.__mapPackageToCycle[pkg]]) |
| 61 | 61 |
circularDependentPackages.remove(pkg) |
| 62 | 62 |
return circularDependentPackages |
| 63 |
- |
|
| 63 |
+ |
|
| 64 | 64 |
def __getSortedBuildOrderListForGivenPackages(self,listPackages): |
| 65 |
- |
|
| 65 |
+ |
|
| 66 | 66 |
alreadyProcessedPackages=[] |
| 67 | 67 |
sortedList=[] |
| 68 | 68 |
completeListPackagesToBuild=self.findCompleteListOfPackagesRequiredToBuildGivenPackages(listPackages) |
| 69 | 69 |
packageIndexInSortedList = 0 |
| 70 | 70 |
prevSortListLen=0 |
| 71 |
- |
|
| 71 |
+ |
|
| 72 | 72 |
while completeListPackagesToBuild: |
| 73 |
- |
|
| 73 |
+ |
|
| 74 | 74 |
# find next package to process |
| 75 | 75 |
pkg=None |
| 76 | 76 |
index=-1 |
| ... | ... |
@@ -81,20 +81,20 @@ class PackageBuildDataGenerator(object): |
| 81 | 81 |
pkg = sortedList[i] |
| 82 | 82 |
packageIndexInSortedList = i |
| 83 | 83 |
break |
| 84 |
- |
|
| 84 |
+ |
|
| 85 | 85 |
if pkg is None: |
| 86 | 86 |
pkg = completeListPackagesToBuild.pop() |
| 87 | 87 |
packageIndexInSortedList = len(sortedList) |
| 88 | 88 |
|
| 89 | 89 |
#creating sort list for package |
| 90 | 90 |
sortListForPkg=self.createSortListForPkg(pkg) |
| 91 |
- |
|
| 91 |
+ |
|
| 92 | 92 |
#remove any cyclic packages in sortListForPkg if they already exists in sortedList |
| 93 | 93 |
circularDependentPackages=self.getCircularDependentPackages(pkg) |
| 94 | 94 |
for p in circularDependentPackages: |
| 95 | 95 |
if p in sortedList and p in sortListForPkg: |
| 96 | 96 |
sortListForPkg.remove(p) |
| 97 |
- |
|
| 97 |
+ |
|
| 98 | 98 |
# insert sort list of package in global sorted list |
| 99 | 99 |
index=packageIndexInSortedList |
| 100 | 100 |
subList=[] |
| ... | ... |
@@ -104,23 +104,23 @@ class PackageBuildDataGenerator(object): |
| 104 | 104 |
if p not in subList: |
| 105 | 105 |
sortedList.insert(index, p) |
| 106 | 106 |
index = index + 1 |
| 107 |
- |
|
| 107 |
+ |
|
| 108 | 108 |
alreadyProcessedPackages.append(p) |
| 109 |
- |
|
| 109 |
+ |
|
| 110 | 110 |
# Remove duplicate entries in sorted list in intervals |
| 111 | 111 |
if (len(sortedList)-prevSortListLen) > 100 : |
| 112 | 112 |
self.logger.info("Removing duplicates in sortedList")
|
| 113 | 113 |
sortedList = removeDuplicateEntriesInList(sortedList) |
| 114 | 114 |
else: |
| 115 | 115 |
prevSortListLen=len(sortedList) |
| 116 |
- |
|
| 116 |
+ |
|
| 117 | 117 |
self.logger.info("Removing duplicates in sorted list")
|
| 118 | 118 |
sortedList = removeDuplicateEntriesInList(sortedList) |
| 119 |
- |
|
| 119 |
+ |
|
| 120 | 120 |
self.logger.info("Sorted list:")
|
| 121 | 121 |
self.logger.info(sortedList) |
| 122 | 122 |
self.__sortedPackageList=sortedList |
| 123 |
- |
|
| 123 |
+ |
|
| 124 | 124 |
def __constructBuildAndRunTimeDependencyGraph(self,package): |
| 125 | 125 |
basePackage=SPECS.getData().getSpecName(package) |
| 126 | 126 |
|
| ... | ... |
@@ -130,28 +130,32 @@ class PackageBuildDataGenerator(object): |
| 130 | 130 |
addBuildTimeGraph = False |
| 131 | 131 |
if self.__runTimeDependencyGraph.has_key(basePackage): |
| 132 | 132 |
addRunTimeGraph=False |
| 133 |
- |
|
| 133 |
+ |
|
| 134 | 134 |
nextPackagesToConstructGraph=[] |
| 135 | 135 |
if addBuildTimeGraph: |
| 136 | 136 |
listDependentRpmPackages=SPECS.getData().getBuildRequiresForPackage(basePackage) |
| 137 | 137 |
listDependentPackages=[] |
| 138 | 138 |
for rpmPkg in listDependentRpmPackages: |
| 139 |
- basePkg=SPECS.getData().getSpecName(rpmPkg) |
|
| 139 |
+ basePkg=SPECS.getData().getSpecName(rpmPkg.package) |
|
| 140 | 140 |
if basePkg not in listDependentPackages: |
| 141 | 141 |
listDependentPackages.append(basePkg) |
| 142 | 142 |
self.__buildDependencyGraph[basePackage]=listDependentPackages |
| 143 | 143 |
nextPackagesToConstructGraph.extend(listDependentPackages) |
| 144 |
- |
|
| 144 |
+ |
|
| 145 | 145 |
if addRunTimeGraph: |
| 146 | 146 |
listRpmPackages=SPECS.getData().getPackages(basePackage) |
| 147 | 147 |
for rpmPkg in listRpmPackages: |
| 148 | 148 |
listDependentRpmPackages=SPECS.getData().getRequiresAllForPackage(rpmPkg) |
| 149 |
- self.__runTimeDependencyGraph[rpmPkg]=listDependentRpmPackages[:] |
|
| 150 |
- nextPackagesToConstructGraph.extend(listDependentRpmPackages) |
|
| 149 |
+ listDependentPackages=[] |
|
| 150 |
+ for rpmPkgs in listDependentRpmPackages: |
|
| 151 |
+ listDependentPackages.append(rpmPkgs.package) |
|
| 152 |
+ listDependentPackages = list(set(listDependentPackages)) |
|
| 153 |
+ self.__runTimeDependencyGraph[rpmPkg]=listDependentPackages[:] |
|
| 154 |
+ nextPackagesToConstructGraph.extend(listDependentPackages) |
|
| 151 | 155 |
|
| 152 | 156 |
for pkg in nextPackagesToConstructGraph: |
| 153 | 157 |
self.__constructBuildAndRunTimeDependencyGraph(pkg) |
| 154 |
- |
|
| 158 |
+ |
|
| 155 | 159 |
def __readDependencyGraphAndCyclesForGivenPackages(self,listPackages): |
| 156 | 160 |
self.logger.info("Reading dependency graph to check for cycles")
|
| 157 | 161 |
for pkg in listPackages: |
| ... | ... |
@@ -167,12 +171,12 @@ class PackageBuildDataGenerator(object): |
| 167 | 167 |
sortedPackageList,circularDependentPackages = self.topologicalSortPackages(self.__runTimeDependencyGraph) |
| 168 | 168 |
if len(circularDependentPackages) > 0 : |
| 169 | 169 |
self.__findCircularDependencies(circularDependentPackages) |
| 170 |
- |
|
| 170 |
+ |
|
| 171 | 171 |
def topologicalSortPackages(self, dependencyGraph, package=None): |
| 172 | 172 |
noDepPackages = Set() |
| 173 | 173 |
sortedPackageList = [] |
| 174 | 174 |
dependentOfPackage = dict() |
| 175 |
- |
|
| 175 |
+ |
|
| 176 | 176 |
dependentPackages={}
|
| 177 | 177 |
if package is None: |
| 178 | 178 |
dependentPackages=copy.deepcopy(dependencyGraph) |
| ... | ... |
@@ -186,7 +190,7 @@ class PackageBuildDataGenerator(object): |
| 186 | 186 |
dependentPackages[pkg]=dependencyGraph[pkg][:] |
| 187 | 187 |
for depPkg in dependencyGraph[pkg]: |
| 188 | 188 |
listDepPkgs.add(depPkg) |
| 189 |
- |
|
| 189 |
+ |
|
| 190 | 190 |
#Find packages with no dependencies and generate dependentof_package edge list |
| 191 | 191 |
for pkg in dependentPackages: |
| 192 | 192 |
if len(dependentPackages[pkg]) == 0: |
| ... | ... |
@@ -198,7 +202,7 @@ class PackageBuildDataGenerator(object): |
| 198 | 198 |
else: |
| 199 | 199 |
if pkg not in dependentOfPackage[depPkg]: |
| 200 | 200 |
dependentOfPackage[depPkg].append(pkg) |
| 201 |
- |
|
| 201 |
+ |
|
| 202 | 202 |
while noDepPackages: |
| 203 | 203 |
pkg = noDepPackages.pop() |
| 204 | 204 |
sortedPackageList.append(pkg) |
| ... | ... |
@@ -208,18 +212,18 @@ class PackageBuildDataGenerator(object): |
| 208 | 208 |
dependentPackages[childPkg].remove(pkg) |
| 209 | 209 |
if len(dependentPackages[childPkg])==0: |
| 210 | 210 |
noDepPackages.add(childPkg) |
| 211 |
- |
|
| 211 |
+ |
|
| 212 | 212 |
# creating circular dependency graph for given dependency graph |
| 213 | 213 |
circularDependencyGraph={}
|
| 214 | 214 |
listCircularPkg = dependentPackages.keys() |
| 215 | 215 |
for pkg in listCircularPkg: |
| 216 | 216 |
if len(dependentPackages[pkg]) != 0: |
| 217 | 217 |
circularDependencyGraph[pkg]=dependentPackages[pkg] |
| 218 |
- |
|
| 218 |
+ |
|
| 219 | 219 |
#return (non-circular dependent package in sorted order and circular dependent package list in a dependencyGraph) |
| 220 | 220 |
return sortedPackageList,circularDependencyGraph |
| 221 |
- |
|
| 222 |
- |
|
| 221 |
+ |
|
| 222 |
+ |
|
| 223 | 223 |
def __constructDependencyMap(self,cyclicDependencyGraph): |
| 224 | 224 |
self.logger.info("Constructing dependency map from circular dependency graph.....")
|
| 225 | 225 |
constructDependencyMap={}
|
| ... | ... |
@@ -243,15 +247,15 @@ class PackageBuildDataGenerator(object): |
| 243 | 243 |
self.logger.info("Dependency Map:")
|
| 244 | 244 |
self.logger.info(constructDependencyMap) |
| 245 | 245 |
return constructDependencyMap |
| 246 |
- |
|
| 247 |
- |
|
| 246 |
+ |
|
| 247 |
+ |
|
| 248 | 248 |
def __findCircularDependencies(self,cyclicDependencyGraph): |
| 249 | 249 |
self.logger.info("Looking for circular dependencies")
|
| 250 | 250 |
if len(cyclicDependencyGraph) == 0: |
| 251 | 251 |
return |
| 252 | 252 |
#step1: construct dependency map from dependency graph |
| 253 | 253 |
constructDependencyMap=self.__constructDependencyMap(cyclicDependencyGraph) |
| 254 |
- |
|
| 254 |
+ |
|
| 255 | 255 |
#step2: find cycles in dependency map |
| 256 | 256 |
self.logger.info("Finding and adding cycles using constructed dependency map......")
|
| 257 | 257 |
cycleCount=0 |
| ... | ... |
@@ -264,7 +268,7 @@ class PackageBuildDataGenerator(object): |
| 264 | 264 |
x = constructDependencyMap[depPkg] |
| 265 | 265 |
if node in x: |
| 266 | 266 |
cycPkgs.append(depPkg) |
| 267 |
- |
|
| 267 |
+ |
|
| 268 | 268 |
if len(cycPkgs) != 0: |
| 269 | 269 |
cycPkgs.append(node) |
| 270 | 270 |
cycleName="cycle"+str(PackageBuildDataGenerator.cycleCount) |
| ... | ... |
@@ -275,14 +279,14 @@ class PackageBuildDataGenerator(object): |
| 275 | 275 |
self.logger.info("New circular dependency found:")
|
| 276 | 276 |
self.logger.info(cycleName+" "+ ",".join(cycPkgs)) |
| 277 | 277 |
cycleCount = cycleCount + 1 |
| 278 |
- |
|
| 278 |
+ |
|
| 279 | 279 |
if cycleCount > 0 : |
| 280 | 280 |
self.logger.info("Found "+str(cycleCount) + " cycles.")
|
| 281 | 281 |
self.logger.info("Successfully added all detected circular dependencies to list.")
|
| 282 | 282 |
else: |
| 283 | 283 |
self.logger.info("No circular dependencies found.")
|
| 284 |
- |
|
| 285 |
- |
|
| 286 | 284 |
|
| 287 |
- |
|
| 288 |
- |
|
| 285 |
+ |
|
| 286 |
+ |
|
| 287 |
+ |
|
| 288 |
+ |
| ... | ... |
@@ -71,7 +71,7 @@ class PackageBuilder(PackageBuilderBase): |
| 71 | 71 |
self.listBuildOptionPackages=listBuildOptionPackages |
| 72 | 72 |
self.pkgBuildOptionFile=pkgBuildOptionFile |
| 73 | 73 |
|
| 74 |
- def prepareBuildRoot(self): |
|
| 74 |
+ def prepareBuildRoot(self,index): |
|
| 75 | 75 |
chrootID=None |
| 76 | 76 |
chrootName="build-"+self.package |
| 77 | 77 |
try: |
| ... | ... |
@@ -81,7 +81,7 @@ class PackageBuilder(PackageBuilderBase): |
| 81 | 81 |
if not returnVal: |
| 82 | 82 |
raise Exception("Unable to prepare build root")
|
| 83 | 83 |
tUtils=ToolChainUtils(self.logName,self.logPath) |
| 84 |
- tUtils.installToolChainRPMS(chrootID, self.package, self.listBuildOptionPackages, self.pkgBuildOptionFile, self.logPath) |
|
| 84 |
+ tUtils.installToolChainRPMS(chrootID, self.package, self.listBuildOptionPackages, self.pkgBuildOptionFile, self.logPath,index) |
|
| 85 | 85 |
except Exception as e: |
| 86 | 86 |
if chrootID is not None: |
| 87 | 87 |
self.logger.debug("Deleting chroot: " + chrootID)
|
| ... | ... |
@@ -135,20 +135,31 @@ class PackageBuilder(PackageBuilderBase): |
| 135 | 135 |
chrUtils = ChrootUtils(self.logName,self.logPath) |
| 136 | 136 |
chrootID=None |
| 137 | 137 |
try: |
| 138 |
- chrootID = self.prepareBuildRoot() |
|
| 138 |
+ chrootID = self.prepareBuildRoot(index) |
|
| 139 | 139 |
listInstalledPackages=self.findInstalledPackages(chrootID) |
| 140 | 140 |
listDependentPackages=self.findBuildTimeRequiredPackages(index) |
| 141 |
+ listTestPackages=[] |
|
| 141 | 142 |
if constants.rpmCheck and self.package in constants.testForceRPMS: |
| 142 | 143 |
listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages(index)) |
| 143 | 144 |
testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([self.package]) |
| 144 |
- listDependentPackages.extend(testPackages) |
|
| 145 |
+ listTestPackages = list(set(testPackages)) |
|
| 145 | 146 |
listDependentPackages=list(set(listDependentPackages)) |
| 146 |
- |
|
| 147 | 147 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
| 148 | 148 |
if len(listDependentPackages) != 0: |
| 149 | 149 |
self.logger.info("Installing the build time dependent packages......")
|
| 150 | 150 |
for pkg in listDependentPackages: |
| 151 |
- self.installPackage(pkgUtils, pkg,chrootID,self.logPath,listInstalledPackages) |
|
| 151 |
+ properVersion=pkgUtils.getProperVersion(pkg.package,pkg) |
|
| 152 |
+ self.installPackage(pkgUtils,pkg.package,properVersion,chrootID,self.logPath,listInstalledPackages) |
|
| 153 |
+ for pkg in listTestPackages: |
|
| 154 |
+ flag=False |
|
| 155 |
+ for lineContent in listDependentPackages: |
|
| 156 |
+ if lineContent.package == pkg: |
|
| 157 |
+ properVersion=pkgUtils.getProperVersion(pkg,lineContent) |
|
| 158 |
+ self.installPackage(pkgUtils,pkg,properVersion,chrootID,self.logPath,listInstalledPackages) |
|
| 159 |
+ flag = True |
|
| 160 |
+ break; |
|
| 161 |
+ if flag == False: |
|
| 162 |
+ self.installPackage(pkgUtils,pkg,"*",chrootID,self.logPath,listInstalledPackages) |
|
| 152 | 163 |
pkgUtils.installRPMSInAOneShot(chrootID,self.logPath) |
| 153 | 164 |
self.logger.info("Finished installing the build time dependent packages......")
|
| 154 | 165 |
|
| ... | ... |
@@ -165,7 +176,7 @@ class PackageBuilder(PackageBuilderBase): |
| 165 | 165 |
if chrootID is not None: |
| 166 | 166 |
chrUtils.destroyChroot(chrootID) |
| 167 | 167 |
|
| 168 |
- def installPackage(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages): |
|
| 168 |
+ def installPackage(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages): |
|
| 169 | 169 |
if package in listInstalledPackages: |
| 170 | 170 |
return |
| 171 | 171 |
# mark it as installed - to avoid cyclic recursion |
| ... | ... |
@@ -178,7 +189,8 @@ class PackageBuilder(PackageBuilderBase): |
| 178 | 178 |
noDeps=True |
| 179 | 179 |
if package in constants.noDepsPackageList: |
| 180 | 180 |
noDeps=True |
| 181 |
- pkgUtils.installRPM(package,chrootID,noDeps,destLogPath) |
|
| 181 |
+ |
|
| 182 |
+ pkgUtils.installRPM(package,packageVersion,chrootID,noDeps,destLogPath) |
|
| 182 | 183 |
|
| 183 | 184 |
def installDependentRunTimePackages(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages): |
| 184 | 185 |
listRunTimeDependentPackages=self.findRunTimeRequiredRPMPackages(package) |
| ... | ... |
@@ -188,6 +200,6 @@ class PackageBuilder(PackageBuilderBase): |
| 188 | 188 |
continue |
| 189 | 189 |
if pkg in listInstalledPackages: |
| 190 | 190 |
continue |
| 191 |
- self.installPackage(pkgUtils,pkg,chrootID,destLogPath,listInstalledPackages) |
|
| 191 |
+ self.installPackage(pkgUtils,pkg,"*",chrootID,destLogPath,listInstalledPackages) |
|
| 192 | 192 |
|
| 193 | 193 |
|
| ... | ... |
@@ -107,7 +107,7 @@ class PackageManager(object): |
| 107 | 107 |
listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(pkg) |
| 108 | 108 |
needToRebuild = False |
| 109 | 109 |
for dependentPkg in listDependentRpmPackages: |
| 110 |
- if dependentPkg not in self.listOfPackagesAlreadyBuilt: |
|
| 110 |
+ if dependentPkg.package not in self.listOfPackagesAlreadyBuilt: |
|
| 111 | 111 |
needToRebuild = True |
| 112 | 112 |
updateBuiltRPMSList = False |
| 113 | 113 |
if needToRebuild: |
| ... | ... |
@@ -249,7 +249,7 @@ class PackageManager(object): |
| 249 | 249 |
if not returnVal: |
| 250 | 250 |
raise Exception("Unable to prepare tool-chain chroot")
|
| 251 | 251 |
tcUtils = ToolChainUtils("toolchain-chroot", self.logPath)
|
| 252 |
- tcUtils.installToolChainRPMS(chrootID, "dummy") |
|
| 252 |
+ tcUtils.installToolChainRPMS(chrootID, "dummy",self.listBuildOptionPackages,self.pkgBuildOptionFile) |
|
| 253 | 253 |
except Exception as e: |
| 254 | 254 |
if chrootID is not None: |
| 255 | 255 |
self.logger.debug("Deleting chroot: " + chrootID)
|
| ... | ... |
@@ -10,6 +10,7 @@ import PullSources |
| 10 | 10 |
import json |
| 11 | 11 |
import collections |
| 12 | 12 |
from SpecData import SPECS |
| 13 |
+from distutils.version import LooseVersion |
|
| 13 | 14 |
|
| 14 | 15 |
class PackageUtils(object): |
| 15 | 16 |
|
| ... | ... |
@@ -51,6 +52,26 @@ class PackageUtils(object): |
| 51 | 51 |
arch="noarch" |
| 52 | 52 |
return arch |
| 53 | 53 |
|
| 54 |
+ def getProperVersion(self,package,parseSpecObj): |
|
| 55 |
+ listOfVersionObjs=SPECS.getData().getSpecObj(package) |
|
| 56 |
+ for num in listOfVersionObjs: |
|
| 57 |
+ if parseSpecObj.compare == 'gte': |
|
| 58 |
+ if LooseVersion(num.version) >= LooseVersion(parseSpecObj.version): |
|
| 59 |
+ return num.version |
|
| 60 |
+ elif parseSpecObj.compare == 'lte': |
|
| 61 |
+ if LooseVersion(num.version) <= LooseVersion(parseSpecObj.version): |
|
| 62 |
+ return num.version |
|
| 63 |
+ elif parseSpecObj.compare == 'eq': |
|
| 64 |
+ if LooseVersion(num.version) == LooseVersion(parseSpecObj.version): |
|
| 65 |
+ return num.version |
|
| 66 |
+ elif parseSpecObj.compare == 'lt': |
|
| 67 |
+ if LooseVersion(num.version) < LooseVersion(parseSpecObj.version): |
|
| 68 |
+ return num.version |
|
| 69 |
+ elif parseSpecObj.compare == 'gt': |
|
| 70 |
+ if LooseVersion(num.version) > LooseVersion(parseSpecObj.version): |
|
| 71 |
+ return num.version |
|
| 72 |
+ return "*" |
|
| 73 |
+ |
|
| 54 | 74 |
def getRPMDestDir(self,rpmName,rpmDir): |
| 55 | 75 |
arch = self.getRPMArch(rpmName) |
| 56 | 76 |
rpmDestDir=rpmDir+"/"+arch |
| ... | ... |
@@ -67,11 +88,11 @@ class PackageUtils(object): |
| 67 | 67 |
shutil.copyfile(rpmFile, rpmDestPath) |
| 68 | 68 |
return rpmDestPath |
| 69 | 69 |
|
| 70 |
- def installRPM(self,package,chrootID,noDeps=False,destLogPath=None): |
|
| 70 |
+ def installRPM(self,package,version,chrootID,noDeps=False,destLogPath=None): |
|
| 71 | 71 |
# self.logger.info("Installing rpm for package:"+package)
|
| 72 | 72 |
# self.logger.debug("No deps:"+str(noDeps))
|
| 73 | 73 |
|
| 74 |
- rpmfile=self.findRPMFileForGivenPackage(package) |
|
| 74 |
+ rpmfile=self.findRPMFileForGivenPackage(package,version) |
|
| 75 | 75 |
if rpmfile is None: |
| 76 | 76 |
self.logger.error("No rpm file found for package:"+package)
|
| 77 | 77 |
raise Exception("Missing rpm file: "+package)
|
| ... | ... |
@@ -309,7 +330,7 @@ class PackageUtils(object): |
| 309 | 309 |
if len(listFoundRPMFiles) == 0 : |
| 310 | 310 |
return None |
| 311 | 311 |
if len(listFoundRPMFiles) > 1 : |
| 312 |
- self.logger.error("Found multiple rpm files for given package in rpm directory.Unable to determine the rpm file for package:"+package)
|
|
| 312 |
+ self.logger.error("Found multiple rpm files for given package in rpm directory.Unable to determine the rpm file for package:"+package+ " list:"+str(listFoundRPMFiles))
|
|
| 313 | 313 |
raise Exception("Multiple rpm files found")
|
| 314 | 314 |
|
| 315 | 315 |
def findPackageNameFromRPMFile(self,rpmfile): |
| ... | ... |
@@ -418,8 +439,8 @@ class PackageUtils(object): |
| 418 | 418 |
rpmPath += rpmName |
| 419 | 419 |
return rpmPath |
| 420 | 420 |
|
| 421 |
- def prepRPMforInstallInContainer(self, package, containerID, noDeps=False, destLogPath=None): |
|
| 422 |
- rpmfile = self.findRPMFileForGivenPackage(package) |
|
| 421 |
+ def prepRPMforInstallInContainer(self, package, version, containerID, noDeps=False, destLogPath=None): |
|
| 422 |
+ rpmfile = self.findRPMFileForGivenPackage(package, version) |
|
| 423 | 423 |
if rpmfile is None: |
| 424 | 424 |
self.logger.error("No rpm file found for package: " + package)
|
| 425 | 425 |
raise Exception("Missing rpm file")
|
| ... | ... |
@@ -7,7 +7,7 @@ from Queue import PriorityQueue |
| 7 | 7 |
from SpecData import SPECS |
| 8 | 8 |
|
| 9 | 9 |
class Scheduler(object): |
| 10 |
- |
|
| 10 |
+ |
|
| 11 | 11 |
lock=threading.Lock() |
| 12 | 12 |
listOfAlreadyBuiltPackages=[] |
| 13 | 13 |
listOfPackagesToBuild=[] |
| ... | ... |
@@ -23,24 +23,23 @@ class Scheduler(object): |
| 23 | 23 |
logger=None |
| 24 | 24 |
event=None |
| 25 | 25 |
stopScheduling=False |
| 26 |
- |
|
| 26 |
+ |
|
| 27 | 27 |
@staticmethod |
| 28 | 28 |
def setEvent(event): |
| 29 | 29 |
Scheduler.event=event |
| 30 |
- |
|
| 30 |
+ |
|
| 31 | 31 |
@staticmethod |
| 32 | 32 |
def setLog(logName,logPath): |
| 33 |
- Scheduler.logger = Logger.getLogger(logName, logPath) |
|
| 33 |
+ Scheduler.logger = Logger.getLogger(logName, logPath) |
|
| 34 | 34 |
|
| 35 | 35 |
@staticmethod |
| 36 | 36 |
def getBuildRequiredPackages(package): |
| 37 | 37 |
listRequiredRPMPackages = [] |
| 38 | 38 |
listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package)) |
| 39 |
- |
|
| 40 | 39 |
listRequiredPackages = [] |
| 41 | 40 |
|
| 42 | 41 |
for pkg in listRequiredRPMPackages: |
| 43 |
- basePkg = SPECS.getData().getSpecName(pkg) |
|
| 42 |
+ basePkg = SPECS.getData().getSpecName(pkg.package) |
|
| 44 | 43 |
if basePkg not in listRequiredPackages: |
| 45 | 44 |
listRequiredPackages.append(basePkg) |
| 46 | 45 |
|
| ... | ... |
@@ -145,22 +144,20 @@ class Scheduler(object): |
| 145 | 145 |
Scheduler.listOfPackagesNextToBuild=[] |
| 146 | 146 |
Scheduler.listOfFailedPackages=[] |
| 147 | 147 |
Scheduler.setPriorities() |
| 148 |
- |
|
| 148 |
+ |
|
| 149 | 149 |
@staticmethod |
| 150 | 150 |
def getRequiredPackages(package): |
| 151 | 151 |
listRequiredRPMPackages=[] |
| 152 | 152 |
listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package)) |
| 153 | 153 |
listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPackage(package)) |
| 154 |
- |
|
| 155 | 154 |
listRequiredPackages=[] |
| 156 | 155 |
|
| 157 | 156 |
for pkg in listRequiredRPMPackages: |
| 158 |
- basePkg=SPECS.getData().getSpecName(pkg) |
|
| 157 |
+ basePkg=SPECS.getData().getSpecName(pkg.package) |
|
| 159 | 158 |
if basePkg not in listRequiredPackages: |
| 160 | 159 |
listRequiredPackages.append(basePkg) |
| 161 |
- |
|
| 162 | 160 |
return listRequiredPackages |
| 163 |
- |
|
| 161 |
+ |
|
| 164 | 162 |
@staticmethod |
| 165 | 163 |
def __getListNextPackagesReadyToBuild(): |
| 166 | 164 |
listOfPackagesNextToBuild=PriorityQueue() |
| ... | ... |
@@ -230,28 +227,28 @@ class Scheduler(object): |
| 230 | 230 |
Scheduler.listOfPackagesCurrentlyBuilding.append(package) |
| 231 | 231 |
Scheduler.listOfPackagesToBuild.remove(package) |
| 232 | 232 |
return package |
| 233 |
- |
|
| 233 |
+ |
|
| 234 | 234 |
#can be synchronized TODO |
| 235 | 235 |
@staticmethod |
| 236 | 236 |
def notifyPackageBuildCompleted(package): |
| 237 | 237 |
if package in Scheduler.listOfPackagesCurrentlyBuilding: |
| 238 | 238 |
Scheduler.listOfPackagesCurrentlyBuilding.remove(package) |
| 239 | 239 |
Scheduler.listOfAlreadyBuiltPackages.append(package) |
| 240 |
- |
|
| 241 |
- |
|
| 240 |
+ |
|
| 241 |
+ |
|
| 242 | 242 |
#can be synchronized TODO |
| 243 | 243 |
@staticmethod |
| 244 | 244 |
def notifyPackageBuildFailed(package): |
| 245 | 245 |
if package in Scheduler.listOfPackagesCurrentlyBuilding: |
| 246 | 246 |
Scheduler.listOfPackagesCurrentlyBuilding.remove(package) |
| 247 | 247 |
Scheduler.listOfFailedPackages.append(package) |
| 248 |
- |
|
| 248 |
+ |
|
| 249 | 249 |
@staticmethod |
| 250 | 250 |
def isAllPackagesBuilt(): |
| 251 | 251 |
if len(Scheduler.listOfPackagesToBuild) == 0 : |
| 252 | 252 |
return True |
| 253 | 253 |
return False |
| 254 |
- |
|
| 254 |
+ |
|
| 255 | 255 |
@staticmethod |
| 256 | 256 |
def isAnyPackagesFailedToBuild(): |
| 257 | 257 |
if len(Scheduler.listOfFailedPackages) != 0: |
| ... | ... |
@@ -177,6 +177,18 @@ class SpecObjectsUtils(object): |
| 177 | 177 |
specName=self.getSpecName(package) |
| 178 | 178 |
return len(self.mapSpecObjects[specName]) |
| 179 | 179 |
|
| 180 |
+ def getSpecObj(self, package): |
|
| 181 |
+ specName=self.getSpecName(package) |
|
| 182 |
+ return self.mapSpecObjects[specName] |
|
| 183 |
+ |
|
| 184 |
+ def getPkgNamesFromObj(self, objlist): |
|
| 185 |
+ listPkgName=[] |
|
| 186 |
+ listPkgNames=list(set(objlist)) |
|
| 187 |
+ for name in listPkgNames: |
|
| 188 |
+ listPkgName.append(name.package) |
|
| 189 |
+ listPkgName=list(set(listPkgName)) |
|
| 190 |
+ return listPkgName |
|
| 191 |
+ |
|
| 180 | 192 |
def printAllObjects(self): |
| 181 | 193 |
listSpecs=self.mapSpecObjects.keys() |
| 182 | 194 |
for spec in listSpecs: |
| ... | ... |
@@ -198,11 +210,11 @@ class SpecObjectsUtils(object): |
| 198 | 198 |
self.logger.info(" ")
|
| 199 | 199 |
self.logger.info(" ")
|
| 200 | 200 |
self.logger.info("Build require packages")
|
| 201 |
- self.logger.info(specObj.buildRequirePackages) |
|
| 201 |
+ self.logger.info(self.getPkgNamesFromObj(specObj.buildRequirePackages)) |
|
| 202 | 202 |
self.logger.info(" ")
|
| 203 | 203 |
self.logger.info(" ")
|
| 204 | 204 |
self.logger.info("install require packages")
|
| 205 |
- self.logger.info(specObj.installRequiresAllPackages) |
|
| 205 |
+ self.logger.info(self.getPkgNamesFromObj(specObj.installRequiresAllPackages)) |
|
| 206 | 206 |
self.logger.info(" ")
|
| 207 | 207 |
self.logger.info(specObj.installRequiresPackages) |
| 208 | 208 |
self.logger.info("security_hardening: " + specObj.securityHardening)
|
| ... | ... |
@@ -364,11 +376,11 @@ class SerializedSpecObjects(object): |
| 364 | 364 |
whoNeedsList.append(specPkg) |
| 365 | 365 |
elif (inputType == "who-needs-build"): |
| 366 | 366 |
for bdrq in specObj.buildRequirePackages: |
| 367 |
- if (whoBuildDeps.has_key(bdrq)): |
|
| 368 |
- whoBuildDeps[bdrq].add(specPkg) |
|
| 367 |
+ if (whoBuildDeps.has_key(bdrq.package)): |
|
| 368 |
+ whoBuildDeps[bdrq.package].add(specPkg) |
|
| 369 | 369 |
else: |
| 370 |
- whoBuildDeps[bdrq] = set() |
|
| 371 |
- whoBuildDeps[bdrq].add(specPkg) |
|
| 370 |
+ whoBuildDeps[bdrq.package] = set() |
|
| 371 |
+ whoBuildDeps[bdrq.package].add(specPkg) |
|
| 372 | 372 |
if(inputValue == specPkg): |
| 373 | 373 |
packageFound = True |
| 374 | 374 |
for depPkg in specObj.listPackages: |
| ... | ... |
@@ -516,5 +528,5 @@ class SerializedSpecObjects(object): |
| 516 | 516 |
return self.mapSpecObjects[specName].securityHardening |
| 517 | 517 |
|
| 518 | 518 |
def getSpecDetails(self, name): |
| 519 |
- print self.mapSpecObjects[name].installRequiresAllPackages |
|
| 519 |
+ print self.getPkgNamesFromObj(self.mapSpecObjects[name].installRequiresAllPackages) |
|
| 520 | 520 |
|
| ... | ... |
@@ -147,12 +147,14 @@ class Specutils(object): |
| 147 | 147 |
for key in self.spec.packages.keys(): |
| 148 | 148 |
pkg = self.spec.packages.get(key) |
| 149 | 149 |
for dpkg in pkg.requires: |
| 150 |
- dependentPackages.append(dpkg.package) |
|
| 151 |
- dependentPackages=list(set(dependentPackages)) |
|
| 150 |
+ dependentPackages.append(dpkg) |
|
| 151 |
+ listDependentPackages = list(set(dependentPackages)) |
|
| 152 | 152 |
packageNames=self.getPackageNames() |
| 153 | 153 |
for pkgName in packageNames: |
| 154 |
- if pkgName in dependentPackages: |
|
| 155 |
- dependentPackages.remove(pkgName) |
|
| 154 |
+ for objName in listDependentPackages: |
|
| 155 |
+ if objName.package == pkgName: |
|
| 156 |
+ dependentPackages.remove(objName) |
|
| 157 |
+ dependentPackages = list(set(dependentPackages)) |
|
| 156 | 158 |
return dependentPackages |
| 157 | 159 |
|
| 158 | 160 |
def getBuildRequiresAllPackages(self): |
| ... | ... |
@@ -160,12 +162,14 @@ class Specutils(object): |
| 160 | 160 |
for key in self.spec.packages.keys(): |
| 161 | 161 |
pkg = self.spec.packages.get(key) |
| 162 | 162 |
for dpkg in pkg.buildrequires: |
| 163 |
- dependentPackages.append(dpkg.package) |
|
| 164 |
- dependentPackages=list(set(dependentPackages)) |
|
| 163 |
+ dependentPackages.append(dpkg) |
|
| 164 |
+ listDependentPackages = list(set(dependentPackages)) |
|
| 165 | 165 |
packageNames=self.getPackageNames() |
| 166 | 166 |
for pkgName in packageNames: |
| 167 |
- if pkgName in dependentPackages: |
|
| 168 |
- dependentPackages.remove(pkgName) |
|
| 167 |
+ for objName in listDependentPackages: |
|
| 168 |
+ if objName.package == pkgName: |
|
| 169 |
+ dependentPackages.remove(objName) |
|
| 170 |
+ dependentPackages = list(set(dependentPackages)) |
|
| 169 | 171 |
return dependentPackages |
| 170 | 172 |
|
| 171 | 173 |
def getCheckBuildRequiresAllPackages(self): |
| ... | ... |
@@ -173,8 +177,8 @@ class Specutils(object): |
| 173 | 173 |
for key in self.spec.packages.keys(): |
| 174 | 174 |
pkg = self.spec.packages.get(key) |
| 175 | 175 |
for dpkg in pkg.checkbuildrequires: |
| 176 |
- dependentPackages.append(dpkg.package) |
|
| 177 |
- dependentPackages=list(set(dependentPackages)) |
|
| 176 |
+ dependentPackages.append(dpkg) |
|
| 177 |
+ dependentPackages = list(set(dependentPackages)) |
|
| 178 | 178 |
return dependentPackages |
| 179 | 179 |
|
| 180 | 180 |
def getRequires(self,pkgName): |
| ... | ... |
@@ -10,6 +10,7 @@ import traceback |
| 10 | 10 |
import shutil |
| 11 | 11 |
import json |
| 12 | 12 |
import collections |
| 13 |
+from SpecData import SPECS |
|
| 13 | 14 |
|
| 14 | 15 |
class ToolChainUtils(object): |
| 15 | 16 |
|
| ... | ... |
@@ -117,8 +118,14 @@ class ToolChainUtils(object): |
| 117 | 117 |
traceback.print_exc() |
| 118 | 118 |
raise e |
| 119 | 119 |
return pkgCount |
| 120 |
- |
|
| 121 |
- def installToolChainRPMS(self,chrootID, packageName, listBuildOptionPackages, pkgBuildOptionFile, logPath=None): |
|
| 120 |
+ |
|
| 121 |
+ def getListDependentPackageLineContent(self, index): |
|
| 122 |
+ listBuildRequiresPkgLineContent=SPECS.getData().getBuildRequiresForPackage(self.package, index) |
|
| 123 |
+ listBuildRequiresPkgLineContent.extend(SPECS.getData().getCheckBuildRequiresForPackage(self.package, index)) |
|
| 124 |
+ listBuildRequiresPkgLineContent=list(set(listBuildRequiresPkgLineContent)) |
|
| 125 |
+ return listBuildRequiresPkgLineContent |
|
| 126 |
+ |
|
| 127 |
+ def installToolChainRPMS(self,chrootID, packageName, listBuildOptionPackages, pkgBuildOptionFile, logPath=None, index=0): |
|
| 122 | 128 |
if logPath is None: |
| 123 | 129 |
logPath=self.logPath |
| 124 | 130 |
cmdUtils = CommandUtils() |
| ... | ... |
@@ -126,6 +133,9 @@ class ToolChainUtils(object): |
| 126 | 126 |
self.logger.info("Installing Tool Chain RPMS.......")
|
| 127 | 127 |
rpmFiles = "" |
| 128 | 128 |
packages = "" |
| 129 |
+ self.package=packageName |
|
| 130 |
+ listBuildRequiresPackageLineContent = self.getListDependentPackageLineContent(index) |
|
| 131 |
+ |
|
| 129 | 132 |
for package in constants.listToolChainRPMsToInstall: |
| 130 | 133 |
pkgUtils=PackageUtils(self.logName,self.logPath) |
| 131 | 134 |
rpmFile = None |
| ... | ... |
@@ -144,7 +154,10 @@ class ToolChainUtils(object): |
| 144 | 144 |
for override in overridelist: |
| 145 | 145 |
if package == str(override["package"].encode('utf-8')):
|
| 146 | 146 |
version = str(override["version"].encode('utf-8'))
|
| 147 |
- |
|
| 147 |
+ if version == "*": |
|
| 148 |
+ for depPkg in listBuildRequiresPackageLineContent: |
|
| 149 |
+ if depPkg.package == package: |
|
| 150 |
+ version=pkgUtils.getProperVersion(package,depPkg) |
|
| 148 | 151 |
if constants.rpmCheck: |
| 149 | 152 |
rpmFile=pkgUtils.findRPMFileForGivenPackage(package, version) |
| 150 | 153 |
else: |
| ... | ... |
@@ -178,7 +191,7 @@ class ToolChainUtils(object): |
| 178 | 178 |
if packageName in constants.perPackageToolChain: |
| 179 | 179 |
print constants.perPackageToolChain[packageName] |
| 180 | 180 |
self.installCustomToolChainRPMS(chrootID, constants.perPackageToolChain[packageName], packageName); |
| 181 |
- |
|
| 181 |
+ |
|
| 182 | 182 |
def installCustomToolChainRPMS(self, chrootID, listOfToolChainPkgs, packageName): |
| 183 | 183 |
self.logger.info("Installing package specific tool chain RPMs for " + packageName + ".......")
|
| 184 | 184 |
rpmFiles = "" |