Browse code

Package builder: simplify SpecParser

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>

Alexey Makhalov authored on 2018/11/20 12:48:23
Showing 4 changed files
... ...
@@ -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()