Example:
In rpm spec file, use "with_check" macro to add additional buildrequires which are required for check
%if %{with_check}
BuildRequires: python-py
BuildRequires: python-pytest
%endif
Change-Id: I99730ce5853cf48a46e8fb2d52f4666cf8473807
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/3265
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>
| ... | ... |
@@ -11,6 +11,7 @@ class SerializableSpecObject(object): |
| 11 | 11 |
self.version="" |
| 12 | 12 |
self.release="" |
| 13 | 13 |
self.buildRequirePackages=[] |
| 14 |
+ self.checkBuildRequirePackages=[] |
|
| 14 | 15 |
self.installRequiresAllPackages=[] |
| 15 | 16 |
self.installRequiresPackages={}
|
| 16 | 17 |
self.specFile="" |
| ... | ... |
@@ -41,6 +42,7 @@ class SerializableSpecObjectsUtils(object): |
| 41 | 41 |
specObj.name=specName |
| 42 | 42 |
specObj.buildRequirePackages=spec.getBuildRequiresAllPackages() |
| 43 | 43 |
specObj.installRequiresAllPackages=spec.getRequiresAllPackages() |
| 44 |
+ specObj.checkBuildRequirePackages=spec.getCheckBuildRequiresAllPackages() |
|
| 44 | 45 |
specObj.listPackages=spec.getPackageNames() |
| 45 | 46 |
specObj.specFile=specFile |
| 46 | 47 |
specObj.version=spec.getVersion() |
| ... | ... |
@@ -87,6 +89,10 @@ class SerializableSpecObjectsUtils(object): |
| 87 | 87 |
return self.mapSerializableSpecObjects[specName].installRequiresPackages[package] |
| 88 | 88 |
return None |
| 89 | 89 |
|
| 90 |
+ def getCheckBuildRequiresForPackage(self, package): |
|
| 91 |
+ specName=self.getSpecName(package) |
|
| 92 |
+ return self.mapSerializableSpecObjects[specName].checkBuildRequirePackages |
|
| 93 |
+ |
|
| 90 | 94 |
def addMacro(self, macroName, macroValue): |
| 91 | 95 |
if macroName == "": |
| 92 | 96 |
self.logger.error("Given invalid macro: name:"+macroName+" value:"+macroValue)
|
| ... | ... |
@@ -13,6 +13,7 @@ class SpecParser(object): |
| 13 | 13 |
self.packages={}
|
| 14 | 14 |
self.specAdditionalContent="" |
| 15 | 15 |
self.globalSecurityHardening="" |
| 16 |
+ self.conditionalCheckMacroEnabled = False |
|
| 16 | 17 |
|
| 17 | 18 |
|
| 18 | 19 |
def readPkgNameFromPackageMacro(self,data,basePkgName=None): |
| ... | ... |
@@ -71,6 +72,10 @@ class SpecParser(object): |
| 71 | 71 |
self.readSecurityHardening(line) |
| 72 | 72 |
elif self.isChecksum(line): |
| 73 | 73 |
self.readChecksum(line, self.packages[currentPkg]) |
| 74 |
+ elif self.isConditionalCheckMacro(line): |
|
| 75 |
+ self.conditionalCheckMacroEnabled = True |
|
| 76 |
+ elif self.conditionalCheckMacroEnabled and self.isConditionalMacroCompleted(line): |
|
| 77 |
+ self.conditionalCheckMacroEnabled = False |
|
| 74 | 78 |
else: |
| 75 | 79 |
self.specAdditionalContent+=line+"\n" |
| 76 | 80 |
i=i+1 |
| ... | ... |
@@ -307,7 +312,10 @@ class SpecParser(object): |
| 307 | 307 |
if headerName == 'conflicts': |
| 308 | 308 |
pkg.conflicts.extend(dpkg) |
| 309 | 309 |
if headerName == 'buildrequires': |
| 310 |
- pkg.buildrequires.extend(dpkg) |
|
| 310 |
+ if self.conditionalCheckMacroEnabled: |
|
| 311 |
+ pkg.checkbuildrequires.extend(dpkg) |
|
| 312 |
+ else: |
|
| 313 |
+ pkg.buildrequires.extend(dpkg) |
|
| 311 | 314 |
if headerName == 'buildprovides': |
| 312 | 315 |
pkg.buildprovides.extend(dpkg) |
| 313 | 316 |
|
| ... | ... |
@@ -353,3 +361,23 @@ class SpecParser(object): |
| 353 | 353 |
return False |
| 354 | 354 |
pkg.checksums[sourceName] = value[1] |
| 355 | 355 |
return True; |
| 356 |
+ |
|
| 357 |
+ def isConditionalCheckMacro(self,line): |
|
| 358 |
+ data = line.strip() |
|
| 359 |
+ words = data.split() |
|
| 360 |
+ nrWords = len(words) |
|
| 361 |
+ if(nrWords != 2): |
|
| 362 |
+ return False |
|
| 363 |
+ if(words[0] != "%if" or words[1] != "%{with_check}"):
|
|
| 364 |
+ return False |
|
| 365 |
+ return True |
|
| 366 |
+ |
|
| 367 |
+ def isConditionalMacroCompleted(self,line): |
|
| 368 |
+ data = line.strip() |
|
| 369 |
+ words = data.split() |
|
| 370 |
+ nrWords = len(words) |
|
| 371 |
+ if(nrWords != 1): |
|
| 372 |
+ return False |
|
| 373 |
+ if(words[0] != "%endif"): |
|
| 374 |
+ return False |
|
| 375 |
+ return True |
| ... | ... |
@@ -9,18 +9,18 @@ class rpmMacro(object): |
| 9 | 9 |
|
| 10 | 10 |
def setName(self,name): |
| 11 | 11 |
self.macroName=name |
| 12 |
- |
|
| 12 |
+ |
|
| 13 | 13 |
def displayMacro(self): |
| 14 | 14 |
print "Macro:\n", self.macroName, " ",self.macroFlag," ",self.position," ",self.endposition |
| 15 | 15 |
print self.content |
| 16 |
- |
|
| 16 |
+ |
|
| 17 | 17 |
class dependentPackageData(object): |
| 18 | 18 |
|
| 19 | 19 |
def __init__(self): |
| 20 | 20 |
self.package="" |
| 21 | 21 |
self.version="" |
| 22 | 22 |
self.compare="" |
| 23 |
- |
|
| 23 |
+ |
|
| 24 | 24 |
class Package(object): |
| 25 | 25 |
def __init__(self, basePkg=None): |
| 26 | 26 |
self.summary="" |
| ... | ... |
@@ -33,25 +33,26 @@ class Package(object): |
| 33 | 33 |
self.distribution="Photon" |
| 34 | 34 |
self.basePkgName="" |
| 35 | 35 |
self.URL="" |
| 36 |
- |
|
| 36 |
+ |
|
| 37 | 37 |
self.sources=[] |
| 38 | 38 |
self.checksums={}
|
| 39 | 39 |
self.patches=[] |
| 40 | 40 |
self.buildrequires=[] |
| 41 | 41 |
self.buildprovides=[] |
| 42 |
- |
|
| 43 |
- |
|
| 42 |
+ self.checkbuildrequires=[] |
|
| 43 |
+ |
|
| 44 |
+ |
|
| 44 | 45 |
self.requires=[] |
| 45 | 46 |
self.provides=[] |
| 46 | 47 |
self.obsoletes=[] |
| 47 | 48 |
self.conflicts=[] |
| 48 |
- |
|
| 49 |
+ |
|
| 49 | 50 |
self.descriptionMacro= None |
| 50 | 51 |
self.postMacro=None |
| 51 | 52 |
self.postunMacro=None |
| 52 | 53 |
self.filesMacro=None |
| 53 | 54 |
self.packageMacro=None |
| 54 |
- |
|
| 55 |
+ |
|
| 55 | 56 |
if basePkg is not None: |
| 56 | 57 |
self.basePkgName=basePkg.name |
| 57 | 58 |
self.group=basePkg.group |
| ... | ... |
@@ -60,22 +61,22 @@ class Package(object): |
| 60 | 60 |
self.buildarch=basePkg.buildarch |
| 61 | 61 |
self.release=basePkg.release |
| 62 | 62 |
self.distribution=basePkg.distribution |
| 63 |
- |
|
| 63 |
+ |
|
| 64 | 64 |
def decodeContents(self,content): |
| 65 | 65 |
if content.find("%{name}") != -1:
|
| 66 | 66 |
if self.basePkgName == "": |
| 67 | 67 |
content = content.replace('%{name}',self.name)
|
| 68 | 68 |
else: |
| 69 | 69 |
content = content.replace('%{name}',self.basePkgName)
|
| 70 |
- |
|
| 70 |
+ |
|
| 71 | 71 |
if content.find("%{release}") != -1:
|
| 72 | 72 |
content = content.replace('%{release}',self.release)
|
| 73 |
- |
|
| 73 |
+ |
|
| 74 | 74 |
if content.find("%{version}") != -1:
|
| 75 | 75 |
content = content.replace('%{version}',self.version)
|
| 76 |
- |
|
| 76 |
+ |
|
| 77 | 77 |
return content |
| 78 |
- |
|
| 78 |
+ |
|
| 79 | 79 |
def updatePackageMacro(self,macro): |
| 80 | 80 |
if macro.macroName == "%post": |
| 81 | 81 |
self.postMacro=macro |
| ... | ... |
@@ -142,31 +142,39 @@ class Specutils(object): |
| 142 | 142 |
return buildArch |
| 143 | 143 |
|
| 144 | 144 |
def getRequiresAllPackages(self): |
| 145 |
- depedentPackages=[] |
|
| 145 |
+ dependentPackages=[] |
|
| 146 | 146 |
for key in self.spec.packages.keys(): |
| 147 | 147 |
pkg = self.spec.packages.get(key) |
| 148 | 148 |
for dpkg in pkg.requires: |
| 149 |
- depedentPackages.append(dpkg.package) |
|
| 150 |
- depedentPackages=list(set(depedentPackages)) |
|
| 149 |
+ dependentPackages.append(dpkg.package) |
|
| 150 |
+ dependentPackages=list(set(dependentPackages)) |
|
| 151 | 151 |
packageNames=self.getPackageNames() |
| 152 | 152 |
for pkgName in packageNames: |
| 153 |
- if pkgName in depedentPackages: |
|
| 154 |
- depedentPackages.remove(pkgName) |
|
| 155 |
- return depedentPackages |
|
| 153 |
+ if pkgName in dependentPackages: |
|
| 154 |
+ dependentPackages.remove(pkgName) |
|
| 155 |
+ return dependentPackages |
|
| 156 | 156 |
|
| 157 | 157 |
def getBuildRequiresAllPackages(self): |
| 158 |
- depedentPackages=[] |
|
| 158 |
+ dependentPackages=[] |
|
| 159 | 159 |
for key in self.spec.packages.keys(): |
| 160 | 160 |
pkg = self.spec.packages.get(key) |
| 161 | 161 |
for dpkg in pkg.buildrequires: |
| 162 |
- depedentPackages.append(dpkg.package) |
|
| 163 |
- depedentPackages=list(set(depedentPackages)) |
|
| 162 |
+ dependentPackages.append(dpkg.package) |
|
| 163 |
+ dependentPackages=list(set(dependentPackages)) |
|
| 164 | 164 |
packageNames=self.getPackageNames() |
| 165 | 165 |
for pkgName in packageNames: |
| 166 |
- if pkgName in depedentPackages: |
|
| 167 |
- depedentPackages.remove(pkgName) |
|
| 168 |
- return depedentPackages |
|
| 166 |
+ if pkgName in dependentPackages: |
|
| 167 |
+ dependentPackages.remove(pkgName) |
|
| 168 |
+ return dependentPackages |
|
| 169 | 169 |
|
| 170 |
+ def getCheckBuildRequiresAllPackages(self): |
|
| 171 |
+ dependentPackages=[] |
|
| 172 |
+ for key in self.spec.packages.keys(): |
|
| 173 |
+ pkg = self.spec.packages.get(key) |
|
| 174 |
+ for dpkg in pkg.checkbuildrequires: |
|
| 175 |
+ dependentPackages.append(dpkg.package) |
|
| 176 |
+ dependentPackages=list(set(dependentPackages)) |
|
| 177 |
+ return dependentPackages |
|
| 170 | 178 |
|
| 171 | 179 |
def getRequires(self,pkgName): |
| 172 | 180 |
dependentPackages=[] |
| ... | ... |
@@ -186,8 +194,17 @@ class Specutils(object): |
| 186 | 186 |
dependentPackages.append(dpkg.package) |
| 187 | 187 |
return dependentPackages |
| 188 | 188 |
|
| 189 |
+ def getCheckBuildRequires(self,pkgName): |
|
| 190 |
+ dependentPackages=[] |
|
| 191 |
+ for key in self.spec.packages.keys(): |
|
| 192 |
+ pkg = self.spec.packages.get(key) |
|
| 193 |
+ if pkg.name == pkgName: |
|
| 194 |
+ for dpkg in pkg.checkbuildrequires: |
|
| 195 |
+ dependentPackages.append(dpkg.package) |
|
| 196 |
+ return dependentPackages |
|
| 197 |
+ |
|
| 189 | 198 |
def getProvides(self,packageName): |
| 190 |
- depedentPackages=[] |
|
| 199 |
+ dependentPackages=[] |
|
| 191 | 200 |
defaultPkgName=self.spec.packages['default'].name |
| 192 | 201 |
pkg = None |
| 193 | 202 |
if self.spec.packages.has_key(packageName): |
| ... | ... |
@@ -196,10 +213,10 @@ class Specutils(object): |
| 196 | 196 |
pkg=self.spec.packages['default'] |
| 197 | 197 |
if pkg is not None: |
| 198 | 198 |
for dpkg in pkg.provides: |
| 199 |
- depedentPackages.append(dpkg.package) |
|
| 199 |
+ dependentPackages.append(dpkg.package) |
|
| 200 | 200 |
else: |
| 201 | 201 |
print "package not found" |
| 202 |
- return depedentPackages |
|
| 202 |
+ return dependentPackages |
|
| 203 | 203 |
|
| 204 | 204 |
def getVersion(self): |
| 205 | 205 |
pkg = self.spec.packages.get('default')
|