def _readSpecs(self, specFilesPath): for specFile in self._getListSpecFiles(specFilesPath): spec = SpecParser(specFile, self.arch) # skip the specfile if buildarch differs buildarch = spec.packages.get('default').buildarch if (buildarch != "noarch" and buildarch != self.arch): self.logger.info("skipping spec file: "+str(specFile)) continue specObj = spec.createSpecObject() name = specObj.name for specPkg in specObj.listPackages: self.mapPackageToSpec[specPkg] = name if name in self.mapSpecObjects: self.mapSpecObjects[name].append(specObj) else: self.mapSpecObjects[name]=[specObj] self.mapSpecFileNameToSpecObj[os.path.basename(specFile)]=specObj # Sort the multiversion list to make getHighestVersion happy for key, value in self.mapSpecObjects.items(): if len(value) > 1: self.mapSpecObjects[key] = sorted(value, key=lambda x : self.compareVersions(x), reverse=True)
def _readSpecs(self, specFilesPath): for specFile in self._getListSpecFiles(specFilesPath): spec = SpecParser(specFile) # skip the specfile if buildarch differs buildarch = spec.packages.get('default').buildarch if (buildarch != "noarch" and platform.machine() != buildarch): self.logger.info("skipping spec file: "+str(specFile)) continue specObj = spec.createSpecObject() name = specObj.name for specPkg in specObj.listPackages: self.mapPackageToSpec[specPkg] = name if name in self.mapSpecObjects: self.mapSpecObjects[name].append(specObj) else: self.mapSpecObjects[name]=[specObj] self.mapSpecFileNameToSpecObj[os.path.basename(specFile)]=specObj # Sort the multiversion list to make getHighestVersion happy for key, value in self.mapSpecObjects.items(): if len(value) > 1: self.mapSpecObjects[key] = sorted(value, key=lambda x : self.compareVersions(x), reverse=True)
def test(self): # Parse spec file self.sp_obj = SpecParser(self.spec) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() return False # Parse sources file if self.sources != "": self.src_obj = Sources(self.sources) if not self.src_obj.parse(): self.err = self.src_obj.getError() return False # Inspect tarball self.prj_obj = ProjectInfo(noGodeps=self.noGodeps) # create a temp directory dir = tempfile.mkdtemp() # extract tarball to the directory so, se, rc = runCommand("tar -xf %s --directory=%s" % (self.archive, dir)) if rc != 0: self.err = se return False so, se, rc = runCommand("ls %s" % dir) if rc != 0: self.err = "Unable to archive's extracted folder" return False so = so.split('\n')[0] if not self.prj_obj.retrieve("%s/%s" % (dir, so), skip_errors=True): self.err = self.prj_obj.getError() return False shutil.rmtree(dir) tests = [] # test package name tests.append(self.testPackageName) # test commit tests.append(self.testCommit) # test import path macros tests.append(self.testImportPathMacros) # test provider, provider_tld, ... tests.append(self.testRepositoryMacros) # test source0 macro tests.append(self.testSpecFileSource) # test devel subpackage tests.append(self.testDevel) for test in tests: if not test(): self.printTResult(self.t_result) elif self.verbose: self.printTResult(self.t_result) return True
def parse(self): f = tempfile.NamedTemporaryFile(delete=True) cmd_str = "curl http://pkgs.fedoraproject.org/cgit/%s.git/plain/%s.spec > %s" runCommand(cmd_str % (self.package, self.package, f.name)) self.sp_obj = SpecParser(f.name) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() f.close() return False f.close() return True
def initialize(self): # Preparse some files # adding kernelversion rpm macro spec = SpecParser(constants.specPath + "/linux/linux.spec", constants.buildArch) defPkg = spec.packages.get('default') kernelversion = defPkg.version constants.addMacro("KERNEL_VERSION", kernelversion) # adding kernelrelease rpm macro kernelrelease = defPkg.release constants.addMacro("KERNEL_RELEASE", kernelrelease) # adding kernelsubrelease rpm macro a, b, c = kernelversion.split(".") kernelsubrelease = ('%02d%02d%03d%03d' % (int(a), int(b), int(c), int(kernelrelease.split('.')[0]))) if kernelsubrelease: kernelsubrelease = "." + kernelsubrelease constants.addMacro("kernelsubrelease", kernelsubrelease) # Full parsing self.specData[constants.buildArch] = SpecData(constants.buildArch, constants.logPath, constants.specPath) if constants.buildArch != constants.targetArch: self.specData[constants.targetArch] = SpecData(constants.targetArch, constants.logPath, constants.specPath)
def test(self): # Parse spec file self.sp_obj = SpecParser(self.spec) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() return False # Parse sources file if self.sources != "": self.src_obj = Sources(self.sources) if not self.src_obj.parse(): self.err = self.src_obj.getError() return False # Inspect tarball self.prj_obj = ProjectInfo(noGodeps = self.noGodeps) # create a temp directory dir = tempfile.mkdtemp() # extract tarball to the directory so, se, rc = runCommand("tar -xf %s --directory=%s" % (self.archive, dir)) if rc != 0: self.err = se return False so, se, rc = runCommand("ls %s" % dir) if rc != 0: self.err = "Unable to archive's extracted folder" return False so = so.split('\n')[0] if not self.prj_obj.retrieve("%s/%s" % (dir, so), skip_errors = True): self.err = self.prj_obj.getError() return False shutil.rmtree(dir) tests = [] # test package name tests.append(self.testPackageName) # test commit tests.append(self.testCommit) # test import path macros tests.append(self.testImportPathMacros) # test provider, provider_tld, ... tests.append(self.testRepositoryMacros) # test source0 macro tests.append(self.testSpecFileSource) # test devel subpackage tests.append(self.testDevel) for test in tests: if not test(): self.printTResult(self.t_result) elif self.verbose: self.printTResult(self.t_result) return True
class RemoteSpecParser(Base): def __init__(self, branch, package): Base.__init__(self) self.branch = branch self.package = package self.sp_obj = None def parse(self): f = tempfile.NamedTemporaryFile(delete=True) cmd_str = "curl http://pkgs.fedoraproject.org/cgit/%s.git/plain/%s.spec > %s" runCommand(cmd_str % (self.package, self.package, f.name)) self.sp_obj = SpecParser(f.name) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() f.close() return False f.close() return True def getProvides(self): """Fetch a spec file from pkgdb and get provides from all its [sub]packages""" if self.sp_obj == None: return {} return self.sp_obj.getProvides() def getPackageCommits(self): if self.sp_obj == None: return "" return self.sp_obj.getMacro("commit") def getPkgURL(self): if self.sp_obj == None: return "" return self.sp_obj.getTag("url")
class Specutils(object): def __init__(self,specfile): self.specfile="" self.spec = SpecParser() if self.isSpecFile(specfile): self.specfile=specfile self.spec.parseSpecFile(self.specfile) def isSpecFile(self,specfile): if os.path.isfile(specfile) and specfile[-5:] == ".spec": return True return False def getSourceNames(self): sourceNames=[] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceName=strUtils.getFileNameFromURL(source) sourceNames.append(sourceName) return sourceNames def getChecksums(self): pkg = self.spec.packages.get('default') return pkg.checksums def getSourceURLs(self): sourceNames=[] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceNames.append(source) return sourceNames def getPatchNames(self): patchNames=[] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for patch in pkg.patches: patchName=strUtils.getFileNameFromURL(patch) patchNames.append(patchName) return patchNames def getPackageNames(self): packageNames=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) packageNames.append(pkg.name) return packageNames def getRPMNames(self): rpmNames=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) rpmName=pkg.name+"-"+pkg.version+"-"+pkg.release rpmNames.append(rpmName) return rpmNames def getRPMName(self, pkgName): rpmName=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: rpmName=pkg.name+"-"+pkg.version+"-"+pkg.release break return rpmName def getRPMVersion(self, pkgName): version=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: version=pkg.version break return version def getRPMRelease(self, pkgName): release=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: release=pkg.release break return release def getLicense(self, pkgName): licenseInfo=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: licenseInfo=pkg.license break return licenseInfo def getURL(self, pkgName): url=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: url=pkg.URL break return url def getBuildArch(self, pkgName): buildArch="x86_64" for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: buildArch=pkg.buildarch break return buildArch def getRequiresAllPackages(self): depedentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) for dpkg in pkg.requires: depedentPackages.append(dpkg.package) depedentPackages=list(set(depedentPackages)) packageNames=self.getPackageNames() for pkgName in packageNames: if pkgName in depedentPackages: depedentPackages.remove(pkgName) return depedentPackages def getBuildRequiresAllPackages(self): depedentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) for dpkg in pkg.buildrequires: depedentPackages.append(dpkg.package) depedentPackages=list(set(depedentPackages)) packageNames=self.getPackageNames() for pkgName in packageNames: if pkgName in depedentPackages: depedentPackages.remove(pkgName) return depedentPackages def getRequires(self,pkgName): dependentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: for dpkg in pkg.requires: dependentPackages.append(dpkg.package) return dependentPackages def getBuildRequires(self,pkgName): dependentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: for dpkg in pkg.buildrequires: dependentPackages.append(dpkg.package) return dependentPackages def getProvides(self,packageName): depedentPackages=[] defaultPkgName=self.spec.packages['default'].name pkg = None if self.spec.packages.has_key(packageName): pkg = self.spec.packages.get(packageName) if defaultPkgName == packageName: pkg=self.spec.packages['default'] if pkg is not None: for dpkg in pkg.provides: depedentPackages.append(dpkg.package) else: print "package not found" return depedentPackages def getVersion(self): pkg = self.spec.packages.get('default') return pkg.version def getRelease(self): pkg = self.spec.packages.get('default') return pkg.release def getBasePackageName(self): pkg = self.spec.packages.get('default') return pkg.name def getSecurityHardeningOption(self): return self.spec.globalSecurityHardening
class Specutils(object): def __init__(self,specfile): self.specfile="" self.spec = SpecParser() if self.isSpecFile(specfile): self.specfile=specfile self.spec.parseSpecFile(self.specfile) def isSpecFile(self,specfile): if os.path.isfile(specfile) and specfile[-5:] == ".spec": return True return False def getSourceNames(self): sourceNames=[] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceName=strUtils.getFileNameFromURL(source) sourceNames.append(sourceName) return sourceNames def getSourceURLs(self): sourceNames=[] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceNames.append(source) return sourceNames def getPatchNames(self): patchNames=[] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for patch in pkg.patches: patchName=strUtils.getFileNameFromURL(patch) patchNames.append(patchName) return patchNames def getPackageNames(self): packageNames=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) packageNames.append(pkg.name) return packageNames def getRPMNames(self): rpmNames=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) rpmName=pkg.name+"-"+pkg.version+"-"+pkg.release rpmNames.append(rpmName) return rpmNames def getRPMName(self, pkgName): rpmName=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: rpmName=pkg.name+"-"+pkg.version+"-"+pkg.release break return rpmName def getRPMVersion(self, pkgName): version=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: version=pkg.version break return version def getRPMRelease(self, pkgName): release=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: release=pkg.release break return release def getLicense(self, pkgName): licenseInfo=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: licenseInfo=pkg.license break return licenseInfo def getURL(self, pkgName): url=None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: url=pkg.URL break return url def getBuildArch(self, pkgName): buildArch="x86_64" for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: buildArch=pkg.buildarch break return buildArch def getRequiresAllPackages(self): depedentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) for dpkg in pkg.requires: depedentPackages.append(dpkg.package) depedentPackages=list(set(depedentPackages)) packageNames=self.getPackageNames() for pkgName in packageNames: if pkgName in depedentPackages: depedentPackages.remove(pkgName) return depedentPackages def getRequiresAllPackagesForGiven(self, pkgName): dependentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: for dpkg in pkg.requires: dependentPackages.append(dpkg.package) #if (pkgName == "mono-extras"): # print "4given packages:", self.spec.packages # print "4given dep packages: ", dependentPackages return dependentPackages def getBuildRequiresAllPackages(self): depedentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) #if(pkg.name == "mono"): #print "build dendent packages len 4 mono-devel:", len(pkg.buildrequires) for dpkg in pkg.buildrequires: depedentPackages.append(dpkg.package) depedentPackages=list(set(depedentPackages)) packageNames=self.getPackageNames() for pkgName in packageNames: if pkgName in depedentPackages: depedentPackages.remove(pkgName) return depedentPackages def getRequires(self,pkgName): dependentPackages=[] #if( pkgName == "mono-devel"): #print "packages:", self.spec.packages for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: #if( pkgName == "mono-devel"): #print "dendent packages len 4 mono-devel:", len(pkg.requires), pkg.requires[0].package for dpkg in pkg.requires: dependentPackages.append(dpkg.package) return dependentPackages def getBuildRequires(self,pkgName): dependentPackages=[] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: #if( pkgName == "mono-devel"): #print "build dendent packages len 4 mono-devel:", len(pkg.buildrequires), pkg.buildrequires[0].package for dpkg in pkg.buildrequires: dependentPackages.append(dpkg.package) return dependentPackages def getProvides(self,packageName): depedentPackages=[] defaultPkgName=self.spec.packages['default'].name pkg = None if self.spec.packages.has_key(packageName): pkg = self.spec.packages.get(packageName) if defaultPkgName == packageName: pkg=self.spec.packages['default'] if pkg is not None: for dpkg in pkg.provides: depedentPackages.append(dpkg.package) else: print "package not found" return depedentPackages def getVersion(self): pkg = self.spec.packages.get('default') return pkg.version def getRelease(self): pkg = self.spec.packages.get('default') return pkg.release def getBasePackageName(self): pkg = self.spec.packages.get('default') return pkg.name def getSecurityHardeningOption(self): return self.spec.globalSecurityHardening
def test(self, source_code_directory = ""): # Parse spec file self.sp_obj = SpecParser(self.spec) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() return False # Parse sources file if self.sources != "": self.src_obj = Sources(self.sources) if not self.src_obj.parse(): self.err = self.src_obj.getError() return False if source_code_directory == "": # create a temp directory dir = tempfile.mkdtemp() # extract tarball to the directory so, se, rc = runCommand("tar -xf %s --directory=%s" % (self.archive, dir)) if rc != 0: self.err = se return False so, se, rc = runCommand("ls %s" % dir) if rc != 0: self.err = "Unable to archive's extracted folder" return False sc_directory = "%s/%s" % (dir, so.split('\n')[0]) else: sc_directory = source_code_directory data = { "type": "user_directory", "resource": path.abspath(sc_directory), #"directories_to_skip": self.noGodeps, "ipprefix": "." } try: data = ActFactory().bake("go-code-inspection").call(data) except Exception as e: logging.error(e) exit(1) # TODO(jchaloup) catch exceptions, at least ValueError self.prj_info.construct(data[ARTEFACT_GOLANG_PROJECT_PACKAGES]) if source_code_directory == "": shutil.rmtree(dir) tests = [] # test package name tests.append(self.testPackageName) # test commit tests.append(self.testCommit) # test import path macros tests.append(self.testImportPathMacros) # test provider, provider_tld, ... tests.append(self.testRepositoryMacros) # test source0 macro tests.append(self.testSpecFileSource) # test devel subpackage tests.append(self.testDevel) for test in tests: if not test(): self.printTResult(self.t_result) elif self.verbose: self.printTResult(self.t_result) return True
class Specutils(object): def __init__(self, specfile): self.specfile = "" self.spec = SpecParser() if Specutils._isSpecFile(specfile): self.specfile = specfile self.spec.parseSpecFile(self.specfile) @staticmethod def _isSpecFile(specfile): if os.path.isfile(specfile) and specfile.endswith(".spec"): return True return False def getSourceNames(self): sourceNames = [] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceName = strUtils.getFileNameFromURL(source) sourceNames.append(sourceName) return sourceNames def getChecksums(self): pkg = self.spec.packages.get('default') return pkg.checksums def getPatchNames(self): patchNames = [] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for patch in pkg.patches: patchName = strUtils.getFileNameFromURL(patch) patchNames.append(patchName) return patchNames def getPackageNames(self): packageNames = [] for pkg in self.spec.packages.values(): packageNames.append(pkg.name) return packageNames def getIsRPMPackage(self, pkgName): defaultPkgName = self.spec.packages['default'].name 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 def getRPMNames(self): rpmNames = [] for pkg in self.spec.packages.values(): rpmName = pkg.name + "-" + pkg.version + "-" + pkg.release rpmNames.append(rpmName) return rpmNames def getLicense(self): pkg = self.spec.packages.get('default') if pkg is None: return None return pkg.license def getBuildArch(self, pkgName): for pkg in self.spec.packages.values(): if pkg.name == pkgName: return pkg.buildarch pkg = self.spec.packages.get('default') return pkg.buildarch 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 if not pkg.sources: return None sourceURL = pkg.sources[0] if sourceURL.startswith("http") or sourceURL.startswith("ftp"): return sourceURL return None def getRequiresAllPackages(self): dependentPackages = [] for pkg in self.spec.packages.values(): for dpkg in pkg.requires: dependentPackages.append(dpkg) listDependentPackages = list(set(dependentPackages)) packageNames = self.getPackageNames() for pkgName in packageNames: for objName in listDependentPackages: if objName.package == pkgName: dependentPackages.remove(objName) dependentPackages = list(set(dependentPackages)) return dependentPackages def getBuildRequiresAllPackages(self): dependentPackages = [] for pkg in self.spec.packages.values(): for dpkg in pkg.buildrequires: dependentPackages.append(dpkg) listDependentPackages = list(set(dependentPackages)) packageNames = self.getPackageNames() for pkgName in packageNames: for objName in listDependentPackages: if objName.package == pkgName: dependentPackages.remove(objName) dependentPackages = list(set(dependentPackages)) return dependentPackages def getCheckBuildRequiresAllPackages(self): dependentPackages = [] for pkg in self.spec.packages.values(): for dpkg in pkg.checkbuildrequires: dependentPackages.append(dpkg) dependentPackages = list(set(dependentPackages)) return dependentPackages def getRequires(self, pkgName): dependentPackages = [] for pkg in self.spec.packages.values(): if pkg.name == pkgName: for dpkg in pkg.requires: dependentPackages.append(dpkg) return dependentPackages def getProvides(self, packageName): dependentPackages = [] defaultPkgName = self.spec.packages['default'].name pkg = None if packageName in self.spec.packages: pkg = self.spec.packages.get(packageName) if defaultPkgName == packageName: pkg = self.spec.packages['default'] if pkg is not None: for dpkg in pkg.provides: dependentPackages.append(dpkg.package) else: print("package not found") return dependentPackages def getVersion(self): pkg = self.spec.packages.get('default') return pkg.version def getRelease(self): pkg = self.spec.packages.get('default') return pkg.release def getBasePackageName(self): pkg = self.spec.packages.get('default') return pkg.name def getSecurityHardeningOption(self): return self.spec.globalSecurityHardening def isCheckAvailable(self): check = False if self.spec.checkMacro is not None: check = True return check def getDefinitions(self): return self.spec.defs
class GoLint(Base): def __init__(self, spec, sources, archive, verbose=False, stdout=True, noGodeps=[]): Base.__init__(self) self.spec = spec self.sources = sources self.archive = archive self.verbose = verbose self.stdout = stdout self.test_results = [] self.t_result = "" self.noGodeps = noGodeps self.err_number = 0 self.warn_number = 0 self.sp_obj = None self.src_obj = None self.prj_obj = None def getErrorCount(self): return self.err_number def getWarningCount(self): return self.warn_number def getTestResults(self): return self.test_results def printTResult(self, t_result): if type(t_result) == type([]): if self.stdout: print "\n".join(t_result) else: self.test_results += t_result else: if self.stdout: print t_result else: self.test_results.append(t_result) def test(self): # Parse spec file self.sp_obj = SpecParser(self.spec) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() return False # Parse sources file if self.sources != "": self.src_obj = Sources(self.sources) if not self.src_obj.parse(): self.err = self.src_obj.getError() return False # Inspect tarball self.prj_obj = ProjectInfo(noGodeps=self.noGodeps) # create a temp directory dir = tempfile.mkdtemp() # extract tarball to the directory so, se, rc = runCommand("tar -xf %s --directory=%s" % (self.archive, dir)) if rc != 0: self.err = se return False so, se, rc = runCommand("ls %s" % dir) if rc != 0: self.err = "Unable to archive's extracted folder" return False so = so.split('\n')[0] if not self.prj_obj.retrieve("%s/%s" % (dir, so), skip_errors=True): self.err = self.prj_obj.getError() return False shutil.rmtree(dir) tests = [] # test package name tests.append(self.testPackageName) # test commit tests.append(self.testCommit) # test import path macros tests.append(self.testImportPathMacros) # test provider, provider_tld, ... tests.append(self.testRepositoryMacros) # test source0 macro tests.append(self.testSpecFileSource) # test devel subpackage tests.append(self.testDevel) for test in tests: if not test(): self.printTResult(self.t_result) elif self.verbose: self.printTResult(self.t_result) return True def testPackageName(self): name = self.sp_obj.getTag('name') url = self.sp_obj.getTag('url') if name == "": self.t_result = "E: Missing name tag" self.err_number += 1 return False if url == "": self.t_result = "E: Missing url tag" self.err_number += 1 return False ip_obj = ImportPath(url) if not ip_obj.parse(): self.err = ip_obj.getError() return False pkg_name = ip_obj.getPackageName() if pkg_name == '': self.t_result = "E: Uknown repo url" self.err_number += 1 return False if pkg_name != name: self.t_result = "W: Incorrect package name %s, should be %s" % ( name, pkg_name) self.warn_number += 1 return False self.t_result = "I: Package name correct" return True def testCommit(self): commit_label = 'commit' commit = self.sp_obj.getMacro(commit_label) if commit == "": commit_label = 'rev' commit = self.sp_obj.getMacro(commit_label) if commit == "": self.t_result = "E: missing %global commit or rev" self.err_number += 1 return False if commit_label == "commit": if self.sp_obj.getMacro("shortcommit") == "": self.t_result = "E: missing %global shortcommit" self.err_number += 1 return False self.t_result = "I: commit and shortcommit macro" else: if self.sp_obj.getMacro("shortrev") == "": self.t_result = "E: missing %global shortrev" self.err_number += 1 return False self.t_result = "I: rev and shortrev macro" return True def testImportPathMacros(self): devel_prefix = self.sp_obj.getMacro('devel_prefix') if devel_prefix == "": import_path = self.sp_obj.getMacro('import_path') ip_macro = "import_path" else: import_path = self.sp_obj.getMacro('%s_import_path' % devel_prefix) ip_macro = "%s_import_path" % devel_prefix if import_path == "": self.t_result = "E: Missing %%{%s} macro" % ip_macro self.err_number += 1 return False self.t_result = "I: %s macro found" % ip_macro return True def testRepositoryMacros(self): provider = self.sp_obj.getMacro('provider') if provider == "": self.t_result = "E: Missing %{provider} macro" self.err_number += 1 return False provider_tld = self.sp_obj.getMacro('provider_tld') if provider_tld == "": self.t_result = "E: Missing %{provider_tld} macro" self.err_number += 1 return False repo = self.sp_obj.getMacro('repo') if repo == "": self.t_result = "E: Missing %{repo} macro" self.err_number += 1 return False project = self.sp_obj.getMacro('project') if project == "": self.t_result = "E: Missing %{project} macro" self.err_number += 1 return False self.t_result = "I: provider, provider_tld, repo and project macros found" return True def testSpecFileSource(self): source = self.sp_obj.getTag('source') if source == "": self.t_result = "E: Missing source tag" self.err_number += 1 return False archive = path.basename(source) if self.sources != "": sources = self.src_obj.getFiles() if archive not in sources: self.t_result = "E: archive in source[0] tag not in sources file" self.err_number += 1 return False if archive != self.archive: self.t_result = "E: sources[0]'s tarball != specified tarball: %s != %s" % ( archive, self.archive) self.err_number += 1 return False self.t_result = "I: %s archive found in sources" % archive return True def testDevel(self): # get provided and imported paths from tarball t_imported = self.prj_obj.getImportedPackages() t_provided = self.prj_obj.getProvidedPackages() devel_prefix = self.sp_obj.getMacro('devel_prefix') if devel_prefix == "": import_path = self.sp_obj.getMacro('import_path') else: import_path = self.sp_obj.getMacro('%s_import_path' % devel_prefix) t_imported = filter(lambda i: not i.startswith(import_path), t_imported) t_imported = map(lambda i: str("golang(%s)" % i), t_imported) skipped_provides_with_prefix = Config().getSkippedProvidesWithPrefix() for provide_prefix in skipped_provides_with_prefix: t_provided = filter(lambda i: not i.startswith(provide_prefix), t_provided) t_provided = map( lambda i: str("golang(%s/%s)" % (import_path, i)) if i != "." else str("golang(%s)" % import_path), t_provided) # get provides and [B]R from package section devel_obj = self.sp_obj.getDevelSubpackage() if devel_obj == None: self.t_result = "E: Unable to find devel subpackage" self.err_number += 1 return False s_br = filter(lambda l: l != "golang", devel_obj.getBuildRequires()) s_r = devel_obj.getRequires() s_provided = devel_obj.getProvides() # compare self.t_result = [] # BR super_br = list(set(s_br) - set(t_imported) - set(['golang'])) missing_br = list(set(t_imported) - set(s_br)) for br in sorted(missing_br): self.t_result.append("W: Missing BuildRequires: %s" % br) self.warn_number += 1 for br in sorted(super_br): self.t_result.append("W: Superfluous BuildRequires: %s" % br) self.warn_number += 1 # R super_r = list(set(s_r) - set(t_imported) - set(['golang'])) missing_r = list(set(t_imported) - set(s_r)) for r in sorted(missing_r): self.t_result.append("W: Missing Requires: %s" % r) self.warn_number += 1 for r in sorted(super_r): self.t_result.append("W: Superfluous Requires: %s" % r) self.warn_number += 1 # Provides super_p = list(set(s_provided) - set(t_provided)) missing_p = list(set(t_provided) - set(s_provided)) for p in sorted(missing_p): self.t_result.append("W: Missing Provides: %s" % p) self.warn_number += 1 for p in sorted(super_p): self.t_result.append("W: Superfluous Provides: %s" % p) self.warn_number += 1 if self.t_result != []: return False self.t_result = "I: devel's provides checked" return True
class GoLint(Base): def __init__(self, spec, sources, archive, verbose = False, stdout = True, noGodeps = []): Base.__init__(self) self.prj_info = ProjectInfoBuilder().build() self.spec = spec self.sources = sources self.archive = archive self.verbose = verbose self.stdout = stdout self.test_results = [] self.t_result = "" self.noGodeps = noGodeps self.err_number = 0 self.warn_number = 0 self.sp_obj = None self.src_obj = None def getErrorCount(self): return self.err_number def getWarningCount(self): return self.warn_number def getTestResults(self): return self.test_results def printTResult(self, t_result): if type(t_result) == type([]): if self.stdout: print "\n".join(t_result) else: self.test_results += t_result else: if self.stdout: print t_result else: self.test_results.append(t_result) def test(self, source_code_directory = ""): # Parse spec file self.sp_obj = SpecParser(self.spec) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() return False # Parse sources file if self.sources != "": self.src_obj = Sources(self.sources) if not self.src_obj.parse(): self.err = self.src_obj.getError() return False if source_code_directory == "": # create a temp directory dir = tempfile.mkdtemp() # extract tarball to the directory so, se, rc = runCommand("tar -xf %s --directory=%s" % (self.archive, dir)) if rc != 0: self.err = se return False so, se, rc = runCommand("ls %s" % dir) if rc != 0: self.err = "Unable to archive's extracted folder" return False sc_directory = "%s/%s" % (dir, so.split('\n')[0]) else: sc_directory = source_code_directory data = { "type": "user_directory", "resource": path.abspath(sc_directory), #"directories_to_skip": self.noGodeps, "ipprefix": "." } try: data = ActFactory().bake("go-code-inspection").call(data) except Exception as e: logging.error(e) exit(1) # TODO(jchaloup) catch exceptions, at least ValueError self.prj_info.construct(data[ARTEFACT_GOLANG_PROJECT_PACKAGES]) if source_code_directory == "": shutil.rmtree(dir) tests = [] # test package name tests.append(self.testPackageName) # test commit tests.append(self.testCommit) # test import path macros tests.append(self.testImportPathMacros) # test provider, provider_tld, ... tests.append(self.testRepositoryMacros) # test source0 macro tests.append(self.testSpecFileSource) # test devel subpackage tests.append(self.testDevel) for test in tests: if not test(): self.printTResult(self.t_result) elif self.verbose: self.printTResult(self.t_result) return True def testPackageName(self): name = self.sp_obj.getTag('name') url = self.sp_obj.getTag('url') importpath = self.sp_obj.getMacro('import_path') if name == "": self.t_result = "E: Missing name tag" self.err_number += 1 return False if url == "": self.t_result = "E: Missing url tag" self.err_number += 1 return False if importpath == "": self.t_result = "E: Missing importpath macro" self.err_number += 1 return False name_generator = PackageNameGeneratorBuilder().buildWithLocalMapping() pkg_name = name_generator.generate(importpath).name() if pkg_name != name: self.t_result = "W: Incorrect package name %s, should be %s" % (name, pkg_name) self.warn_number += 1 return False self.t_result = "I: Package name correct" return True def testCommit(self): commit_label = 'commit' commit = self.sp_obj.getMacro(commit_label) if commit == "": commit_label = 'rev' commit = self.sp_obj.getMacro(commit_label) if commit == "": self.t_result = "E: missing %global commit or rev" self.err_number += 1 return False if commit_label == "commit": if self.sp_obj.getMacro("shortcommit") == "": self.t_result = "E: missing %global shortcommit" self.err_number += 1 return False self.t_result = "I: commit and shortcommit macro" else: if self.sp_obj.getMacro("shortrev") == "": self.t_result = "E: missing %global shortrev" self.err_number += 1 return False self.t_result = "I: rev and shortrev macro" return True def testImportPathMacros(self): devel_prefix = self.sp_obj.getMacro('devel_prefix') if devel_prefix == "": import_path = self.sp_obj.getMacro('import_path') ip_macro = "import_path" else: import_path = self.sp_obj.getMacro('%s_import_path' % devel_prefix) ip_macro = "%s_import_path" % devel_prefix if import_path == "": self.t_result = "E: Missing %%{%s} macro" % ip_macro self.err_number += 1 return False self.t_result = "I: %s macro found" % ip_macro return True def testRepositoryMacros(self): provider = self.sp_obj.getMacro('provider') if provider == "": self.t_result = "E: Missing %{provider} macro" self.err_number += 1 return False provider_tld = self.sp_obj.getMacro('provider_tld') if provider_tld == "": self.t_result = "E: Missing %{provider_tld} macro" self.err_number += 1 return False repo = self.sp_obj.getMacro('repo') if repo == "": self.t_result = "E: Missing %{repo} macro" self.err_number += 1 return False project = self.sp_obj.getMacro('project') if project == "": self.t_result = "E: Missing %{project} macro" self.err_number += 1 return False self.t_result = "I: provider, provider_tld, repo and project macros found" return True def testSpecFileSource(self): source = self.sp_obj.getTag('source') if source == "": self.t_result = "E: Missing source tag" self.err_number += 1 return False archive = path.basename(source) if self.sources != "": sources = self.src_obj.getFiles() if archive not in sources: self.t_result = "E: archive in source[0] tag not in sources file" self.err_number += 1 return False if archive != self.archive: self.t_result = "E: sources[0]'s tarball != specified tarball: %s != %s" % (archive, self.archive) self.err_number += 1 return False self.t_result = "I: %s archive found in sources" % archive return True def testDevel(self): # get provided and imported paths from tarball t_imported = self.prj_info.getImportedPackages() t_provided = self.prj_info.getProvidedPackages() devel_prefix = self.sp_obj.getMacro('devel_prefix') if devel_prefix == "": import_path = self.sp_obj.getMacro('import_path') else: import_path = self.sp_obj.getMacro('%s_import_path' % devel_prefix) # import paths can be in form prefix/Godeps/_workspace/src/IMPORTED_PATH godeps_ips = filter(lambda i: i.startswith("%s/Godeps/_workspace/src/" % import_path), t_imported) godeps_ips = map(lambda i: i.replace("%s/Godeps/_workspace/src/" % import_path, ""), godeps_ips) t_imported = filter(lambda i: not i.startswith(import_path), t_imported) t_imported = map(lambda i: str("golang(%s)" % i), t_imported + godeps_ips) skipped_provides_with_prefix = Config().getSkippedProvidesWithPrefix() for provide_prefix in skipped_provides_with_prefix: t_provided = filter(lambda i: not i.startswith(provide_prefix), t_provided) # filter out all provided packages that contains /internal/ keyword t_provided = filter(lambda i: "internal" not in i.split("/"), t_provided) # add golang( prefix to all provided packages t_provided = map(lambda i: str("golang(%s/%s)" % (import_path, i)) if i != "." else str("golang(%s)" % import_path), t_provided) # get provides and [B]R from package section devel_obj = self.sp_obj.getDevelSubpackage() if devel_obj == None: self.t_result = "E: Unable to find devel subpackage" self.err_number += 1 return False s_br = filter(lambda l: l != "golang", devel_obj.getBuildRequires()) s_r = devel_obj.getRequires() s_provided = devel_obj.getProvides() # check only those br/r/provides that are related to golang s_br = filter(lambda l: l.startswith("golang("), s_br) s_r = filter(lambda l: l.startswith("golang("), s_r) s_provided = filter(lambda l: l.startswith("golang("), s_provided) # compare self.t_result = [] # BR super_br = list(set(s_br) - set(t_imported) - set(['golang'])) missing_br = list(set(t_imported) - set(s_br)) for br in sorted(missing_br): self.t_result.append("W: Missing BuildRequires: %s" % br) self.warn_number += 1 for br in sorted(super_br): self.t_result.append("W: Superfluous BuildRequires: %s" % br) self.warn_number += 1 # R super_r = list(set(s_r) - set(t_imported) - set(['golang'])) missing_r = list(set(t_imported) - set(s_r)) for r in sorted(missing_r): self.t_result.append("W: Missing Requires: %s" % r) self.warn_number += 1 for r in sorted(super_r): self.t_result.append("W: Superfluous Requires: %s" % r) self.warn_number += 1 # Provides super_p = list(set(s_provided) - set(t_provided)) missing_p = list(set(t_provided) - set(s_provided)) for p in sorted(missing_p): self.t_result.append("W: Missing Provides: %s" % p) self.warn_number += 1 for p in sorted(super_p): self.t_result.append("W: Superfluous Provides: %s" % p) self.warn_number += 1 if self.t_result != []: return False self.t_result = "I: devel's provides checked" return True
def __init__(self,specfile): self.specfile="" self.spec = SpecParser() if self.isSpecFile(specfile): self.specfile=specfile self.spec.parseSpecFile(self.specfile)
class Specutils(object): def __init__(self, specfile): self.specfile = "" self.spec = SpecParser() if Specutils._isSpecFile(specfile): self.specfile = specfile self.spec.parseSpecFile(self.specfile) @staticmethod def _isSpecFile(specfile): if os.path.isfile(specfile) and specfile.endswith(".spec"): return True return False def getSourceNames(self): sourceNames = [] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceName = strUtils.getFileNameFromURL(source) sourceNames.append(sourceName) return sourceNames def getChecksums(self): pkg = self.spec.packages.get('default') return pkg.checksums def getPatchNames(self): patchNames = [] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for patch in pkg.patches: patchName = strUtils.getFileNameFromURL(patch) patchNames.append(patchName) return patchNames def getPackageNames(self): packageNames = [] for pkg in self.spec.packages.values(): packageNames.append(pkg.name) return packageNames def getIsRPMPackage(self, pkgName): defaultPkgName = self.spec.packages['default'].name 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 def getRPMNames(self): rpmNames = [] for pkg in self.spec.packages.values(): rpmName = pkg.name + "-" + pkg.version + "-" + pkg.release rpmNames.append(rpmName) return rpmNames def getLicense(self): pkg = self.spec.packages.get('default') if pkg is None: return None return pkg.license 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 if not pkg.sources: return None sourceURL = pkg.sources[0] if sourceURL.startswith("http") or sourceURL.startswith("ftp"): return sourceURL return None def getRequiresAllPackages(self): dependentPackages = [] specParseObjDependentPackages=[] for pkg in self.spec.packages.values(): for dpkg in pkg.requires: dependentPackages.append(dpkg.package) specParseObjDependentPackages.append(dpkg) dependentPackages = list(set(dependentPackages)) specParseObjDependentPackages = list(set(specParseObjDependentPackages)) specParseObjDependentPackagesTemp = specParseObjDependentPackages[:] packageNames = self.getPackageNames() for pkgName in packageNames: if pkgName in dependentPackages: dependentPackages.remove(pkgName) for objName in specParseObjDependentPackagesTemp: if objName.package == pkgName: specParseObjDependentPackages.remove(objName) return dependentPackages,specParseObjDependentPackages def getBuildRequiresAllPackages(self): dependentPackages = [] specParseObjDependentPackages=[] for pkg in self.spec.packages.values(): for dpkg in pkg.buildrequires: dependentPackages.append(dpkg.package) specParseObjDependentPackages.append(dpkg) dependentPackages = list(set(dependentPackages)) specParseObjDependentPackages = list(set(specParseObjDependentPackages)) specParseObjDependentPackagesTemp = specParseObjDependentPackages[:] packageNames = self.getPackageNames() for pkgName in packageNames: if pkgName in dependentPackages: dependentPackages.remove(pkgName) for objName in specParseObjDependentPackagesTemp: if objName.package == pkgName: specParseObjDependentPackages.remove(objName) return dependentPackages,specParseObjDependentPackages def getCheckBuildRequiresAllPackages(self): dependentPackages = [] specParseObjDependentPackages=[] for pkg in self.spec.packages.values(): for dpkg in pkg.checkbuildrequires: dependentPackages.append(dpkg.package) specParseObjDependentPackages.append(dpkg) dependentPackages = list(set(dependentPackages)) specParseObjDependentPackages = list(set(specParseObjDependentPackages)) return dependentPackages,specParseObjDependentPackages def getRequires(self, pkgName): dependentPackages = [] for pkg in self.spec.packages.values(): if pkg.name == pkgName: for dpkg in pkg.requires: dependentPackages.append(dpkg.package) return dependentPackages def getProvides(self, packageName): dependentPackages = [] defaultPkgName = self.spec.packages['default'].name pkg = None if packageName in self.spec.packages: pkg = self.spec.packages.get(packageName) if defaultPkgName == packageName: pkg = self.spec.packages['default'] if pkg is not None: for dpkg in pkg.provides: dependentPackages.append(dpkg.package) else: print("package not found") return dependentPackages def getVersion(self): pkg = self.spec.packages.get('default') return pkg.version def getRelease(self): pkg = self.spec.packages.get('default') return pkg.release def getBasePackageName(self): pkg = self.spec.packages.get('default') return pkg.name def getSecurityHardeningOption(self): return self.spec.globalSecurityHardening def isCheckAvailable(self): check = False if self.spec.checkMacro is not None: check = True return check def getDefinitions(self): return self.spec.defs
class Specutils(object): def __init__(self, specfile): self.specfile = "" self.spec = SpecParser() if self.isSpecFile(specfile): self.specfile = specfile self.spec.parseSpecFile(self.specfile) def isSpecFile(self, specfile): if os.path.isfile(specfile) and specfile[-5:] == ".spec": return True return False def getSourceNames(self): sourceNames = [] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceName = strUtils.getFileNameFromURL(source) sourceNames.append(sourceName) return sourceNames def getChecksums(self): pkg = self.spec.packages.get('default') return pkg.checksums def getChecksumForSource(self, source): pkg = self.spec.packages.get('default') return pkg.checksums.get(source) def getSourceURLs(self): sourceNames = [] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for source in pkg.sources: sourceNames.append(source) return sourceNames def getPatchNames(self): patchNames = [] strUtils = StringUtils() pkg = self.spec.packages.get('default') if pkg is None: return None for patch in pkg.patches: patchName = strUtils.getFileNameFromURL(patch) patchNames.append(patchName) return patchNames def getPackageNames(self): packageNames = [] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) packageNames.append(pkg.name) return packageNames def getIsRPMPackage(self, pkgName): defaultPkgName = self.spec.packages['default'].name 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 def getRPMNames(self): rpmNames = [] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) rpmName = pkg.name + "-" + pkg.version + "-" + pkg.release rpmNames.append(rpmName) return rpmNames def getRPMName(self, pkgName): rpmName = None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: rpmName = pkg.name + "-" + pkg.version + "-" + pkg.release break return rpmName def getRPMVersion(self, pkgName): version = None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: version = pkg.version break return version def getRPMRelease(self, pkgName): release = None for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: release = pkg.release break return release def getLicense(self): licenseInfo = None pkg = self.spec.packages.get('default') if pkg is None: return None return pkg.license 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 if len(pkg.sources) == 0: return None sourceURL = pkg.sources[0] if sourceURL.startswith("http") or sourceURL.startswith("ftp"): return sourceURL return None def getBuildArch(self, pkgName): buildArch = platform.machine() for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: buildArch = pkg.buildarch break return buildArch def getRequiresAllPackages(self): dependentPackages = [] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) for dpkg in pkg.requires: dependentPackages.append(dpkg.package) dependentPackages = list(set(dependentPackages)) packageNames = self.getPackageNames() for pkgName in packageNames: if pkgName in dependentPackages: dependentPackages.remove(pkgName) return dependentPackages def getBuildRequiresAllPackages(self): dependentPackages = [] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) for dpkg in pkg.buildrequires: dependentPackages.append(dpkg.package) dependentPackages = list(set(dependentPackages)) packageNames = self.getPackageNames() for pkgName in packageNames: if pkgName in dependentPackages: dependentPackages.remove(pkgName) return dependentPackages def getCheckBuildRequiresAllPackages(self): dependentPackages = [] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) for dpkg in pkg.checkbuildrequires: dependentPackages.append(dpkg.package) dependentPackages = list(set(dependentPackages)) return dependentPackages def getRequires(self, pkgName): dependentPackages = [] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: for dpkg in pkg.requires: dependentPackages.append(dpkg.package) return dependentPackages def getBuildRequires(self, pkgName): dependentPackages = [] for key in self.spec.packages.keys(): pkg = self.spec.packages.get(key) if pkg.name == pkgName: for dpkg in pkg.buildrequires: dependentPackages.append(dpkg.package) return dependentPackages def getProvides(self, packageName): dependentPackages = [] defaultPkgName = self.spec.packages['default'].name pkg = None if self.spec.packages.has_key(packageName): pkg = self.spec.packages.get(packageName) if defaultPkgName == packageName: pkg = self.spec.packages['default'] if pkg is not None: for dpkg in pkg.provides: dependentPackages.append(dpkg.package) else: print "package not found" return dependentPackages def getVersion(self): pkg = self.spec.packages.get('default') return pkg.version def getRelease(self): pkg = self.spec.packages.get('default') return pkg.release def getBasePackageName(self): pkg = self.spec.packages.get('default') return pkg.name def getSecurityHardeningOption(self): return self.spec.globalSecurityHardening def isCheckAvailable(self): check = False if self.spec.checkMacro is not None: check = True return check def getDefinitions(self): return self.spec.defs
def __init__(self, specfile): self.specfile = "" self.spec = SpecParser() if Specutils._isSpecFile(specfile): self.specfile = specfile self.spec.parseSpecFile(self.specfile)
class GoLint(Base): def __init__(self, spec, sources, archive, verbose = False, stdout = True, noGodeps = []): Base.__init__(self) self.spec = spec self.sources = sources self.archive = archive self.verbose = verbose self.stdout = stdout self.test_results = [] self.t_result = "" self.noGodeps = noGodeps self.err_number = 0 self.warn_number = 0 self.sp_obj = None self.src_obj = None self.prj_obj = None def getErrorCount(self): return self.err_number def getWarningCount(self): return self.warn_number def getTestResults(self): return self.test_results def printTResult(self, t_result): if type(t_result) == type([]): if self.stdout: print "\n".join(t_result) else: self.test_results += t_result else: if self.stdout: print t_result else: self.test_results.append(t_result) def test(self): # Parse spec file self.sp_obj = SpecParser(self.spec) if not self.sp_obj.parse(): self.err = self.sp_obj.getError() return False # Parse sources file if self.sources != "": self.src_obj = Sources(self.sources) if not self.src_obj.parse(): self.err = self.src_obj.getError() return False # Inspect tarball self.prj_obj = ProjectInfo(noGodeps = self.noGodeps) # create a temp directory dir = tempfile.mkdtemp() # extract tarball to the directory so, se, rc = runCommand("tar -xf %s --directory=%s" % (self.archive, dir)) if rc != 0: self.err = se return False so, se, rc = runCommand("ls %s" % dir) if rc != 0: self.err = "Unable to archive's extracted folder" return False so = so.split('\n')[0] if not self.prj_obj.retrieve("%s/%s" % (dir, so), skip_errors = True): self.err = self.prj_obj.getError() return False shutil.rmtree(dir) tests = [] # test package name tests.append(self.testPackageName) # test commit tests.append(self.testCommit) # test import path macros tests.append(self.testImportPathMacros) # test provider, provider_tld, ... tests.append(self.testRepositoryMacros) # test source0 macro tests.append(self.testSpecFileSource) # test devel subpackage tests.append(self.testDevel) for test in tests: if not test(): self.printTResult(self.t_result) elif self.verbose: self.printTResult(self.t_result) return True def testPackageName(self): name = self.sp_obj.getTag('name') url = self.sp_obj.getTag('url') if name == "": self.t_result = "E: Missing name tag" self.err_number += 1 return False if url == "": self.t_result = "E: Missing url tag" self.err_number += 1 return False ip_obj = ImportPath(url) if not ip_obj.parse(): self.err = ip_obj.getError() return False pkg_name = ip_obj.getPackageName() if pkg_name == '': self.t_result = "E: Uknown repo url" self.err_number += 1 return False if pkg_name != name: self.t_result = "W: Incorrect package name %s, should be %s" % (name, pkg_name) self.warn_number += 1 return False self.t_result = "I: Package name correct" return True def testCommit(self): commit_label = 'commit' commit = self.sp_obj.getMacro(commit_label) if commit == "": commit_label = 'rev' commit = self.sp_obj.getMacro(commit_label) if commit == "": self.t_result = "E: missing %global commit or rev" self.err_number += 1 return False if commit_label == "commit": if self.sp_obj.getMacro("shortcommit") == "": self.t_result = "E: missing %global shortcommit" self.err_number += 1 return False self.t_result = "I: commit and shortcommit macro" else: if self.sp_obj.getMacro("shortrev") == "": self.t_result = "E: missing %global shortrev" self.err_number += 1 return False self.t_result = "I: rev and shortrev macro" return True def testImportPathMacros(self): devel_prefix = self.sp_obj.getMacro('devel_prefix') if devel_prefix == "": import_path = self.sp_obj.getMacro('import_path') ip_macro = "import_path" else: import_path = self.sp_obj.getMacro('%s_import_path' % devel_prefix) ip_macro = "%s_import_path" % devel_prefix if import_path == "": self.t_result = "E: Missing %%{%s} macro" % ip_macro self.err_number += 1 return False self.t_result = "I: %s macro found" % ip_macro return True def testRepositoryMacros(self): provider = self.sp_obj.getMacro('provider') if provider == "": self.t_result = "E: Missing %{provider} macro" self.err_number += 1 return False provider_tld = self.sp_obj.getMacro('provider_tld') if provider_tld == "": self.t_result = "E: Missing %{provider_tld} macro" self.err_number += 1 return False repo = self.sp_obj.getMacro('repo') if repo == "": self.t_result = "E: Missing %{repo} macro" self.err_number += 1 return False project = self.sp_obj.getMacro('project') if project == "": self.t_result = "E: Missing %{project} macro" self.err_number += 1 return False self.t_result = "I: provider, provider_tld, repo and project macros found" return True def testSpecFileSource(self): source = self.sp_obj.getTag('source') if source == "": self.t_result = "E: Missing source tag" self.err_number += 1 return False archive = path.basename(source) if self.sources != "": sources = self.src_obj.getFiles() if archive not in sources: self.t_result = "E: archive in source[0] tag not in sources file" self.err_number += 1 return False if archive != self.archive: self.t_result = "E: sources[0]'s tarball != specified tarball: %s != %s" % (archive, self.archive) self.err_number += 1 return False self.t_result = "I: %s archive found in sources" % archive return True def testDevel(self): # get provided and imported paths from tarball t_imported = self.prj_obj.getImportedPackages() package_imports_occurence = self.prj_obj.getPackageImportsOccurences() t_provided = self.prj_obj.getProvidedPackages() # filter out import paths used only by main packages non_main_imported = [] for gimport in t_imported: skip = True if gimport in package_imports_occurence: for occurrence in package_imports_occurence[gimport]: if not occurrence.endswith(":main"): skip = False break if skip: continue non_main_imported.append(gimport) t_imported = non_main_imported devel_prefix = self.sp_obj.getMacro('devel_prefix') if devel_prefix == "": import_path = self.sp_obj.getMacro('import_path') else: import_path = self.sp_obj.getMacro('%s_import_path' % devel_prefix) # import paths can be in form prefix/Godeps/_workspace/src/IMPORTED_PATH godeps_ips = filter(lambda i: i.startswith("%s/Godeps/_workspace/src/" % import_path), t_imported) godeps_ips = map(lambda i: i.replace("%s/Godeps/_workspace/src/" % import_path, ""), godeps_ips) t_imported = filter(lambda i: not i.startswith(import_path), t_imported) t_imported = map(lambda i: str("golang(%s)" % i), t_imported + godeps_ips) skipped_provides_with_prefix = Config().getSkippedProvidesWithPrefix() for provide_prefix in skipped_provides_with_prefix: t_provided = filter(lambda i: not i.startswith(provide_prefix), t_provided) # filter out all provided packages that contains /internal/ keyword t_provided = filter(lambda i: "internal" not in i.split("/"), t_provided) # add golang( prefix to all provided packages t_provided = map(lambda i: str("golang(%s/%s)" % (import_path, i)) if i != "." else str("golang(%s)" % import_path), t_provided) # get provides and [B]R from package section devel_obj = self.sp_obj.getDevelSubpackage() if devel_obj == None: self.t_result = "E: Unable to find devel subpackage" self.err_number += 1 return False s_br = filter(lambda l: l != "golang", devel_obj.getBuildRequires()) s_r = devel_obj.getRequires() s_provided = devel_obj.getProvides() # check only those br/r/provides that are related to golang s_br = filter(lambda l: l.startswith("golang("), s_br) s_r = filter(lambda l: l.startswith("golang("), s_r) s_provided = filter(lambda l: l.startswith("golang("), s_provided) # compare self.t_result = [] # BR super_br = list(set(s_br) - set(t_imported) - set(['golang'])) missing_br = list(set(t_imported) - set(s_br)) for br in sorted(missing_br): self.t_result.append("W: Missing BuildRequires: %s" % br) self.warn_number += 1 for br in sorted(super_br): self.t_result.append("W: Superfluous BuildRequires: %s" % br) self.warn_number += 1 # R super_r = list(set(s_r) - set(t_imported) - set(['golang'])) missing_r = list(set(t_imported) - set(s_r)) for r in sorted(missing_r): self.t_result.append("W: Missing Requires: %s" % r) self.warn_number += 1 for r in sorted(super_r): self.t_result.append("W: Superfluous Requires: %s" % r) self.warn_number += 1 # Provides super_p = list(set(s_provided) - set(t_provided)) missing_p = list(set(t_provided) - set(s_provided)) for p in sorted(missing_p): self.t_result.append("W: Missing Provides: %s" % p) self.warn_number += 1 for p in sorted(super_p): self.t_result.append("W: Superfluous Provides: %s" % p) self.warn_number += 1 if self.t_result != []: return False self.t_result = "I: devel's provides checked" return True