コード例 #1
0
ファイル: SpecData.py プロジェクト: jadeiceman/photon
    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)
コード例 #2
0
ファイル: SpecData.py プロジェクト: frapposelli/photon
    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)
コード例 #3
0
    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
コード例 #4
0
ファイル: RemoteSpecParser.py プロジェクト: piotr1212/gofed
	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
コード例 #5
0
ファイル: SpecData.py プロジェクト: jadeiceman/photon
    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)
コード例 #6
0
ファイル: GoLint.py プロジェクト: jedahan/gofed
	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
コード例 #7
0
ファイル: RemoteSpecParser.py プロジェクト: piotr1212/gofed
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
コード例 #9
0
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
コード例 #10
0
	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
コード例 #11
0
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
コード例 #12
0
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
コード例 #13
0
ファイル: GoLint.py プロジェクト: KotyVM/gofed
	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
コード例 #14
0
ファイル: GoLint.py プロジェクト: KotyVM/gofed
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)
コード例 #16
0
ファイル: SpecUtils.py プロジェクト: TiejunChina/photon
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
コード例 #17
0
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
コード例 #18
0
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
コード例 #19
0
 def __init__(self, specfile):
     self.specfile = ""
     self.spec = SpecParser()
     if Specutils._isSpecFile(specfile):
         self.specfile = specfile
         self.spec.parseSpecFile(self.specfile)
コード例 #20
0
ファイル: GoLint.py プロジェクト: jedahan/gofed
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