Replaced index based multiversion support with
version based multiversion support.
* Removed SerializedSpecObjects class in SpecData.py
* Added logic to get the overriden package(gcc) version
in PackageBuilder.py
Change-Id: Ia5c5e8edc40010a5909a4fb37d6cdf88bcc01112
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6222
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>
... | ... |
@@ -108,7 +108,7 @@ find %{buildroot}%{_libdir} -name '*.la' -delete |
108 | 108 |
%changelog |
109 | 109 |
* Tue Jan 23 2018 Xiaolin Li <xiaolinl@vmware.com> 1.2.2-2 |
110 | 110 |
- Add serf-devel to BuildRequires. |
111 |
-* Tue Oct 11 2017 Dheeraj Shetty <dheerajs@vmware.com> 1.2.2-1 |
|
111 |
+* Tue Oct 10 2017 Dheeraj Shetty <dheerajs@vmware.com> 1.2.2-1 |
|
112 | 112 |
- Updated to version 1.2.2 |
113 | 113 |
* Mon Oct 02 2017 Vinay Kulkarni <kulkarniv@vmware.com> 1.2.0-7 |
114 | 114 |
- Use multiple cores to build mesos. |
... | ... |
@@ -243,16 +243,19 @@ class Installer(object): |
243 | 243 |
# prepare the RPMs list |
244 | 244 |
json_pkg_to_rpm_map = JsonWrapper(self.install_config["pkg_to_rpm_map_file"]) |
245 | 245 |
pkg_to_rpm_map = json_pkg_to_rpm_map.read() |
246 |
- |
|
247 | 246 |
self.rpms_tobeinstalled = [] |
248 | 247 |
selected_packages = self.install_config['packages'] |
249 | 248 |
|
250 | 249 |
for pkg in selected_packages: |
251 |
- if pkg in pkg_to_rpm_map: |
|
252 |
- if not pkg_to_rpm_map[pkg]['rpm'] is None: |
|
253 |
- name = pkg_to_rpm_map[pkg]['rpm'] |
|
250 |
+ versionindex = pkg.rfind("-") |
|
251 |
+ if versionindex == -1: |
|
252 |
+ raise Exception("Invalid pkg name: " + pkg) |
|
253 |
+ package = pkg[:versionindex] |
|
254 |
+ if package in pkg_to_rpm_map: |
|
255 |
+ if pkg_to_rpm_map[package]['rpm']: |
|
256 |
+ name = pkg_to_rpm_map[package]['rpm'] |
|
254 | 257 |
basename = os.path.basename(name) |
255 |
- self.rpms_tobeinstalled.append({'filename': basename, 'path': name, 'package' : pkg}) |
|
258 |
+ self.rpms_tobeinstalled.append({'filename': basename, 'path': name, 'package' : package}) |
|
256 | 259 |
|
257 | 260 |
# Copy the rpms |
258 | 261 |
for rpm in self.rpms_tobeinstalled: |
... | ... |
@@ -1,4 +1,5 @@ |
1 | 1 |
from Logger import Logger |
2 |
+from collections import OrderedDict |
|
2 | 3 |
from constants import constants |
3 | 4 |
from sets import Set |
4 | 5 |
import copy |
... | ... |
@@ -6,13 +7,6 @@ from SpecData import SPECS |
6 | 6 |
|
7 | 7 |
|
8 | 8 |
|
9 |
-def removeDuplicateEntriesInList(myList): |
|
10 |
- myListCopy=[] |
|
11 |
- for p in myList: |
|
12 |
- if p not in myListCopy: |
|
13 |
- myListCopy.append(p) |
|
14 |
- return myListCopy |
|
15 |
- |
|
16 | 9 |
class PackageBuildDataGenerator(object): |
17 | 10 |
|
18 | 11 |
cycleCount=0 |
... | ... |
@@ -32,22 +26,29 @@ class PackageBuildDataGenerator(object): |
32 | 32 |
self.__sortedPackageList=[] |
33 | 33 |
self.__sortedBuildDependencyGraph={} |
34 | 34 |
|
35 |
+ def removeDuplicateEntries(self, myList): |
|
36 |
+ myListCopy = list(OrderedDict.fromkeys(myList)) |
|
37 |
+ return myListCopy |
|
38 |
+ |
|
35 | 39 |
def getPackageBuildData(self,listPackages): |
36 |
- self.__readDependencyGraphAndCyclesForGivenPackages(listPackages) |
|
37 |
- self.__getSortedBuildOrderListForGivenPackages(listPackages) |
|
40 |
+ basePackages = [] |
|
41 |
+ for pkg in listPackages: |
|
42 |
+ basePackages.append(SPECS.getData().getBasePkg(pkg)) |
|
43 |
+ self.__readDependencyGraphAndCyclesForGivenPackages(basePackages) |
|
44 |
+ self.__getSortedBuildOrderListForGivenPackages() |
|
38 | 45 |
return self.__mapCyclesToPackageList, self.__mapPackageToCycle, self.__sortedPackageList |
39 | 46 |
|
40 | 47 |
#todo |
41 |
- def findCompleteListOfPackagesRequiredToBuildGivenPackages(self,listPackages): |
|
42 |
- return self.__buildDependencyGraph.keys() |
|
48 |
+ def findCompleteListOfPackagesRequiredToBuildGivenPackages(self): |
|
49 |
+ return list(self.__buildDependencyGraph.keys()) |
|
43 | 50 |
|
44 | 51 |
def createSortListForPkg(self,pkg): |
45 |
- runTimeDepPkgList=self.__runTimeDependencyGraph[pkg] |
|
52 |
+ runTimeDepPkgList=list(set(self.__runTimeDependencyGraph[pkg])) |
|
46 | 53 |
runTimeDepPkgList.append(pkg) |
47 | 54 |
sortListForPkg=[] |
48 | 55 |
|
49 | 56 |
for p in runTimeDepPkgList: |
50 |
- basePkg=SPECS.getData().getSpecName(p) |
|
57 |
+ basePkg=SPECS.getData().getBasePkg(p) |
|
51 | 58 |
for bPkg in self.__sortedBuildDependencyGraph[basePkg]: |
52 | 59 |
if bPkg not in sortListForPkg: |
53 | 60 |
sortListForPkg.append(bPkg) |
... | ... |
@@ -61,21 +62,21 @@ class PackageBuildDataGenerator(object): |
61 | 61 |
circularDependentPackages.remove(pkg) |
62 | 62 |
return circularDependentPackages |
63 | 63 |
|
64 |
- def __getSortedBuildOrderListForGivenPackages(self,listPackages): |
|
64 |
+ def __getSortedBuildOrderListForGivenPackages(self): |
|
65 | 65 |
|
66 |
- alreadyProcessedPackages=[] |
|
67 |
- sortedList=[] |
|
68 |
- completeListPackagesToBuild=self.findCompleteListOfPackagesRequiredToBuildGivenPackages(listPackages) |
|
66 |
+ alreadyProcessedPackages = set() |
|
67 |
+ sortedList = [] |
|
68 |
+ completeListPackagesToBuild = self.findCompleteListOfPackagesRequiredToBuildGivenPackages() |
|
69 | 69 |
packageIndexInSortedList = 0 |
70 |
- prevSortListLen=0 |
|
70 |
+ prevSortListLen = 0 |
|
71 | 71 |
|
72 | 72 |
while completeListPackagesToBuild: |
73 | 73 |
|
74 | 74 |
# find next package to process |
75 |
- pkg=None |
|
76 |
- index=-1 |
|
77 |
- lenList=len(sortedList) |
|
78 |
- for i in range(lenList): |
|
75 |
+ pkg = None |
|
76 |
+ index = -1 |
|
77 |
+ lenList = len(sortedList) |
|
78 |
+ for i in range(lenList): |
|
79 | 79 |
if sortedList[i] in alreadyProcessedPackages: |
80 | 80 |
continue |
81 | 81 |
pkg = sortedList[i] |
... | ... |
@@ -87,72 +88,66 @@ class PackageBuildDataGenerator(object): |
87 | 87 |
packageIndexInSortedList = len(sortedList) |
88 | 88 |
|
89 | 89 |
#creating sort list for package |
90 |
- sortListForPkg=self.createSortListForPkg(pkg) |
|
90 |
+ sortListForPkg = self.createSortListForPkg(pkg) |
|
91 | 91 |
|
92 |
- #remove any cyclic packages in sortListForPkg if they already exists in sortedList |
|
93 |
- circularDependentPackages=self.getCircularDependentPackages(pkg) |
|
92 |
+ #remove any cyclic packages in sortListForPkg if they already |
|
93 |
+ #exists in sortedList |
|
94 |
+ circularDependentPackages = self.getCircularDependentPackages(pkg) |
|
94 | 95 |
for p in circularDependentPackages: |
95 | 96 |
if p in sortedList and p in sortListForPkg: |
96 | 97 |
sortListForPkg.remove(p) |
97 | 98 |
|
98 | 99 |
# insert sort list of package in global sorted list |
99 |
- index=packageIndexInSortedList |
|
100 |
- subList=[] |
|
100 |
+ index = packageIndexInSortedList |
|
101 |
+ subList = [] |
|
101 | 102 |
if packageIndexInSortedList > 0: |
102 |
- subList=sortedList[:packageIndexInSortedList] |
|
103 |
+ subList = sortedList[:packageIndexInSortedList] |
|
103 | 104 |
for p in sortListForPkg: |
104 | 105 |
if p not in subList: |
105 | 106 |
sortedList.insert(index, p) |
106 | 107 |
index = index + 1 |
107 | 108 |
|
108 |
- alreadyProcessedPackages.append(p) |
|
109 |
+ alreadyProcessedPackages.add(p) |
|
109 | 110 |
|
110 | 111 |
# Remove duplicate entries in sorted list in intervals |
111 |
- if (len(sortedList)-prevSortListLen) > 100 : |
|
112 |
- self.logger.info("Removing duplicates in sortedList") |
|
113 |
- sortedList = removeDuplicateEntriesInList(sortedList) |
|
112 |
+ if (len(sortedList) - prevSortListLen) > 100: |
|
113 |
+ self.logger.debug("Removing duplicates in sortedList") |
|
114 |
+ sortedList = self.removeDuplicateEntries(sortedList) |
|
114 | 115 |
else: |
115 |
- prevSortListLen=len(sortedList) |
|
116 |
+ prevSortListLen = len(sortedList) |
|
116 | 117 |
|
117 |
- self.logger.info("Removing duplicates in sorted list") |
|
118 |
- sortedList = removeDuplicateEntriesInList(sortedList) |
|
118 |
+ self.logger.debug("Removing duplicates in sorted list") |
|
119 |
+ sortedList = self.removeDuplicateEntries(sortedList) |
|
119 | 120 |
|
120 |
- self.logger.info("Sorted list:") |
|
121 |
- self.logger.info(sortedList) |
|
122 |
- self.__sortedPackageList=sortedList |
|
121 |
+ self.logger.debug("Sorted list: ") |
|
122 |
+ self.logger.debug(sortedList) |
|
123 |
+ self.__sortedPackageList = sortedList |
|
123 | 124 |
|
124 |
- def __constructBuildAndRunTimeDependencyGraph(self,package): |
|
125 |
- basePackage=SPECS.getData().getSpecName(package) |
|
126 |
- |
|
127 |
- addBuildTimeGraph=True |
|
128 |
- addRunTimeGraph=True |
|
129 |
- if self.__buildDependencyGraph.has_key(basePackage): |
|
125 |
+ def __constructBuildAndRunTimeDependencyGraph(self, basePackage): |
|
126 |
+ addBuildTimeGraph = True |
|
127 |
+ addRunTimeGraph = True |
|
128 |
+ if basePackage in self.__buildDependencyGraph: |
|
130 | 129 |
addBuildTimeGraph = False |
131 |
- if self.__runTimeDependencyGraph.has_key(basePackage): |
|
132 |
- addRunTimeGraph=False |
|
130 |
+ if basePackage in self.__runTimeDependencyGraph: |
|
131 |
+ addRunTimeGraph = False |
|
133 | 132 |
|
134 |
- nextPackagesToConstructGraph=[] |
|
133 |
+ nextPackagesToConstructGraph = set() |
|
135 | 134 |
if addBuildTimeGraph: |
136 |
- listDependentRpmPackages=SPECS.getData().getBuildRequiresForPackage(basePackage) |
|
137 |
- listDependentPackages=[] |
|
138 |
- for rpmPkg in listDependentRpmPackages: |
|
139 |
- basePkg=SPECS.getData().getSpecName(rpmPkg.package) |
|
140 |
- if basePkg not in listDependentPackages: |
|
141 |
- listDependentPackages.append(basePkg) |
|
142 |
- self.__buildDependencyGraph[basePackage]=listDependentPackages |
|
143 |
- nextPackagesToConstructGraph.extend(listDependentPackages) |
|
135 |
+ dependentRpmPackages = SPECS.getData().getBuildRequiresForPkg(basePackage) |
|
136 |
+ dependentPackages = set() |
|
137 |
+ for dependentPkg in dependentRpmPackages: |
|
138 |
+ dependentPackages.add(SPECS.getData().getBasePkg(dependentPkg)) |
|
139 |
+ self.__buildDependencyGraph[basePackage] = dependentPackages |
|
140 |
+ nextPackagesToConstructGraph.update(dependentPackages) |
|
144 | 141 |
|
145 | 142 |
if addRunTimeGraph: |
146 |
- listRpmPackages=SPECS.getData().getPackages(basePackage) |
|
147 |
- for rpmPkg in listRpmPackages: |
|
148 |
- listDependentRpmPackages=SPECS.getData().getRequiresAllForPackage(rpmPkg) |
|
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) |
|
155 |
- |
|
143 |
+ dependentPackages = set() |
|
144 |
+ for rpmPkg in SPECS.getData().getPackagesForPkg(basePackage): |
|
145 |
+ dependentRpmPackages = SPECS.getData().getRequiresAllForPkg(rpmPkg) |
|
146 |
+ self.__runTimeDependencyGraph[rpmPkg] = copy.copy(set(dependentRpmPackages)) |
|
147 |
+ for pkg in dependentRpmPackages: |
|
148 |
+ dependentPackages.add(SPECS.getData().getBasePkg(pkg)) |
|
149 |
+ nextPackagesToConstructGraph.update(dependentPackages) |
|
156 | 150 |
for pkg in nextPackagesToConstructGraph: |
157 | 151 |
self.__constructBuildAndRunTimeDependencyGraph(pkg) |
158 | 152 |
|
... | ... |
@@ -172,57 +167,68 @@ class PackageBuildDataGenerator(object): |
172 | 172 |
if len(circularDependentPackages) > 0 : |
173 | 173 |
self.__findCircularDependencies(circularDependentPackages) |
174 | 174 |
|
175 |
- def topologicalSortPackages(self, dependencyGraph, package=None): |
|
176 |
- noDepPackages = Set() |
|
177 |
- sortedPackageList = [] |
|
178 |
- dependentOfPackage = dict() |
|
179 |
- |
|
180 |
- dependentPackages={} |
|
175 |
+ @staticmethod |
|
176 |
+ def _buildDependentPackages(dependencyGraph, package): |
|
177 |
+ dependentPackages = {} |
|
181 | 178 |
if package is None: |
182 |
- dependentPackages=copy.deepcopy(dependencyGraph) |
|
179 |
+ dependentPackages = copy.deepcopy(dependencyGraph) |
|
183 | 180 |
else: |
184 |
- listDepPkgs= Set() |
|
185 |
- listDepPkgs.add(package) |
|
186 |
- while listDepPkgs: |
|
187 |
- pkg = listDepPkgs.pop() |
|
188 |
- if dependentPackages.has_key(pkg): |
|
181 |
+ depPkgs = set() |
|
182 |
+ depPkgs.add(package) |
|
183 |
+ while depPkgs: |
|
184 |
+ pkg = depPkgs.pop() |
|
185 |
+ if pkg in dependentPackages: |
|
189 | 186 |
continue |
190 |
- dependentPackages[pkg]=dependencyGraph[pkg][:] |
|
187 |
+ dependentPackages[pkg] = copy.copy(dependencyGraph[pkg]) |
|
191 | 188 |
for depPkg in dependencyGraph[pkg]: |
192 |
- listDepPkgs.add(depPkg) |
|
189 |
+ depPkgs.add(depPkg) |
|
190 |
+ return dependentPackages |
|
193 | 191 |
|
194 |
- #Find packages with no dependencies and generate dependentof_package edge list |
|
192 |
+ @staticmethod |
|
193 |
+ def _buildDependentOfPackages(dependentPackages): |
|
194 |
+ dependentOfPackage = dict() |
|
195 | 195 |
for pkg in dependentPackages: |
196 |
- if len(dependentPackages[pkg]) == 0: |
|
197 |
- noDepPackages.add(pkg) |
|
198 |
- else: |
|
196 |
+ if dependentPackages[pkg]: |
|
199 | 197 |
for depPkg in dependentPackages[pkg]: |
200 |
- if not dependentOfPackage.has_key(depPkg): |
|
201 |
- dependentOfPackage[depPkg]=[pkg] |
|
198 |
+ if depPkg not in dependentOfPackage: |
|
199 |
+ dependentOfPackage[depPkg] = {pkg} |
|
202 | 200 |
else: |
203 |
- if pkg not in dependentOfPackage[depPkg]: |
|
204 |
- dependentOfPackage[depPkg].append(pkg) |
|
201 |
+ dependentOfPackage[depPkg].add(pkg) |
|
202 |
+ return dependentOfPackage |
|
203 |
+ |
|
204 |
+ @staticmethod |
|
205 |
+ def topologicalSortPackages(dependencyGraph, package=None): |
|
206 |
+ sortedPackageList = [] |
|
207 |
+ noDepPackages = set() |
|
208 |
+ dependentPackages = PackageBuildDataGenerator._buildDependentPackages( |
|
209 |
+ dependencyGraph, package) |
|
210 |
+ dependentOfPackage = PackageBuildDataGenerator._buildDependentOfPackages( |
|
211 |
+ dependentPackages) |
|
212 |
+ |
|
213 |
+ #Find packages with no dependencies and generate dependentof_package edge list |
|
214 |
+ for pkg in dependentPackages: |
|
215 |
+ if not dependentPackages[pkg]: |
|
216 |
+ noDepPackages.add(pkg) |
|
205 | 217 |
|
206 | 218 |
while noDepPackages: |
207 | 219 |
pkg = noDepPackages.pop() |
208 | 220 |
sortedPackageList.append(pkg) |
209 |
- if dependentOfPackage.get(pkg) is not None: |
|
210 |
- for childPkg in list(dependentOfPackage.get(pkg)): |
|
211 |
- dependentOfPackage.get(pkg).remove(childPkg) |
|
221 |
+ if pkg in dependentOfPackage: |
|
222 |
+ for childPkg in list(dependentOfPackage[pkg]): |
|
223 |
+ dependentOfPackage[pkg].remove(childPkg) |
|
212 | 224 |
dependentPackages[childPkg].remove(pkg) |
213 |
- if len(dependentPackages[childPkg])==0: |
|
225 |
+ if not dependentPackages[childPkg]: |
|
214 | 226 |
noDepPackages.add(childPkg) |
215 | 227 |
|
216 | 228 |
# creating circular dependency graph for given dependency graph |
217 |
- circularDependencyGraph={} |
|
218 |
- listCircularPkg = dependentPackages.keys() |
|
219 |
- for pkg in listCircularPkg: |
|
220 |
- if len(dependentPackages[pkg]) != 0: |
|
221 |
- circularDependencyGraph[pkg]=dependentPackages[pkg] |
|
222 |
- |
|
223 |
- #return (non-circular dependent package in sorted order and circular dependent package list in a dependencyGraph) |
|
224 |
- return sortedPackageList,circularDependencyGraph |
|
229 |
+ circularDependencyGraph = {} |
|
230 |
+ for pkg in dependentPackages.keys(): |
|
231 |
+ if dependentPackages[pkg]: |
|
232 |
+ circularDependencyGraph[pkg] = dependentPackages[pkg] |
|
225 | 233 |
|
234 |
+ #return (non-circular dependent package in sorted order and circular dependent |
|
235 |
+ #package list in a dependencyGraph) |
|
236 |
+ return sortedPackageList, circularDependencyGraph |
|
226 | 237 |
|
227 | 238 |
def __constructDependencyMap(self,cyclicDependencyGraph): |
228 | 239 |
self.logger.info("Constructing dependency map from circular dependency graph.....") |
... | ... |
@@ -286,7 +292,3 @@ class PackageBuildDataGenerator(object): |
286 | 286 |
else: |
287 | 287 |
self.logger.info("No circular dependencies found.") |
288 | 288 |
|
289 |
- |
|
290 |
- |
|
291 |
- |
|
292 |
- |
... | ... |
@@ -7,6 +7,7 @@ import os.path |
7 | 7 |
from constants import constants |
8 | 8 |
import shutil |
9 | 9 |
from SpecData import SPECS |
10 |
+from StringUtils import StringUtils |
|
10 | 11 |
|
11 | 12 |
class PackageBuilderBase(object): |
12 | 13 |
def __init__(self, mapPackageToCycles, pkgBuildType): |
... | ... |
@@ -15,52 +16,45 @@ class PackageBuilderBase(object): |
15 | 15 |
self.logPath = None |
16 | 16 |
self.logger = None |
17 | 17 |
self.package = None |
18 |
+ self.version = None |
|
18 | 19 |
self.mapPackageToCycles = mapPackageToCycles |
19 | 20 |
self.listNodepsPackages = ["glibc", "gmp", "zlib", "file", "binutils", "mpfr", |
20 | 21 |
"mpc", "gcc", "ncurses", "util-linux", "groff", "perl", |
21 | 22 |
"texinfo", "rpm", "openssl", "go"] |
22 | 23 |
self.pkgBuildType = pkgBuildType |
23 | 24 |
|
24 |
- def findPackageNameFromRPMFile(self,rpmfile): |
|
25 |
- rpmfile=os.path.basename(rpmfile) |
|
26 |
- releaseindex=rpmfile.rfind("-") |
|
25 |
+ def _findPackageNameAndVersionFromRPMFile(self, rpmfile): |
|
26 |
+ rpmfile = os.path.basename(rpmfile) |
|
27 |
+ releaseindex = rpmfile.rfind("-") |
|
27 | 28 |
if releaseindex == -1: |
28 |
- self.logger.error("Invalid rpm file:"+rpmfile) |
|
29 |
+ self.logger.error("Invalid rpm file:" + rpmfile) |
|
29 | 30 |
return None |
30 |
- versionindex=rpmfile[0:releaseindex].rfind("-") |
|
31 |
- if versionindex == -1: |
|
32 |
- self.logger.error("Invalid rpm file:"+rpmfile) |
|
33 |
- return None |
|
34 |
- packageName=rpmfile[0:versionindex] |
|
35 |
- return packageName |
|
31 |
+ pkg = rpmfile[0:releaseindex] |
|
32 |
+ return pkg |
|
36 | 33 |
|
37 |
- def checkIfPackageIsAlreadyBuilt(self, index=0): |
|
38 |
- basePkg=SPECS.getData().getSpecName(self.package) |
|
39 |
- listRPMPackages=SPECS.getData().getRPMPackages(basePkg, index) |
|
34 |
+ def checkIfPackageIsAlreadyBuilt(self, package, version): |
|
35 |
+ basePkg=SPECS.getData().getSpecName(package) |
|
36 |
+ listRPMPackages=SPECS.getData().getRPMPackages(basePkg, version) |
|
40 | 37 |
packageIsAlreadyBuilt=True |
41 | 38 |
pkgUtils = PackageUtils(self.logName,self.logPath) |
42 | 39 |
for pkg in listRPMPackages: |
43 |
- if pkgUtils.findRPMFileForGivenPackage(pkg, "*", index) is None: |
|
40 |
+ if pkgUtils.findRPMFileForGivenPackage(pkg, version) is None: |
|
44 | 41 |
packageIsAlreadyBuilt=False |
45 | 42 |
break |
46 | 43 |
return packageIsAlreadyBuilt |
47 | 44 |
|
48 |
- def findRunTimeRequiredRPMPackages(self,rpmPackage): |
|
49 |
- listRequiredPackages=SPECS.getData().getRequiresForPackage(rpmPackage) |
|
45 |
+ def findRunTimeRequiredRPMPackages(self,rpmPackage, version): |
|
46 |
+ listRequiredPackages=SPECS.getData().getRequiresForPackage(rpmPackage, version) |
|
50 | 47 |
return listRequiredPackages |
51 | 48 |
|
52 |
- def findBuildTimeRequiredPackages(self, index): |
|
53 |
- listRequiredPackages=SPECS.getData().getBuildRequiresForPackage(self.package, index) |
|
49 |
+ def findBuildTimeRequiredPackages(self): |
|
50 |
+ listRequiredPackages=SPECS.getData().getBuildRequiresForPackage(self.package, self.version) |
|
54 | 51 |
return listRequiredPackages |
55 | 52 |
|
56 |
- def findBuildTimeCheckRequiredPackages(self, index): |
|
57 |
- listRequiredPackages=SPECS.getData().getCheckBuildRequiresForPackage(self.package, index) |
|
53 |
+ def findBuildTimeCheckRequiredPackages(self): |
|
54 |
+ listRequiredPackages=SPECS.getData().getCheckBuildRequiresForPackage(self.package, self.version) |
|
58 | 55 |
return listRequiredPackages |
59 | 56 |
|
60 |
- @staticmethod |
|
61 |
- def getNumOfVersions(package): |
|
62 |
- return SPECS.getData().getNumberOfVersions(package) |
|
63 |
- |
|
64 | 57 |
class PackageBuilder(PackageBuilderBase): |
65 | 58 |
|
66 | 59 |
def __init__(self,mapPackageToCycles,listAvailableCyclicPackages,listBuildOptionPackages,pkgBuildOptionFile): |
... | ... |
@@ -71,9 +65,9 @@ class PackageBuilder(PackageBuilderBase): |
71 | 71 |
self.listBuildOptionPackages=listBuildOptionPackages |
72 | 72 |
self.pkgBuildOptionFile=pkgBuildOptionFile |
73 | 73 |
|
74 |
- def prepareBuildRoot(self,index): |
|
74 |
+ def prepareBuildRoot(self): |
|
75 | 75 |
chrootID=None |
76 |
- chrootName="build-"+self.package |
|
76 |
+ chrootName="build-"+self.package + "-" + self.version |
|
77 | 77 |
try: |
78 | 78 |
chrUtils = ChrootUtils(self.logName,self.logPath) |
79 | 79 |
returnVal,chrootID = chrUtils.createChroot(chrootName) |
... | ... |
@@ -81,7 +75,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,index) |
|
84 |
+ tUtils.installToolChainRPMS(chrootID, self.package,self.version, self.listBuildOptionPackages, self.pkgBuildOptionFile, self.logPath) |
|
85 | 85 |
except Exception as e: |
86 | 86 |
if chrootID is not None: |
87 | 87 |
self.logger.debug("Deleting chroot: " + chrootID) |
... | ... |
@@ -89,58 +83,57 @@ class PackageBuilder(PackageBuilderBase): |
89 | 89 |
raise e |
90 | 90 |
return chrootID |
91 | 91 |
|
92 |
- def findInstalledPackages(self,chrootID): |
|
93 |
- pkgUtils = PackageUtils(self.logName,self.logPath) |
|
94 |
- listInstalledRPMs=pkgUtils.findInstalledRPMPackages(chrootID) |
|
95 |
- listInstalledPackages=[] |
|
92 |
+ def findInstalledPackages(self, instanceID): |
|
93 |
+ pkgUtils = PackageUtils(self.logName, self.logPath) |
|
94 |
+ if self.pkgBuildType == "chroot": |
|
95 |
+ listInstalledRPMs = pkgUtils.findInstalledRPMPackages(instanceID) |
|
96 |
+ listInstalledPackages = [] |
|
96 | 97 |
for installedRPM in listInstalledRPMs: |
97 |
- packageName=self.findPackageNameFromRPMFile(installedRPM) |
|
98 |
- if packageName is not None: |
|
99 |
- listInstalledPackages.append(packageName) |
|
100 |
- return listInstalledPackages |
|
98 |
+ pkg = self._findPackageNameAndVersionFromRPMFile(installedRPM) |
|
99 |
+ if pkg is not None: |
|
100 |
+ listInstalledPackages.append(pkg) |
|
101 |
+ return listInstalledPackages, listInstalledRPMs |
|
101 | 102 |
|
102 | 103 |
def buildPackageThreadAPI(self,package,outputMap, threadName,): |
103 |
- self.package=package |
|
104 |
- self.logName="build-"+package |
|
105 |
- self.logPath=constants.logPath+"/build-"+package |
|
106 |
- if not os.path.isdir(self.logPath): |
|
107 |
- cmdUtils = CommandUtils() |
|
108 |
- cmdUtils.runCommandInShell("mkdir -p "+self.logPath) |
|
109 |
- self.logger=Logger.getLogger(self.logName,self.logPath) |
|
110 |
- versions = self.getNumOfVersions(package) |
|
111 |
- if(versions < 1): |
|
112 |
- raise Exception("No package exists") |
|
113 |
- for version in range(0, versions): |
|
114 |
- try: |
|
115 |
- self.buildPackage(version) |
|
116 |
- outputMap[threadName]=True |
|
117 |
- except Exception as e: |
|
118 |
- # TODO: self.logger might be None |
|
119 |
- self.logger.exception(e) |
|
120 |
- outputMap[threadName]=False |
|
121 |
- raise e |
|
122 |
- |
|
123 |
- def buildPackage(self, index): |
|
104 |
+ packageName, packageVersion = StringUtils.splitPackageNameAndVersion(package) |
|
124 | 105 |
#do not build if RPM is already built |
125 | 106 |
#test only if the package is in the testForceRPMS with rpmCheck |
126 | 107 |
#build only if the package is not in the testForceRPMS with rpmCheck |
127 |
- if self.checkIfPackageIsAlreadyBuilt(index): |
|
108 |
+ if self.checkIfPackageIsAlreadyBuilt(packageName, packageVersion): |
|
128 | 109 |
if not constants.rpmCheck: |
129 |
- self.logger.info("Skipping building the package:"+self.package) |
|
110 |
+ outputMap[threadName]=True |
|
130 | 111 |
return |
131 |
- elif constants.rpmCheck and self.package not in constants.testForceRPMS: |
|
132 |
- self.logger.info("Skipping testing the package:"+self.package) |
|
112 |
+ elif constants.rpmCheck and packageName not in constants.testForceRPMS: |
|
113 |
+ outputMap[threadName]=True |
|
133 | 114 |
return |
134 | 115 |
|
116 |
+ self.package=packageName |
|
117 |
+ self.version=packageVersion |
|
118 |
+ self.logName="build-"+package |
|
119 |
+ self.logPath=constants.logPath+"/build-"+package |
|
120 |
+ if not os.path.isdir(self.logPath): |
|
121 |
+ cmdUtils = CommandUtils() |
|
122 |
+ cmdUtils.runCommandInShell("mkdir -p "+self.logPath) |
|
123 |
+ self.logger=Logger.getLogger(self.logName,self.logPath) |
|
124 |
+ try: |
|
125 |
+ self.buildPackage() |
|
126 |
+ outputMap[threadName]=True |
|
127 |
+ except Exception as e: |
|
128 |
+ # TODO: self.logger might be None |
|
129 |
+ self.logger.exception(e) |
|
130 |
+ outputMap[threadName]=False |
|
131 |
+ raise e |
|
132 |
+ |
|
133 |
+ def buildPackage(self): |
|
135 | 134 |
chrUtils = ChrootUtils(self.logName,self.logPath) |
136 | 135 |
chrootID=None |
137 | 136 |
try: |
138 |
- chrootID = self.prepareBuildRoot(index) |
|
139 |
- listInstalledPackages=self.findInstalledPackages(chrootID) |
|
140 |
- listDependentPackages=self.findBuildTimeRequiredPackages(index) |
|
137 |
+ chrootID = self.prepareBuildRoot() |
|
138 |
+ listInstalledPackages, listInstalledRPMs=self.findInstalledPackages(chrootID) |
|
139 |
+ listDependentPackages=self.findBuildTimeRequiredPackages() |
|
141 | 140 |
listTestPackages=[] |
142 | 141 |
if constants.rpmCheck and self.package in constants.testForceRPMS: |
143 |
- listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages(index)) |
|
142 |
+ listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages()) |
|
144 | 143 |
testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([self.package]) |
145 | 144 |
listTestPackages = list(set(testPackages)) |
146 | 145 |
listDependentPackages=list(set(listDependentPackages)) |
... | ... |
@@ -148,23 +141,23 @@ class PackageBuilder(PackageBuilderBase): |
148 | 148 |
if len(listDependentPackages) != 0: |
149 | 149 |
self.logger.info("Installing the build time dependent packages......") |
150 | 150 |
for pkg in listDependentPackages: |
151 |
- properVersion=pkgUtils.getProperVersion(pkg.package,pkg) |
|
152 |
- self.installPackage(pkgUtils,pkg.package,properVersion,chrootID,self.logPath,listInstalledPackages) |
|
151 |
+ packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg) |
|
152 |
+ self.installPackage(pkgUtils,packageName,packageVersion,chrootID,self.logPath,listInstalledPackages,listInstalledRPMs) |
|
153 | 153 |
for pkg in listTestPackages: |
154 | 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) |
|
155 |
+ packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg) |
|
156 |
+ for depPkg in listDependentPackages: |
|
157 |
+ depPackageName, depPackageVersion = StringUtils.splitPackageNameAndVersion(depPkg) |
|
158 |
+ if depPackageName == packageName: |
|
159 | 159 |
flag = True |
160 | 160 |
break; |
161 | 161 |
if flag == False: |
162 |
- self.installPackage(pkgUtils,pkg,"*",chrootID,self.logPath,listInstalledPackages) |
|
162 |
+ self.installPackage(pkgUtils,packageName,packageVersion,chrootID,self.logPath,listInstalledPackages,listInstalledRPMs) |
|
163 | 163 |
pkgUtils.installRPMSInAOneShot(chrootID,self.logPath) |
164 | 164 |
self.logger.info("Finished installing the build time dependent packages......") |
165 | 165 |
|
166 |
- pkgUtils.adjustGCCSpecs(self.package, chrootID, self.logPath, index) |
|
167 |
- pkgUtils.buildRPMSForGivenPackage(self.package,chrootID,self.listBuildOptionPackages,self.pkgBuildOptionFile,self.logPath, index) |
|
166 |
+ pkgUtils.adjustGCCSpecs(self.package, chrootID, self.logPath, self.version) |
|
167 |
+ pkgUtils.buildRPMSForGivenPackage(self.package,self.version,chrootID,self.listBuildOptionPackages,self.pkgBuildOptionFile,self.logPath) |
|
168 | 168 |
self.logger.info("Successfully built the package:"+self.package) |
169 | 169 |
except Exception as e: |
170 | 170 |
self.logger.error("Failed while building package:" + self.package) |
... | ... |
@@ -176,12 +169,28 @@ class PackageBuilder(PackageBuilderBase): |
176 | 176 |
if chrootID is not None: |
177 | 177 |
chrUtils.destroyChroot(chrootID) |
178 | 178 |
|
179 |
- def installPackage(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages): |
|
180 |
- if package in listInstalledPackages: |
|
179 |
+ def installPackage(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages,listInstalledRPMs): |
|
180 |
+ rpmfile = pkgUtils.findRPMFileForGivenPackage(package,packageVersion); |
|
181 |
+ if rpmfile is None: |
|
182 |
+ self.logger.error("No rpm file found for package: " + package + "-" + packageVersion) |
|
183 |
+ raise Exception("Missing rpm file") |
|
184 |
+ specificRPM = os.path.basename(rpmfile.replace(".rpm", "")) |
|
185 |
+ pkg = package+"-"+packageVersion |
|
186 |
+ if pkg in listInstalledPackages: |
|
181 | 187 |
return |
188 |
+ # For linux packages, install the gcc dependencies from publish rpms |
|
189 |
+ if self.package in self.listBuildOptionPackages: |
|
190 |
+ if SPECS.getData().getSpecName(package) == "gcc": |
|
191 |
+ tUtils=ToolChainUtils(self.logName,self.logPath) |
|
192 |
+ overridenPkgVer = tUtils.getOverridenPackageVersion(self.package, package, self.listBuildOptionPackages, self.pkgBuildOptionFile) |
|
193 |
+ overridenPkg = package+"-"+overridenPkgVer |
|
194 |
+ if overridenPkg in listInstalledPackages: |
|
195 |
+ return |
|
196 |
+ |
|
182 | 197 |
# mark it as installed - to avoid cyclic recursion |
183 |
- listInstalledPackages.append(package) |
|
184 |
- self.installDependentRunTimePackages(pkgUtils,package,chrootID,destLogPath,listInstalledPackages) |
|
198 |
+ listInstalledPackages.append(pkg) |
|
199 |
+ listInstalledRPMs.append(specificRPM) |
|
200 |
+ self.installDependentRunTimePackages(pkgUtils,package,packageVersion, chrootID,destLogPath,listInstalledPackages,listInstalledRPMs) |
|
185 | 201 |
noDeps=False |
186 | 202 |
if self.mapPackageToCycles.has_key(package): |
187 | 203 |
noDeps = True |
... | ... |
@@ -192,14 +201,17 @@ class PackageBuilder(PackageBuilderBase): |
192 | 192 |
|
193 | 193 |
pkgUtils.installRPM(package,packageVersion,chrootID,noDeps,destLogPath) |
194 | 194 |
|
195 |
- def installDependentRunTimePackages(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages): |
|
196 |
- listRunTimeDependentPackages=self.findRunTimeRequiredRPMPackages(package) |
|
195 |
+ def installDependentRunTimePackages(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages,listInstalledRPMs): |
|
196 |
+ listRunTimeDependentPackages=self.findRunTimeRequiredRPMPackages(package,packageVersion) |
|
197 | 197 |
if len(listRunTimeDependentPackages) != 0: |
198 | 198 |
for pkg in listRunTimeDependentPackages: |
199 |
- if self.mapPackageToCycles.has_key(pkg) and pkg not in self.listAvailableCyclicPackages: |
|
199 |
+ if self.mapPackageToCycles.has_key(pkg): |
|
200 | 200 |
continue |
201 |
- if pkg in listInstalledPackages: |
|
201 |
+ packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg) |
|
202 |
+ latestPkgRPM = os.path.basename( |
|
203 |
+ pkgUtils.findRPMFileForGivenPackage(packageName, packageVersion)).replace(".rpm", "") |
|
204 |
+ if pkg in listInstalledPackages and latestPkgRPM in listInstalledRPMs: |
|
202 | 205 |
continue |
203 |
- self.installPackage(pkgUtils,pkg,"*",chrootID,destLogPath,listInstalledPackages) |
|
206 |
+ self.installPackage(pkgUtils,packageName,packageVersion,chrootID,destLogPath,listInstalledPackages,listInstalledRPMs) |
|
204 | 207 |
|
205 | 208 |
|
... | ... |
@@ -24,29 +24,31 @@ class PackageInfo(object): |
24 | 24 |
listRPMFiles = [] |
25 | 25 |
cmdUtils = CommandUtils() |
26 | 26 |
for package in listPackages: |
27 |
- release = SPECS.getData().getRelease(package) |
|
28 |
- version = SPECS.getData().getVersion(package) |
|
29 |
- listRPMPackages = SPECS.getData().getRPMPackages(package) |
|
30 |
- srpmFileName = package+"-"+version+"-"+release+".src.rpm" |
|
31 |
- srpmFiles = cmdUtils.findFile(srpmFileName, constants.sourceRpmPath) |
|
32 |
- srpmFile = None |
|
33 |
- if len(srpmFiles) == 1: |
|
34 |
- srpmFile = srpmFiles[0] |
|
35 |
- debugrpmFileName = package+"-debuginfo-"+version+"-"+release+"*" |
|
36 |
- debugrpmFiles = cmdUtils.findFile(debugrpmFileName, constants.rpmPath) |
|
37 |
- debugrpmFile = None |
|
38 |
- if len(debugrpmFiles) == 1: |
|
39 |
- debugrpmFile = debugrpmFiles[0] |
|
40 |
- pkgUtils = PackageUtils(self.logName,self.logPath) |
|
41 |
- for rpmPkg in listRPMPackages: |
|
42 |
- rpmFile = pkgUtils.findRPMFileForGivenPackage(rpmPkg) |
|
43 |
- if rpmFile is not None: |
|
44 |
- listRPMFiles.append(rpmFile) |
|
45 |
- listPkgAttributes = {"sourcerpm":srpmFile, "rpm":rpmFile, "debugrpm":debugrpmFile} |
|
46 |
- self.pkgList[rpmPkg] = listPkgAttributes |
|
47 |
- self.logger.debug("Added "+rpmPkg +" rpm package to the list") |
|
48 |
- else: |
|
49 |
- self.logger.error("Missing rpm file for package:"+rpmPkg) |
|
27 |
+ for version in SPECS.getData().getVersions(package): |
|
28 |
+ release = SPECS.getData().getRelease(package, version) |
|
29 |
+ if release is None: |
|
30 |
+ release = "*" |
|
31 |
+ listRPMPackages = SPECS.getData().getRPMPackages(package, version) |
|
32 |
+ srpmFileName = package+"-"+version+"-"+release+".src.rpm" |
|
33 |
+ srpmFiles = cmdUtils.findFile(srpmFileName, constants.sourceRpmPath) |
|
34 |
+ srpmFile = None |
|
35 |
+ if len(srpmFiles) == 1: |
|
36 |
+ srpmFile = srpmFiles[0] |
|
37 |
+ debugrpmFileName = package+"-debuginfo-"+version+"-"+release+"*" |
|
38 |
+ debugrpmFiles = cmdUtils.findFile(debugrpmFileName, constants.rpmPath) |
|
39 |
+ debugrpmFile = None |
|
40 |
+ if len(debugrpmFiles) == 1: |
|
41 |
+ debugrpmFile = debugrpmFiles[0] |
|
42 |
+ pkgUtils = PackageUtils(self.logName,self.logPath) |
|
43 |
+ for rpmPkg in listRPMPackages: |
|
44 |
+ rpmFile = pkgUtils.findRPMFileForGivenPackage(rpmPkg) |
|
45 |
+ if rpmFile is not None: |
|
46 |
+ listRPMFiles.append(rpmFile) |
|
47 |
+ listPkgAttributes = {"sourcerpm":srpmFile, "rpm":rpmFile, "debugrpm":debugrpmFile} |
|
48 |
+ self.pkgList[rpmPkg] = listPkgAttributes |
|
49 |
+ self.logger.debug("Added "+rpmPkg +" rpm package to the list") |
|
50 |
+ else: |
|
51 |
+ self.logger.error("Missing rpm file for package:"+rpmPkg) |
|
50 | 52 |
|
51 | 53 |
def writePkgListToFile(self, fileName): |
52 | 54 |
self.logger.info("Writing package list to the json file") |
... | ... |
@@ -11,6 +11,7 @@ from ToolChainUtils import ToolChainUtils |
11 | 11 |
from Scheduler import Scheduler |
12 | 12 |
from ThreadPool import ThreadPool |
13 | 13 |
from SpecData import SPECS |
14 |
+from StringUtils import StringUtils |
|
14 | 15 |
|
15 | 16 |
class PackageManager(object): |
16 | 17 |
|
... | ... |
@@ -46,43 +47,21 @@ class PackageManager(object): |
46 | 46 |
return True |
47 | 47 |
|
48 | 48 |
def readAlreadyAvailablePackages(self): |
49 |
- listAvailablePackages=[] |
|
50 |
- listFoundRPMPackages=[] |
|
51 |
- listRPMFiles=[] |
|
52 |
- listDirectorys=[] |
|
53 |
- listDirectorys.append(constants.rpmPath) |
|
54 |
- if constants.inputRPMSPath is not None: |
|
55 |
- listDirectorys.append(constants.inputRPMSPath) |
|
49 |
+ listAvailablePackages = set() |
|
50 |
+ pkgUtils = PackageUtils(self.logName, self.logPath) |
|
51 |
+ listPackages = SPECS.getData().getListPackages() |
|
52 |
+ for package in listPackages: |
|
53 |
+ for version in SPECS.getData().getVersions(package): |
|
54 |
+ # Mark package available only if all subpackages are available |
|
55 |
+ packageIsAlreadyBuilt=True |
|
56 |
+ listRPMPackages = SPECS.getData().getRPMPackages(package, version) |
|
57 |
+ for rpmPkg in listRPMPackages: |
|
58 |
+ if pkgUtils.findRPMFileForGivenPackage(rpmPkg, version) is None: |
|
59 |
+ packageIsAlreadyBuilt=False |
|
60 |
+ break; |
|
61 |
+ if packageIsAlreadyBuilt: |
|
62 |
+ listAvailablePackages.add(package+"-"+version) |
|
56 | 63 |
|
57 |
- while len(listDirectorys) > 0: |
|
58 |
- dirPath=listDirectorys.pop() |
|
59 |
- for dirEntry in os.listdir(dirPath): |
|
60 |
- dirEntryPath = os.path.join(dirPath, dirEntry) |
|
61 |
- if os.path.isfile(dirEntryPath) and dirEntryPath.endswith(".rpm"): |
|
62 |
- listRPMFiles.append(dirEntryPath) |
|
63 |
- elif os.path.isdir(dirEntryPath): |
|
64 |
- listDirectorys.append(dirEntryPath) |
|
65 |
- pkgUtils = PackageUtils(self.logName,self.logPath) |
|
66 |
- for rpmfile in listRPMFiles: |
|
67 |
- package,version,release = pkgUtils.findPackageInfoFromRPMFile(rpmfile) |
|
68 |
- if SPECS.getData().isRPMPackage(package): |
|
69 |
- specVersion=SPECS.getData().getVersion(package) |
|
70 |
- specRelease=SPECS.getData().getRelease(package) |
|
71 |
- if version == specVersion and release == specRelease: |
|
72 |
- listFoundRPMPackages.append(package) |
|
73 |
- #Mark package available only if all sub packages are available |
|
74 |
- for package in listFoundRPMPackages: |
|
75 |
- basePkg = SPECS.getData().getSpecName(package) |
|
76 |
- if basePkg in listAvailablePackages: |
|
77 |
- continue; |
|
78 |
- listRPMPackages = SPECS.getData().getRPMPackages(basePkg) |
|
79 |
- packageIsAlreadyBuilt = True |
|
80 |
- for rpmpkg in listRPMPackages: |
|
81 |
- if rpmpkg not in listFoundRPMPackages: |
|
82 |
- packageIsAlreadyBuilt = False |
|
83 |
- if packageIsAlreadyBuilt: |
|
84 |
- listAvailablePackages.append(package) |
|
85 |
- self.logger.info("List of Already built packages") |
|
86 | 64 |
self.logger.info(listAvailablePackages) |
87 | 65 |
return listAvailablePackages |
88 | 66 |
|
... | ... |
@@ -96,7 +75,7 @@ class PackageManager(object): |
96 | 96 |
self.sortedPackageList=[] |
97 | 97 |
|
98 | 98 |
listOfPackagesAlreadyBuilt = [] |
99 |
- listOfPackagesAlreadyBuilt = self.readAlreadyAvailablePackages() |
|
99 |
+ listOfPackagesAlreadyBuilt = list(self.readAlreadyAvailablePackages()) |
|
100 | 100 |
self.listOfPackagesAlreadyBuilt = listOfPackagesAlreadyBuilt[:] |
101 | 101 |
|
102 | 102 |
updateBuiltRPMSList = False |
... | ... |
@@ -104,10 +83,11 @@ class PackageManager(object): |
104 | 104 |
updateBuiltRPMSList = True |
105 | 105 |
listOfPackagesAlreadyBuilt = self.listOfPackagesAlreadyBuilt[:] |
106 | 106 |
for pkg in listOfPackagesAlreadyBuilt: |
107 |
- listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(pkg) |
|
107 |
+ packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg) |
|
108 |
+ listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(packageName, packageVersion) |
|
108 | 109 |
needToRebuild = False |
109 | 110 |
for dependentPkg in listDependentRpmPackages: |
110 |
- if dependentPkg.package not in self.listOfPackagesAlreadyBuilt: |
|
111 |
+ if dependentPkg not in self.listOfPackagesAlreadyBuilt: |
|
111 | 112 |
needToRebuild = True |
112 | 113 |
updateBuiltRPMSList = False |
113 | 114 |
if needToRebuild: |
... | ... |
@@ -117,7 +97,6 @@ class PackageManager(object): |
117 | 117 |
for pkg in listPackages: |
118 | 118 |
if pkg in self.listOfPackagesAlreadyBuilt and not constants.rpmCheck: |
119 | 119 |
listPackagesToBuild.remove(pkg) |
120 |
- |
|
121 | 120 |
if not self.readPackageBuildData(listPackagesToBuild): |
122 | 121 |
return False |
123 | 122 |
return True |
... | ... |
@@ -181,11 +160,20 @@ class PackageManager(object): |
181 | 181 |
Scheduler.stopScheduling=False |
182 | 182 |
|
183 | 183 |
def buildGivenPackages (self, listPackages, buildThreads): |
184 |
+ # Extend listPackages from ["name1", "name2",..] to ["name1-vers1", "name2-vers2",..] |
|
185 |
+ listPackageNamesAndVersions=[] |
|
186 |
+ for pkg in listPackages: |
|
187 |
+ for version in SPECS.getData().getVersions(pkg): |
|
188 |
+ listPackageNamesAndVersions.append(pkg+"-"+version) |
|
184 | 189 |
if constants.rpmCheck: |
185 | 190 |
alreadyBuiltRPMS=self.readAlreadyAvailablePackages() |
186 |
- listPackages=list(set(listPackages)|(set(constants.listMakeCheckRPMPkgtoInstall)-set(alreadyBuiltRPMS))) |
|
191 |
+ listMakeCheckPackages=set() |
|
192 |
+ for pkg in listPackages: |
|
193 |
+ version = SPECS.getData().getHighestVersion(pkg) |
|
194 |
+ listMakeCheckPackages.add(pkg+"-"+version) |
|
195 |
+ listPackageNamesAndVersions = (list(set(listPackageNamesAndVersions)|(listMakeCheckPackages-alreadyBuiltRPMS))) |
|
187 | 196 |
|
188 |
- returnVal=self.calculateParams(listPackages) |
|
197 |
+ returnVal=self.calculateParams(listPackageNamesAndVersions) |
|
189 | 198 |
if not returnVal: |
190 | 199 |
self.logger.error("Unable to set paramaters. Terminating the package manager.") |
191 | 200 |
raise Exception("Unable to set paramaters") |
... | ... |
@@ -16,7 +16,7 @@ class PackageUtils(object): |
16 | 16 |
|
17 | 17 |
def __init__(self,logName=None,logPath=None): |
18 | 18 |
if logName is None: |
19 |
- self.logName = "PackageUtils" |
|
19 |
+ logName = "PackageUtils" |
|
20 | 20 |
if logPath is None: |
21 | 21 |
logPath = constants.logPath |
22 | 22 |
self.logName=logName |
... | ... |
@@ -52,26 +52,6 @@ class PackageUtils(object): |
52 | 52 |
arch="noarch" |
53 | 53 |
return arch |
54 | 54 |
|
55 |
- def getProperVersion(self,package,parseSpecObj): |
|
56 |
- listOfVersionObjs=SPECS.getData().getSpecObj(package) |
|
57 |
- for num in listOfVersionObjs: |
|
58 |
- if parseSpecObj.compare == 'gte': |
|
59 |
- if LooseVersion(num.version) >= LooseVersion(parseSpecObj.version): |
|
60 |
- return num.version |
|
61 |
- elif parseSpecObj.compare == 'lte': |
|
62 |
- if LooseVersion(num.version) <= LooseVersion(parseSpecObj.version): |
|
63 |
- return num.version |
|
64 |
- elif parseSpecObj.compare == 'eq': |
|
65 |
- if LooseVersion(num.version) == LooseVersion(parseSpecObj.version): |
|
66 |
- return num.version |
|
67 |
- elif parseSpecObj.compare == 'lt': |
|
68 |
- if LooseVersion(num.version) < LooseVersion(parseSpecObj.version): |
|
69 |
- return num.version |
|
70 |
- elif parseSpecObj.compare == 'gt': |
|
71 |
- if LooseVersion(num.version) > LooseVersion(parseSpecObj.version): |
|
72 |
- return num.version |
|
73 |
- return "*" |
|
74 |
- |
|
75 | 55 |
def getRPMDestDir(self,rpmName,rpmDir): |
76 | 56 |
arch = self.getRPMArch(rpmName) |
77 | 57 |
rpmDestDir=rpmDir+"/"+arch |
... | ... |
@@ -129,10 +109,10 @@ class PackageUtils(object): |
129 | 129 |
self.logger.error("Unable to install rpms") |
130 | 130 |
raise Exception("RPM installation failed") |
131 | 131 |
|
132 |
- def verifyShaAndGetSourcePath(self, source, package, index=0): |
|
132 |
+ def verifyShaAndGetSourcePath(self, source, package, version): |
|
133 | 133 |
cmdUtils = CommandUtils() |
134 | 134 |
# Fetch/verify sources if sha1 not None. |
135 |
- sha1 = SPECS.getData().getSHA1(package, source, index) |
|
135 |
+ sha1 = SPECS.getData().getSHA1(package, source, version) |
|
136 | 136 |
if sha1 is not None: |
137 | 137 |
PullSources.get(package, source, sha1, constants.sourcePath, constants.pullsourcesConfig, self.logger) |
138 | 138 |
|
... | ... |
@@ -160,9 +140,9 @@ class PackageUtils(object): |
160 | 160 |
listSourceFiles, |
161 | 161 |
package, |
162 | 162 |
destDir, |
163 |
- index=0): |
|
163 |
+ version): |
|
164 | 164 |
for source in listSourceFiles: |
165 |
- sourcePath = self.verifyShaAndGetSourcePath(source, package, index) |
|
165 |
+ sourcePath = self.verifyShaAndGetSourcePath(source, package, version) |
|
166 | 166 |
self.logger.info("Copying... Source path :" + source + " Source filename: " + sourcePath[0]) |
167 | 167 |
shutil.copy2(sourcePath[0], destDir) |
168 | 168 |
|
... | ... |
@@ -198,16 +178,16 @@ class PackageUtils(object): |
198 | 198 |
def buildRPMSForGivenPackage( |
199 | 199 |
self, |
200 | 200 |
package, |
201 |
+ version, |
|
201 | 202 |
chrootID, |
202 | 203 |
listBuildOptionPackages, |
203 | 204 |
pkgBuildOptionFile, |
204 |
- destLogPath=None, |
|
205 |
- index=0): |
|
205 |
+ destLogPath=None): |
|
206 | 206 |
self.logger.info("Building rpm's for package:"+package) |
207 | 207 |
|
208 |
- listSourcesFiles = SPECS.getData().getSources(package, index) |
|
209 |
- listPatchFiles = SPECS.getData().getPatches(package, index) |
|
210 |
- specFile = SPECS.getData().getSpecFile(package, index) |
|
208 |
+ listSourcesFiles = SPECS.getData().getSources(package, version) |
|
209 |
+ listPatchFiles = SPECS.getData().getPatches(package, version) |
|
210 |
+ specFile = SPECS.getData().getSpecFile(package, version) |
|
211 | 211 |
specName = SPECS.getData().getSpecName(package) + ".spec" |
212 | 212 |
chrootSourcePath=chrootID+constants.topDirPath+"/SOURCES/" |
213 | 213 |
chrootSpecPath=constants.topDirPath+"/SPECS/" |
... | ... |
@@ -217,8 +197,8 @@ class PackageUtils(object): |
217 | 217 |
|
218 | 218 |
# FIXME: some sources are located in SPECS/.. how to mount? |
219 | 219 |
# if os.geteuid()==0: |
220 |
- self.copySourcesTobuildroot(listSourcesFiles,package,chrootSourcePath, index) |
|
221 |
- self.copySourcesTobuildroot(listPatchFiles,package,chrootSourcePath, index) |
|
220 |
+ self.copySourcesTobuildroot(listSourcesFiles,package,chrootSourcePath, version) |
|
221 |
+ self.copySourcesTobuildroot(listPatchFiles,package,chrootSourcePath, version) |
|
222 | 222 |
|
223 | 223 |
macros = [] |
224 | 224 |
if package in listBuildOptionPackages: |
... | ... |
@@ -311,13 +291,13 @@ class PackageUtils(object): |
311 | 311 |
listSRPMFiles.append(listcontents[1]) |
312 | 312 |
return listRPMFiles,listSRPMFiles |
313 | 313 |
|
314 |
- def findRPMFileForGivenPackage(self, package, version = "*", index=0): |
|
314 |
+ def findRPMFileForGivenPackage(self, package, version = "*"): |
|
315 | 315 |
cmdUtils = CommandUtils() |
316 | 316 |
|
317 | 317 |
# If no version is specified, use the latest from the source |
318 | 318 |
# code. |
319 | 319 |
if version == "*": |
320 |
- version = SPECS.getData().getVersion(package,index) |
|
320 |
+ version = SPECS.getData().getHighestVersion(package) |
|
321 | 321 |
release = SPECS.getData().getRelease(package,version) |
322 | 322 |
# pkg_build_options does not specify the release and there is no spec for that |
323 | 323 |
if not release: |
... | ... |
@@ -374,8 +354,8 @@ class PackageUtils(object): |
374 | 374 |
return result.split() |
375 | 375 |
return result |
376 | 376 |
|
377 |
- def adjustGCCSpecs(self, package, chrootID, logPath, index=0): |
|
378 |
- opt = " " + SPECS.getData().getSecurityHardeningOption(package, index) |
|
377 |
+ def adjustGCCSpecs(self, package, chrootID, logPath, version): |
|
378 |
+ opt = " " + SPECS.getData().getSecurityHardeningOption(package, version) |
|
379 | 379 |
cmdUtils=CommandUtils() |
380 | 380 |
cpcmd="cp "+ self.adjustGCCSpecScript+" "+chrootID+"/tmp/"+self.adjustGCCSpecScript |
381 | 381 |
cmd = "/tmp/"+self.adjustGCCSpecScript+opt |
... | ... |
@@ -396,10 +376,10 @@ class PackageUtils(object): |
396 | 396 |
self.logger.error("Failed while adjusting gcc specs") |
397 | 397 |
raise Exception("Failed while adjusting gcc specs") |
398 | 398 |
|
399 |
- def copySourcesToContainer(self, listSourceFiles, package, containerID, destDir, index=0): |
|
399 |
+ def copySourcesToContainer(self, listSourceFiles, package, containerID, destDir, version): |
|
400 | 400 |
cmdUtils = CommandUtils() |
401 | 401 |
for source in listSourceFiles: |
402 |
- sourcePath = self.verifyShaAndGetSourcePath(source, package, index) |
|
402 |
+ sourcePath = self.verifyShaAndGetSourcePath(source, package, version) |
|
403 | 403 |
self.logger.info("Copying source file: " + sourcePath[0]) |
404 | 404 |
copyCmd = "docker cp " + sourcePath[0] + " " + containerID.short_id + ":" + destDir |
405 | 405 |
cmdUtils.runCommandInShell(copyCmd) |
... | ... |
@@ -529,8 +509,8 @@ class PackageUtils(object): |
529 | 529 |
return result.split() |
530 | 530 |
return result |
531 | 531 |
|
532 |
- def adjustGCCSpecsInContainer(self, package, containerID, logPath, index): |
|
533 |
- opt = " " + SPECS.getData().getSecurityHardeningOption(package, index) |
|
532 |
+ def adjustGCCSpecsInContainer(self, package, containerID, logPath, version): |
|
533 |
+ opt = " " + SPECS.getData().getSecurityHardeningOption(package, version) |
|
534 | 534 |
adjustCmd = "/" + self.adjustGCCSpecScript + opt |
535 | 535 |
adjustCmd = "/bin/bash -l -c '" + adjustCmd + "'" |
536 | 536 |
logFile = logPath + "/adjustGCCSpecScript.log" |
... | ... |
@@ -552,16 +532,16 @@ class PackageUtils(object): |
552 | 552 |
def buildRPMSForGivenPackageInContainer( |
553 | 553 |
self, |
554 | 554 |
package, |
555 |
+ version, |
|
555 | 556 |
containerID, |
556 | 557 |
listBuildOptionPackages, |
557 | 558 |
pkgBuildOptionFile, |
558 |
- destLogPath=None, |
|
559 |
- index=0): |
|
559 |
+ destLogPath=None): |
|
560 | 560 |
self.logger.info("Building rpm's for package " + package + " in container " + containerID.short_id) |
561 | 561 |
|
562 |
- listSourcesFiles = SPECS.getData().getSources(package, index) |
|
563 |
- listPatchFiles = SPECS.getData().getPatches(package, index) |
|
564 |
- specFile = SPECS.getData().getSpecFile(package, index) |
|
562 |
+ listSourcesFiles = SPECS.getData().getSources(package, version) |
|
563 |
+ listPatchFiles = SPECS.getData().getPatches(package, version) |
|
564 |
+ specFile = SPECS.getData().getSpecFile(package, version) |
|
565 | 565 |
specName = SPECS.getData().getSpecName(package) + ".spec" |
566 | 566 |
sourcePath = constants.topDirPath + "/SOURCES/" |
567 | 567 |
specPath = constants.topDirPath + "/SPECS/" |
... | ... |
@@ -581,9 +561,9 @@ class PackageUtils(object): |
581 | 581 |
# if os.geteuid()==0: |
582 | 582 |
#TODO: mount it in, don't copy |
583 | 583 |
macros = [] |
584 |
- self.copySourcesToContainer(listSourcesFiles, package, containerID, sourcePath, index) |
|
584 |
+ self.copySourcesToContainer(listSourcesFiles, package, containerID, sourcePath, version) |
|
585 | 585 |
#TODO: mount it in, don't copy |
586 |
- self.copySourcesToContainer(listPatchFiles, package, containerID, sourcePath, index) |
|
586 |
+ self.copySourcesToContainer(listPatchFiles, package, containerID, sourcePath, version) |
|
587 | 587 |
if package in listBuildOptionPackages: |
588 | 588 |
listAdditionalFiles, macros = self.getAdditionalBuildFiles(package, pkgBuildOptionFile) |
589 | 589 |
self.copyAdditionalBuildFilesToContainer(listAdditionalFiles, containerID) |
... | ... |
@@ -35,11 +35,11 @@ class Scheduler(object): |
35 | 35 |
@staticmethod |
36 | 36 |
def getBuildRequiredPackages(package): |
37 | 37 |
listRequiredRPMPackages = [] |
38 |
- listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package)) |
|
38 |
+ listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPkg(package)) |
|
39 | 39 |
listRequiredPackages = [] |
40 | 40 |
|
41 | 41 |
for pkg in listRequiredRPMPackages: |
42 |
- basePkg = SPECS.getData().getSpecName(pkg.package) |
|
42 |
+ basePkg = SPECS.getData().getBasePkg(pkg) |
|
43 | 43 |
if basePkg not in listRequiredPackages: |
44 | 44 |
listRequiredPackages.append(basePkg) |
45 | 45 |
|
... | ... |
@@ -148,12 +148,12 @@ class Scheduler(object): |
148 | 148 |
@staticmethod |
149 | 149 |
def getRequiredPackages(package): |
150 | 150 |
listRequiredRPMPackages=[] |
151 |
- listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package)) |
|
152 |
- listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPackage(package)) |
|
151 |
+ listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPkg(package)) |
|
152 |
+ listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPkg(package)) |
|
153 | 153 |
listRequiredPackages=[] |
154 | 154 |
|
155 | 155 |
for pkg in listRequiredRPMPackages: |
156 |
- basePkg=SPECS.getData().getSpecName(pkg.package) |
|
156 |
+ basePkg=SPECS.getData().getBasePkg(pkg) |
|
157 | 157 |
if basePkg not in listRequiredPackages: |
158 | 158 |
listRequiredPackages.append(basePkg) |
159 | 159 |
return listRequiredPackages |
... | ... |
@@ -7,6 +7,8 @@ import Queue |
7 | 7 |
import json |
8 | 8 |
import operator |
9 | 9 |
from constants import constants |
10 |
+from distutils.version import LooseVersion |
|
11 |
+from StringUtils import StringUtils |
|
10 | 12 |
|
11 | 13 |
class SpecObject(object): |
12 | 14 |
def __init__(self): |
... | ... |
@@ -81,23 +83,111 @@ class SpecObjectsUtils(object): |
81 | 81 |
elif os.path.isdir(dirEntryPath): |
82 | 82 |
self.getListSpecFiles(listSpecFiles,dirEntryPath) |
83 | 83 |
|
84 |
- def getBuildRequiresForPackage(self, package, index=0): |
|
85 |
- specName=self.getSpecName(package) |
|
86 |
- return self.mapSpecObjects[specName][index].buildRequirePackages |
|
87 |
- |
|
88 |
- def getRequiresAllForPackage(self, package, index=0): |
|
89 |
- specName=self.getSpecName(package) |
|
90 |
- return self.mapSpecObjects[specName][index].installRequiresAllPackages |
|
91 |
- |
|
92 |
- def getRequiresForPackage(self, package, index=0): |
|
93 |
- specName=self.getSpecName(package) |
|
94 |
- if self.mapSpecObjects[specName][index].installRequiresPackages.has_key(package): |
|
95 |
- return self.mapSpecObjects[specName][index].installRequiresPackages[package] |
|
96 |
- return None |
|
97 |
- |
|
98 |
- def getCheckBuildRequiresForPackage(self, package, index=0): |
|
99 |
- specName=self.getSpecName(package) |
|
100 |
- return self.mapSpecObjects[specName][index].checkBuildRequirePackages |
|
84 |
+ def _getProperVersion(self,depPkg): |
|
85 |
+ if (depPkg.compare == ""): |
|
86 |
+ return self.getHighestVersion(depPkg.package) |
|
87 |
+ specObjs=self.getSpecObj(depPkg.package) |
|
88 |
+ try: |
|
89 |
+ for obj in specObjs: |
|
90 |
+ verrel=obj.version+"-"+obj.release |
|
91 |
+ if depPkg.compare == "gte": |
|
92 |
+ if LooseVersion(verrel) >= LooseVersion(depPkg.version): |
|
93 |
+ return obj.version |
|
94 |
+ if LooseVersion(obj.version) >= LooseVersion(depPkg.version): |
|
95 |
+ return obj.version |
|
96 |
+ elif depPkg.compare == "lte": |
|
97 |
+ if LooseVersion(verrel) <= LooseVersion(depPkg.version): |
|
98 |
+ return obj.version |
|
99 |
+ if LooseVersion(obj.version) <= LooseVersion(depPkg.version): |
|
100 |
+ return obj.version |
|
101 |
+ elif depPkg.compare == "eq": |
|
102 |
+ if LooseVersion(verrel) == LooseVersion(depPkg.version): |
|
103 |
+ return obj.version |
|
104 |
+ if LooseVersion(obj.version) == LooseVersion(depPkg.version): |
|
105 |
+ return obj.version |
|
106 |
+ elif depPkg.compare == "lt": |
|
107 |
+ if LooseVersion(verrel) < LooseVersion(depPkg.version): |
|
108 |
+ return obj.version |
|
109 |
+ if LooseVersion(obj.version) < LooseVersion(depPkg.version): |
|
110 |
+ return obj.version |
|
111 |
+ elif depPkg.compare == "gt": |
|
112 |
+ if LooseVersion(verrel) > LooseVersion(depPkg.version): |
|
113 |
+ return obj.version |
|
114 |
+ if LooseVersion(obj.version) > LooseVersion(depPkg.version): |
|
115 |
+ return obj.version |
|
116 |
+ except Exception as e: |
|
117 |
+ self.logger.error("Exception happened while searching for: " + depPkg.package + depPkg.compare + depPkg.version) |
|
118 |
+ raise e |
|
119 |
+ |
|
120 |
+ # To ignore Epoch, consider the highest version of the package |
|
121 |
+ if "epoch" in depPkg.version: |
|
122 |
+ return self.getHighestVersion(depPkg.package) |
|
123 |
+ # about to throw exception |
|
124 |
+ availableVersions="" |
|
125 |
+ for obj in specObjs: |
|
126 |
+ availableVersions+=" "+obj.name+"-"+obj.version+"-"+obj.release |
|
127 |
+ raise Exception("Can not find package: " + depPkg.package + depPkg.compare + depPkg.version + " available specs:"+availableVersions) |
|
128 |
+ |
|
129 |
+ def _getSpecObjField(self, package, version, field): |
|
130 |
+ specName = self.getSpecName(package) |
|
131 |
+ for specObj in self.mapSpecObjects[specName]: |
|
132 |
+ if specObj.version == version: |
|
133 |
+ return field(specObj) |
|
134 |
+ self.logger.error("Could not able to find " + package + |
|
135 |
+ "-" + version + " package from specs") |
|
136 |
+ raise Exception("Invalid package: " + package + "-" + version) |
|
137 |
+ |
|
138 |
+ def getBuildRequiresForPackage(self, package, version): |
|
139 |
+ buildRequiresList=[] |
|
140 |
+ buildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.buildRequirePackages) |
|
141 |
+ for pkg in buildRequiresPackages: |
|
142 |
+ properVersion = self._getProperVersion(pkg) |
|
143 |
+ buildRequiresList.append(pkg.package+"-"+properVersion) |
|
144 |
+ return buildRequiresList |
|
145 |
+ |
|
146 |
+ def getBuildRequiresForPkg(self, pkg): |
|
147 |
+ package, version = StringUtils.splitPackageNameAndVersion(pkg) |
|
148 |
+ return self.getBuildRequiresForPackage(package, version) |
|
149 |
+ |
|
150 |
+ # Returns list of [ "pkg1-vers1", "pkg2-vers2",.. ] |
|
151 |
+ def getRequiresAllForPackage(self, package, version): |
|
152 |
+ requiresList=[] |
|
153 |
+ requiresPackages = self._getSpecObjField(package, version, field=lambda x : x.installRequiresAllPackages) |
|
154 |
+ for pkg in requiresPackages: |
|
155 |
+ properVersion = self._getProperVersion(pkg) |
|
156 |
+ requiresList.append(pkg.package+"-"+properVersion) |
|
157 |
+ return requiresList |
|
158 |
+ |
|
159 |
+ def getRequiresAllForPkg(self, pkg): |
|
160 |
+ package, version = StringUtils.splitPackageNameAndVersion(pkg) |
|
161 |
+ return self.getRequiresAllForPackage(package, version) |
|
162 |
+ |
|
163 |
+ def getRequiresForPackage(self, package, version): |
|
164 |
+ requiresList=[] |
|
165 |
+ specName = self.getSpecName(package) |
|
166 |
+ for specObj in self.mapSpecObjects[specName]: |
|
167 |
+ if specObj.version == version: |
|
168 |
+ if package in specObj.installRequiresPackages: |
|
169 |
+ requiresPackages = specObj.installRequiresPackages[package] |
|
170 |
+ for pkg in requiresPackages: |
|
171 |
+ properVersion = self._getProperVersion(pkg) |
|
172 |
+ requiresList.append(pkg.package+"-"+properVersion) |
|
173 |
+ return requiresList |
|
174 |
+ self.logger.error("Could not able to find " + package + |
|
175 |
+ "-" + version + " package from specs") |
|
176 |
+ raise Exception("Invalid package: " + package + "-" + version) |
|
177 |
+ |
|
178 |
+ def getRequiresForPkg(self, pkg): |
|
179 |
+ package, version = StringUtils.splitPackageNameAndVersion(pkg) |
|
180 |
+ return self.getRequiresForPackage(package, version) |
|
181 |
+ |
|
182 |
+ def getCheckBuildRequiresForPackage(self, package, version): |
|
183 |
+ checkBuildRequiresList=[] |
|
184 |
+ checkBuildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.checkBuildRequirePackages) |
|
185 |
+ for pkg in checkBuildRequiresPackages: |
|
186 |
+ properVersion = self._getProperVersion(pkg) |
|
187 |
+ checkBuildRequiresList.append(pkg.package+"-"+properVersion) |
|
188 |
+ return checkBuildRequiresList |
|
101 | 189 |
|
102 | 190 |
def getRelease(self, package, version=None): |
103 | 191 |
specName=self.getSpecName(package) |
... | ... |
@@ -108,33 +198,41 @@ class SpecObjectsUtils(object): |
108 | 108 |
return p.release |
109 | 109 |
return None |
110 | 110 |
|
111 |
- def getVersion(self, package, index=0): |
|
112 |
- specName=self.getSpecName(package) |
|
113 |
- return self.mapSpecObjects[specName][index].version |
|
111 |
+ def getHighestVersion(self, package): |
|
112 |
+ specName = self.getSpecName(package) |
|
113 |
+ return self.mapSpecObjects[specName][0].version |
|
114 | 114 |
|
115 |
- def getSpecFile(self, package, index=0): |
|
116 |
- specName=self.getSpecName(package) |
|
117 |
- return self.mapSpecObjects[specName][index].specFile |
|
115 |
+ def getVersions(self, package): |
|
116 |
+ versions=[] |
|
117 |
+ specName = self.getSpecName(package) |
|
118 |
+ for specObj in self.mapSpecObjects[specName]: |
|
119 |
+ versions.append(specObj.version) |
|
120 |
+ return versions |
|
118 | 121 |
|
119 |
- def getPatches(self, package, index=0): |
|
120 |
- specName=self.getSpecName(package) |
|
121 |
- return self.mapSpecObjects[specName][index].listPatches |
|
122 |
+ def getSpecFile(self, package, version): |
|
123 |
+ return self._getSpecObjField(package, version, field=lambda x : x.specFile) |
|
122 | 124 |
|
123 |
- def getSources(self, package, index=0): |
|
124 |
- specName=self.getSpecName(package) |
|
125 |
- return self.mapSpecObjects[specName][index].listSources |
|
125 |
+ def getPatches(self, package, version): |
|
126 |
+ return self._getSpecObjField(package, version, field=lambda x : x.listPatches) |
|
126 | 127 |
|
127 |
- def getSHA1(self, package, source, index=0): |
|
128 |
- specName=self.getSpecName(package) |
|
129 |
- return self.mapSpecObjects[specName][index].checksums.get(source) |
|
128 |
+ def getSources(self, package, version): |
|
129 |
+ return self._getSpecObjField(package, version, field=lambda x : x.listSources) |
|
130 | 130 |
|
131 |
- def getPackages(self, package, index=0): |
|
132 |
- specName=self.getSpecName(package) |
|
133 |
- return self.mapSpecObjects[specName][index].listPackages |
|
131 |
+ def getSHA1(self, package, source, version): |
|
132 |
+ return self._getSpecObjField(package, version, field=lambda x : x.checksums.get(source)) |
|
133 |
+ # returns list of package names (no versions) |
|
134 |
+ def getPackages(self, package, version): |
|
135 |
+ return self._getSpecObjField(package, version, field=lambda x : x.listPackages) |
|
134 | 136 |
|
135 |
- def getRPMPackages(self, package, index=0): |
|
136 |
- specName=self.getSpecName(package) |
|
137 |
- return self.mapSpecObjects[specName][index].listRPMPackages |
|
137 |
+ def getPackagesForPkg(self, pkg): |
|
138 |
+ pkgs=[] |
|
139 |
+ package, version = StringUtils.splitPackageNameAndVersion(pkg) |
|
140 |
+ for p in self.getPackages(package, version): |
|
141 |
+ pkgs.append(p+"-"+version) |
|
142 |
+ return pkgs |
|
143 |
+ |
|
144 |
+ def getRPMPackages(self, package, version): |
|
145 |
+ return self._getSpecObjField(package, version, field=lambda x : x.listRPMPackages) |
|
138 | 146 |
|
139 | 147 |
@staticmethod |
140 | 148 |
def compareVersions(p): |
... | ... |
@@ -148,35 +246,30 @@ class SpecObjectsUtils(object): |
148 | 148 |
self.logger.error("Could not able to find "+package+" package from specs") |
149 | 149 |
raise Exception("Invalid package:"+package) |
150 | 150 |
|
151 |
- def isRPMPackage(self,package, index=0): |
|
151 |
+ def isRPMPackage(self,package): |
|
152 | 152 |
if package in self.mapPackageToSpec: |
153 | 153 |
specName=self.mapPackageToSpec[package] |
154 | 154 |
if specName in self.mapSpecObjects: |
155 | 155 |
return True |
156 | 156 |
return False |
157 | 157 |
|
158 |
- def getSecurityHardeningOption(self, package, index=0): |
|
159 |
- specName=self.getSpecName(package) |
|
160 |
- return self.mapSpecObjects[specName][index].securityHardening |
|
158 |
+ def getSecurityHardeningOption(self, package, version): |
|
159 |
+ return self._getSpecObjField(package, version, field=lambda x : x.securityHardening) |
|
161 | 160 |
|
162 |
- def isCheckAvailable(self, package, index=0): |
|
163 |
- specName=self.getSpecName(package) |
|
164 |
- return self.mapSpecObjects[specName][index].isCheckAvailable |
|
161 |
+ def isCheckAvailable(self, package, version): |
|
162 |
+ return self._getSpecObjField(package, version, field=lambda x : x.isCheckAvailable) |
|
165 | 163 |
|
166 | 164 |
def getListPackages(self): |
167 | 165 |
return self.mapSpecObjects.keys() |
168 | 166 |
|
169 |
- def getURL(self, package, index=0): |
|
170 |
- specName=self.getSpecName(package) |
|
171 |
- return self.mapSpecObjects[specName][index].url |
|
167 |
+ def getURL(self, package, version): |
|
168 |
+ return self._getSpecObjField(package, version, field=lambda x : x.url) |
|
172 | 169 |
|
173 |
- def getSourceURL(self, package, index=0): |
|
174 |
- specName=self.getSpecName(package) |
|
175 |
- return self.mapSpecObjects[specName][index].sourceurl |
|
170 |
+ def getSourceURL(self, package, version): |
|
171 |
+ return self._getSpecObjField(package, version, field=lambda x : x.sourceurl) |
|
176 | 172 |
|
177 |
- def getLicense(self, package, index=0): |
|
178 |
- specName=self.getSpecName(package) |
|
179 |
- return self.mapSpecObjects[specName][index].license |
|
173 |
+ def getLicense(self, package, version): |
|
174 |
+ return self._getSpecObjField(package, version, field=lambda x : x.license) |
|
180 | 175 |
|
181 | 176 |
def getNumberOfVersions(self, package): |
182 | 177 |
specName=self.getSpecName(package) |
... | ... |
@@ -194,6 +287,11 @@ class SpecObjectsUtils(object): |
194 | 194 |
listPkgName=list(set(listPkgName)) |
195 | 195 |
return listPkgName |
196 | 196 |
|
197 |
+ # Converts "glibc-devel-2.28" into "glibc-2.28" |
|
198 |
+ def getBasePkg(self, pkg): |
|
199 |
+ package, version = StringUtils.splitPackageNameAndVersion(pkg) |
|
200 |
+ return self.getSpecName(package)+"-"+version |
|
201 |
+ |
|
197 | 202 |
def printAllObjects(self): |
198 | 203 |
listSpecs=self.mapSpecObjects.keys() |
199 | 204 |
for spec in listSpecs: |
... | ... |
@@ -252,7 +350,7 @@ class SPECS(object): |
252 | 252 |
java8version = spec.getVersion() |
253 | 253 |
constants.addMacro("JAVA8_VERSION",java8version) |
254 | 254 |
|
255 |
- |
|
255 |
+ |
|
256 | 256 |
#adding openjre9 version rpm macro |
257 | 257 |
if (platform.machine() == "x86_64"): |
258 | 258 |
spec = Specutils(constants.specPath + "/openjdk9/openjdk9.spec") |
... | ... |
@@ -285,267 +383,3 @@ class SPECS(object): |
285 | 285 |
# Full parsing |
286 | 286 |
self.specData = SpecObjectsUtils(constants.logPath) |
287 | 287 |
self.specData.readSpecsAndConvertToSerializableObjects(constants.specPath) |
288 |
- |
|
289 |
-# Little bit of duplication |
|
290 |
-# Used by SpecVerify and SpecDeps only |
|
291 |
-class SerializedSpecObjects(object): |
|
292 |
- |
|
293 |
- def __init__(self, inputDataDir, stageDir): |
|
294 |
- self.mapSpecObjects={} |
|
295 |
- self.mapPackageToSpec={} |
|
296 |
- self.jsonFilesOutPath = stageDir + "/common/data/" |
|
297 |
- self.inputDataDir = inputDataDir |
|
298 |
- |
|
299 |
- def findTotalRequires(self, allDeps, depQue, parent, displayOption): |
|
300 |
- while not depQue.empty(): |
|
301 |
- specPkg = depQue.get() |
|
302 |
- specName = self.getSpecName(specPkg) |
|
303 |
- if specName is None: |
|
304 |
- print specPkg + " is missing" |
|
305 |
- specObj = self.mapSpecObjects[specName] |
|
306 |
- for depPkg in specObj.installRequiresPackages[specPkg]: |
|
307 |
- if True == allDeps.has_key(depPkg): |
|
308 |
- if(allDeps[depPkg] < allDeps[specPkg] + 1): |
|
309 |
- allDeps[depPkg] = allDeps[specPkg] + 1 |
|
310 |
- parent[depPkg] = specPkg |
|
311 |
- self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg]) |
|
312 |
- else: |
|
313 |
- allDeps[depPkg] = allDeps[specPkg] + 1 |
|
314 |
- parent[depPkg] = specPkg |
|
315 |
- depQue.put(depPkg) |
|
316 |
- |
|
317 |
- def findTotalWhoNeedsToBuild(self, depQue, whoBuildDeps, whoBuildDepSet, displayOption): |
|
318 |
- while not depQue.empty(): |
|
319 |
- specPkg = depQue.get() |
|
320 |
- specName = self.getSpecName(specPkg) |
|
321 |
- spec=Specutils(self.getSpecFile(specPkg)) |
|
322 |
- RPMName=spec.getRPMName(specPkg) |
|
323 |
- debuginfoRPMName=spec.getDebuginfoRPMName(specPkg) |
|
324 |
- whoBuildDepSet.add(RPMName) |
|
325 |
- whoBuildDepSet.add(debuginfoRPMName) |
|
326 |
- if specName is None: |
|
327 |
- print specPkg + " is missing" |
|
328 |
- if not whoBuildDeps.has_key(specPkg): |
|
329 |
- continue |
|
330 |
- for depPkg in whoBuildDeps[specPkg]: |
|
331 |
- depQue.put(depPkg) |
|
332 |
- |
|
333 |
- def printTree(self, allDeps, children, curParent , depth): |
|
334 |
- if (children.has_key(curParent)): |
|
335 |
- for child in children[curParent]: |
|
336 |
- print "\t" * depth, child |
|
337 |
- self.printTree(allDeps, children, child, depth+1) |
|
338 |
- |
|
339 |
- def get_all_package_names(self, jsonFilePath): |
|
340 |
- base_path = os.path.dirname(jsonFilePath) |
|
341 |
- jsonData = open(jsonFilePath) |
|
342 |
- option_list_json = json.load(jsonData) |
|
343 |
- jsonData.close() |
|
344 |
- packages = option_list_json["packages"] |
|
345 |
- return packages |
|
346 |
- |
|
347 |
- def updateLevels(self, allDeps, inPkg, parent, level): |
|
348 |
- specName = self.getSpecName(inPkg) |
|
349 |
- specObj = self.mapSpecObjects[specName] |
|
350 |
- for depPkg in specObj.installRequiresPackages[inPkg]: |
|
351 |
- # ignore circular deps within single spec file |
|
352 |
- if (specObj.installRequiresPackages.has_key(depPkg) and inPkg in specObj.installRequiresPackages[depPkg] and self.getSpecName(depPkg) == specName): |
|
353 |
- continue |
|
354 |
- if (allDeps.has_key(depPkg) and allDeps[depPkg] < level + 1): |
|
355 |
- allDeps[depPkg] = level + 1 |
|
356 |
- parent[depPkg] = inPkg |
|
357 |
- self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg]) |
|
358 |
- |
|
359 |
- def readSpecsAndConvertToSerializableObjects(self, specFilesPath, inputType, inputValue, displayOption): |
|
360 |
- children = {} |
|
361 |
- listSpecFiles=[] |
|
362 |
- whoNeedsList=[] |
|
363 |
- whoBuildDepSet= set() |
|
364 |
- independentRPMS=[] # list of all RPMS not built from photon and that must be blindly copied. |
|
365 |
- whoBuildDeps = {} |
|
366 |
- allDeps={} |
|
367 |
- parent={} |
|
368 |
- depQue = Queue.Queue() |
|
369 |
- packageFound = False |
|
370 |
- self.getListSpecFiles(listSpecFiles,specFilesPath) |
|
371 |
- for specFile in listSpecFiles: |
|
372 |
- spec=Specutils(specFile) |
|
373 |
- specName=spec.getBasePackageName() |
|
374 |
- specObj=SpecObject() |
|
375 |
- specObj.name=specName |
|
376 |
- specObj.buildRequirePackages=spec.getBuildRequiresAllPackages() |
|
377 |
- specObj.installRequiresAllPackages=spec.getRequiresAllPackages() |
|
378 |
- specObj.listPackages=spec.getPackageNames() |
|
379 |
- specObj.specFile=specFile |
|
380 |
- specObj.version=spec.getVersion() |
|
381 |
- specObj.release=spec.getRelease() |
|
382 |
- specObj.listSources=spec.getSourceNames() |
|
383 |
- specObj.listPatches=spec.getPatchNames() |
|
384 |
- specObj.securityHardening=spec.getSecurityHardeningOption() |
|
385 |
- for specPkg in specObj.listPackages: |
|
386 |
- specObj.installRequiresPackages[specPkg]=spec.getRequires(specPkg) |
|
387 |
- if (inputType == "pkg" and inputValue == specPkg): # all the first level dependencies to a dictionary and queue |
|
388 |
- packageFound = True |
|
389 |
- for depPkg in specObj.installRequiresPackages[specPkg]: |
|
390 |
- if False == allDeps.has_key(depPkg): |
|
391 |
- allDeps[depPkg] = 0 |
|
392 |
- parent[depPkg] = "" |
|
393 |
- depQue.put(depPkg) |
|
394 |
- elif (inputType == "who-needs" and (inputValue in specObj.installRequiresPackages[specPkg])): |
|
395 |
- whoNeedsList.append(specPkg) |
|
396 |
- elif (inputType == "who-needs-build"): |
|
397 |
- for bdrq in specObj.buildRequirePackages: |
|
398 |
- if (whoBuildDeps.has_key(bdrq.package)): |
|
399 |
- whoBuildDeps[bdrq.package].add(specPkg) |
|
400 |
- else: |
|
401 |
- whoBuildDeps[bdrq.package] = set() |
|
402 |
- whoBuildDeps[bdrq.package].add(specPkg) |
|
403 |
- if(inputValue == specPkg): |
|
404 |
- packageFound = True |
|
405 |
- for depPkg in specObj.listPackages: |
|
406 |
- depQue.put(depPkg) |
|
407 |
- |
|
408 |
- self.mapPackageToSpec[specPkg]=specName |
|
409 |
- self.mapSpecObjects[specName]=specObj |
|
410 |
- |
|
411 |
- # Generate dependencies for individual packages |
|
412 |
- if (inputType == "pkg"): |
|
413 |
- if (packageFound == True): |
|
414 |
- self.findTotalRequires(allDeps, depQue, parent, displayOption) |
|
415 |
- else: |
|
416 |
- print "No spec file builds a package named",inputValue |
|
417 |
- return |
|
418 |
- |
|
419 |
- # Generate dependencies for all packages in the given JSON input file |
|
420 |
- elif (inputType == "json"): |
|
421 |
- filePath = self.inputDataDir +"/"+ inputValue |
|
422 |
- data = self.get_all_package_names(filePath) |
|
423 |
- for pkg in data: |
|
424 |
- if False == allDeps.has_key(pkg): |
|
425 |
- spName = self.getSpecName(pkg) |
|
426 |
- if(spName != None): |
|
427 |
- allDeps[pkg] = 0 |
|
428 |
- parent[pkg] = "" |
|
429 |
- depQue.put(pkg) |
|
430 |
- self.findTotalRequires(allDeps, depQue, parent, displayOption) |
|
431 |
- else: |
|
432 |
- independentRPMS.append(pkg); |
|
433 |
- |
|
434 |
- #Generating the list of packages that requires the given input package at install time |
|
435 |
- elif (inputType == "who-needs"): |
|
436 |
- print whoNeedsList |
|
437 |
- return |
|
438 |
- |
|
439 |
- #Generating the list of packages that the modified package will affect at build time |
|
440 |
- elif (inputType == "who-needs-build"): |
|
441 |
- if (packageFound == True): |
|
442 |
- self.findTotalWhoNeedsToBuild(depQue, whoBuildDeps, whoBuildDepSet, displayOption) |
|
443 |
- print whoBuildDepSet |
|
444 |
- else: |
|
445 |
- print "No spec file builds a package named", inputValue |
|
446 |
- return |
|
447 |
- |
|
448 |
- # construct the sorted list of all packages (sorted by dependency) |
|
449 |
- sortedList = [] |
|
450 |
- for elem in sorted(allDeps.items(), key=operator.itemgetter(1), reverse=True): |
|
451 |
- sortedList.append(elem[0]) |
|
452 |
- sortedList.extend(independentRPMS) |
|
453 |
- |
|
454 |
- # construct all children nodes |
|
455 |
- if (displayOption == "tree"): |
|
456 |
- for k, v in parent.iteritems(): |
|
457 |
- children.setdefault(v, []).append(k) |
|
458 |
- if(inputType == "json"): |
|
459 |
- print "Dependency Mappings for", inputValue, ":", "\n----------------------------------------------------",children |
|
460 |
- print "----------------------------------------------------" |
|
461 |
- if (children.has_key("")): |
|
462 |
- for child in children[""]: |
|
463 |
- print child |
|
464 |
- self.printTree(allDeps, children, child, 1) |
|
465 |
- for pkg in independentRPMS: |
|
466 |
- print pkg |
|
467 |
- print "******************",len(sortedList), "packages in total ******************" |
|
468 |
- else: |
|
469 |
- if (inputType == "pkg" and len(children) > 0): |
|
470 |
- print "cyclic dependency detected, mappings: \n",children |
|
471 |
- |
|
472 |
- # To display a flat list of all packages |
|
473 |
- elif(displayOption == "list"): |
|
474 |
- print sortedList |
|
475 |
- |
|
476 |
- # To generate a new JSON file based on given input json file |
|
477 |
- elif(displayOption == "json" and inputType == "json"): |
|
478 |
- d = {} |
|
479 |
- d['packages'] = sortedList |
|
480 |
- outFilePath = self.jsonFilesOutPath + inputValue |
|
481 |
- with open(outFilePath, 'wb') as outfile: |
|
482 |
- json.dump(d, outfile) |
|
483 |
- return sortedList |
|
484 |
- |
|
485 |
- def getListSpecFiles(self,listSpecFiles,path): |
|
486 |
- for dirEntry in os.listdir(path): |
|
487 |
- dirEntryPath = os.path.join(path, dirEntry) |
|
488 |
- if os.path.isfile(dirEntryPath) and dirEntryPath.endswith(".spec") and os.path.basename(dirEntryPath) not in constants.skipSpecsForArch.get(platform.machine(),[]): |
|
489 |
- listSpecFiles.append(dirEntryPath) |
|
490 |
- elif os.path.isdir(dirEntryPath): |
|
491 |
- self.getListSpecFiles(listSpecFiles,dirEntryPath) |
|
492 |
- |
|
493 |
- def getBuildRequiresForPackage(self, package): |
|
494 |
- specName=self.getSpecName(package) |
|
495 |
- return self.mapSpecObjects[specName].buildRequirePackages |
|
496 |
- |
|
497 |
- def getRequiresForPackage(self, package): |
|
498 |
- specName=self.getSpecName(package) |
|
499 |
- if self.mapSpecObjects[specName].installRequiresPackages.has_key(package): |
|
500 |
- return self.mapSpecObjects[specName].installRequiresPackages[package] |
|
501 |
- return None |
|
502 |
- |
|
503 |
- def getRelease(self, package): |
|
504 |
- specName=self.getSpecName(package) |
|
505 |
- return self.mapSpecObjects[specName].release |
|
506 |
- |
|
507 |
- def getVersion(self, package): |
|
508 |
- specName=self.getSpecName(package) |
|
509 |
- return self.mapSpecObjects[specName].version |
|
510 |
- |
|
511 |
- def getSpecFile(self, package): |
|
512 |
- specName=self.getSpecName(package) |
|
513 |
- return self.mapSpecObjects[specName].specFile |
|
514 |
- |
|
515 |
- def getPatches(self, package): |
|
516 |
- specName=self.getSpecName(package) |
|
517 |
- return self.mapSpecObjects[specName].listPatches |
|
518 |
- |
|
519 |
- def getSources(self, package): |
|
520 |
- specName=self.getSpecName(package) |
|
521 |
- return self.mapSpecObjects[specName].listSources |
|
522 |
- |
|
523 |
- def getPackages(self, package): |
|
524 |
- specName=self.getSpecName(package) |
|
525 |
- return self.mapSpecObjects[specName].listPackages |
|
526 |
- |
|
527 |
- def getSpecName(self,package): |
|
528 |
- if self.mapPackageToSpec.has_key(package): |
|
529 |
- specName=self.mapPackageToSpec[package] |
|
530 |
- if self.mapSpecObjects.has_key(specName): |
|
531 |
- return specName |
|
532 |
- else: |
|
533 |
- print "SpecDeps: Could not able to find " + package + " package from specs" |
|
534 |
- raise Exception("Invalid package:" + package) |
|
535 |
- else: |
|
536 |
- return None |
|
537 |
- |
|
538 |
- def isRPMPackage(self,package): |
|
539 |
- if self.mapPackageToSpec.has_key(package): |
|
540 |
- specName=self.mapPackageToSpec[package] |
|
541 |
- if self.mapSpecObjects.has_key(specName): |
|
542 |
- return True |
|
543 |
- return False |
|
544 |
- |
|
545 |
- def getSecurityHardeningOption(self, package): |
|
546 |
- specName=self.getSpecName(package) |
|
547 |
- return self.mapSpecObjects[specName].securityHardening |
|
548 |
- |
|
549 |
- def getSpecDetails(self, name): |
|
550 |
- print self.getPkgNamesFromObj(self.mapSpecObjects[name].installRequiresAllPackages) |
|
551 |
- |
... | ... |
@@ -3,54 +3,242 @@ |
3 | 3 |
# Copyright (C) 2015 vmware inc. |
4 | 4 |
# |
5 | 5 |
# Author: Harish Udaiya Kumar <hudaiyakumar@vmware.com> |
6 |
-from SpecUtils import Specutils |
|
7 |
-from SpecData import SerializedSpecObjects |
|
8 | 6 |
import sys |
9 | 7 |
import os |
10 |
-from optparse import OptionParser |
|
8 |
+import json |
|
9 |
+import Queue |
|
10 |
+import operator |
|
11 |
+from argparse import ArgumentParser |
|
12 |
+import shutil |
|
13 |
+import traceback |
|
14 |
+from SpecData import SPECS |
|
11 | 15 |
from jsonwrapper import JsonWrapper |
16 |
+from constants import constants |
|
17 |
+from CommandUtils import CommandUtils |
|
18 |
+from StringUtils import StringUtils |
|
19 |
+from Logger import Logger |
|
20 |
+from optparse import OptionParser |
|
21 |
+ |
|
12 | 22 |
|
13 | 23 |
DEFAULT_INPUT_TYPE = "pkg" |
14 | 24 |
DEFAULT_DISPLAY_OPTION = "tree" |
15 | 25 |
SPEC_FILE_DIR = "../../SPECS" |
16 | 26 |
LOG_FILE_DIR = "../../stage/LOGS" |
17 | 27 |
|
28 |
+class SpecDependencyGenerator(object): |
|
29 |
+ |
|
30 |
+ def __init__(self, logPath, logLevel): |
|
31 |
+ self.logger = Logger.getLogger("Serializable Spec objects", logPath, logLevel) |
|
32 |
+ def findTotalRequires(self, mapDependencies, depQue, parent): |
|
33 |
+ while not depQue.empty(): |
|
34 |
+ specPkg = depQue.get() |
|
35 |
+ try: |
|
36 |
+ listRequiredPackages = SPECS.getData().getRequiresForPkg(specPkg) |
|
37 |
+ except Exception as e: |
|
38 |
+ self.logger.info("Caught Exception:"+str(e)) |
|
39 |
+ self.logger.info(specPkg + " is missing") |
|
40 |
+ raise e |
|
41 |
+ |
|
42 |
+ for depPkg in listRequiredPackages: |
|
43 |
+ if depPkg in mapDependencies: |
|
44 |
+ if mapDependencies[depPkg] < mapDependencies[specPkg] + 1: |
|
45 |
+ mapDependencies[depPkg] = mapDependencies[specPkg] + 1 |
|
46 |
+ parent[depPkg] = specPkg |
|
47 |
+ self.updateLevels(mapDependencies, depPkg, parent, mapDependencies[depPkg]) |
|
48 |
+ else: |
|
49 |
+ mapDependencies[depPkg] = mapDependencies[specPkg] + 1 |
|
50 |
+ parent[depPkg] = specPkg |
|
51 |
+ depQue.put(depPkg) |
|
52 |
+ |
|
53 |
+ def getBasePackagesRequired(self, pkg): |
|
54 |
+ listBasePackagesRequired=[] |
|
55 |
+ listPackagesRequired = SPECS.getData().getBuildRequiresForPkg(pkg) |
|
56 |
+ listPackagesRequired.extend(SPECS.getData().getRequiresAllForPkg(pkg)) |
|
57 |
+ for p in listPackagesRequired: |
|
58 |
+ basePkg = SPECS.getData().getBasePkg(p) |
|
59 |
+ if basePkg not in listBasePackagesRequired: |
|
60 |
+ listBasePackagesRequired.append(basePkg) |
|
61 |
+ return listBasePackagesRequired |
|
62 |
+ |
|
63 |
+ def findTotalWhoNeeds(self, depList, whoNeeds): |
|
64 |
+ while depList: |
|
65 |
+ pkg = depList.pop(0) |
|
66 |
+ for depPackage in SPECS.getData().getListPackages(): |
|
67 |
+ for version in SPECS.getData().getVersions(depPackage): |
|
68 |
+ depBasePkg = depPackage+"-"+version |
|
69 |
+ if depBasePkg in whoNeeds: |
|
70 |
+ continue |
|
71 |
+ if pkg in self.getBasePackagesRequired(depBasePkg): |
|
72 |
+ whoNeeds.append(depBasePkg) |
|
73 |
+ if depBasePkg not in depList: |
|
74 |
+ depList.append(depBasePkg) |
|
75 |
+ |
|
76 |
+ def printTree(self, children, curParent, depth): |
|
77 |
+ if curParent in children: |
|
78 |
+ for child in children[curParent]: |
|
79 |
+ self.logger.info("\t" * depth + child) |
|
80 |
+ self.printTree(children, child, depth + 1) |
|
81 |
+ |
|
82 |
+ def getAllPackageNames(self, jsonFilePath): |
|
83 |
+ with open(jsonFilePath) as jsonData: |
|
84 |
+ option_list_json = json.load(jsonData) |
|
85 |
+ packages = option_list_json["packages"] |
|
86 |
+ return packages |
|
87 |
+ |
|
88 |
+ def updateLevels(self, mapDependencies, inPkg, parent, level): |
|
89 |
+ listPackages = SPECS.getData().getPackagesForPkg(inPkg) |
|
90 |
+ for depPkg in SPECS.getData().getRequiresForPkg(inPkg): |
|
91 |
+ if depPkg in listPackages: |
|
92 |
+ continue |
|
93 |
+ if depPkg in mapDependencies and mapDependencies[depPkg] < level + 1: |
|
94 |
+ mapDependencies[depPkg] = level + 1 |
|
95 |
+ parent[depPkg] = inPkg |
|
96 |
+ self.updateLevels(mapDependencies, depPkg, parent, mapDependencies[depPkg]) |
|
97 |
+ |
|
98 |
+ def calculateSpecDependency(self, inputPackages, mapDependencies, parent): |
|
99 |
+ depQue = Queue.Queue() |
|
100 |
+ for package in inputPackages: |
|
101 |
+ if SPECS.getData().isRPMPackage(package): |
|
102 |
+ version = SPECS.getData().getHighestVersion(package) |
|
103 |
+ pkg = package+"-"+version |
|
104 |
+ if pkg not in mapDependencies: |
|
105 |
+ mapDependencies[pkg] = 0 |
|
106 |
+ parent[pkg] = "" |
|
107 |
+ depQue.put(pkg) |
|
108 |
+ self.findTotalRequires(mapDependencies, depQue, parent) |
|
109 |
+ else: |
|
110 |
+ self.logger.info("Could not find spec for " + package) |
|
111 |
+ |
|
112 |
+ def displayDependencies(self, displayOption, inputType, inputValue, allDeps, parent): |
|
113 |
+ children = {} |
|
114 |
+ sortedList = [] |
|
115 |
+ for elem in sorted(allDeps.items(), key=operator.itemgetter(1), reverse=True): |
|
116 |
+ sortedList.append(elem[0]) |
|
117 |
+ # construct all children nodes |
|
118 |
+ if displayOption == "tree": |
|
119 |
+ for k, v in parent.iteritems(): |
|
120 |
+ children.setdefault(v, []).append(k) |
|
121 |
+ if inputType == "json": |
|
122 |
+ self.logger.info("Dependency Mappings for {}".format(inputValue) + " :") |
|
123 |
+ self.logger.info("-" * 52 + " {}".format(children)) |
|
124 |
+ self.logger.info("-" * 52) |
|
125 |
+ if "" in children: |
|
126 |
+ for child in children[""]: |
|
127 |
+ self.logger.info(child) |
|
128 |
+ self.printTree(children, child, 1) |
|
129 |
+ self.logger.info("*" * 18 + " {} ".format(len(sortedList)) + |
|
130 |
+ "packages in total " + "*" * 18) |
|
131 |
+ else: |
|
132 |
+ if inputType == "pkg" and len(children) > 0: |
|
133 |
+ self.logger.info("cyclic dependency detected, mappings: \n", children) |
|
134 |
+ |
|
135 |
+ # To display a flat list of all packages |
|
136 |
+ elif displayOption == "list": |
|
137 |
+ self.logger.info(sortedList) |
|
138 |
+ |
|
139 |
+ # To generate a new JSON file based on given input json file |
|
140 |
+ elif displayOption == "json" and inputType == "json": |
|
141 |
+ d = {'packages': sortedList} |
|
142 |
+ with open(inputValue, 'w') as outfile: |
|
143 |
+ json.dump(d, outfile) |
|
144 |
+ |
|
145 |
+ return sortedList |
|
146 |
+ |
|
147 |
+ def process(self, inputType, inputValue, displayOption, outputFile=None): |
|
148 |
+ whoNeedsList = [] |
|
149 |
+ inputPackages = [] |
|
150 |
+ whatNeedsBuild = [] |
|
151 |
+ mapDependencies = {} |
|
152 |
+ parent = {} |
|
153 |
+ if inputType == "pkg" or inputType == "json": |
|
154 |
+ if inputType == "pkg": |
|
155 |
+ inputPackages.append(inputValue) |
|
156 |
+ else: |
|
157 |
+ inputPackages = self.getAllPackageNames(inputValue) |
|
158 |
+ self.calculateSpecDependency(inputPackages, mapDependencies, parent) |
|
159 |
+ if outputFile is not None: |
|
160 |
+ return self.displayDependencies(displayOption, inputType, outputFile, mapDependencies, parent) |
|
161 |
+ else: |
|
162 |
+ return self.displayDependencies(displayOption, inputType, inputValue, mapDependencies, parent) |
|
163 |
+ elif inputType == "who-needs-build": |
|
164 |
+ depList = [] |
|
165 |
+ for specFile in inputValue.split(":"): |
|
166 |
+ if specFile in SPECS.getData().mapSpecFileNameToSpecObj: |
|
167 |
+ specObj = SPECS.getData().mapSpecFileNameToSpecObj[specFile] |
|
168 |
+ whoNeedsList.append(specObj.name+"-"+specObj.version) |
|
169 |
+ depList.append(specObj.name+"-"+specObj.version) |
|
170 |
+ self.findTotalWhoNeeds(depList, whoNeedsList) |
|
171 |
+ return whoNeedsList |
|
172 |
+ |
|
173 |
+ elif inputType == "who-needs": |
|
174 |
+ for depPackage in SPECS.getData().mapPackageToSpec: |
|
175 |
+ pkg=inputValue+"-"+SPECS.getData().getHighestVersion(inputValue) |
|
176 |
+ for version in SPECS.getData().getVersions(depPackage): |
|
177 |
+ depPkg = depPackage+"-"+version |
|
178 |
+ self.logger.info(depPkg) |
|
179 |
+ if pkg in SPECS.getData().getRequiresForPkg(depPkg): |
|
180 |
+ whoNeedsList.append(depPkg) |
|
181 |
+ self.logger.info(whoNeedsList) |
|
182 |
+ return whoNeedsList |
|
183 |
+ |
|
18 | 184 |
|
19 | 185 |
def main(): |
20 |
- usage = os.path.basename(__file__) + "--input-type=[json/pkg/who-needs/who-needs-build] --pkg=[pkg_name] --file=<JSON_FILE_NAME> --disp=[tree/list/json]" |
|
21 |
- parser = OptionParser(usage) |
|
22 |
- parser.add_option("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE) |
|
23 |
- parser.add_option("-p", "--pkg", dest="pkg") |
|
24 |
- parser.add_option("-f", "--file", dest="json_file", default="packages_minimal.json") |
|
25 |
- parser.add_option("-d", "--disp", dest="display_option", default=DEFAULT_DISPLAY_OPTION) |
|
26 |
- parser.add_option("-s", "--spec-dir", dest="spec_dir", default=SPEC_FILE_DIR) |
|
27 |
- parser.add_option("-t", "--stage-dir", dest="stage_dir", default="../../stage") |
|
28 |
- parser.add_option("-a", "--input-data-dir", dest="input_data_dir", default="../../common/data/") |
|
29 |
- (options, args) = parser.parse_args() |
|
30 |
- |
|
31 |
- if(False == options.input_data_dir.endswith('/')): |
|
186 |
+ usage = "Usage: %prog [options]" |
|
187 |
+ parser = ArgumentParser(usage) |
|
188 |
+ parser.add_argument("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE) |
|
189 |
+ parser.add_argument("-p", "--pkg", dest="pkg") |
|
190 |
+ parser.add_argument("-f", "--file", dest="json_file", default="packages_minimal.json") |
|
191 |
+ parser.add_argument("-d", "--display-option", dest="display_option", default=DEFAULT_DISPLAY_OPTION) |
|
192 |
+ parser.add_argument("-s", "--spec-path", dest="spec_path", default=SPEC_FILE_DIR) |
|
193 |
+ parser.add_argument("-l", "--log-path", dest="log_path", default=LOG_FILE_DIR) |
|
194 |
+ parser.add_argument("-y", "--log-level", dest="log_level", default="info") |
|
195 |
+ parser.add_argument("-t", "--stage-dir", dest="stage_dir", default="../../stage") |
|
196 |
+ parser.add_argument("-a", "--input-data-dir", dest="input_data_dir", default="../../common/data/") |
|
197 |
+ parser.add_argument("-o", "--output-dir", dest="output_dir", default="../../stage/common/data") |
|
198 |
+ options = parser.parse_args() |
|
199 |
+ |
|
200 |
+ constants.setSpecPath(options.spec_path) |
|
201 |
+ constants.setLogPath(options.log_path) |
|
202 |
+ constants.setLogLevel(options.log_level) |
|
203 |
+ |
|
204 |
+ cmdUtils = CommandUtils() |
|
205 |
+ logger = Logger.getLogger("SpecDeps", options.log_path, options.log_level) |
|
206 |
+ |
|
207 |
+ if not os.path.isdir(options.output_dir): |
|
208 |
+ cmdUtils.runCommandInShell("mkdir -p "+options.output_dir) |
|
209 |
+ |
|
210 |
+ if not options.input_data_dir.endswith('/'): |
|
32 | 211 |
options.input_data_dir += '/' |
33 | 212 |
|
34 |
- specDeps = SerializedSpecObjects(options.input_data_dir, options.stage_dir) |
|
35 |
- displayOption = options.display_option |
|
36 |
- abs_path = os.path.abspath(__file__) |
|
37 |
- dir_name = os.path.dirname(abs_path) |
|
38 |
- os.chdir(dir_name) |
|
39 |
- |
|
40 |
- # To display/print package dependencies on console |
|
41 |
- if(options.input_type == "pkg" or options.input_type == "who-needs" or options.input_type == "who-needs-build"): |
|
42 |
- targetName = options.pkg |
|
43 |
- specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, targetName, displayOption) |
|
44 |
- elif(options.input_type == "json"):# Generate the expanded package dependencies json file based on package_list_file |
|
45 |
- json_wrapper_option_list = JsonWrapper(options.json_file) |
|
46 |
- option_list_json = json_wrapper_option_list.read() |
|
47 |
- options_sorted = option_list_json.items() |
|
48 |
- for install_option in options_sorted: |
|
49 |
- if displayOption == "tree" and install_option[1]["title"] == "ISO Packages": |
|
50 |
- continue |
|
51 |
- specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, install_option[1]["file"], displayOption) |
|
213 |
+ |
|
214 |
+ try: |
|
215 |
+ specDeps = SpecDependencyGenerator(options.log_path, options.log_level) |
|
216 |
+ |
|
217 |
+ if (options.input_type == "pkg" or options.input_type == "who-needs" or options.input_type == "who-needs-build"): |
|
218 |
+ specDeps.process(options.input_type, options.pkg, options.display_option) |
|
219 |
+ |
|
220 |
+ elif options.input_type == "json": |
|
221 |
+ list_json_files = options.json_file.split("\n") |
|
222 |
+ # Generate the expanded package dependencies json file based on package_list_file |
|
223 |
+ logger.info("Generating the install time dependency list for all json files") |
|
224 |
+ for build_json_file in list_json_files: |
|
225 |
+ output_file = None |
|
226 |
+ if options.display_option == "json": |
|
227 |
+ json_wrapper_option_list = JsonWrapper(build_json_file) |
|
228 |
+ option_list_json = json_wrapper_option_list.read() |
|
229 |
+ options_sorted = option_list_json.items() |
|
230 |
+ for install_option in options_sorted: |
|
231 |
+ json_file = install_option[1]["file"] |
|
232 |
+ output_file = os.path.join(options.output_dir, os.path.basename(json_file)) |
|
233 |
+ specDeps.process(options.input_type, options.input_data_dir+json_file, options.display_option, output_file) |
|
234 |
+ except Exception as e: |
|
235 |
+ traceback.print_exc() |
|
236 |
+ sys.stderr.write(str(e)) |
|
237 |
+ sys.stderr.write("Failed to generate dependency lists from spec files\n") |
|
238 |
+ sys.exit(1) |
|
52 | 239 |
|
53 | 240 |
sys.exit(0) |
54 | 241 |
|
242 |
+ |
|
55 | 243 |
if __name__=="__main__": |
56 | 244 |
main() |
... | ... |
@@ -144,8 +144,7 @@ class Specutils(object): |
144 | 144 |
|
145 | 145 |
def getRequiresAllPackages(self): |
146 | 146 |
dependentPackages=[] |
147 |
- for key in self.spec.packages.keys(): |
|
148 |
- pkg = self.spec.packages.get(key) |
|
147 |
+ for pkg in self.spec.packages.values(): |
|
149 | 148 |
for dpkg in pkg.requires: |
150 | 149 |
dependentPackages.append(dpkg) |
151 | 150 |
listDependentPackages = list(set(dependentPackages)) |
... | ... |
@@ -159,8 +158,7 @@ class Specutils(object): |
159 | 159 |
|
160 | 160 |
def getBuildRequiresAllPackages(self): |
161 | 161 |
dependentPackages=[] |
162 |
- for key in self.spec.packages.keys(): |
|
163 |
- pkg = self.spec.packages.get(key) |
|
162 |
+ for pkg in self.spec.packages.values(): |
|
164 | 163 |
for dpkg in pkg.buildrequires: |
165 | 164 |
dependentPackages.append(dpkg) |
166 | 165 |
listDependentPackages = list(set(dependentPackages)) |
... | ... |
@@ -174,8 +172,7 @@ class Specutils(object): |
174 | 174 |
|
175 | 175 |
def getCheckBuildRequiresAllPackages(self): |
176 | 176 |
dependentPackages=[] |
177 |
- for key in self.spec.packages.keys(): |
|
178 |
- pkg = self.spec.packages.get(key) |
|
177 |
+ for pkg in self.spec.packages.values(): |
|
179 | 178 |
for dpkg in pkg.checkbuildrequires: |
180 | 179 |
dependentPackages.append(dpkg) |
181 | 180 |
dependentPackages = list(set(dependentPackages)) |
... | ... |
@@ -183,20 +180,18 @@ class Specutils(object): |
183 | 183 |
|
184 | 184 |
def getRequires(self,pkgName): |
185 | 185 |
dependentPackages=[] |
186 |
- for key in self.spec.packages.keys(): |
|
187 |
- pkg = self.spec.packages.get(key) |
|
186 |
+ for pkg in self.spec.packages.values(): |
|
188 | 187 |
if pkg.name == pkgName: |
189 | 188 |
for dpkg in pkg.requires: |
190 |
- dependentPackages.append(dpkg.package) |
|
189 |
+ dependentPackages.append(dpkg) |
|
191 | 190 |
return dependentPackages |
192 | 191 |
|
193 | 192 |
def getBuildRequires(self,pkgName): |
194 | 193 |
dependentPackages=[] |
195 |
- for key in self.spec.packages.keys(): |
|
196 |
- pkg = self.spec.packages.get(key) |
|
194 |
+ for pkg in self.spec.packages.values(): |
|
197 | 195 |
if pkg.name == pkgName: |
198 | 196 |
for dpkg in pkg.buildrequires: |
199 |
- dependentPackages.append(dpkg.package) |
|
197 |
+ dependentPackages.append(dpkg) |
|
200 | 198 |
return dependentPackages |
201 | 199 |
|
202 | 200 |
def getProvides(self,packageName): |
... | ... |
@@ -37,3 +37,12 @@ class StringUtils(object): |
37 | 37 |
return inputstring |
38 | 38 |
name = m.group(2) |
39 | 39 |
return name.replace("_", ".") |
40 |
+ |
|
41 |
+ @staticmethod |
|
42 |
+ def splitPackageNameAndVersion(pkg): |
|
43 |
+ versionindex = pkg.rfind("-") |
|
44 |
+ if versionindex == -1: |
|
45 |
+ raise Exception("Invalid argument") |
|
46 |
+ packageName = pkg[:versionindex] |
|
47 |
+ packageVersion = pkg[versionindex+1:] |
|
48 |
+ return packageName, packageVersion |
... | ... |
@@ -12,6 +12,7 @@ import json |
12 | 12 |
import collections |
13 | 13 |
from SpecData import SPECS |
14 | 14 |
import re |
15 |
+from StringUtils import StringUtils |
|
15 | 16 |
|
16 | 17 |
class ToolChainUtils(object): |
17 | 18 |
|
... | ... |
@@ -90,7 +91,8 @@ class ToolChainUtils(object): |
90 | 90 |
try: |
91 | 91 |
pkgUtils=PackageUtils(self.logName,self.logPath) |
92 | 92 |
for package in constants.listCoreToolChainPackages: |
93 |
- rpmPkg=pkgUtils.findRPMFileForGivenPackage(package) |
|
93 |
+ version = SPECS.getData().getHighestVersion(package) |
|
94 |
+ rpmPkg=pkgUtils.findRPMFileForGivenPackage(package, version) |
|
94 | 95 |
if rpmPkg is not None: |
95 | 96 |
continue |
96 | 97 |
self.logger.info("Building core toolchain package: " + package) |
... | ... |
@@ -104,9 +106,9 @@ class ToolChainUtils(object): |
104 | 104 |
if not returnVal: |
105 | 105 |
self.logger.error("Creating chroot failed") |
106 | 106 |
raise Exception("creating chroot failed") |
107 |
- self.installToolChainRPMS(chrootID, package, listBuildOptionPackages, pkgBuildOptionFile, destLogPath) |
|
108 |
- pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath) |
|
109 |
- pkgUtils.buildRPMSForGivenPackage(package, chrootID, listBuildOptionPackages, pkgBuildOptionFile, destLogPath) |
|
107 |
+ self.installToolChainRPMS(chrootID, package, version, listBuildOptionPackages, pkgBuildOptionFile, destLogPath) |
|
108 |
+ pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath, version) |
|
109 |
+ pkgUtils.buildRPMSForGivenPackage(package,version, chrootID, listBuildOptionPackages, pkgBuildOptionFile, destLogPath) |
|
110 | 110 |
pkgCount += 1 |
111 | 111 |
chrUtils.destroyChroot(chrootID) |
112 | 112 |
chrootID=None |
... | ... |
@@ -120,13 +122,28 @@ class ToolChainUtils(object): |
120 | 120 |
raise e |
121 | 121 |
return pkgCount |
122 | 122 |
|
123 |
- def getListDependentPackageLineContent(self, index): |
|
124 |
- listBuildRequiresPkgLineContent=SPECS.getData().getBuildRequiresForPackage(self.package, index) |
|
125 |
- listBuildRequiresPkgLineContent.extend(SPECS.getData().getCheckBuildRequiresForPackage(self.package, index)) |
|
126 |
- listBuildRequiresPkgLineContent=list(set(listBuildRequiresPkgLineContent)) |
|
127 |
- return listBuildRequiresPkgLineContent |
|
123 |
+ def getOverridenPackageVersion(self, packageName, package, listBuildOptionPackages, pkgBuildOptionFile): |
|
124 |
+ version = "*" |
|
125 |
+ if packageName in listBuildOptionPackages: |
|
126 |
+ jsonData = open(pkgBuildOptionFile) |
|
127 |
+ pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict) |
|
128 |
+ jsonData.close() |
|
129 |
+ pkgs_sorted = pkg_build_option_json.items() |
|
130 |
+ for pkg in pkgs_sorted: |
|
131 |
+ p = str(pkg[0].encode('utf-8')) |
|
132 |
+ if p == packageName: |
|
133 |
+ overridelist = pkg[1]["override_toolchain"] |
|
134 |
+ for override in overridelist: |
|
135 |
+ if package == str(override["package"].encode('utf-8')): |
|
136 |
+ version = str(override["version"].encode('utf-8')) |
|
137 |
+ return version |
|
128 | 138 |
|
129 |
- def installToolChainRPMS(self,chrootID, packageName, listBuildOptionPackages, pkgBuildOptionFile, logPath=None, index=0): |
|
139 |
+ def getListDependentPackage(self, package, version): |
|
140 |
+ listBuildRequiresPkg=SPECS.getData().getBuildRequiresForPackage(package, version) |
|
141 |
+ listBuildRequiresPkg.extend(SPECS.getData().getCheckBuildRequiresForPackage(package, version)) |
|
142 |
+ return listBuildRequiresPkg |
|
143 |
+ |
|
144 |
+ def installToolChainRPMS(self,chrootID, packageName,packageVersion, listBuildOptionPackages, pkgBuildOptionFile, logPath=None): |
|
130 | 145 |
if logPath is None: |
131 | 146 |
logPath=self.logPath |
132 | 147 |
cmdUtils = CommandUtils() |
... | ... |
@@ -135,7 +152,7 @@ class ToolChainUtils(object): |
135 | 135 |
rpmFiles = "" |
136 | 136 |
packages = "" |
137 | 137 |
self.package=packageName |
138 |
- listBuildRequiresPackageLineContent = self.getListDependentPackageLineContent(index) |
|
138 |
+ listBuildRequiresPackage = self.getListDependentPackage(packageName,packageVersion) |
|
139 | 139 |
|
140 | 140 |
for package in constants.listToolChainRPMsToInstall: |
141 | 141 |
pkgUtils=PackageUtils(self.logName,self.logPath) |
... | ... |
@@ -156,9 +173,10 @@ class ToolChainUtils(object): |
156 | 156 |
if package == str(override["package"].encode('utf-8')): |
157 | 157 |
version = str(override["version"].encode('utf-8')) |
158 | 158 |
if version == "*": |
159 |
- for depPkg in listBuildRequiresPackageLineContent: |
|
160 |
- if depPkg.package == package: |
|
161 |
- version=pkgUtils.getProperVersion(package,depPkg) |
|
159 |
+ for depPkg in listBuildRequiresPackage: |
|
160 |
+ depPkgName, depPkgVersion = StringUtils.splitPackageNameAndVersion(depPkg) |
|
161 |
+ if depPkgName == package: |
|
162 |
+ version=depPkgVersion |
|
162 | 163 |
if constants.rpmCheck: |
163 | 164 |
rpmFile=pkgUtils.findRPMFileForGivenPackage(package, version) |
164 | 165 |
else: |
... | ... |
@@ -156,6 +156,7 @@ def main(): |
156 | 156 |
buildAPackage(package, listBuildOptionPackages, options.pkgBuildOptionFile, options.buildThreads, options.pkgBuildType) |
157 | 157 |
else: |
158 | 158 |
buildPackagesForAllSpecs(listBuildOptionPackages, options.pkgBuildOptionFile, logger, options.buildThreads, pkgInfoJsonFile, options.pkgBuildType) |
159 |
+ |
|
159 | 160 |
except Exception as e: |
160 | 161 |
logger.error("Caught an exception") |
161 | 162 |
logger.error(str(e)) |
... | ... |
@@ -171,19 +172,19 @@ def buildPackagesList(csvFilename): |
171 | 171 |
listPackages.sort() |
172 | 172 |
for package in listPackages: |
173 | 173 |
name = package |
174 |
- version = SPECS.getData().getVersion(package) |
|
175 |
- license = SPECS.getData().getLicense(package) |
|
176 |
- listPatches = SPECS.getData().getPatches(package) |
|
177 |
- url = SPECS.getData().getURL(package) |
|
178 |
- listSourceNames = SPECS.getData().getSources(package) |
|
179 |
- sources = "" |
|
180 |
- patches = "" |
|
181 |
- if listPatches is not None: |
|
182 |
- patches = " ".join(listPatches) |
|
183 |
- if listSourceNames is not None: |
|
184 |
- sources = " ".join(listSourceNames) |
|
185 |
- csvFile.write(name+","+version+","+license+","+url+","+sources+","+patches+"\n") |
|
186 |
- csvFile.close() |
|
174 |
+ for version in SPECS.getData().getVersions(package): |
|
175 |
+ license = SPECS.getData().getLicense(package, version) |
|
176 |
+ listPatches = SPECS.getData().getPatches(package, version) |
|
177 |
+ url = SPECS.getData().getURL(package, version) |
|
178 |
+ listSourceNames = SPECS.getData().getSources(package,version) |
|
179 |
+ sources = "" |
|
180 |
+ patches = "" |
|
181 |
+ if listPatches is not None: |
|
182 |
+ patches = " ".join(listPatches) |
|
183 |
+ if listSourceNames is not None: |
|
184 |
+ sources = " ".join(listSourceNames) |
|
185 |
+ csvFile.write(name+","+version+","+license+","+url+","+sources+","+patches+"\n") |
|
186 |
+ csvFile.close() |
|
187 | 187 |
|
188 | 188 |
def readBlackListPackages(pkgBlackListFile): |
189 | 189 |
blackListPkgs = [] |
... | ... |
@@ -208,38 +209,38 @@ def buildSourcesList(yamlDir, blackListPkgs, logger, singleFile=True): |
208 | 208 |
if package in blackListPkgs: |
209 | 209 |
continue |
210 | 210 |
ossname = package |
211 |
- ossversion = SPECS.getData().getVersion(package) |
|
212 |
- modified = False |
|
213 |
- listPatches = SPECS.getData().getPatches(package) |
|
214 |
- if listPatches is not None and len(listPatches) > 0 : |
|
215 |
- modified = True |
|
216 |
- url = SPECS.getData().getSourceURL(package) |
|
217 |
- if url is None: |
|
218 |
- url = SPECS.getData().getURL(package) |
|
219 |
- |
|
220 |
- sourceName = None |
|
221 |
- listSourceNames = SPECS.getData().getSources(package) |
|
222 |
- if len(listSourceNames) >0: |
|
223 |
- sourceName=listSourceNames[0] |
|
224 |
- sha1 = SPECS.getData().getSHA1(package, sourceName) |
|
225 |
- if sha1 is not None: |
|
226 |
- PullSources.get(package, sourceName, sha1, yamlSourceDir, constants.pullsourcesConfig, logger) |
|
227 |
- |
|
228 |
- if not singleFile: |
|
229 |
- yamlFile = open(yamlSourceDir+"/"+ossname+"-"+ossversion+".yaml", "w") |
|
230 |
- yamlFile.write("vmwsource:"+ossname+":"+ossversion+":\n") |
|
231 |
- yamlFile.write(" repository: VMWsource\n") |
|
232 |
- yamlFile.write(" name: '"+ossname+"'\n") |
|
233 |
- yamlFile.write(" version: '"+ossversion+"'\n") |
|
234 |
- yamlFile.write(" url: "+str(url)+"\n") |
|
235 |
- yamlFile.write(" license: UNKNOWN\n") |
|
236 |
- if sourceName is not None: |
|
237 |
- yamlFile.write(" vmwsource-distribution: "+str(sourceName)+"\n") |
|
238 |
- if modified: |
|
239 |
- yamlFile.write(" modified: true\n") |
|
240 |
- yamlFile.write("\n") |
|
241 |
- if not singleFile: |
|
242 |
- yamlFile.close() |
|
211 |
+ for version in SPECS.getData().getVersions(package): |
|
212 |
+ modified = False |
|
213 |
+ listPatches = SPECS.getData().getPatches(package, version) |
|
214 |
+ if listPatches is not None and len(listPatches) > 0 : |
|
215 |
+ modified = True |
|
216 |
+ url = SPECS.getData().getSourceURL(package, version) |
|
217 |
+ if url is None: |
|
218 |
+ url = SPECS.getData().getURL(package, version) |
|
219 |
+ |
|
220 |
+ sourceName = None |
|
221 |
+ listSourceNames = SPECS.getData().getSources(package, version) |
|
222 |
+ if len(listSourceNames) >0: |
|
223 |
+ sourceName=listSourceNames[0] |
|
224 |
+ sha1 = SPECS.getData().getSHA1(package, sourceName, version) |
|
225 |
+ if sha1 is not None: |
|
226 |
+ PullSources.get(package, sourceName, sha1, yamlSourceDir, constants.pullsourcesConfig, logger) |
|
227 |
+ |
|
228 |
+ if not singleFile: |
|
229 |
+ yamlFile = open(yamlSourceDir+"/"+ossname+"-"+version+".yaml", "w") |
|
230 |
+ yamlFile.write("vmwsource:"+ossname+":"+version+":\n") |
|
231 |
+ yamlFile.write(" repository: VMWsource\n") |
|
232 |
+ yamlFile.write(" name: '"+ossname+"'\n") |
|
233 |
+ yamlFile.write(" version: '"+version+"'\n") |
|
234 |
+ yamlFile.write(" url: "+str(url)+"\n") |
|
235 |
+ yamlFile.write(" license: UNKNOWN\n") |
|
236 |
+ if sourceName is not None: |
|
237 |
+ yamlFile.write(" vmwsource-distribution: "+str(sourceName)+"\n") |
|
238 |
+ if modified: |
|
239 |
+ yamlFile.write(" modified: true\n") |
|
240 |
+ yamlFile.write("\n") |
|
241 |
+ if not singleFile: |
|
242 |
+ yamlFile.close() |
|
243 | 243 |
|
244 | 244 |
if singleFile: |
245 | 245 |
yamlFile.close() |
... | ... |
@@ -258,39 +259,39 @@ def buildSRPMList(srpmPath, yamlDir, blackListPkgs, logger, singleFile=True): |
258 | 258 |
if package in blackListPkgs: |
259 | 259 |
continue |
260 | 260 |
ossname = package |
261 |
- ossversion = SPECS.getData().getVersion(package) |
|
262 |
- ossrelease = SPECS.getData().getRelease(package) |
|
263 |
- |
|
264 |
- listFoundSRPMFiles = cmdUtils.findFile(ossname+"-"+ossversion+"-"+ossrelease+".src.rpm",srpmPath) |
|
265 |
- srpmName = None |
|
266 |
- if len(listFoundSRPMFiles) == 1: |
|
267 |
- srpmFullPath = listFoundSRPMFiles[0]; |
|
268 |
- srpmName = os.path.basename(srpmFullPath) |
|
269 |
- cpcmd = "cp "+ srpmFullPath +" "+yamlSrpmDir+"/" |
|
270 |
- returnVal = cmdUtils.runCommandInShell(cpcmd) |
|
271 |
- if not returnVal: |
|
272 |
- logger.error("Copy SRPM File is failed for package:"+ossname) |
|
273 |
- else: |
|
274 |
- logger.error("SRPM file is not found:" +ossname) |
|
275 |
- |
|
276 |
- if not singleFile: |
|
277 |
- yamlFile = open(yamlSrpmDir+"/"+ossname+"-"+ossversion+"-"+ossrelease+".yaml", "w") |
|
278 |
- |
|
279 |
- yamlFile.write("baseos:"+ossname+":"+ossversion+"-"+ossrelease+":\n") |
|
280 |
- yamlFile.write(" repository: BaseOS\n") |
|
281 |
- yamlFile.write(" name: '"+ossname+"'\n") |
|
282 |
- yamlFile.write(" version: '"+ossversion+"-"+ossrelease+"'\n") |
|
283 |
- yamlFile.write(" url: 'http://www.vmware.com'\n") |
|
284 |
- yamlFile.write(" baseos-style: rpm\n") |
|
285 |
- yamlFile.write(" baseos-source: '"+str(srpmName)+"'\n") |
|
286 |
- yamlFile.write(" baseos-osname: 'photon'\n") |
|
287 |
- yamlFile.write("\n") |
|
288 |
- if not singleFile: |
|
289 |
- yamlFile.close() |
|
290 |
- |
|
291 |
- if singleFile: |
|
292 |
- yamlFile.close() |
|
293 |
- logger.info("Generated srpm yaml files for all packages") |
|
261 |
+ for ossversion in SPECS.getData().getVersions(package): |
|
262 |
+ ossrelease = SPECS.getData().getRelease(package, ossversion) |
|
263 |
+ |
|
264 |
+ listFoundSRPMFiles = cmdUtils.findFile(ossname+"-"+ossversion+"-"+ossrelease+".src.rpm",srpmPath) |
|
265 |
+ srpmName = None |
|
266 |
+ if len(listFoundSRPMFiles) == 1: |
|
267 |
+ srpmFullPath = listFoundSRPMFiles[0]; |
|
268 |
+ srpmName = os.path.basename(srpmFullPath) |
|
269 |
+ cpcmd = "cp "+ srpmFullPath +" "+yamlSrpmDir+"/" |
|
270 |
+ returnVal = cmdUtils.runCommandInShell(cpcmd) |
|
271 |
+ if not returnVal: |
|
272 |
+ logger.error("Copy SRPM File is failed for package:"+ossname) |
|
273 |
+ else: |
|
274 |
+ logger.error("SRPM file is not found:" +ossname) |
|
275 |
+ |
|
276 |
+ if not singleFile: |
|
277 |
+ yamlFile = open(yamlSrpmDir+"/"+ossname+"-"+ossversion+"-"+ossrelease+".yaml", "w") |
|
278 |
+ |
|
279 |
+ yamlFile.write("baseos:"+ossname+":"+ossversion+"-"+ossrelease+":\n") |
|
280 |
+ yamlFile.write(" repository: BaseOS\n") |
|
281 |
+ yamlFile.write(" name: '"+ossname+"'\n") |
|
282 |
+ yamlFile.write(" version: '"+ossversion+"-"+ossrelease+"'\n") |
|
283 |
+ yamlFile.write(" url: 'http://www.vmware.com'\n") |
|
284 |
+ yamlFile.write(" baseos-style: rpm\n") |
|
285 |
+ yamlFile.write(" baseos-source: '"+str(srpmName)+"'\n") |
|
286 |
+ yamlFile.write(" baseos-osname: 'photon'\n") |
|
287 |
+ yamlFile.write("\n") |
|
288 |
+ if not singleFile: |
|
289 |
+ yamlFile.close() |
|
290 |
+ |
|
291 |
+ if singleFile: |
|
292 |
+ yamlFile.close() |
|
293 |
+ logger.info("Generated srpm yaml files for all packages") |
|
294 | 294 |
|
295 | 295 |
def buildAPackage(package, listBuildOptionPackages, pkgBuildOptionFile, buildThreads, pkgBuildType): |
296 | 296 |
listPackages=[] |
... | ... |
@@ -467,3 +467,15 @@ class constants(object): |
467 | 467 |
@staticmethod |
468 | 468 |
def addMacro(macroName, macroValue): |
469 | 469 |
constants.userDefinedMacros[macroName]=macroValue |
470 |
+ |
|
471 |
+ @staticmethod |
|
472 |
+ def setLogLevel(logLevel): |
|
473 |
+ constants.logLevel = logLevel |
|
474 |
+ |
|
475 |
+ @staticmethod |
|
476 |
+ def setLogPath(logPath): |
|
477 |
+ constants.logPath = logPath |
|
478 |
+ |
|
479 |
+ @staticmethod |
|
480 |
+ def setSpecPath(specPath): |
|
481 |
+ constants.specPath = specPath |