support/package-builder/SpecUtils.py
326d5ca8
 # pylint: disable=invalid-name,missing-docstring
2820c61a
 import os
87815216
 from SpecParser import SpecParser
 from StringUtils import StringUtils
2820c61a
 
 class Specutils(object):
5062126c
 
87815216
     def __init__(self, specfile):
         self.specfile = ""
2820c61a
         self.spec = SpecParser()
326d5ca8
         if Specutils._isSpecFile(specfile):
87815216
             self.specfile = specfile
2820c61a
             self.spec.parseSpecFile(self.specfile)
5062126c
 
326d5ca8
     @staticmethod
     def _isSpecFile(specfile):
87815216
         if os.path.isfile(specfile) and specfile.endswith(".spec"):
2820c61a
             return True
         return False
5062126c
 
2820c61a
     def getSourceNames(self):
87815216
         sourceNames = []
2820c61a
         strUtils = StringUtils()
         pkg = self.spec.packages.get('default')
         if pkg is None:
             return None
         for source in pkg.sources:
87815216
             sourceName = strUtils.getFileNameFromURL(source)
2820c61a
             sourceNames.append(sourceName)
         return sourceNames
5062126c
 
3cc43c92
     def getChecksums(self):
         pkg = self.spec.packages.get('default')
         return pkg.checksums
7253ce7d
 
2820c61a
     def getPatchNames(self):
87815216
         patchNames = []
2820c61a
         strUtils = StringUtils()
         pkg = self.spec.packages.get('default')
         if pkg is None:
             return None
         for patch in pkg.patches:
87815216
             patchName = strUtils.getFileNameFromURL(patch)
2820c61a
             patchNames.append(patchName)
         return patchNames
5062126c
 
2820c61a
     def getPackageNames(self):
87815216
         packageNames = []
         for pkg in self.spec.packages.values():
2820c61a
             packageNames.append(pkg.name)
         return packageNames
5062126c
 
87815216
     def getIsRPMPackage(self, pkgName):
         defaultPkgName = self.spec.packages['default'].name
adf248d5
         if pkgName == defaultPkgName:
             pkgName = "default"
         if pkgName in self.spec.packages.keys():
             pkg = self.spec.packages.get(pkgName)
             if pkg.filesMacro is not None:
                 return True
         return False
 
2820c61a
     def getRPMNames(self):
87815216
         rpmNames = []
         for pkg in self.spec.packages.values():
             rpmName = pkg.name + "-" + pkg.version + "-" + pkg.release
2820c61a
             rpmNames.append(rpmName)
         return rpmNames
 
5062126c
     def getLicense(self):
         pkg = self.spec.packages.get('default')
         if pkg is None:
             return None
         return pkg.license
2820c61a
 
5062126c
     def getURL(self):
         pkg = self.spec.packages.get('default')
         if pkg is None:
             return None
         return pkg.URL
 
     def getSourceURL(self):
         pkg = self.spec.packages.get('default')
         if pkg is None:
             return None
326d5ca8
         if not pkg.sources:
5062126c
             return None
         sourceURL = pkg.sources[0]
         if sourceURL.startswith("http") or sourceURL.startswith("ftp"):
             return sourceURL
         return None
920a9773
 
2820c61a
     def getRequiresAllPackages(self):
87815216
         dependentPackages = []
         for pkg in self.spec.packages.values():
2820c61a
             for dpkg in pkg.requires:
e45f5730
                 dependentPackages.append(dpkg)
         listDependentPackages = list(set(dependentPackages))
87815216
         packageNames = self.getPackageNames()
2820c61a
         for pkgName in packageNames:
e45f5730
             for objName in listDependentPackages:
4a93976f
                 if objName.package == pkgName:
e45f5730
                         dependentPackages.remove(objName)
         dependentPackages = list(set(dependentPackages))
         return dependentPackages
5062126c
 
2820c61a
     def getBuildRequiresAllPackages(self):
87815216
         dependentPackages = []
         for pkg in self.spec.packages.values():
2820c61a
             for dpkg in pkg.buildrequires:
e45f5730
                 dependentPackages.append(dpkg)
         listDependentPackages = list(set(dependentPackages))
87815216
         packageNames = self.getPackageNames()
2820c61a
         for pkgName in packageNames:
e45f5730
             for objName in listDependentPackages:
4a93976f
                 if objName.package == pkgName:
e45f5730
                         dependentPackages.remove(objName)
         dependentPackages = list(set(dependentPackages))
         return dependentPackages
5062126c
 
5f40784b
     def getCheckBuildRequiresAllPackages(self):
87815216
         dependentPackages = []
         for pkg in self.spec.packages.values():
5f40784b
             for dpkg in pkg.checkbuildrequires:
e45f5730
                 dependentPackages.append(dpkg)
87815216
         dependentPackages = list(set(dependentPackages))
e45f5730
         return dependentPackages
5062126c
 
87815216
     def getRequires(self, pkgName):
         dependentPackages = []
         for pkg in self.spec.packages.values():
2820c61a
             if pkg.name == pkgName:
                 for dpkg in pkg.requires:
                     dependentPackages.append(dpkg.package)
         return dependentPackages
 
87815216
     def getProvides(self, packageName):
         dependentPackages = []
         defaultPkgName = self.spec.packages['default'].name
2820c61a
         pkg = None
87815216
         if packageName in self.spec.packages:
2820c61a
             pkg = self.spec.packages.get(packageName)
         if defaultPkgName == packageName:
87815216
             pkg = self.spec.packages['default']
2820c61a
         if pkg is not None:
             for dpkg in pkg.provides:
5f40784b
                 dependentPackages.append(dpkg.package)
2820c61a
         else:
87815216
             print("package not found")
5f40784b
         return dependentPackages
5062126c
 
2820c61a
     def getVersion(self):
         pkg = self.spec.packages.get('default')
         return pkg.version
5062126c
 
2820c61a
     def getRelease(self):
         pkg = self.spec.packages.get('default')
         return pkg.release
5062126c
 
5e29a499
     def getBasePackageName(self):
         pkg = self.spec.packages.get('default')
         return pkg.name
5062126c
 
cb4e8710
     def getSecurityHardeningOption(self):
         return self.spec.globalSecurityHardening
 
b5e09fac
     def isCheckAvailable(self):
87815216
         check = False
b5e09fac
         if self.spec.checkMacro is not None:
87815216
             check = True
b5e09fac
         return check
 
fba234bc
     def getDefinitions(self):
         return self.spec.defs
 
2820c61a
 def main():
     spec = Specutils("/workspace1/myrepos/photon/SPECS/docker/docker.spec")
87815216
     print("packages {}".format(spec.getPackageNames()))
     print("packages {}".format(spec.getRPMNames()))
     print("sources {}".format(spec.getSourceNames()))
     print("patches {}".format(spec.getPatchNames()))
     print("requires {}".format(spec.getRequires('libltdl-devel')))
     print("requires {}".format(spec.getRequires('libtool')))
5062126c
 
87815216
     print("provides {}".format(spec.getProvides('libtool')))
e45f5730
     print("all-requires {}".format(spec.getPkgNamesFromObj(spec.getRequiresAllPackages())))
     print("all-build-requires {}".format(spec.getPkgNamesFromObj(spec.getBuildRequiresAllPackages())))
5062126c
 
2820c61a
 if __name__ == '__main__':
     main()