1. Remove SpecUtils as confusing intermediate layer between
SpecParser and SpecObject.
2. SpecParser.createSpecObject is responsible to convert internal
SpecParser data into SpecObject.
3. Move SpecObject to SpecStructures.py
4. Clean and comment SpecData.py
Change-Id: Ia86e4f2eef357891f38e00af2a0763ccada19534
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6203
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Bo Gan <ganb@vmware.com>
... | ... |
@@ -4,107 +4,83 @@ import queue |
4 | 4 |
import json |
5 | 5 |
import operator |
6 | 6 |
from distutils.version import StrictVersion |
7 |
-from SpecUtils import Specutils |
|
8 | 7 |
from Logger import Logger |
9 | 8 |
from constants import constants |
10 | 9 |
from StringUtils import StringUtils |
11 | 10 |
from distutils.version import LooseVersion |
11 |
+from SpecParser import SpecParser |
|
12 | 12 |
|
13 | 13 |
|
14 |
-class SpecObject(object): |
|
15 |
- def __init__(self): |
|
16 |
- self.listPackages = [] |
|
17 |
- self.listRPMPackages = [] |
|
18 |
- self.name = "" |
|
19 |
- self.version = "" |
|
20 |
- self.release = "" |
|
21 |
- self.buildarch = {} |
|
22 |
- self.buildRequiresAllPackages = [] |
|
23 |
- self.checkBuildRequirePackages = [] |
|
24 |
- self.installRequiresAllPackages = [] |
|
25 |
- self.installRequiresPackages = {} |
|
26 |
- self.specFile = "" |
|
27 |
- self.listSources = [] |
|
28 |
- self.checksums = {} |
|
29 |
- self.listPatches = [] |
|
30 |
- self.securityHardening = "" |
|
31 |
- self.url = "" |
|
32 |
- self.sourceurl = "" |
|
33 |
- self.license = "" |
|
34 |
- self.specDefs = {} |
|
35 |
- |
|
36 |
- |
|
37 |
-class SpecObjectsUtils(object): |
|
38 |
- |
|
39 |
- def __init__(self, logPath): |
|
14 |
+class SpecData(object): |
|
15 |
+ |
|
16 |
+ def __init__(self, logPath, specFilesPath): |
|
17 |
+ |
|
18 |
+ self.logger = Logger.getLogger("SpecData", logPath, constants.logLevel) |
|
19 |
+ |
|
20 |
+ # map default package name to list of SpecObjects. Usually it is just |
|
21 |
+ # a list with only one element. But, for multiversion spec file this |
|
22 |
+ # list has as many elements as many versions of given package name |
|
23 |
+ # are available |
|
40 | 24 |
self.mapSpecObjects = {} |
25 |
+ |
|
26 |
+ # map subpackage names to default package name |
|
41 | 27 |
self.mapPackageToSpec = {} |
28 |
+ |
|
29 |
+ # map spec file name to SpecObject |
|
42 | 30 |
self.mapSpecFileNameToSpecObj = {} |
43 |
- self.logger = Logger.getLogger("Serializable Spec objects", logPath, constants.logLevel) |
|
44 | 31 |
|
45 |
- def readSpecsAndConvertToSerializableObjects(self, specFilesPath): |
|
46 |
- listSpecFiles = [] |
|
47 |
- self.getListSpecFiles(listSpecFiles, specFilesPath) |
|
48 |
- for specFile in listSpecFiles: |
|
49 |
- spec = Specutils(specFile) |
|
50 |
- specName = spec.getBasePackageName() |
|
32 |
+ self._readSpecs(specFilesPath) |
|
33 |
+ |
|
51 | 34 |
|
52 |
- if (spec.getBuildArch(specName) != "noarch" and |
|
53 |
- platform.machine() != spec.getBuildArch(specName)): |
|
35 |
+ # Read all .spec files from the given folder including subfolders, |
|
36 |
+ # creates corresponding SpecObjects and put them in internal mappings. |
|
37 |
+ def _readSpecs(self, specFilesPath): |
|
38 |
+ for specFile in self._getListSpecFiles(specFilesPath): |
|
39 |
+ spec = SpecParser(specFile) |
|
40 |
+ |
|
41 |
+ # skip the specfile if buildarch differs |
|
42 |
+ buildarch = spec.packages.get('default').buildarch |
|
43 |
+ if (buildarch != "noarch" and |
|
44 |
+ platform.machine() != buildarch): |
|
54 | 45 |
self.logger.info("skipping spec file: "+str(specFile)) |
55 | 46 |
continue |
56 | 47 |
|
57 |
- specObj = SpecObject() |
|
58 |
- specObj.name = specName |
|
59 |
- specObj.buildRequiresAllPackages = spec.getBuildRequiresAllPackages() |
|
60 |
- specObj.extraBuildRequires = spec.getExtraBuildRequires() |
|
61 |
- specObj.installRequiresAllPackages = spec.getRequiresAllPackages() |
|
62 |
- specObj.checkBuildRequirePackages = spec.getCheckBuildRequiresAllPackages() |
|
63 |
- specObj.listPackages = spec.getPackageNames() |
|
64 |
- specObj.specFile = specFile |
|
65 |
- specObj.version = spec.getVersion() |
|
66 |
- specObj.release = spec.getRelease() |
|
67 |
- specObj.listSources = spec.getSourceNames() |
|
68 |
- specObj.checksums = spec.getChecksums() |
|
69 |
- specObj.specDefs = spec.getDefinitions() |
|
70 |
- specObj.listPatches = spec.getPatchNames() |
|
71 |
- specObj.securityHardening = spec.getSecurityHardeningOption() |
|
72 |
- specObj.isCheckAvailable = spec.isCheckAvailable() |
|
73 |
- specObj.license = spec.getLicense() |
|
74 |
- specObj.url = spec.getURL() |
|
75 |
- specObj.sourceurl = spec.getSourceURL() |
|
48 |
+ specObj = spec.createSpecObject() |
|
49 |
+ |
|
50 |
+ name = specObj.name |
|
76 | 51 |
for specPkg in specObj.listPackages: |
77 |
- specObj.installRequiresPackages[specPkg] = spec.getRequires(specPkg) |
|
78 |
- specObj.buildarch[specPkg] = spec.getBuildArch(specPkg) |
|
79 |
- # TODO add multiversioning support |
|
80 |
- self.mapPackageToSpec[specPkg] = specName |
|
81 |
- if spec.getIsRPMPackage(specPkg): |
|
82 |
- specObj.listRPMPackages.append(specPkg) |
|
83 |
- if specName in self.mapSpecObjects: |
|
84 |
- self.mapSpecObjects[specName].append(specObj) |
|
52 |
+ self.mapPackageToSpec[specPkg] = name |
|
53 |
+ |
|
54 |
+ if name in self.mapSpecObjects: |
|
55 |
+ self.mapSpecObjects[name].append(specObj) |
|
85 | 56 |
else: |
86 |
- self.mapSpecObjects[specName]=[specObj] |
|
57 |
+ self.mapSpecObjects[name]=[specObj] |
|
58 |
+ |
|
87 | 59 |
self.mapSpecFileNameToSpecObj[os.path.basename(specFile)]=specObj |
88 | 60 |
|
61 |
+ |
|
62 |
+ # Sort the multiversion list to make getHighestVersion happy |
|
89 | 63 |
for key, value in self.mapSpecObjects.items(): |
90 | 64 |
if len(value) > 1: |
91 | 65 |
self.mapSpecObjects[key] = sorted(value, |
92 | 66 |
key=lambda x : self.compareVersions(x), |
93 | 67 |
reverse=True) |
94 | 68 |
|
95 |
- def getListSpecFiles(self, listSpecFiles, path): |
|
69 |
+ def _getListSpecFiles(self, path): |
|
70 |
+ listSpecFiles = [] |
|
96 | 71 |
for dirEntry in os.listdir(path): |
97 | 72 |
dirEntryPath = os.path.join(path, dirEntry) |
98 | 73 |
if (os.path.isfile(dirEntryPath) and |
99 | 74 |
dirEntryPath.endswith(".spec")): |
100 | 75 |
listSpecFiles.append(dirEntryPath) |
101 | 76 |
elif os.path.isdir(dirEntryPath): |
102 |
- self.getListSpecFiles(listSpecFiles, dirEntryPath) |
|
77 |
+ listSpecFiles.extend(self._getListSpecFiles(dirEntryPath)) |
|
78 |
+ return listSpecFiles |
|
103 | 79 |
|
104 | 80 |
def _getProperVersion(self,depPkg): |
105 | 81 |
if (depPkg.compare == ""): |
106 | 82 |
return self.getHighestVersion(depPkg.package) |
107 |
- specObjs=self.getSpecObj(depPkg.package) |
|
83 |
+ specObjs=self.getSpecObjects(depPkg.package) |
|
108 | 84 |
try: |
109 | 85 |
for obj in specObjs: |
110 | 86 |
verrel=obj.version+"-"+obj.release |
... | ... |
@@ -139,8 +115,7 @@ class SpecObjectsUtils(object): |
139 | 139 |
" available specs:" + availableVersions) |
140 | 140 |
|
141 | 141 |
def _getSpecObjField(self, package, version, field): |
142 |
- specName = self.getSpecName(package) |
|
143 |
- for specObj in self.mapSpecObjects[specName]: |
|
142 |
+ for specObj in self.getSpecObjects(package): |
|
144 | 143 |
if specObj.version == version: |
145 | 144 |
return field(specObj) |
146 | 145 |
self.logger.error("Could not find " + package + |
... | ... |
@@ -149,7 +124,7 @@ class SpecObjectsUtils(object): |
149 | 149 |
|
150 | 150 |
def getBuildRequiresForPackage(self, package, version): |
151 | 151 |
buildRequiresList=[] |
152 |
- for pkg in self._getSpecObjField(package, version, field=lambda x : x.buildRequiresAllPackages): |
|
152 |
+ for pkg in self._getSpecObjField(package, version, field=lambda x : x.buildRequires): |
|
153 | 153 |
properVersion = self._getProperVersion(pkg) |
154 | 154 |
buildRequiresList.append(pkg.package+"-"+properVersion) |
155 | 155 |
return buildRequiresList |
... | ... |
@@ -168,7 +143,7 @@ class SpecObjectsUtils(object): |
168 | 168 |
# Returns list of [ "pkg1-vers1", "pkg2-vers2",.. ] |
169 | 169 |
def getRequiresAllForPackage(self, package, version): |
170 | 170 |
requiresList=[] |
171 |
- for pkg in self._getSpecObjField(package, version, field=lambda x : x.installRequiresAllPackages): |
|
171 |
+ for pkg in self._getSpecObjField(package, version, field=lambda x : x.installRequires): |
|
172 | 172 |
properVersion = self._getProperVersion(pkg) |
173 | 173 |
requiresList.append(pkg.package+"-"+properVersion) |
174 | 174 |
return requiresList |
... | ... |
@@ -179,8 +154,7 @@ class SpecObjectsUtils(object): |
179 | 179 |
|
180 | 180 |
def getRequiresForPackage(self, package, version): |
181 | 181 |
requiresList=[] |
182 |
- specName = self.getSpecName(package) |
|
183 |
- for specObj in self.mapSpecObjects[specName]: |
|
182 |
+ for specObj in self.getSpecObjects(package): |
|
184 | 183 |
if specObj.version == version: |
185 | 184 |
if package in specObj.installRequiresPackages: |
186 | 185 |
requiresPackages = specObj.installRequiresPackages[package] |
... | ... |
@@ -198,13 +172,14 @@ class SpecObjectsUtils(object): |
198 | 198 |
|
199 | 199 |
def getCheckBuildRequiresForPackage(self, package, version): |
200 | 200 |
checkBuildRequiresList=[] |
201 |
- checkBuildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.checkBuildRequirePackages) |
|
201 |
+ checkBuildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.checkBuildRequires) |
|
202 | 202 |
for pkg in checkBuildRequiresPackages: |
203 | 203 |
properVersion = self._getProperVersion(pkg) |
204 | 204 |
checkBuildRequiresList.append(pkg.package+"-"+properVersion) |
205 | 205 |
return checkBuildRequiresList |
206 | 206 |
|
207 |
- def getSpecObj(self, package): |
|
207 |
+ # Returns list of SpecObjects for given subpackage name |
|
208 |
+ def getSpecObjects(self, package): |
|
208 | 209 |
specName=self.getSpecName(package) |
209 | 210 |
return self.mapSpecObjects[specName] |
210 | 211 |
|
... | ... |
@@ -219,14 +194,12 @@ class SpecObjectsUtils(object): |
219 | 219 |
|
220 | 220 |
def getVersions(self, package): |
221 | 221 |
versions=[] |
222 |
- specName = self.getSpecName(package) |
|
223 |
- for specObj in self.mapSpecObjects[specName]: |
|
222 |
+ for specObj in self.getSpecObjects(package): |
|
224 | 223 |
versions.append(specObj.version) |
225 | 224 |
return versions |
226 | 225 |
|
227 | 226 |
def getHighestVersion(self, package): |
228 |
- specName = self.getSpecName(package) |
|
229 |
- return self.mapSpecObjects[specName][0].version |
|
227 |
+ return self.getSpecObjects(package)[0].version |
|
230 | 228 |
|
231 | 229 |
def getBuildArch(self, package, version): |
232 | 230 |
return self._getSpecObjField(package, version, field=lambda x : x.buildarch[package]) |
... | ... |
@@ -315,9 +288,9 @@ class SpecObjectsUtils(object): |
315 | 315 |
self.logger.debug("List RPM packages") |
316 | 316 |
self.logger.debug(specObj.listPackages) |
317 | 317 |
self.logger.debug("Build require packages") |
318 |
- self.logger.debug(self.getPkgNamesFromObj(specObj.buildRequiresAllPackages)) |
|
318 |
+ self.logger.debug(self.getPkgNamesFromObj(specObj.buildRequires)) |
|
319 | 319 |
self.logger.debug("install require packages") |
320 |
- self.logger.debug(self.getPkgNamesFromObj(specObj.installRequiresAllPackages)) |
|
320 |
+ self.logger.debug(self.getPkgNamesFromObj(specObj.installRequires)) |
|
321 | 321 |
self.logger.debug(specObj.installRequiresPackages) |
322 | 322 |
self.logger.debug("security_hardening: " + specObj.securityHardening) |
323 | 323 |
self.logger.debug("------------------------------------------------") |
... | ... |
@@ -346,12 +319,13 @@ class SPECS(object): |
346 | 346 |
# Preparse some files |
347 | 347 |
|
348 | 348 |
# adding kernelversion rpm macro |
349 |
- spec = Specutils(constants.specPath + "/linux/linux.spec") |
|
350 |
- kernelversion = spec.getVersion() |
|
349 |
+ spec = SpecParser(constants.specPath + "/linux/linux.spec") |
|
350 |
+ defPkg = spec.packages.get('default') |
|
351 |
+ kernelversion = defPkg.version |
|
351 | 352 |
constants.addMacro("KERNEL_VERSION", kernelversion) |
352 | 353 |
|
353 | 354 |
# adding kernelrelease rpm macro |
354 |
- kernelrelease = spec.getRelease() |
|
355 |
+ kernelrelease = defPkg.release |
|
355 | 356 |
constants.addMacro("KERNEL_RELEASE", kernelrelease) |
356 | 357 |
|
357 | 358 |
# adding kernelsubrelease rpm macro |
... | ... |
@@ -364,6 +338,5 @@ class SPECS(object): |
364 | 364 |
constants.addMacro("kernelsubrelease", kernelsubrelease) |
365 | 365 |
|
366 | 366 |
# Full parsing |
367 |
- self.specData = SpecObjectsUtils(constants.logPath) |
|
368 |
- self.specData.readSpecsAndConvertToSerializableObjects(constants.specPath) |
|
367 |
+ self.specData = SpecData(constants.logPath, constants.specPath) |
|
369 | 368 |
|
... | ... |
@@ -2,29 +2,40 @@ |
2 | 2 |
import re |
3 | 3 |
import platform |
4 | 4 |
from StringUtils import StringUtils |
5 |
-from SpecStructures import rpmMacro, dependentPackageData, Package |
|
5 |
+from SpecStructures import dependentPackageData, Package, SpecObject |
|
6 | 6 |
from constants import constants |
7 | 7 |
|
8 | 8 |
class SpecParser(object): |
9 | 9 |
|
10 |
- def __init__(self): |
|
11 |
- self.cleanMacro = rpmMacro().setName("clean") |
|
12 |
- self.prepMacro = rpmMacro().setName("prep") |
|
13 |
- self.buildMacro = rpmMacro().setName("build") |
|
14 |
- self.installMacro = rpmMacro().setName("install") |
|
15 |
- self.changelogMacro = rpmMacro().setName("changelog") |
|
16 |
- self.checkMacro = rpmMacro().setName("check") |
|
10 |
+ class rpmMacro(object): |
|
11 |
+ def __init__(self): |
|
12 |
+ self.macroName = "" |
|
13 |
+ self.macroFlag = "" |
|
14 |
+ self.content = "" |
|
15 |
+ self.position = -1 |
|
16 |
+ self.endposition = -1 |
|
17 |
+ |
|
18 |
+ def __init__(self, specfile): |
|
19 |
+ self.cleanMacro = None |
|
20 |
+ self.prepMacro = None |
|
21 |
+ self.buildMacro = None |
|
22 |
+ self.installMacro = None |
|
23 |
+ self.changelogMacro = None |
|
24 |
+ self.checkMacro = None |
|
17 | 25 |
self.packages = {} |
18 | 26 |
self.specAdditionalContent = "" |
19 | 27 |
self.globalSecurityHardening = "" |
20 | 28 |
self.defs = {} |
21 | 29 |
self.conditionalCheckMacroEnabled = False |
22 | 30 |
self.macro_pattern = re.compile(r'%{(\S+?)\}') |
31 |
+ self.specfile = specfile |
|
23 | 32 |
|
24 |
- def parseSpecFile(self, specfile): |
|
25 |
- self._createDefaultPackage() |
|
33 |
+ self._parseSpecFile() |
|
34 |
+ |
|
35 |
+ def _parseSpecFile(self): |
|
36 |
+ self.packages["default"] = Package() |
|
26 | 37 |
currentPkg = "default" |
27 |
- with open(specfile) as specFile: |
|
38 |
+ with open(self.specfile) as specFile: |
|
28 | 39 |
lines = specFile.readlines() |
29 | 40 |
totalLines = len(lines) |
30 | 41 |
i = 0 |
... | ... |
@@ -177,11 +188,8 @@ class SpecParser(object): |
177 | 177 |
string = string.replace(macro, value) |
178 | 178 |
return re.sub(self.macro_pattern, _macro_repl, string) |
179 | 179 |
|
180 |
- def _createDefaultPackage(self): |
|
181 |
- self.packages["default"] = Package() |
|
182 |
- |
|
183 | 180 |
def _readMacroFromFile(self, currentPos, lines): |
184 |
- macro = rpmMacro() |
|
181 |
+ macro = self.rpmMacro() |
|
185 | 182 |
line = lines[currentPos] |
186 | 183 |
macro.position = currentPos |
187 | 184 |
macro.endposition = currentPos |
... | ... |
@@ -208,23 +216,17 @@ class SpecParser(object): |
208 | 208 |
def _updateSpecMacro(self, macro): |
209 | 209 |
if macro.macroName == "%clean": |
210 | 210 |
self.cleanMacro = macro |
211 |
- return True |
|
212 | 211 |
if macro.macroName == "%prep": |
213 | 212 |
self.prepMacro = macro |
214 |
- return True |
|
215 | 213 |
if macro.macroName == "%build": |
216 | 214 |
self.buildMacro = macro |
217 |
- return True |
|
218 | 215 |
if macro.macroName == "%install": |
219 | 216 |
self.installMacro = macro |
220 |
- return True |
|
221 | 217 |
if macro.macroName == "%changelog": |
222 | 218 |
self.changelogMacro = macro |
223 |
- return True |
|
224 | 219 |
if macro.macroName == "%check": |
225 | 220 |
self.checkMacro = macro |
226 |
- return True |
|
227 |
- return False |
|
221 |
+ |
|
228 | 222 |
def _isMacro(self, line): |
229 | 223 |
return (self._isPackageMacro(line) or |
230 | 224 |
self._isSpecMacro(line) or |
... | ... |
@@ -495,3 +497,107 @@ class SpecParser(object): |
495 | 495 |
|
496 | 496 |
def _isConditionalMacroEnd(self, line): |
497 | 497 |
return line.strip() == "%endif" |
498 |
+ |
|
499 |
+ ######################################################################## |
|
500 |
+ # SpecObject generating functions |
|
501 |
+ ######################################################################## |
|
502 |
+ |
|
503 |
+ # |
|
504 |
+ # @requiresType: "build" for BuildRequires or |
|
505 |
+ # "install" for Requires dependencies. |
|
506 |
+ def _getRequiresTypeAllPackages(self, requiresType): |
|
507 |
+ dependentPackages = [] |
|
508 |
+ for pkg in self.packages.values(): |
|
509 |
+ if requiresType == "build": |
|
510 |
+ dependentPackages.extend(pkg.buildrequires) |
|
511 |
+ elif requiresType == "install": |
|
512 |
+ dependentPackages.extend(pkg.requires) |
|
513 |
+ listDependentPackages = dependentPackages.copy() |
|
514 |
+ packageNames = self._getPackageNames() |
|
515 |
+ for pkg in self.packages.values(): |
|
516 |
+ for objName in listDependentPackages: |
|
517 |
+ if objName.package == pkg.name: |
|
518 |
+ dependentPackages.remove(objName) |
|
519 |
+ return dependentPackages |
|
520 |
+ |
|
521 |
+ def _getCheckBuildRequiresAllPackages(self): |
|
522 |
+ dependentPackages = [] |
|
523 |
+ for pkg in self.packages.values(): |
|
524 |
+ dependentPackages.extend(pkg.checkbuildrequires) |
|
525 |
+ return dependentPackages |
|
526 |
+ |
|
527 |
+ def _getExtraBuildRequires(self): |
|
528 |
+ dependentPackages = [] |
|
529 |
+ for pkg in self.packages.values(): |
|
530 |
+ dependentPackages.extend(pkg.extrabuildrequires) |
|
531 |
+ return dependentPackages |
|
532 |
+ |
|
533 |
+ def _getPackageNames(self): |
|
534 |
+ packageNames = [] |
|
535 |
+ for pkg in self.packages.values(): |
|
536 |
+ packageNames.append(pkg.name) |
|
537 |
+ return packageNames |
|
538 |
+ |
|
539 |
+ def _getSourceNames(self): |
|
540 |
+ sourceNames = [] |
|
541 |
+ strUtils = StringUtils() |
|
542 |
+ pkg = self.packages.get('default') |
|
543 |
+ for source in pkg.sources: |
|
544 |
+ sourceName = strUtils.getFileNameFromURL(source) |
|
545 |
+ sourceNames.append(sourceName) |
|
546 |
+ return sourceNames |
|
547 |
+ |
|
548 |
+ def _getPatchNames(self): |
|
549 |
+ patchNames = [] |
|
550 |
+ strUtils = StringUtils() |
|
551 |
+ pkg = self.packages.get('default') |
|
552 |
+ for patch in pkg.patches: |
|
553 |
+ patchName = strUtils.getFileNameFromURL(patch) |
|
554 |
+ patchNames.append(patchName) |
|
555 |
+ return patchNames |
|
556 |
+ |
|
557 |
+ def _getSourceURL(self): |
|
558 |
+ pkg = self.packages.get('default') |
|
559 |
+ if not pkg.sources: |
|
560 |
+ return None |
|
561 |
+ sourceURL = pkg.sources[0] |
|
562 |
+ if sourceURL.startswith("http") or sourceURL.startswith("ftp"): |
|
563 |
+ return sourceURL |
|
564 |
+ return None |
|
565 |
+ |
|
566 |
+ def _getRequires(self, pkgName): |
|
567 |
+ dependentPackages = [] |
|
568 |
+ for pkg in self.packages.values(): |
|
569 |
+ if pkg.name == pkgName: |
|
570 |
+ dependentPackages.extend(pkg.requires) |
|
571 |
+ return dependentPackages |
|
572 |
+ |
|
573 |
+ # Convert parsed data into SpecObject |
|
574 |
+ def createSpecObject(self): |
|
575 |
+ specObj = SpecObject() |
|
576 |
+ specObj.specFile = self.specfile |
|
577 |
+ defPkg = self.packages.get('default') |
|
578 |
+ specObj.name = defPkg.name |
|
579 |
+ specObj.version = defPkg.version |
|
580 |
+ specObj.release = defPkg.release |
|
581 |
+ specObj.checksums = defPkg.checksums |
|
582 |
+ specObj.license = defPkg.license |
|
583 |
+ specObj.url = defPkg.URL |
|
584 |
+ specObj.securityHardening = self.globalSecurityHardening |
|
585 |
+ specObj.isCheckAvailable = self.checkMacro is not None |
|
586 |
+ specObj.buildRequires = self._getRequiresTypeAllPackages("build") |
|
587 |
+ specObj.installRequires = self._getRequiresTypeAllPackages("install") |
|
588 |
+ specObj.checkBuildRequires = self._getCheckBuildRequiresAllPackages() |
|
589 |
+ specObj.extraBuildRequires = self._getExtraBuildRequires() |
|
590 |
+ specObj.listPackages = self._getPackageNames() |
|
591 |
+ specObj.listSources = self._getSourceNames() |
|
592 |
+ specObj.listPatches = self._getPatchNames() |
|
593 |
+ specObj.sourceurl = self._getSourceURL() |
|
594 |
+ |
|
595 |
+ for pkg in self.packages.values(): |
|
596 |
+ specObj.installRequiresPackages[pkg.name] = pkg.requires |
|
597 |
+ specObj.buildarch[pkg.name] = pkg.buildarch |
|
598 |
+ if pkg.filesMacro: |
|
599 |
+ specObj.listRPMPackages.append(pkg.name) |
|
600 |
+ |
|
601 |
+ return specObj |
... | ... |
@@ -1,24 +1,5 @@ |
1 | 1 |
import platform |
2 | 2 |
|
3 |
-class rpmMacro(object): |
|
4 |
- |
|
5 |
- def __init__(self): |
|
6 |
- self.macroName = "" |
|
7 |
- self.macroFlag = "" |
|
8 |
- self.content = "" |
|
9 |
- self.position = -1 |
|
10 |
- self.endposition = -1 |
|
11 |
- |
|
12 |
- def setName(self, name): |
|
13 |
- self.macroName = name |
|
14 |
- |
|
15 |
- def displayMacro(self): |
|
16 |
- print("Macro:") |
|
17 |
- print(self.macroName + " {}".format(self.macroFlag) |
|
18 |
- + " {}".format(self.position) |
|
19 |
- + " {}".format(self.endposition)) |
|
20 |
- print(self.content) |
|
21 |
- |
|
22 | 3 |
class dependentPackageData(object): |
23 | 4 |
|
24 | 5 |
def __init__(self): |
... | ... |
@@ -70,14 +51,40 @@ class Package(object): |
70 | 70 |
def updatePackageMacro(self, macro): |
71 | 71 |
if macro.macroName == "%post": |
72 | 72 |
self.postMacro = macro |
73 |
- return True |
|
74 | 73 |
if macro.macroName == "%postun": |
75 | 74 |
self.postunMacro = macro |
76 |
- return True |
|
77 | 75 |
if macro.macroName == "%files": |
78 | 76 |
self.filesMacro = macro |
79 |
- return True |
|
80 | 77 |
if macro.macroName == "%description": |
81 | 78 |
self.descriptionMacro = macro |
82 |
- return True |
|
83 |
- return False |
|
79 |
+ |
|
80 |
+class SpecObject(object): |
|
81 |
+ def __init__(self): |
|
82 |
+ self.name = "" |
|
83 |
+ self.version = "" |
|
84 |
+ self.release = "" |
|
85 |
+ # map subpackage name to its buildarch |
|
86 |
+ self.buildarch = {} |
|
87 |
+ # list of subpackage names |
|
88 |
+ self.listPackages = [] |
|
89 |
+ # list of subpackage names that have %files section |
|
90 |
+ self.listRPMPackages = [] |
|
91 |
+ |
|
92 |
+ # Next four lists store dependentPackageData objects |
|
93 |
+ self.buildRequires = [] |
|
94 |
+ self.installRequires = [] |
|
95 |
+ self.checkBuildRequires = [] |
|
96 |
+ self.extraBuildRequires = [] |
|
97 |
+ # map subpackage name to list of install requires |
|
98 |
+ # dependentPackageData objects |
|
99 |
+ self.installRequiresPackages = {} |
|
100 |
+ |
|
101 |
+ # full spec file name |
|
102 |
+ self.specFile = "" |
|
103 |
+ self.listSources = [] |
|
104 |
+ self.checksums = {} |
|
105 |
+ self.listPatches = [] |
|
106 |
+ self.securityHardening = "" |
|
107 |
+ self.url = "" |
|
108 |
+ self.sourceurl = "" |
|
109 |
+ self.license = "" |
84 | 110 |
deleted file mode 100644 |
... | ... |
@@ -1,195 +0,0 @@ |
1 |
-# pylint: disable=invalid-name,missing-docstring |
|
2 |
-import os |
|
3 |
-from SpecParser import SpecParser |
|
4 |
-from StringUtils import StringUtils |
|
5 |
- |
|
6 |
-class Specutils(object): |
|
7 |
- |
|
8 |
- def __init__(self, specfile): |
|
9 |
- self.specfile = "" |
|
10 |
- self.spec = SpecParser() |
|
11 |
- if Specutils._isSpecFile(specfile): |
|
12 |
- self.specfile = specfile |
|
13 |
- self.spec.parseSpecFile(self.specfile) |
|
14 |
- |
|
15 |
- @staticmethod |
|
16 |
- def _isSpecFile(specfile): |
|
17 |
- if os.path.isfile(specfile) and specfile.endswith(".spec"): |
|
18 |
- return True |
|
19 |
- return False |
|
20 |
- |
|
21 |
- def getSourceNames(self): |
|
22 |
- sourceNames = [] |
|
23 |
- strUtils = StringUtils() |
|
24 |
- pkg = self.spec.packages.get('default') |
|
25 |
- if pkg is None: |
|
26 |
- return None |
|
27 |
- for source in pkg.sources: |
|
28 |
- sourceName = strUtils.getFileNameFromURL(source) |
|
29 |
- sourceNames.append(sourceName) |
|
30 |
- return sourceNames |
|
31 |
- |
|
32 |
- def getChecksums(self): |
|
33 |
- pkg = self.spec.packages.get('default') |
|
34 |
- return pkg.checksums |
|
35 |
- |
|
36 |
- def getPatchNames(self): |
|
37 |
- patchNames = [] |
|
38 |
- strUtils = StringUtils() |
|
39 |
- pkg = self.spec.packages.get('default') |
|
40 |
- if pkg is None: |
|
41 |
- return None |
|
42 |
- for patch in pkg.patches: |
|
43 |
- patchName = strUtils.getFileNameFromURL(patch) |
|
44 |
- patchNames.append(patchName) |
|
45 |
- return patchNames |
|
46 |
- |
|
47 |
- def getPackageNames(self): |
|
48 |
- packageNames = [] |
|
49 |
- for pkg in self.spec.packages.values(): |
|
50 |
- packageNames.append(pkg.name) |
|
51 |
- return packageNames |
|
52 |
- |
|
53 |
- def getIsRPMPackage(self, pkgName): |
|
54 |
- defaultPkgName = self.spec.packages['default'].name |
|
55 |
- if pkgName == defaultPkgName: |
|
56 |
- pkgName = "default" |
|
57 |
- if pkgName in self.spec.packages.keys(): |
|
58 |
- pkg = self.spec.packages.get(pkgName) |
|
59 |
- if pkg.filesMacro is not None: |
|
60 |
- return True |
|
61 |
- return False |
|
62 |
- |
|
63 |
- def getRPMNames(self): |
|
64 |
- rpmNames = [] |
|
65 |
- for pkg in self.spec.packages.values(): |
|
66 |
- rpmName = pkg.name + "-" + pkg.version + "-" + pkg.release |
|
67 |
- rpmNames.append(rpmName) |
|
68 |
- return rpmNames |
|
69 |
- |
|
70 |
- def getLicense(self): |
|
71 |
- pkg = self.spec.packages.get('default') |
|
72 |
- if pkg is None: |
|
73 |
- return None |
|
74 |
- return pkg.license |
|
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 |
- |
|
83 |
- def getURL(self): |
|
84 |
- pkg = self.spec.packages.get('default') |
|
85 |
- if pkg is None: |
|
86 |
- return None |
|
87 |
- return pkg.URL |
|
88 |
- |
|
89 |
- def getSourceURL(self): |
|
90 |
- pkg = self.spec.packages.get('default') |
|
91 |
- if pkg is None: |
|
92 |
- return None |
|
93 |
- if not pkg.sources: |
|
94 |
- return None |
|
95 |
- sourceURL = pkg.sources[0] |
|
96 |
- if sourceURL.startswith("http") or sourceURL.startswith("ftp"): |
|
97 |
- return sourceURL |
|
98 |
- return None |
|
99 |
- |
|
100 |
- # @requiresType: "build" for BuildRequires or |
|
101 |
- # "install" for Requires dependencies. |
|
102 |
- def _getRequiresTypeAllPackages(self, requiresType): |
|
103 |
- dependentPackages = [] |
|
104 |
- for pkg in self.spec.packages.values(): |
|
105 |
- if requiresType == "build": |
|
106 |
- dependentPackages.extend(pkg.buildrequires) |
|
107 |
- elif requiresType == "install": |
|
108 |
- dependentPackages.extend(pkg.requires) |
|
109 |
- listDependentPackages = dependentPackages.copy() |
|
110 |
- packageNames = self.getPackageNames() |
|
111 |
- for pkgName in packageNames: |
|
112 |
- for objName in listDependentPackages: |
|
113 |
- if objName.package == pkgName: |
|
114 |
- dependentPackages.remove(objName) |
|
115 |
- return dependentPackages |
|
116 |
- |
|
117 |
- def getBuildRequiresAllPackages(self): |
|
118 |
- return self._getRequiresTypeAllPackages("build") |
|
119 |
- |
|
120 |
- def getRequiresAllPackages(self): |
|
121 |
- return self._getRequiresTypeAllPackages("install") |
|
122 |
- |
|
123 |
- def getCheckBuildRequiresAllPackages(self): |
|
124 |
- dependentPackages = [] |
|
125 |
- for pkg in self.spec.packages.values(): |
|
126 |
- dependentPackages.extend(pkg.checkbuildrequires) |
|
127 |
- return dependentPackages |
|
128 |
- |
|
129 |
- def getExtraBuildRequires(self): |
|
130 |
- dependentPackages = [] |
|
131 |
- for pkg in self.spec.packages.values(): |
|
132 |
- dependentPackages.extend(pkg.extrabuildrequires) |
|
133 |
- return dependentPackages |
|
134 |
- |
|
135 |
- def getRequires(self, pkgName): |
|
136 |
- dependentPackages = [] |
|
137 |
- for pkg in self.spec.packages.values(): |
|
138 |
- if pkg.name == pkgName: |
|
139 |
- dependentPackages.extend(pkg.requires) |
|
140 |
- return dependentPackages |
|
141 |
- |
|
142 |
- def getProvides(self, packageName): |
|
143 |
- dependentPackages = [] |
|
144 |
- defaultPkgName = self.spec.packages['default'].name |
|
145 |
- pkg = None |
|
146 |
- if packageName in self.spec.packages: |
|
147 |
- pkg = self.spec.packages.get(packageName) |
|
148 |
- if defaultPkgName == packageName: |
|
149 |
- pkg = self.spec.packages['default'] |
|
150 |
- if pkg is not None: |
|
151 |
- for dpkg in pkg.provides: |
|
152 |
- dependentPackages.append(dpkg.package) |
|
153 |
- else: |
|
154 |
- print("package not found") |
|
155 |
- return dependentPackages |
|
156 |
- |
|
157 |
- def getVersion(self): |
|
158 |
- pkg = self.spec.packages.get('default') |
|
159 |
- return pkg.version |
|
160 |
- |
|
161 |
- def getRelease(self): |
|
162 |
- pkg = self.spec.packages.get('default') |
|
163 |
- return pkg.release |
|
164 |
- |
|
165 |
- def getBasePackageName(self): |
|
166 |
- pkg = self.spec.packages.get('default') |
|
167 |
- return pkg.name |
|
168 |
- |
|
169 |
- def getSecurityHardeningOption(self): |
|
170 |
- return self.spec.globalSecurityHardening |
|
171 |
- |
|
172 |
- def isCheckAvailable(self): |
|
173 |
- check = False |
|
174 |
- if self.spec.checkMacro is not None: |
|
175 |
- check = True |
|
176 |
- return check |
|
177 |
- |
|
178 |
- def getDefinitions(self): |
|
179 |
- return self.spec.defs |
|
180 |
- |
|
181 |
-def main(): |
|
182 |
- spec = Specutils("/workspace1/myrepos/photon/SPECS/docker/docker.spec") |
|
183 |
- print("packages {}".format(spec.getPackageNames())) |
|
184 |
- print("packages {}".format(spec.getRPMNames())) |
|
185 |
- print("sources {}".format(spec.getSourceNames())) |
|
186 |
- print("patches {}".format(spec.getPatchNames())) |
|
187 |
- print("requires {}".format(spec.getRequires('libltdl-devel'))) |
|
188 |
- print("requires {}".format(spec.getRequires('libtool'))) |
|
189 |
- |
|
190 |
- print("provides {}".format(spec.getProvides('libtool'))) |
|
191 |
- print("all-requires {}".format(spec.getPkgNamesFromObj(spec.getRequiresAllPackages()))) |
|
192 |
- print("all-build-requires {}".format(spec.getPkgNamesFromObj(spec.getBuildRequiresAllPackages()))) |
|
193 |
- |
|
194 |
-if __name__ == '__main__': |
|
195 |
- main() |