Browse code

Package builder: multiversioning reimplementation

Change-Id: I87250c1b97c52d9d1a1c6db0a3d9d01c818ce033
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5763
Reviewed-by: Sharath George
Tested-by: Sharath George

Alexey Makhalov authored on 2018/09/21 17:11:06
Showing 16 changed files
... ...
@@ -21,7 +21,7 @@ Requires:       jansson
21 21
 Requires:       likewise-open >= 6.2.9
22 22
 Requires:       netmgmt
23 23
 Requires:       systemd
24
-Requires:       tdnf >= 2.2.0
24
+Requires:       tdnf >= 2.0.0
25 25
 Requires:       lightwave-client-libs
26 26
 Requires:       %{name}-libs = %{version}-%{release}
27 27
 Requires:       shadow
... ...
@@ -44,5 +44,4 @@ class ChrootUtils(object):
44 44
         if not returnVal:
45 45
             self.logger.error("Unable to destroy chroot:" + chrootID + ".Unknown error.")
46 46
             return False
47
-        self.logger.info("Successfully destroyed chroot:" + chrootID)
48 47
         return True
... ...
@@ -101,19 +101,19 @@ def buildPackagesList(csvFilename):
101 101
         listPackages.sort()
102 102
         for package in listPackages:
103 103
             name = package
104
-            version = SPECS.getData().getVersion(package)
105
-            packagelicense = SPECS.getData().getLicense(package)
106
-            listPatches = SPECS.getData().getPatches(package)
107
-            url = SPECS.getData().getURL(package)
108
-            listSourceNames = SPECS.getData().getSources(package)
109
-            sources = ""
110
-            patches = ""
111
-            if listPatches is not None:
112
-                patches = " ".join(listPatches)
113
-            if listSourceNames is not None:
114
-                sources = " ".join(listSourceNames)
115
-            csvFile.write(name + "," + version + "," + packagelicense + "," + url + "," +
116
-                          sources + "," + patches + "\n")
104
+            for version in SPECS.getData().getVersions(package):
105
+                packagelicense = SPECS.getData().getLicense(package, version)
106
+                listPatches = SPECS.getData().getPatches(package, version)
107
+                url = SPECS.getData().getURL(package, version)
108
+                listSourceNames = SPECS.getData().getSources(package, version)
109
+                sources = ""
110
+                patches = ""
111
+                if listPatches is not None:
112
+                    patches = " ".join(listPatches)
113
+                if listSourceNames is not None:
114
+                    sources = " ".join(listSourceNames)
115
+                csvFile.write(name + "," + version + "," + packagelicense + "," + url + "," +
116
+                            sources + "," + patches + "\n")
117 117
 
118 118
 def readBlackListPackages(pkgBlackListFile):
119 119
     blackListPkgs = []
... ...
@@ -139,39 +139,39 @@ def buildSourcesList(yamlDir, blackListPkgs, logger, singleFile=True):
139 139
         if package in blackListPkgs:
140 140
             continue
141 141
         ossname = package
142
-        ossversion = SPECS.getData().getVersion(package)
143
-        modified = False
144
-        listPatches = SPECS.getData().getPatches(package)
145
-        if listPatches:
146
-            modified = True
147
-        url = SPECS.getData().getSourceURL(package)
148
-        if url is None:
149
-            url = SPECS.getData().getURL(package)
150
-
151
-        sourceName = None
152
-        listSourceNames = SPECS.getData().getSources(package)
153
-        if listSourceNames:
154
-            sourceName = listSourceNames[0]
155
-            sha1 = SPECS.getData().getSHA1(package, sourceName)
156
-            if sha1 is not None:
157
-                PullSources.get(package, sourceName, sha1, yamlSourceDir,
158
-                                constants.pullsourcesConfig, logger)
159
-
160
-        if not singleFile:
161
-            yamlFile = open(yamlSourceDir + "/" + ossname + "-" + ossversion + ".yaml", "w")
162
-        yamlFile.write("vmwsource:" + ossname + ":" + ossversion + ":\n")
163
-        yamlFile.write("  repository: VMWsource\n")
164
-        yamlFile.write("  name: '" + ossname + "'\n")
165
-        yamlFile.write("  version: '" + ossversion + "'\n")
166
-        yamlFile.write("  url: " + str(url) + "\n")
167
-        yamlFile.write("  license: UNKNOWN\n")
168
-        if sourceName is not None:
169
-            yamlFile.write("  vmwsource-distribution: " + str(sourceName) + "\n")
170
-        if modified:
171
-            yamlFile.write("  modified: true\n")
172
-        yamlFile.write("\n")
173
-        if not singleFile:
174
-            yamlFile.close()
142
+        for version in SPECS.getData().getVersions(package):
143
+            modified = False
144
+            listPatches = SPECS.getData().getPatches(package, version)
145
+            if listPatches:
146
+                modified = True
147
+            url = SPECS.getData().getSourceURL(package, version)
148
+            if url is None:
149
+                url = SPECS.getData().getURL(package, version)
150
+
151
+            sourceName = None
152
+            listSourceNames = SPECS.getData().getSources(package, version)
153
+            if listSourceNames:
154
+                sourceName = listSourceNames[0]
155
+                sha1 = SPECS.getData().getSHA1(package, version, sourceName)
156
+                if sha1 is not None:
157
+                    PullSources.get(package, sourceName, sha1, yamlSourceDir,
158
+                                    constants.pullsourcesConfig, logger)
159
+
160
+            if not singleFile:
161
+                yamlFile = open(yamlSourceDir + "/" + ossname + "-" + version + ".yaml", "w")
162
+            yamlFile.write("vmwsource:" + ossname + ":" + version + ":\n")
163
+            yamlFile.write("  repository: VMWsource\n")
164
+            yamlFile.write("  name: '" + ossname + "'\n")
165
+            yamlFile.write("  version: '" + ossversion + "'\n")
166
+            yamlFile.write("  url: " + str(url) + "\n")
167
+            yamlFile.write("  license: UNKNOWN\n")
168
+            if sourceName is not None:
169
+                yamlFile.write("  vmwsource-distribution: " + str(sourceName) + "\n")
170
+            if modified:
171
+                yamlFile.write("  modified: true\n")
172
+            yamlFile.write("\n")
173
+            if not singleFile:
174
+                yamlFile.close()
175 175
 
176 176
     if singleFile:
177 177
         yamlFile.close()
... ...
@@ -192,7 +192,7 @@ def buildSRPMList(srpmPath, yamlDir, blackListPkgs, logger, singleFile=True):
192 192
             continue
193 193
         ossname = package
194 194
         ossversion = SPECS.getData().getVersion(package)
195
-        ossrelease = SPECS.getData().getRelease(package)
195
+        ossrelease = SPECS.getData().getRelease(package, ossversion)
196 196
 
197 197
         listFoundSRPMFiles = cmdUtils.findFile(ossname + "-" + ossversion + "-" + ossrelease
198 198
                                                + ".src.rpm",
... ...
@@ -4,6 +4,7 @@ from collections import OrderedDict
4 4
 from Logger import Logger
5 5
 from constants import constants
6 6
 from SpecData import SPECS
7
+from StringUtils import StringUtils
7 8
 
8 9
 def removeDuplicateEntries(myList):
9 10
     myListCopy = list(OrderedDict.fromkeys(myList))
... ...
@@ -27,10 +28,9 @@ class PackageBuildDataGenerator(object):
27 27
         self.__sortedBuildDependencyGraph = {}
28 28
 
29 29
     def getPackageBuildData(self, listPackages):
30
-        basePackages = set()
30
+        basePackages = []
31 31
         for pkg in listPackages:
32
-            basePackage = SPECS.getData().getSpecName(pkg)
33
-            basePackages.add(basePackage)
32
+            basePackages.append(SPECS.getData().getBasePkg(pkg))
34 33
 
35 34
         self._readDependencyGraphAndCyclesForGivenPackages(basePackages)
36 35
         self._getSortedBuildOrderList()
... ...
@@ -46,7 +46,7 @@ class PackageBuildDataGenerator(object):
46 46
         sortListForPkg = []
47 47
 
48 48
         for p in runTimeDepPkgList:
49
-            basePkg = SPECS.getData().getSpecName(p)
49
+            basePkg = SPECS.getData().getBasePkg(p)
50 50
             for bPkg in self.__sortedBuildDependencyGraph[basePkg]:
51 51
                 if bPkg not in sortListForPkg:
52 52
                     sortListForPkg.append(bPkg)
... ...
@@ -118,7 +118,7 @@ class PackageBuildDataGenerator(object):
118 118
         self.logger.info("Removing duplicates in sorted list")
119 119
         sortedList = removeDuplicateEntries(sortedList)
120 120
 
121
-        self.logger.info("Sorted list:")
121
+        self.logger.info("Sorted list: ")
122 122
         self.logger.info(sortedList)
123 123
         self.__sortedPackageList = sortedList
124 124
 
... ...
@@ -129,28 +129,25 @@ class PackageBuildDataGenerator(object):
129 129
             addBuildTimeGraph = False
130 130
         if basePackage in self.__runTimeDependencyGraph:
131 131
             addRunTimeGraph = False
132
-
132
+        
133 133
         nextPackagesToConstructGraph = set()
134 134
         if addBuildTimeGraph:
135
-            dependentRpmPackages = SPECS.getData().getBuildRequiresForPackage(basePackage)
135
+            dependentRpmPackages = SPECS.getData().getBuildRequiresForPkg(basePackage)
136 136
             dependentPackages = set()
137
-            for rpmPkg in dependentRpmPackages:
138
-                basePkg = SPECS.getData().getSpecName(rpmPkg.package)
139
-                dependentPackages.add(basePkg)
137
+            for dependentPkg in dependentRpmPackages:
138
+                dependentPackages.add(SPECS.getData().getBasePkg(dependentPkg))
140 139
             self.__buildDependencyGraph[basePackage] = dependentPackages
141 140
             nextPackagesToConstructGraph.update(dependentPackages)
142 141
 
143 142
         if addRunTimeGraph:
144
-            rpmPackages = SPECS.getData().getPackages(basePackage)
143
+            packageName, packageVersion = StringUtils.splitPackageNameAndVersion(basePackage)
144
+            rpmPackages = SPECS.getData().getPackages(packageName, packageVersion)
145 145
             dependentPackages = set()
146
-            dependentRpmPackagesNames= set()
147 146
             for rpmPkg in rpmPackages:
148
-                dependentRpmPackages = SPECS.getData().getRequiresAllForPackage(rpmPkg)
149
-                for pkgName in dependentRpmPackages:
150
-                    dependentRpmPackagesNames.add(pkgName.package)
151
-                self.__runTimeDependencyGraph[rpmPkg] = copy.copy(dependentRpmPackagesNames)
152
-                for pkg in dependentRpmPackagesNames:
153
-                    dependentPackages.add(SPECS.getData().getSpecName(pkg))
147
+                dependentRpmPackages = SPECS.getData().getRequiresAllForPackage(rpmPkg, packageVersion)
148
+                self.__runTimeDependencyGraph[rpmPkg+"-"+packageVersion] = copy.copy(set(dependentRpmPackages))
149
+                for pkg in dependentRpmPackages:
150
+                    dependentPackages.add(SPECS.getData().getBasePkg(pkg))
154 151
             nextPackagesToConstructGraph.update(dependentPackages)
155 152
 
156 153
         for pkg in nextPackagesToConstructGraph:
... ...
@@ -9,6 +9,7 @@ from constants import constants
9 9
 from SpecData import SPECS
10 10
 import docker
11 11
 from distutils.version import LooseVersion
12
+from StringUtils import StringUtils
12 13
 
13 14
 class PackageBuilderBase(object):
14 15
     def __init__(self, mapPackageToCycles, pkgBuildType):
... ...
@@ -17,46 +18,50 @@ class PackageBuilderBase(object):
17 17
         self.logPath = None
18 18
         self.logger = None
19 19
         self.package = None
20
+        self.version = None
20 21
         self.mapPackageToCycles = mapPackageToCycles
21 22
         self.listNodepsPackages = ["glibc", "gmp", "zlib", "file", "binutils", "mpfr",
22 23
                                    "mpc", "gcc", "ncurses", "util-linux", "groff", "perl",
23 24
                                    "texinfo", "rpm", "openssl", "go"]
24 25
         self.pkgBuildType = pkgBuildType
25 26
 
26
-    def buildPackageFunction(self, package):
27
-        self._buildPackagePrepareFunction(package)
28
-        versions = self.getNumOfVersions(package)
29
-        if(versions < 1):
30
-            raise Exception("No package exists")
31
-        for version in range(0, versions):
32
-            try:
33
-                self._buildPackage(version)
34
-            except Exception as e:
35
-                # TODO: self.logger might be None
36
-                self.logger.exception(e)
37
-                raise e
27
+    def buildPackageFunction(self, pkg):
28
+        packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
29
+        #do not build if RPM is already built
30
+        #test only if the package is in the testForceRPMS with rpmCheck
31
+        #build only if the package is not in the testForceRPMS with rpmCheck
32
+        if self._checkIfPackageIsAlreadyBuilt(packageName, packageVersion):
33
+            if not constants.rpmCheck:
34
+                return
35
+            elif constants.rpmCheck and self.package not in constants.testForceRPMS:
36
+                return
38 37
 
39
-    def _buildPackagePrepareFunction(self, package):
38
+        self._buildPackagePrepareFunction(packageName, packageVersion)
39
+        try:
40
+            self._buildPackage()
41
+        except Exception as e:
42
+            # TODO: self.logger might be None
43
+            self.logger.exception(e)
44
+            raise e
45
+
46
+    def _buildPackagePrepareFunction(self, package, version):
40 47
         self.package = package
41
-        self.logName = "build-" + package
42
-        self.logPath = constants.logPath + "/build-" + package
48
+        self.version = version
49
+        self.logName = "build-" + package + "-" + version
50
+        self.logPath = constants.logPath + "/" + package + "-" + version
43 51
         if not os.path.isdir(self.logPath):
44 52
             cmdUtils = CommandUtils()
45 53
             cmdUtils.runCommandInShell("mkdir -p " + self.logPath)
46 54
         self.logger = Logger.getLogger(self.logName, self.logPath)
47 55
 
48
-    def _findPackageNameFromRPMFile(self, rpmfile):
56
+    def _findPackageNameAndVersionFromRPMFile(self, rpmfile):
49 57
         rpmfile = os.path.basename(rpmfile)
50 58
         releaseindex = rpmfile.rfind("-")
51 59
         if releaseindex == -1:
52 60
             self.logger.error("Invalid rpm file:" + rpmfile)
53 61
             return None
54
-        versionindex = rpmfile[0:releaseindex].rfind("-")
55
-        if versionindex == -1:
56
-            self.logger.error("Invalid rpm file:" + rpmfile)
57
-            return None
58
-        packageName = rpmfile[0:versionindex]
59
-        return packageName
62
+        pkg = rpmfile[0:releaseindex]
63
+        return pkg
60 64
 
61 65
     def _findInstalledPackages(self, instanceID):
62 66
         pkgUtils = PackageUtils(self.logName, self.logPath)
... ...
@@ -66,40 +71,45 @@ class PackageBuilderBase(object):
66 66
             listInstalledRPMs = pkgUtils.findInstalledRPMPackagesInContainer(instanceID)
67 67
         listInstalledPackages = []
68 68
         for installedRPM in listInstalledRPMs:
69
-            packageName = self._findPackageNameFromRPMFile(installedRPM)
70
-            if packageName is not None:
71
-                listInstalledPackages.append(packageName)
69
+            pkg = self._findPackageNameAndVersionFromRPMFile(installedRPM)
70
+            if pkg is not None:
71
+                listInstalledPackages.append(pkg)
72 72
         return listInstalledPackages, listInstalledRPMs
73 73
 
74
-    def _checkIfPackageIsAlreadyBuilt(self, index=0):
75
-        basePkg = SPECS.getData().getSpecName(self.package)
76
-        listRPMPackages = SPECS.getData().getRPMPackages(basePkg, index)
74
+    def _checkIfPackageIsAlreadyBuilt(self, package, version):
75
+        basePkg = SPECS.getData().getSpecName(package)
76
+        listRPMPackages = SPECS.getData().getRPMPackages(basePkg, version)
77 77
         packageIsAlreadyBuilt = True
78
-        pkgUtils = PackageUtils(self.logName, self.logPath)
78
+        pkgUtils = PackageUtils()
79 79
         for pkg in listRPMPackages:
80
-            if pkgUtils.findRPMFileForGivenPackage(pkg,"*", index) is None:
80
+            if pkgUtils.findRPMFileForGivenPackage(pkg, version) is None:
81 81
                 packageIsAlreadyBuilt = False
82 82
                 break
83 83
         return packageIsAlreadyBuilt
84 84
 
85
-    def _findRunTimeRequiredRPMPackages(self, rpmPackage, index=0):
86
-        return SPECS.getData().getRequiresForPackage(rpmPackage, index)
85
+    def _findRunTimeRequiredRPMPackages(self, rpmPackage, version):
86
+        return SPECS.getData().getRequiresForPackage(rpmPackage, version)
87 87
 
88
-    def _findBuildTimeRequiredPackages(self, index=0):
89
-        return SPECS.getData().getBuildRequiresForPackage(self.package, index)
88
+    def _findBuildTimeRequiredPackages(self):
89
+        return SPECS.getData().getBuildRequiresForPackage(self.package, self.version)
90 90
 
91
-    def _findBuildTimeCheckRequiredPackages(self, index=0):
92
-        return SPECS.getData().getCheckBuildRequiresForPackage(self.package, index)
91
+    def _findBuildTimeCheckRequiredPackages(self):
92
+        return SPECS.getData().getCheckBuildRequiresForPackage(self.package, self.version)
93 93
 
94 94
     def _installPackage(self, pkgUtils, package,packageVersion, instanceID, destLogPath,
95 95
                         listInstalledPackages, listInstalledRPMs):
96
-        specificRPM = os.path.basename(pkgUtils.findRPMFileForGivenPackage(package,packageVersion)).replace(".rpm", "")
97
-        if package in listInstalledPackages:
96
+        rpmfile = pkgUtils.findRPMFileForGivenPackage(package,packageVersion);
97
+        if rpmfile is None:
98
+            self.logger.error("No rpm file found for package: " + package + "-" + packageVersion)
99
+            raise Exception("Missing rpm file")
100
+        specificRPM = os.path.basename(rpmfile.replace(".rpm", ""))
101
+        pkg = package+"-"+packageVersion
102
+        if pkg in listInstalledPackages:
98 103
                 return
99 104
         # mark it as installed -  to avoid cyclic recursion
100
-        listInstalledPackages.append(package)
105
+        listInstalledPackages.append(pkg)
101 106
         listInstalledRPMs.append(specificRPM)
102
-        self._installDependentRunTimePackages(pkgUtils, package, instanceID, destLogPath,
107
+        self._installDependentRunTimePackages(pkgUtils, package, packageVersion, instanceID, destLogPath,
103 108
                                               listInstalledPackages, listInstalledRPMs)
104 109
         noDeps = False
105 110
         if (package in self.mapPackageToCycles or
... ...
@@ -111,37 +121,41 @@ class PackageBuilderBase(object):
111 111
         elif self.pkgBuildType == "container":
112 112
             pkgUtils.prepRPMforInstallInContainer(package,packageVersion, instanceID, noDeps, destLogPath)
113 113
 
114
-    def _installDependentRunTimePackages(self, pkgUtils, package, instanceID, destLogPath,
114
+    def _installDependentRunTimePackages(self, pkgUtils, package, packageVersion, instanceID, destLogPath,
115 115
                                          listInstalledPackages, listInstalledRPMs):
116
-        listRunTimeDependentPackages = self._findRunTimeRequiredRPMPackages(package)
116
+        listRunTimeDependentPackages = self._findRunTimeRequiredRPMPackages(package, packageVersion)
117 117
         if listRunTimeDependentPackages:
118 118
             for pkg in listRunTimeDependentPackages:
119 119
                 if pkg in self.mapPackageToCycles:
120 120
                     continue
121
+                packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
121 122
                 latestPkgRPM = os.path.basename(
122
-                    pkgUtils.findRPMFileForGivenPackage(pkg)).replace(".rpm", "")
123
+                    pkgUtils.findRPMFileForGivenPackage(packageName, packageVersion)).replace(".rpm", "")
123 124
                 if pkg in listInstalledPackages and latestPkgRPM in listInstalledRPMs:
124 125
                     continue
125
-                self._installPackage(pkgUtils, pkg,"*", instanceID, destLogPath,listInstalledPackages, listInstalledRPMs)
126
+                self._installPackage(pkgUtils, packageName,packageVersion, instanceID, destLogPath,listInstalledPackages, listInstalledRPMs)
126 127
 
127
-    def _findDependentPackagesAndInstalledRPM(self, instanceID, index=0):
128
+    def _findDependentPackagesAndInstalledRPM(self, instanceID):
128 129
         listInstalledPackages, listInstalledRPMs = self._findInstalledPackages(instanceID)
129 130
         self.logger.info(listInstalledPackages)
130
-        listDependentPackages = self._findBuildTimeRequiredPackages(index)
131
+        listDependentPackages = self._findBuildTimeRequiredPackages()
131 132
         listTestPackages=[]
132 133
         if constants.rpmCheck and self.package in constants.testForceRPMS:
133
-            listDependentPackages.extend(self._findBuildTimeCheckRequiredPackages(index))
134
-            testPackages = (set(constants.listMakeCheckRPMPkgtoInstall) -
134
+            # One time optimization
135
+            if constants.listMakeCheckRPMPkgWithVersionstoInstall is None:
136
+                constants.listMakeCheckRPMPkgWithVersionstoInstalli=[]
137
+                for package in constants.listMakeCheckRPMPkgtoInstall:
138
+                    version = SPECS.getData().getHighestVersion(package)
139
+                    constants.listMakeCheckRPMPkgWithVersionstoInstall.append(package+"-"+version)
140
+
141
+            listDependentPackages.extend(self._findBuildTimeCheckRequiredPackages())
142
+            testPackages = (set(constants.listMakeCheckRPMPkgWithVersionstoInstall) -
135 143
                             set(listInstalledPackages) -
136
-                            set([self.package]))
144
+                            set([self.package+"-"+self.version]))
137 145
             listTestPackages=list(set(testPackages))
138 146
             listDependentPackages = list(set(listDependentPackages))
139 147
         return listDependentPackages, listTestPackages, listInstalledPackages, listInstalledRPMs
140 148
 
141
-    @staticmethod
142
-    def getNumOfVersions(package):
143
-        return SPECS.getData().getNumberOfVersions(package)
144
-
145 149
 class PackageBuilderContainer(PackageBuilderBase):
146 150
     def __init__(self, mapPackageToCycles, pkgBuildType):
147 151
         self.buildContainerImage = "photon_build_container:latest"
... ...
@@ -149,11 +163,11 @@ class PackageBuilderContainer(PackageBuilderBase):
149 149
 
150 150
         PackageBuilderBase.__init__(self, mapPackageToCycles, pkgBuildType)
151 151
 
152
-    def _prepareBuildContainer(self, containerTaskName, packageName,
152
+    def _prepareBuildContainer(self, containerTaskName, packageName, packageVersion,
153 153
                                isToolChainPackage=False):
154 154
         # Prepare an empty chroot environment to let docker use the BUILD folder.
155 155
         # This avoids docker using overlayFS which will cause make check failure.
156
-        chrootName = "build-" + packageName
156
+        chrootName = packageName + "-" + packageVersion
157 157
         chrUtils = ChrootUtils(self.logName, self.logPath)
158 158
         returnVal, chrootID = chrUtils.createChroot(chrootName)
159 159
         if not returnVal:
... ...
@@ -217,18 +231,7 @@ class PackageBuilderContainer(PackageBuilderBase):
217 217
             raise e
218 218
         return containerID, chrootID
219 219
 
220
-    def _buildPackage(self, index=0):
221
-        #do not build if RPM is already built
222
-        #test only if the package is in the testForceRPMS with rpmCheck
223
-        #build only if the package is not in the testForceRPMS with rpmCheck
224
-        if self._checkIfPackageIsAlreadyBuilt(index):
225
-            if not constants.rpmCheck:
226
-                self.logger.info("Skipping building the package:" + self.package)
227
-                return
228
-            elif constants.rpmCheck and self.package not in constants.testForceRPMS:
229
-                self.logger.info("Skipping testing the package:" + self.package)
230
-                return
231
-
220
+    def _buildPackage(self):
232 221
         #should initialize a logger based on package name
233 222
         containerTaskName = "build-" + self.package
234 223
         containerID = None
... ...
@@ -239,7 +242,7 @@ class PackageBuilderContainer(PackageBuilderBase):
239 239
         destLogPath = constants.logPath + "/build-" + self.package
240 240
         try:
241 241
             containerID, chrootID = self._prepareBuildContainer(
242
-                containerTaskName, self.package, isToolChainPackage)
242
+                containerTaskName, self.package, self.version, isToolChainPackage)
243 243
 
244 244
             tcUtils = ToolChainUtils(self.logName, self.logPath)
245 245
             if self.package in constants.perPackageToolChain:
... ...
@@ -250,7 +253,7 @@ class PackageBuilderContainer(PackageBuilderBase):
250 250
                     self.package)
251 251
 
252 252
             listDependentPackages, listTestPackages, listInstalledPackages, listInstalledRPMs = (
253
-                self._findDependentPackagesAndInstalledRPM(containerID, index))
253
+                self._findDependentPackagesAndInstalledRPM(containerID))
254 254
 
255 255
             pkgUtils = PackageUtils(self.logName, self.logPath)
256 256
             if listDependentPackages:
... ...
@@ -258,29 +261,29 @@ class PackageBuilderContainer(PackageBuilderBase):
258 258
                                  "Installing dependent packages..")
259 259
                 self.logger.info(listDependentPackages)
260 260
                 for pkg in listDependentPackages:
261
-                    properVersion=pkgUtils._getProperVersion(pkg.package,pkg)
262
-                    self._installPackage(pkgUtils, pkg.package,properVersion, containerID, destLogPath,listInstalledPackages, listInstalledRPMs)
261
+                    packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
262
+                    self._installPackage(pkgUtils, packageName, packageVersion, containerID, destLogPath,listInstalledPackages, listInstalledRPMs)
263 263
                 for pkg in listTestPackages:
264
+                    packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
264 265
                     flag = False
265
-                    for lineContent in listDependentPackages:
266
-                        if lineContent.package == pkg:
267
-                                properVersion=pkgUtils._getProperVersion(pkg,lineContent)
268
-                                self._installPackage(pkgUtils, pkg,properVersion, containerID, destLogPath,listInstalledPackages, listInstalledRPMs)
269
-                                flag = True
270
-                                break;
266
+                    for depPkg in listDependentPackages:
267
+                        depPackageName, depPackageVersion = StringUtils.splitPackageNameAndVersion(depPkg)
268
+                        if depPackageName == packageName:
269
+                            flag = True
270
+                            break;
271 271
                     if flag == False:
272
-                        self._installPackage(pkgUtils, pkg,"*", containerID, destLogPath,listInstalledPackages, listInstalledRPMs)
272
+                        self._installPackage(pkgUtils, packageName,packageVersion, containerID, destLogPath,listInstalledPackages, listInstalledRPMs)
273 273
                 pkgUtils.installRPMSInAOneShotInContainer(containerID, destLogPath)
274 274
                 self.logger.info("Finished installing the build time dependent packages....")
275 275
 
276 276
             self.logger.info("BuildContainer-buildPackage: Start building the package: " +
277 277
                              self.package)
278
-            pkgUtils.adjustGCCSpecsInContainer(self.package, containerID, destLogPath, index)
278
+            pkgUtils.adjustGCCSpecsInContainer(self.package, self.version, containerID, destLogPath)
279 279
             pkgUtils.buildRPMSForGivenPackageInContainer(
280 280
                 self.package,
281
+                self.version,
281 282
                 containerID,
282
-                destLogPath,
283
-                index)
283
+                destLogPath)
284 284
             self.logger.info("BuildContainer-buildPackage: Successfully built the package: " +
285 285
                              self.package)
286 286
         except Exception as e:
... ...
@@ -307,7 +310,7 @@ class PackageBuilderChroot(PackageBuilderBase):
307 307
 
308 308
     def _prepareBuildRoot(self):
309 309
         chrootID = None
310
-        chrootName = "build-" + self.package
310
+        chrootName = self.package + "-" + self.version
311 311
         try:
312 312
             chrUtils = ChrootUtils(self.logName, self.logPath)
313 313
             returnVal, chrootID = chrUtils.createChroot(chrootName)
... ...
@@ -315,7 +318,7 @@ class PackageBuilderChroot(PackageBuilderBase):
315 315
             if not returnVal:
316 316
                 raise Exception("Unable to prepare build root")
317 317
             tUtils = ToolChainUtils(self.logName, self.logPath)
318
-            tUtils.installToolChainRPMS(chrootID, self.package, self.logPath)
318
+            tUtils.installToolChainRPMS(self.package, self.version, chrootID, self.logPath)
319 319
         except Exception as e:
320 320
             if chrootID is not None:
321 321
                 self.logger.debug("Deleting chroot: " + chrootID)
... ...
@@ -323,48 +326,37 @@ class PackageBuilderChroot(PackageBuilderBase):
323 323
             raise e
324 324
         return chrootID
325 325
 
326
-    def _buildPackage(self, index=0):
327
-        #do not build if RPM is already built
328
-        #test only if the package is in the testForceRPMS with rpmCheck
329
-        #build only if the package is not in the testForceRPMS with rpmCheck
330
-        if self._checkIfPackageIsAlreadyBuilt(index):
331
-            if not constants.rpmCheck:
332
-                self.logger.info("Skipping building the package:" + self.package)
333
-                return
334
-            elif constants.rpmCheck and self.package not in constants.testForceRPMS:
335
-                self.logger.info("Skipping testing the package:" + self.package)
336
-                return
337
-
326
+    def _buildPackage(self):
338 327
         chrUtils = ChrootUtils(self.logName, self.logPath)
339 328
         chrootID = None
340 329
         try:
341 330
             chrootID = self._prepareBuildRoot()
342 331
             listDependentPackages, listTestPackages, listInstalledPackages, listInstalledRPMs = (
343
-                self._findDependentPackagesAndInstalledRPM(chrootID, index))
332
+                self._findDependentPackagesAndInstalledRPM(chrootID))
344 333
 
345 334
             pkgUtils = PackageUtils(self.logName, self.logPath)
346 335
 
347 336
             if listDependentPackages:
348 337
                 self.logger.info("Installing the build time dependent packages......")
349 338
                 for pkg in listDependentPackages:
350
-                    properVersion=pkgUtils._getProperVersion(pkg.package, pkg)
351
-                    self._installPackage(pkgUtils, pkg.package,properVersion, chrootID, self.logPath,listInstalledPackages, listInstalledRPMs)
339
+                    packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
340
+                    self._installPackage(pkgUtils, packageName, packageVersion, chrootID, self.logPath,listInstalledPackages, listInstalledRPMs)
352 341
                 for pkg in listTestPackages:
353 342
                     flag = False
354
-                    for lineContent in listDependentPackages:
355
-                        if lineContent.package == pkg:
356
-                                properVersion=pkgUtils._getProperVersion(pkg,lineContent)
357
-                                self._installPackage(pkgUtils, pkg,properVersion, chrootID, self.logPath,listInstalledPackages, listInstalledRPMs)
343
+                    packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
344
+                    for depPkg in listDependentPackages:
345
+                        depPackageName, depPackageVersion = StringUtils.splitPackageNameAndVersion(depPkg)
346
+                        if depPackageName == packageName:
358 347
                                 flag = True
359 348
                                 break;
360 349
                     if flag == False:
361
-                        self._installPackage(pkgUtils, pkg,"*", chrootID, self.logPath,listInstalledPackages, listInstalledRPMs)
350
+                        self._installPackage(pkgUtils, packageName,packageVersion, chrootID, self.logPath,listInstalledPackages, listInstalledRPMs)
362 351
                 pkgUtils.installRPMSInAOneShot(chrootID, self.logPath)
363 352
                 self.logger.info("Finished installing the build time dependent packages....")
364 353
 
365
-            pkgUtils.adjustGCCSpecs(self.package, chrootID, self.logPath, index)
366
-            pkgUtils.buildRPMSForGivenPackage(self.package, chrootID,
367
-                                              self.logPath, index)
354
+            pkgUtils.adjustGCCSpecs(self.package, self.version, chrootID, self.logPath)
355
+            pkgUtils.buildRPMSForGivenPackage(self.package, self.version, chrootID,
356
+                                              self.logPath)
368 357
             self.logger.info("Successfully built the package:" + self.package)
369 358
         except Exception as e:
370 359
             self.logger.error("Failed while building package:" + self.package)
... ...
@@ -24,8 +24,8 @@ class PackageInfo(object):
24 24
         listRPMFiles = []
25 25
         cmdUtils = CommandUtils()
26 26
         for package in listPackages:
27
-            release = SPECS.getData().getRelease(package)
28 27
             version = SPECS.getData().getVersion(package)
28
+            release = SPECS.getData().getRelease(package, version)
29 29
             listRPMPackages = SPECS.getData().getRPMPackages(package)
30 30
             srpmFileName = package + "-" + version + "-" + release + ".src.rpm"
31 31
             srpmFiles = cmdUtils.findFile(srpmFileName, constants.sourceRpmPath)
... ...
@@ -12,6 +12,7 @@ from ToolChainUtils import ToolChainUtils
12 12
 from Scheduler import Scheduler
13 13
 from ThreadPool import ThreadPool
14 14
 from SpecData import SPECS
15
+from StringUtils import StringUtils
15 16
 
16 17
 class PackageManager(object):
17 18
 
... ...
@@ -79,57 +80,25 @@ class PackageManager(object):
79 79
             return False
80 80
         return True
81 81
 
82
+    # Returns list of package names which spec file has all subpackages built
83
+    # Returns set of package name and version like
84
+    # ["name1-vers1", "name2-vers2",..]
82 85
     def _readAlreadyAvailablePackages(self):
83 86
         listAvailablePackages = set()
84
-        listFoundRPMPackages = set()
85
-        listRPMFiles = set()
86
-        listDirectorys = set()
87
-        mapPackageVersion={}
88
-        mapPackageRelease={}
89
-        listDirectorys.add(constants.rpmPath)
90
-        if constants.inputRPMSPath is not None:
91
-            listDirectorys.add(constants.inputRPMSPath)
92
-
93
-        while listDirectorys:
94
-            dirPath = listDirectorys.pop()
95
-            for dirEntry in os.listdir(dirPath):
96
-                dirEntryPath = os.path.join(dirPath, dirEntry)
97
-                if os.path.isfile(dirEntryPath) and dirEntryPath.endswith(".rpm"):
98
-                    listRPMFiles.add(dirEntryPath)
99
-                elif os.path.isdir(dirEntryPath):
100
-                    listDirectorys.add(dirEntryPath)
101 87
         pkgUtils = PackageUtils(self.logName, self.logPath)
102
-        for rpmfile in listRPMFiles:
103
-            package, version, release = pkgUtils.findPackageInfoFromRPMFile(rpmfile)
104
-            if package in mapPackageVersion:
105
-                mapPackageVersion[package].append(version)
106
-                mapPackageRelease[package].append(release)
107
-            else:
108
-                mapPackageVersion[package]=[version]
109
-                mapPackageRelease[package]=[release]
110
-        for package in mapPackageVersion:
111
-            if SPECS.getData().isRPMPackage(package):
112
-                numVersions=SPECS.getData().getNumberOfVersions(package)
113
-                flag=True;
114
-                for index in range(0, numVersions):
115
-                        specVersion=SPECS.getData().getVersion(package,index)
116
-                        specRelease=SPECS.getData().getRelease(package,index)
117
-                        if  specVersion not in mapPackageVersion[package] and specRelease not in mapPackageRelease[package]:
118
-                                flag=False
119
-                if flag:
120
-                        listFoundRPMPackages.add(package)
121
-        #Mark package available only if all sub packages are available
122
-        for package in listFoundRPMPackages:
123
-            basePkg = SPECS.getData().getSpecName(package)
124
-            if basePkg in listAvailablePackages:
125
-                continue
126
-            listRPMPackages = SPECS.getData().getRPMPackages(basePkg)
127
-            packageIsAlreadyBuilt = True
128
-            for rpmpkg in listRPMPackages:
129
-                if rpmpkg not in listFoundRPMPackages:
130
-                    packageIsAlreadyBuilt = False
131
-            if packageIsAlreadyBuilt:
132
-                listAvailablePackages.add(package)
88
+        listPackages = SPECS.getData().getListPackages()
89
+        for package in listPackages:
90
+            for version in SPECS.getData().getVersions(package):
91
+                # Mark package available only if all subpackages are available
92
+                packageIsAlreadyBuilt=True
93
+                listRPMPackages = SPECS.getData().getRPMPackages(package, version)
94
+                for rpmPkg in listRPMPackages:
95
+                    if pkgUtils.findRPMFileForGivenPackage(rpmPkg) is None:
96
+                        packageIsAlreadyBuilt=False
97
+                        break;
98
+                if packageIsAlreadyBuilt:
99
+                    listAvailablePackages.add(package+"-"+version)
100
+
133 101
         self.logger.info("List of Already built packages")
134 102
         self.logger.info(listAvailablePackages)
135 103
         return listAvailablePackages
... ...
@@ -139,14 +108,15 @@ class PackageManager(object):
139 139
         self.mapPackageToCycle.clear()
140 140
         self.sortedPackageList = []
141 141
 
142
-        self.listOfPackagesAlreadyBuilt = self._readAlreadyAvailablePackages()
142
+        self.listOfPackagesAlreadyBuilt = list(self._readAlreadyAvailablePackages())
143 143
 
144 144
         updateBuiltRPMSList = False
145 145
         while not updateBuiltRPMSList:
146 146
             updateBuiltRPMSList = True
147
-            listOfPackagesAlreadyBuilt = list(self.listOfPackagesAlreadyBuilt)
147
+            listOfPackagesAlreadyBuilt = self.listOfPackagesAlreadyBuilt
148 148
             for pkg in listOfPackagesAlreadyBuilt:
149
-                listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(pkg)
149
+                packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
150
+                listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(packageName, packageVersion)
150 151
                 needToRebuild = False
151 152
                 for dependentPkg in listDependentRpmPackages:
152 153
                     if dependentPkg not in self.listOfPackagesAlreadyBuilt:
... ...
@@ -178,17 +148,26 @@ class PackageManager(object):
178 178
 
179 179
     def _initializeScheduler(self, statusEvent):
180 180
         Scheduler.setLog(self.logName, self.logPath)
181
-        Scheduler.setParams(self.sortedPackageList, self.listOfPackagesAlreadyBuilt)
181
+        Scheduler.setParams(self.sortedPackageList, set(self.listOfPackagesAlreadyBuilt))
182 182
         Scheduler.setEvent(statusEvent)
183 183
         Scheduler.stopScheduling = False
184 184
 
185 185
     def _buildGivenPackages(self, listPackages, buildThreads):
186
+        # Extend listPackages from ["name1", "name2",..] to ["name1-vers1", "name2-vers2",..]
187
+        listPackageNamesAndVersions=[]
188
+        for pkg in listPackages:
189
+            for version in SPECS.getData().getVersions(pkg):
190
+                listPackageNamesAndVersions.append(pkg+"-"+version)
191
+            
186 192
         if constants.rpmCheck:
193
+            listMakeCheckPackages=set()
194
+            for pkg in listPackages:
195
+                version = SPECS.getData().getHighestVersion(pkg)
196
+                listMakeCheckPackages.add(pkg+"-"+version)
187 197
             alreadyBuiltRPMS = self._readAlreadyAvailablePackages()
188
-            listPackages = (list(set(listPackages)|(set(constants.listMakeCheckRPMPkgtoInstall)-
189
-                                                    alreadyBuiltRPMS)))
198
+            listPackageNamesAndVersions = (list(set(listPackageNamesAndVersions)|(listMakeCheckPackages-alreadyBuiltRPMS)))
190 199
 
191
-        returnVal = self._calculateParams(listPackages)
200
+        returnVal = self._calculateParams(listPackageNamesAndVersions)
192 201
         if not returnVal:
193 202
             self.logger.error("Unable to set paramaters. Terminating the package manager.")
194 203
             raise Exception("Unable to set paramaters")
... ...
@@ -15,7 +15,7 @@ class PackageUtils(object):
15 15
 
16 16
     def __init__(self, logName=None, logPath=None):
17 17
         if logName is None:
18
-            self.logName = "PackageUtils"
18
+            logName = "PackageUtils"
19 19
         if logPath is None:
20 20
             logPath = constants.logPath
21 21
         self.logName = logName
... ...
@@ -85,12 +85,12 @@ class PackageUtils(object):
85 85
                 self.logger.error("Unable to install rpms")
86 86
                 raise Exception("RPM installation failed")
87 87
 
88
-    def buildRPMSForGivenPackage(self, package, chrootID, destLogPath=None, index=0):
88
+    def buildRPMSForGivenPackage(self, package, version, chrootID, destLogPath=None):
89 89
         self.logger.info("Building rpm's for package:" + package)
90 90
 
91
-        listSourcesFiles = SPECS.getData().getSources(package, index)
92
-        listPatchFiles = SPECS.getData().getPatches(package, index)
93
-        specFile = SPECS.getData().getSpecFile(package, index)
91
+        listSourcesFiles = SPECS.getData().getSources(package, version)
92
+        listPatchFiles = SPECS.getData().getPatches(package, version)
93
+        specFile = SPECS.getData().getSpecFile(package, version)
94 94
         specName = SPECS.getData().getSpecName(package) + ".spec"
95 95
 
96 96
         chrootSourcePath = chrootID + constants.topDirPath + "/SOURCES/"
... ...
@@ -101,8 +101,8 @@ class PackageUtils(object):
101 101
 
102 102
         # FIXME: some sources are located in SPECS/.. how to mount?
103 103
         #        if os.geteuid()==0:
104
-        self._copySourcesTobuildroot(listSourcesFiles, package, chrootSourcePath, index)
105
-        self._copySourcesTobuildroot(listPatchFiles, package, chrootSourcePath, index)
104
+        self._copySourcesTobuildroot(listSourcesFiles, package, version, chrootSourcePath)
105
+        self._copySourcesTobuildroot(listPatchFiles, package, version, chrootSourcePath)
106 106
         macros = []
107 107
 
108 108
         listAdditionalFiles, macros = self._getAdditionalBuildFiles(package)
... ...
@@ -144,24 +144,19 @@ class PackageUtils(object):
144 144
         for srpmFile in listSRPMFiles:
145 145
             srpmDestFile = self._copyRPM(chrootID + "/" + srpmFile, constants.sourceRpmPath)
146 146
 
147
-    def findRPMFileForGivenPackage(self, package,version="*", index=0):
147
+    def findRPMFileForGivenPackage(self, package,version="*"):
148 148
         cmdUtils = CommandUtils()
149
-        release = "*"
150 149
         if version == "*":
151
-                version = SPECS.getData().getVersion(package, index)
152
-                release = SPECS.getData().getRelease(package, index)
150
+                version = SPECS.getData().getHighestVersion(package)
151
+        release = SPECS.getData().getRelease(package, version)
152
+        buildarch=SPECS.getData().getBuildArch(package, version)
153 153
         listFoundRPMFiles = sum([cmdUtils.findFile(package + "-" + version + "-" + release + "." +
154
-                                                   platform.machine()+".rpm",
155
-                                                   constants.rpmPath),
156
-                                 cmdUtils.findFile(package + "-" + version + "-" + release +
157
-                                                   ".noarch.rpm",
154
+                                                   buildarch+".rpm",
158 155
                                                    constants.rpmPath)], [])
159 156
         if constants.inputRPMSPath is not None:
160 157
             listFoundRPMFiles = sum([cmdUtils.findFile(package + "-" + version + "-" + release +
161
-                                                       "." + platform.machine()+".rpm",
162
-                                                       constants.inputRPMSPath),
163
-                                     cmdUtils.findFile(package + "-" + version + "-" + release +
164
-                                                       ".noarch.rpm", constants.inputRPMSPath)],
158
+                                                       "." + buildarch+".rpm",
159
+                                                       constants.inputRPMSPath)],
165 160
                                     listFoundRPMFiles)
166 161
         if len(listFoundRPMFiles) == 1:
167 162
             return listFoundRPMFiles[0]
... ...
@@ -169,26 +164,10 @@ class PackageUtils(object):
169 169
             return None
170 170
         if len(listFoundRPMFiles) > 1:
171 171
             self.logger.error("Found multiple rpm files for given package in rpm directory." +
172
-                              "Unable to determine the rpm file for package:" + package)
172
+                              "Unable to determine the rpm file for package:" + package +
173
+                              " : " + str(listFoundRPMFiles))
173 174
             raise Exception("Multiple rpm files found")
174 175
 
175
-    def findPackageInfoFromRPMFile(self, rpmfile):
176
-        rpmfile = os.path.basename(rpmfile)
177
-        rpmfile = rpmfile.replace("." + platform.machine() + ".rpm", "")
178
-        rpmfile = rpmfile.replace(".noarch.rpm", "")
179
-        releaseindex = rpmfile.rfind("-")
180
-        if releaseindex == -1:
181
-            self.logger.error("Invalid rpm file:" + rpmfile)
182
-            raise Exception("Invalid RPM")
183
-        versionindex = rpmfile[0:releaseindex].rfind("-")
184
-        if versionindex == -1:
185
-            self.logger.error("Invalid rpm file:" + rpmfile)
186
-            raise Exception("Invalid RPM")
187
-        packageName = rpmfile[0:versionindex]
188
-        version = rpmfile[versionindex + 1:releaseindex]
189
-        release = rpmfile[releaseindex + 1:]
190
-        return packageName, version, release
191
-
192 176
     def findInstalledRPMPackages(self, chrootID):
193 177
         cmd = self.rpmBinary + " " + self.queryRpmPackageOptions
194 178
         chrootCmd = self.runInChrootCommand + " " + chrootID
... ...
@@ -198,8 +177,8 @@ class PackageUtils(object):
198 198
             return result.decode().split()
199 199
         return result
200 200
 
201
-    def adjustGCCSpecs(self, package, chrootID, logPath, index=0):
202
-        opt = " " + SPECS.getData().getSecurityHardeningOption(package, index)
201
+    def adjustGCCSpecs(self, package, version, chrootID, logPath):
202
+        opt = " " + SPECS.getData().getSecurityHardeningOption(package, version)
203 203
         cmdUtils = CommandUtils()
204 204
         cpcmd = ("cp " + self.adjustGCCSpecScript + " " + chrootID +
205 205
                  "/tmp/" + self.adjustGCCSpecScript)
... ...
@@ -316,8 +295,8 @@ class PackageUtils(object):
316 316
             return result.decode().split()
317 317
         return result
318 318
 
319
-    def adjustGCCSpecsInContainer(self, package, containerID, logPath, index=0):
320
-        opt = " " + SPECS.getData().getSecurityHardeningOption(package, index)
319
+    def adjustGCCSpecsInContainer(self, package, version, containerID, logPath):
320
+        opt = " " + SPECS.getData().getSecurityHardeningOption(package, version)
321 321
         adjustCmd = "/" + self.adjustGCCSpecScript + opt
322 322
         adjustCmd = "/bin/bash -l -c '" + adjustCmd + "'"
323 323
         logFile = logPath + "/adjustGCCSpecScript.log"
... ...
@@ -335,13 +314,13 @@ class PackageUtils(object):
335 335
         self.logger.error("Failed while adjusting gcc specs")
336 336
         raise Exception("Failed while adjusting gcc specs")
337 337
 
338
-    def buildRPMSForGivenPackageInContainer(self, package, containerID, destLogPath=None, index=0):
338
+    def buildRPMSForGivenPackageInContainer(self, package, version, containerID, destLogPath=None):
339 339
         self.logger.info("Building rpm's for package " + package + " in container " +
340 340
                          containerID.short_id)
341 341
 
342
-        listSourcesFiles = SPECS.getData().getSources(package, index)
343
-        listPatchFiles = SPECS.getData().getPatches(package, index)
344
-        specFile = SPECS.getData().getSpecFile(package, index)
342
+        listSourcesFiles = SPECS.getData().getSources(package, version)
343
+        listPatchFiles = SPECS.getData().getPatches(package, version)
344
+        specFile = SPECS.getData().getSpecFile(package, version)
345 345
         specName = SPECS.getData().getSpecName(package) + ".spec"
346 346
         sourcePath = constants.topDirPath + "/SOURCES/"
347 347
         specPath = constants.topDirPath + "/SPECS/"
... ...
@@ -361,9 +340,9 @@ class PackageUtils(object):
361 361
         #        if os.geteuid()==0:
362 362
         #TODO: mount it in, don't copy
363 363
         macros = []
364
-        self._copySourcesToContainer(listSourcesFiles, package, containerID, sourcePath, index)
364
+        self._copySourcesToContainer(listSourcesFiles, package, version, containerID, sourcePath)
365 365
         #TODO: mount it in, don't copy
366
-        self._copySourcesToContainer(listPatchFiles, package, containerID, sourcePath, index)
366
+        self._copySourcesToContainer(listPatchFiles, package, version, containerID, sourcePath)
367 367
         listAdditionalFiles, macros = self._getAdditionalBuildFiles(package)
368 368
         self._copyAdditionalBuildFilesToContainer(listAdditionalFiles, containerID)
369 369
 
... ...
@@ -382,6 +361,7 @@ class PackageUtils(object):
382 382
                 destLogFile,
383 383
                 containerID,
384 384
                 package,
385
+                version,
385 386
                 macros)
386 387
             self.logger.info("Successfully built rpm:" + package)
387 388
         except Exception as e:
... ...
@@ -392,7 +372,7 @@ class PackageUtils(object):
392 392
                 rpmLog = destLogPath + "/" + package + ".log"
393 393
                 if (constants.rpmCheck and
394 394
                         package in constants.testForceRPMS and
395
-                        SPECS.getData().isCheckAvailable(package, index)):
395
+                        SPECS.getData().isCheckAvailable(package, version)):
396 396
                     cmd = "sed -i '/^Executing(%check):/,/^Processing files:/{//!b};d' " + rpmLog
397 397
                     logFile = destLogPath + "/adjustTestFile.log"
398 398
                     returnVal = CommandUtils().runCommandInShell(cmd, logFile)
... ...
@@ -435,19 +415,19 @@ class PackageUtils(object):
435 435
     def _getProperVersion(self,package,parseSpecObj):
436 436
         listOfVersionObjs=SPECS.getData().getSpecObj(package)
437 437
         for num in listOfVersionObjs:
438
-                if parseSpecObj.compare == 'gte':
438
+                if parseSpecObj.compare == ">=":
439 439
                        if LooseVersion(num.version) >= LooseVersion(parseSpecObj.version):
440 440
                                 return num.version
441
-                elif parseSpecObj.compare == 'lte':
441
+                elif parseSpecObj.compare == "<=":
442 442
                         if LooseVersion(num.version) <= LooseVersion(parseSpecObj.version):
443 443
                                 return num.version
444
-                elif parseSpecObj.compare == 'eq':
444
+                elif parseSpecObj.compare == "=":
445 445
                         if LooseVersion(num.version) == LooseVersion(parseSpecObj.version):
446 446
                                 return num.version
447
-                elif parseSpecObj.compare == 'lt':
447
+                elif parseSpecObj.compare == "<":
448 448
                         if LooseVersion(num.version) < LooseVersion(parseSpecObj.version):
449 449
                                 return num.version
450
-                elif parseSpecObj.compare == 'gt':
450
+                elif parseSpecObj.compare == ">":
451 451
                         if LooseVersion(num.version) > LooseVersion(parseSpecObj.version):
452 452
                                 return num.version
453 453
         return "*"
... ...
@@ -468,10 +448,10 @@ class PackageUtils(object):
468 468
             shutil.move(rpmDestPathTemp, rpmDestPath)
469 469
         return rpmDestPath
470 470
 
471
-    def _verifyShaAndGetSourcePath(self, source, package, index=0):
471
+    def _verifyShaAndGetSourcePath(self, source, package, version):
472 472
         cmdUtils = CommandUtils()
473 473
         # Fetch/verify sources if sha1 not None.
474
-        sha1 = SPECS.getData().getSHA1(package, source, index)
474
+        sha1 = SPECS.getData().getSHA1(package, version, source)
475 475
         if sha1 is not None:
476 476
             PullSources.get(package, source, sha1, constants.sourcePath,
477 477
                             constants.pullsourcesConfig, self.logger)
... ...
@@ -497,9 +477,9 @@ class PackageUtils(object):
497 497
             raise Exception("Multiple sources found")
498 498
         return sourcePath
499 499
 
500
-    def _copySourcesTobuildroot(self, listSourceFiles, package, destDir, index=0):
500
+    def _copySourcesTobuildroot(self, listSourceFiles, package, version, destDir):
501 501
         for source in listSourceFiles:
502
-            sourcePath = self._verifyShaAndGetSourcePath(source, package, index)
502
+            sourcePath = self._verifyShaAndGetSourcePath(source, package, version)
503 503
             self.logger.info("Copying... Source path :" + source +
504 504
                              " Source filename: " + sourcePath[0])
505 505
             shutil.copy2(sourcePath[0], destDir)
... ...
@@ -594,10 +574,10 @@ class PackageUtils(object):
594 594
         return listRPMFiles, listSRPMFiles
595 595
 
596 596
 
597
-    def _copySourcesToContainer(self, listSourceFiles, package, containerID, destDir, index=0):
597
+    def _copySourcesToContainer(self, listSourceFiles, package, version, containerID, destDir):
598 598
         cmdUtils = CommandUtils()
599 599
         for source in listSourceFiles:
600
-            sourcePath = self._verifyShaAndGetSourcePath(source, package, index)
600
+            sourcePath = self._verifyShaAndGetSourcePath(source, package, version)
601 601
             self.logger.info("Copying source file: " + sourcePath[0])
602 602
             copyCmd = "docker cp " + sourcePath[0] + " " + containerID.short_id + ":" + destDir
603 603
             cmdUtils.runCommandInShell(copyCmd)
... ...
@@ -641,13 +621,13 @@ class PackageUtils(object):
641 641
         return rpmPath
642 642
 
643 643
 
644
-    def _buildRPMinContainer(self, specFile, rpmLogFile, destLogFile, containerID, package, macros):
644
+    def _buildRPMinContainer(self, specFile, rpmLogFile, destLogFile, containerID, package, version, macros):
645 645
 
646 646
         rpmBuildCmd = self.rpmbuildBinary + " " + self.rpmbuildBuildallOption
647 647
 
648 648
         if constants.rpmCheck and package in constants.testForceRPMS:
649 649
             self.logger.info("#" * (68 + 2 * len(package)))
650
-            if not SPECS.getData().isCheckAvailable(package, index):
650
+            if not SPECS.getData().isCheckAvailable(package, version):
651 651
                 self.logger.info("####### " + package +
652 652
                                  " MakeCheck is not available. Skipping MakeCheck TEST for " +
653 653
                                  package + " #######")
... ...
@@ -679,7 +659,7 @@ class PackageUtils(object):
679 679
             raise Exception("RPM Build failed")
680 680
 
681 681
         if constants.rpmCheck and package in constants.testForceRPMS:
682
-            if not SPECS.getData().isCheckAvailable(package, index):
682
+            if not SPECS.getData().isCheckAvailable(package, version):
683 683
                 constants.testLogger.info(package + " : N/A")
684 684
             elif returnVal:
685 685
                 constants.testLogger.info(package + " : PASS")
... ...
@@ -71,7 +71,6 @@ class Scheduler(object):
71 71
 
72 72
     @staticmethod
73 73
     def getNextPackageToBuild():
74
-        Scheduler.logger.info("Waiting to acquire scheduler lock")
75 74
         with Scheduler.lock:
76 75
             if Scheduler.stopScheduling:
77 76
                 return None
... ...
@@ -89,7 +88,6 @@ class Scheduler(object):
89 89
             packageTup = Scheduler.listOfPackagesNextToBuild.get()
90 90
 
91 91
             package = packageTup[1]
92
-            Scheduler.logger.info("PackagesNextToBuild " + str(packageTup))
93 92
             if Scheduler.listOfPackagesNextToBuild.qsize() > 0:
94 93
                 ThreadPool.activateWorkerThreads(
95 94
                     Scheduler.listOfPackagesNextToBuild.qsize())
... ...
@@ -98,14 +96,14 @@ class Scheduler(object):
98 98
             return package
99 99
 
100 100
     @staticmethod
101
-    def _getBuildRequiredPackages(package):
101
+    def _getBuildRequiredPackages(pkg):
102 102
         listRequiredRPMPackages = []
103
-        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package))
103
+        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPkg(pkg))
104 104
 
105 105
         listRequiredPackages = []
106 106
 
107
-        for pkg in listRequiredRPMPackages:
108
-            basePkg = SPECS.getData().getSpecName(pkg.package)
107
+        for reqPkg in listRequiredRPMPackages:
108
+            basePkg = SPECS.getData().getBasePkg(reqPkg)
109 109
             if basePkg not in listRequiredPackages:
110 110
                 listRequiredPackages.append(basePkg)
111 111
 
... ...
@@ -208,15 +206,15 @@ class Scheduler(object):
208 208
 
209 209
 
210 210
     @staticmethod
211
-    def _getRequiredPackages(package):
211
+    def _getRequiredPackages(pkg):
212 212
         listRequiredRPMPackages = []
213
-        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package))
214
-        listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPackage(package))
213
+        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPkg(pkg))
214
+        listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPkg(pkg))
215 215
 
216 216
         listRequiredPackages = []
217 217
 
218
-        for pkg in listRequiredRPMPackages:
219
-            basePkg = SPECS.getData().getSpecName(pkg.package)
218
+        for reqPkg in listRequiredRPMPackages:
219
+            basePkg = SPECS.getData().getBasePkg(reqPkg)
220 220
             if basePkg not in listRequiredPackages:
221 221
                 listRequiredPackages.append(basePkg)
222 222
 
... ...
@@ -224,7 +222,6 @@ class Scheduler(object):
224 224
 
225 225
     @staticmethod
226 226
     def _getListNextPackagesReadyToBuild():
227
-        Scheduler.logger.info("Checking for next possible packages to build")
228 227
         for pkg in Scheduler.listOfPackagesToBuild:
229 228
             if pkg in Scheduler.listOfPackagesCurrentlyBuilding:
230 229
                 continue
... ...
@@ -236,4 +233,4 @@ class Scheduler(object):
236 236
                     break
237 237
             if canBuild:
238 238
                 Scheduler.listOfPackagesNextToBuild.put((-Scheduler._getPriority(pkg), pkg))
239
-                Scheduler.logger.info("Adding " + pkg + " to the schedule list")
239
+#                Scheduler.logger.info("Adding " + pkg + " to the schedule list")
... ...
@@ -7,7 +7,8 @@ from distutils.version import StrictVersion
7 7
 from SpecUtils import Specutils
8 8
 from Logger import Logger
9 9
 from constants import constants
10
-
10
+from StringUtils import StringUtils
11
+from distutils.version import LooseVersion
11 12
 
12 13
 
13 14
 class SpecObject(object):
... ...
@@ -17,6 +18,7 @@ class SpecObject(object):
17 17
         self.name = ""
18 18
         self.version = ""
19 19
         self.release = ""
20
+        self.buildarch = {}
20 21
         self.buildRequirePackages = []
21 22
         self.checkBuildRequirePackages = []
22 23
         self.installRequiresAllPackages = []
... ...
@@ -65,6 +67,8 @@ class SpecObjectsUtils(object):
65 65
             specObj.sourceurl = spec.getSourceURL()
66 66
             for specPkg in specObj.listPackages:
67 67
                 specObj.installRequiresPackages[specPkg] = spec.getRequires(specPkg)
68
+                specObj.buildarch[specPkg] = spec.getBuildArch(specPkg)
69
+                # TODO add multiversioning support
68 70
                 self.mapPackageToSpec[specPkg] = specName
69 71
                 if spec.getIsRPMPackage(specPkg):
70 72
                     specObj.listRPMPackages.append(specPkg)
... ...
@@ -89,23 +93,100 @@ class SpecObjectsUtils(object):
89 89
             elif os.path.isdir(dirEntryPath):
90 90
                 self.getListSpecFiles(listSpecFiles, dirEntryPath)
91 91
 
92
-    def getBuildRequiresForPackage(self, package, index=0):
93
-        specName = self.getSpecName(package)
94
-        return self.mapSpecObjects[specName][index].buildRequirePackages
95
-
96
-    def getRequiresAllForPackage(self, package, index=0):
92
+    def _getProperVersion(self,depPkg):
93
+        if (depPkg.compare == ""):
94
+            return self.getHighestVersion(depPkg.package)
95
+        specObjs=self.getSpecObj(depPkg.package)
96
+        for obj in specObjs:
97
+                verrel=obj.version+"-"+obj.release
98
+                if depPkg.compare == ">=":
99
+                       if LooseVersion(verrel) >= LooseVersion(depPkg.version):
100
+                                return obj.version
101
+                elif depPkg.compare == "<=":
102
+                        if LooseVersion(verrel) <= LooseVersion(depPkg.version):
103
+                                return obj.version
104
+                elif depPkg.compare == "=":
105
+                        if LooseVersion(verrel) == LooseVersion(depPkg.version):
106
+                                return obj.version
107
+                        if LooseVersion(obj.version) == LooseVersion(depPkg.version):
108
+                                return obj.version
109
+                elif depPkg.compare == "<":
110
+                        if LooseVersion(verrel) < LooseVersion(depPkg.version):
111
+                                return obj.version
112
+                elif depPkg.compare == ">":
113
+                        if LooseVersion(verrel) > LooseVersion(depPkg.version):
114
+                                return obj.version
115
+
116
+        # about to throw exception
117
+        availableVersions=""
118
+        for obj in specObjs:
119
+            availableVersions+=" "+obj.name+"-"+obj.version+"-"+obj.release
120
+        raise Exception("Can not find package: " + depPkg.package + depPkg.compare + depPkg.version + " available specs:"+availableVersions)
121
+
122
+    def _getSpecObjField(self, package, version, field):
97 123
         specName = self.getSpecName(package)
98
-        return self.mapSpecObjects[specName][index].installRequiresAllPackages
99
-
100
-    def getRequiresForPackage(self, package, index=0):
101
-        specName = self.getSpecName(package)
102
-        if package in self.mapSpecObjects[specName][index].installRequiresPackages:
103
-            return self.mapSpecObjects[specName][index].installRequiresPackages[package]
104
-        return None
105
-
106
-    def getCheckBuildRequiresForPackage(self, package, index=0):
124
+        for specObj in self.mapSpecObjects[specName]:
125
+            if specObj.version == version:
126
+                return field(specObj)
127
+        self.logger.error("Could not able to find " + package +
128
+                          "-" + version + " package from specs")
129
+        raise Exception("Invalid package: " + package + "-" + version)
130
+
131
+    def getBuildRequiresForPackage(self, package, version):
132
+        buildRequiresList=[]
133
+        buildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.buildRequirePackages)
134
+        for pkg in buildRequiresPackages:
135
+            properVersion = self._getProperVersion(pkg)
136
+            buildRequiresList.append(pkg.package+"-"+properVersion)
137
+        return buildRequiresList
138
+
139
+    def getBuildRequiresForPkg(self, pkg):
140
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
141
+        return self.getBuildRequiresForPackage(package, version)
142
+
143
+    def getBuildRequiresForPkg(self, pkg):
144
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
145
+        return self.getBuildRequiresForPackage(package, version)
146
+
147
+    # Returns list of [ "pkg1-vers1", "pkg2-vers2",.. ]
148
+    def getRequiresAllForPackage(self, package, version):
149
+        requiresList=[]
150
+        requiresPackages = self._getSpecObjField(package, version, field=lambda x : x.installRequiresAllPackages)
151
+        for pkg in requiresPackages:
152
+            properVersion = self._getProperVersion(pkg)
153
+            requiresList.append(pkg.package+"-"+properVersion)
154
+        return requiresList
155
+
156
+    def getRequiresAllForPkg(self, pkg):
157
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
158
+        return self.getRequiresAllForPackage(package, version)
159
+
160
+    def getRequiresForPackage(self, package, version):
161
+        requiresList=[]
107 162
         specName = self.getSpecName(package)
108
-        return self.mapSpecObjects[specName][index].checkBuildRequirePackages
163
+        for specObj in self.mapSpecObjects[specName]:
164
+            if specObj.version == version:
165
+                if package in specObj.installRequiresPackages:
166
+                    requiresPackages = specObj.installRequiresPackages[package]
167
+                    for pkg in requiresPackages:
168
+                        properVersion = self._getProperVersion(pkg)
169
+                        requiresList.append(pkg.package+"-"+properVersion)
170
+                return requiresList
171
+        self.logger.error("Could not able to find " + package +
172
+                          "-" + version + " package from specs")
173
+        raise Exception("Invalid package: " + package + "-" + version)
174
+
175
+    def getRequiresForPkg(self, pkg):
176
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
177
+        return self.getRequiresForPackage(package, version)
178
+
179
+    def getCheckBuildRequiresForPackage(self, package, version):
180
+        checkBuildRequiresList=[]
181
+        checkBuildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.checkBuildRequirePackages)
182
+        for pkg in checkBuildRequiresPackages:
183
+            properVersion = self._getProperVersion(pkg)
184
+            checkBuildRequiresList.append(pkg.package+"-"+properVersion)
185
+        return checkBuildRequiresList
109 186
 
110 187
     def getSpecObj(self, package):
111 188
         specName=self.getSpecName(package)
... ...
@@ -113,43 +194,49 @@ class SpecObjectsUtils(object):
113 113
 
114 114
     def getPkgNamesFromObj(self, objlist):
115 115
         listPkgName=[]
116
-        listPkgNames=list(set(objlist))
117
-        for name in listPkgNames:
116
+        for name in objlist:
118 117
                 listPkgName.append(name.package)
119
-        listPkgName=list(set(listPkgName))
120 118
         return listPkgName
121 119
 
122
-    def getRelease(self, package, index=0):
123
-        specName = self.getSpecName(package)
124
-        return self.mapSpecObjects[specName][index].release
120
+    def getRelease(self, package, version):
121
+        return self._getSpecObjField(package, version, field=lambda x : x.release)
125 122
 
126
-    def getVersion(self, package, index=0):
123
+    def getVersions(self, package):
124
+        versions=[]
127 125
         specName = self.getSpecName(package)
128
-        return self.mapSpecObjects[specName][index].version
126
+        for specObj in self.mapSpecObjects[specName]:
127
+            versions.append(specObj.version)
128
+        return versions
129 129
 
130
-    def getSpecFile(self, package, index=0):
130
+    def getHighestVersion(self, package):
131 131
         specName = self.getSpecName(package)
132
-        return self.mapSpecObjects[specName][index].specFile
132
+        return self.mapSpecObjects[specName][0].version
133 133
 
134
-    def getPatches(self, package, index=0):
135
-        specName = self.getSpecName(package)
136
-        return self.mapSpecObjects[specName][index].listPatches
134
+    def getBuildArch(self, package, version):
135
+        return self._getSpecObjField(package, version, field=lambda x : x.buildarch[package])
137 136
 
138
-    def getSources(self, package, index=0):
139
-        specName = self.getSpecName(package)
140
-        return self.mapSpecObjects[specName][index].listSources
137
+    def getSpecFile(self, package, version):
138
+        return self._getSpecObjField(package, version, field=lambda x : x.specFile)
141 139
 
142
-    def getSHA1(self, package, source, index=0):
143
-        specName = self.getSpecName(package)
144
-        return self.mapSpecObjects[specName][index].checksums.get(source)
140
+    def getPatches(self, package, version):
141
+        return self._getSpecObjField(package, version, field=lambda x : x.listPatches)
145 142
 
146
-    def getPackages(self, package, index=0):
147
-        specName = self.getSpecName(package)
148
-        return self.mapSpecObjects[specName][index].listPackages
143
+    def getSources(self, package, version):
144
+        return self._getSpecObjField(package, version, field=lambda x : x.listSources)
149 145
 
150
-    def getRPMPackages(self, package, index=0):
151
-        specName = self.getSpecName(package)
152
-        return self.mapSpecObjects[specName][index].listRPMPackages
146
+    def getSHA1(self, package, version, source):
147
+        return self._getSpecObjField(package, version, field=lambda x : x.checksums.get(source))
148
+
149
+    # returns list of package names (no versions)
150
+    def getPackages(self, package, version):
151
+        return self._getSpecObjField(package, version, field=lambda x : x.listPackages)
152
+
153
+    def getPackagesForPkg(self, pkg):
154
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
155
+        return self.getPackages(package, version)
156
+
157
+    def getRPMPackages(self, package, version):
158
+        return self._getSpecObjField(package, version, field=lambda x : x.listRPMPackages)
153 159
 
154 160
     @staticmethod
155 161
     def compareVersions(p):
... ...
@@ -170,32 +257,29 @@ class SpecObjectsUtils(object):
170 170
                 return True
171 171
         return False
172 172
 
173
-    def getSecurityHardeningOption(self, package, index=0):
174
-        specName = self.getSpecName(package)
175
-        return self.mapSpecObjects[specName][index].securityHardening
173
+    def getSecurityHardeningOption(self, package, version):
174
+        return self._getSpecObjField(package, version, field=lambda x : x.securityHardening)
176 175
 
177
-    def isCheckAvailable(self, package, index=0):
178
-        specName = self.getSpecName(package)
179
-        return self.mapSpecObjects[specName][index].isCheckAvailable
176
+    def isCheckAvailable(self, package, version):
177
+        return self._getSpecObjField(package, version, field=lambda x : x.isCheckAvailable)
180 178
 
181 179
     def getListPackages(self):
182 180
         return list(self.mapSpecObjects.keys())
183 181
 
184
-    def getURL(self, package, index=0):
185
-        specName = self.getSpecName(package)
186
-        return self.mapSpecObjects[specName][index].url
182
+    def getURL(self, package, version):
183
+        return self._getSpecObjField(package, version, field=lambda x : x.url)
187 184
 
188
-    def getSourceURL(self, package, index=0):
189
-        specName = self.getSpecName(package)
190
-        return self.mapSpecObjects[specName][index].sourceurl
185
+    def getSourceURL(self, package, version):
186
+        return self._getSpecObjField(package, version, field=lambda x : x.sourceurl)
191 187
 
192
-    def getLicense(self, package, index=0):
193
-        specName = self.getSpecName(package)
194
-        return self.mapSpecObjects[specName][index].license
188
+    def getLicense(self, package, version):
189
+        return self._getSpecObjField(package, version, field=lambda x : x.license)
190
+
191
+    # Converts "glibc-devel-2.28" into "glibc-2.28"
192
+    def getBasePkg(self, pkg):
193
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
194
+        return self.getSpecName(package)+"-"+version
195 195
 
196
-    def getNumberOfVersions(self, package):
197
-        specName=self.getSpecName(package)
198
-        return len(self.mapSpecObjects[specName])
199 196
 
200 197
     def printAllObjects(self):
201 198
         listSpecs = self.mapSpecObjects.keys()
... ...
@@ -300,10 +384,11 @@ class SpecDependencyGenerator(object):
300 300
         while not depQue.empty():
301 301
             specPkg = depQue.get()
302 302
             try:
303
-                listRequiredPackages = SPECS.getData().getRequiresForPackage(specPkg)
303
+                listRequiredPackages = SPECS.getData().getRequiresForPkg(specPkg)
304 304
             except Exception as e:
305 305
                 print("Caught Exception:"+str(e))
306 306
                 print(specPkg + " is missing")
307
+                raise e
307 308
 
308 309
             for depPkg in listRequiredPackages:
309 310
                 if depPkg in mapDependencies:
... ...
@@ -319,9 +404,9 @@ class SpecDependencyGenerator(object):
319 319
     def findTotalWhoNeedsToBuild(self, depQue, whoNeedsBuild):
320 320
         while not depQue.empty():
321 321
             specPkg = depQue.get()
322
-            listPackagesRequiredToBuild = SPECS.getData().getBuildRequiresForPackage(specPkg)
322
+            listPackagesRequiredToBuild = SPECS.getData().getBuildRequiresForPkg(specPkg)
323 323
             for depPkg in listPackagesRequiredToBuild:
324
-                depSpecPkg = SPECS.getData().getSpecName(depPkg)
324
+                depSpecPkg = SPECS.getData().getBasePkg(depPkg)
325 325
                 if depSpecPkg not in whoNeedsBuild:
326 326
                     whoNeedsBuild.append(depSpecPkg)
327 327
                     depQue.put(depSpecPkg)
... ...
@@ -339,9 +424,10 @@ class SpecDependencyGenerator(object):
339 339
             return packages
340 340
 
341 341
     def updateLevels(self, mapDependencies, inPkg, parent, level):
342
-        listPackages = SPECS.getData().getPackages(inPkg)
343
-        for depPkg in SPECS.getData().getRequiresForPackage(inPkg):
344
-            if depPkg in listPackages:
342
+        listPackages = SPECS.getData().getPackagesForPkg(inPkg)
343
+        for depPkg in SPECS.getData().getRequiresForPkg(inPkg):
344
+            package, version = StringUtils.splitPackageNameAndVersion(depPkg)
345
+            if package in listPackages:
345 346
                 continue
346 347
             if depPkg in mapDependencies and mapDependencies[depPkg] < level + 1:
347 348
                 mapDependencies[depPkg] = level + 1
... ...
@@ -350,13 +436,15 @@ class SpecDependencyGenerator(object):
350 350
 
351 351
     def calculateSpecDependency(self, inputPackages, mapDependencies, parent):
352 352
         depQue = queue.Queue()
353
-        for pkg in inputPackages:
354
-            if SPECS.getData().isRPMPackage(pkg):
355
-                if pkg not in mapDependencies:
356
-                    mapDependencies[pkg] = 0
357
-                    parent[pkg] = ""
358
-                    depQue.put(pkg)
359
-                    self.findTotalRequires(mapDependencies, depQue, parent)
353
+        for package in inputPackages:
354
+            if SPECS.getData().isRPMPackage(package):
355
+                for version in SPECS.getData().getVersions(package):
356
+                    pkg = package+"-"+version
357
+                    if pkg not in mapDependencies:
358
+                        mapDependencies[pkg] = 0
359
+                        parent[pkg] = ""
360
+                        depQue.put(pkg)
361
+                        self.findTotalRequires(mapDependencies, depQue, parent)
360 362
             else:
361 363
                 print("Could not find spec for "+pkg)
362 364
 
... ...
@@ -414,7 +502,8 @@ class SpecDependencyGenerator(object):
414 414
                 return self.displayDependencies(displayOption, inputType, inputValue, mapDependencies, parent)
415 415
         elif inputType == "who-needs":
416 416
             for depPkg in SPECS.getData().mapPackageToSpec:
417
-                if inputValue in SPECS.getData().getRequiresForPackage(depPkg):
417
+                pkg=inputValue+"-"+SPECS.getData().getHighestVersion(inputValue)
418
+                if pkg in SPECS.getData().getRequiresForPkg(depPkg):
418 419
                     whoNeedsList.append(depPkg)
419 420
             print (whoNeedsList)
420 421
             return whoNeedsList
... ...
@@ -314,18 +314,8 @@ class SpecParser(object):
314 314
                     else:
315 315
                         continue
316 316
                 if i + 2 < len(listContents):
317
-                    if listContents[i+1] == ">=":
318
-                        compare = "gte"
319
-                    elif listContents[i+1] == "<=":
320
-                        compare = "lte"
321
-                    elif listContents[i+1] == "==":
322
-                        compare = "eq"
323
-                    elif listContents[i+1] == "<":
324
-                        compare = "lt"
325
-                    elif listContents[i+1] == ">":
326
-                        compare = "gt"
327
-                    elif listContents[i+1] == "=":
328
-                        compare = "eq"
317
+                    if listContents[i+1] in (">=", "<=", "=", "<", ">"):
318
+                        compare = listContents[i+1]
329 319
 
330 320
                 if compare is not None:
331 321
                     dpkg.package = packageName
... ...
@@ -73,6 +73,13 @@ class Specutils(object):
73 73
             return None
74 74
         return pkg.license
75 75
 
76
+    def getBuildArch(self, pkgName):
77
+        for pkg in self.spec.packages.values():
78
+            if pkg.name == pkgName:
79
+                return pkg.buildarch
80
+        pkg = self.spec.packages.get('default')
81
+        return pkg.buildarch
82
+
76 83
     def getURL(self):
77 84
         pkg = self.spec.packages.get('default')
78 85
         if pkg is None:
... ...
@@ -131,7 +138,7 @@ class Specutils(object):
131 131
         for pkg in self.spec.packages.values():
132 132
             if pkg.name == pkgName:
133 133
                 for dpkg in pkg.requires:
134
-                    dependentPackages.append(dpkg.package)
134
+                    dependentPackages.append(dpkg)
135 135
         return dependentPackages
136 136
 
137 137
     def getProvides(self, packageName):
... ...
@@ -39,3 +39,12 @@ class StringUtils(object):
39 39
             return inputstring
40 40
         name = m.group(2)
41 41
         return name.replace("_", ".")
42
+
43
+    @staticmethod
44
+    def splitPackageNameAndVersion(pkg):
45
+        versionindex = pkg.rfind("-")
46
+        if versionindex == -1:
47
+            raise Exception("Invalid argument")
48
+        packageName = pkg[:versionindex]
49
+        packageVersion = pkg[versionindex+1:]
50
+        return packageName, packageVersion
... ...
@@ -8,6 +8,7 @@ from Logger import Logger
8 8
 from PackageUtils import PackageUtils
9 9
 from constants import constants
10 10
 from SpecData import SPECS
11
+from StringUtils import StringUtils
11 12
 
12 13
 class ToolChainUtils(object):
13 14
 
... ...
@@ -83,7 +84,8 @@ class ToolChainUtils(object):
83 83
         try:
84 84
             pkgUtils = PackageUtils(self.logName, self.logPath)
85 85
             for package in constants.listCoreToolChainPackages:
86
-                rpmPkg = pkgUtils.findRPMFileForGivenPackage(package)
86
+                version = SPECS.getData().getHighestVersion(package)
87
+                rpmPkg = pkgUtils.findRPMFileForGivenPackage(package, version)
87 88
                 if rpmPkg is not None:
88 89
                     continue
89 90
                 self.logger.info("Building core toolchain package: " + package)
... ...
@@ -97,9 +99,9 @@ class ToolChainUtils(object):
97 97
                 if not returnVal:
98 98
                     self.logger.error("Creating chroot failed")
99 99
                     raise Exception("creating chroot failed")
100
-                self.installToolChainRPMS(chrootID, package, destLogPath)
101
-                pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath)
102
-                pkgUtils.buildRPMSForGivenPackage(package, chrootID, destLogPath)
100
+                self.installToolChainRPMS(package, version, chrootID, destLogPath)
101
+                pkgUtils.adjustGCCSpecs(package, version, chrootID, destLogPath)
102
+                pkgUtils.buildRPMSForGivenPackage(package, version, chrootID, destLogPath)
103 103
                 pkgCount += 1
104 104
                 chrUtils.destroyChroot(chrootID)
105 105
                 chrootID = None
... ...
@@ -113,13 +115,12 @@ class ToolChainUtils(object):
113 113
             raise e
114 114
         return pkgCount
115 115
 
116
-    def getListDependentPackageLineContent(self, index):
117
-        listBuildRequiresPkgLineContent=SPECS.getData().getBuildRequiresForPackage(self.package, index)
118
-        listBuildRequiresPkgLineContent.extend(SPECS.getData().getCheckBuildRequiresForPackage(self.package, index))
119
-        listBuildRequiresPkgLineContent=list(set(listBuildRequiresPkgLineContent))
120
-        return listBuildRequiresPkgLineContent
116
+    def getListDependentPackages(self, package, version):
117
+        listBuildRequiresPkg=SPECS.getData().getBuildRequiresForPackage(package, version)
118
+        listBuildRequiresPkg.extend(SPECS.getData().getCheckBuildRequiresForPackage(package, version))
119
+        return listBuildRequiresPkg
121 120
 
122
-    def installToolChainRPMS(self, chrootID, packageName, logPath=None,index=0):
121
+    def installToolChainRPMS(self, packageName, packageVersion, chrootID, logPath=None):
123 122
         if logPath is None:
124 123
             logPath = self.logPath
125 124
         cmdUtils = CommandUtils()
... ...
@@ -127,15 +128,15 @@ class ToolChainUtils(object):
127 127
         self.logger.info("Installing Tool Chain RPMS.......")
128 128
         rpmFiles = ""
129 129
         packages = ""
130
-        self.package=packageName
131
-        listBuildRequiresPackageLineContent = self.getListDependentPackageLineContent(index)
130
+        listBuildRequiresPackages = self.getListDependentPackages(packageName, packageVersion)
132 131
         for package in constants.listToolChainRPMsToInstall:
133 132
             pkgUtils = PackageUtils(self.logName, self.logPath)
134 133
             rpmFile = None
135 134
             version = "*"
136
-            for depPkg in listBuildRequiresPackageLineContent:
137
-                if depPkg.package == package:
138
-                        version=pkgUtils._getProperVersion(package,depPkg)
135
+            for depPkg in listBuildRequiresPackages:
136
+                depPkgName, depPkgVersion = StringUtils.splitPackageNameAndVersion(depPkg)
137
+                if depPkgName == package:
138
+                        version=depPkgVersion
139 139
             if constants.rpmCheck:
140 140
                 rpmFile = pkgUtils.findRPMFileForGivenPackage(package, version)
141 141
             else:
... ...
@@ -157,9 +158,9 @@ class ToolChainUtils(object):
157 157
                                       " in current and previous versions")
158 158
                     raise Exception("Input Error")
159 159
             rpmFiles += " " + rpmFile
160
-            packages += " " + package
160
+            packages += " " + package+"-"+version
161 161
 
162
-        self.logger.debug("Installing toolchain rpms:" + packages)
162
+        self.logger.debug(packages)
163 163
         cmd = (self.rpmCommand + " -i -v --nodeps --noorder --force --root " +
164 164
                chrootID +" --define \'_dbpath /var/lib/rpm\' "+ rpmFiles)
165 165
         retVal = cmdUtils.runCommandInShell(cmd, logPath + "/install_toolchain_rpms.log")
... ...
@@ -218,7 +219,8 @@ class ToolChainUtils(object):
218 218
         packages = ""
219 219
         pkgUtils = PackageUtils(self.logName, self.logPath)
220 220
         for package in constants.listToolChainRPMPkgsToInstall:
221
-            rpmFile = pkgUtils.findRPMFileForGivenPackage(package)
221
+            version = SPECS.getData().getHighestVersion(package)
222
+            rpmFile = pkgUtils.findRPMFileForGivenPackage(package, version)
222 223
             if rpmFile is None:
223 224
                 # sqlite-autoconf package was renamed, but it still published as sqlite-autoconf
224 225
 #                if (package == "sqlite") and (platform.machine() == "x86_64"):
... ...
@@ -23,7 +23,6 @@ class WorkerThread(threading.Thread):
23 23
             pkg = Scheduler.Scheduler.getNextPackageToBuild()
24 24
             if pkg is None:
25 25
                 break
26
-            self.logger.info("Thread " + self.name + " is building package:" + pkg)
27 26
             if self.pkgBuildType == "chroot":
28 27
                 pkgBuilder = PackageBuilderChroot(self.mapPackageToCycle,
29 28
                                                   self.pkgBuildType)
... ...
@@ -39,7 +38,6 @@ class WorkerThread(threading.Thread):
39 39
                 self.logger.info("Thread " + self.name + " stopped building package:" + pkg)
40 40
                 self.statusEvent.set()
41 41
                 break
42
-            self.logger.info("Thread " + self.name + " finished building package:" + pkg)
43 42
             Scheduler.Scheduler.notifyPackageBuildCompleted(pkg)
44 43
 
45 44
         ThreadPool.ThreadPool.makeWorkerThreadInActive(self.name)
... ...
@@ -25,6 +25,8 @@ class constants(object):
25 25
     testForceRPMS = []
26 26
     tmpDirPath = "/dev/shm"
27 27
     buildOptions = {}
28
+    # will be extended later from listMakeCheckRPMPkgtoInstall
29
+    listMakeCheckRPMPkgWithVersionstoInstall = None
28 30
 
29 31
     noDepsPackageList = [
30 32
         "texinfo",