Evet, kocaman bir patch.

test/beta-light.sh, pisi build/install gzip ve run.py specfile
denedim, biraz daha test/deneme lazım.

Artık spec klaslarında .verify() yerine .has_errors() metotları var.
Bunlar hata yoksa None, varsa bir hata listesi döndürüyorlar.
Liste stringlerden oluşuyor.

Amaç specfile'larda hata varsa, tüm bulunan hataları ve bunlara ait
bilgileri ekrana basabilmek.

Denemek için herhangi bi pspec'ten kritik bikaç tagi çıkarıp build
etmeyi deneyin.

Ufak bi sorun build.py de hataları döküp exception verdikten sonra
bi şekilde tekrar sorun çıkması, sanırım exception handler içinde ui
nesnesi kayboluyor? Buna bakabilirseniz iyi olur.
This commit is contained in:
Gürer Özen
2005-08-13 21:51:46 +00:00
parent 52f5074f15
commit 91d396ff56
12 changed files with 161 additions and 93 deletions
+5 -2
View File
@@ -87,8 +87,11 @@ class PisiBuild:
self.actionGlobals = None self.actionGlobals = None
self.srcDir = None self.srcDir = None
if not self.spec.verify(): errs = self.spec.has_errors()
ui.error("PSPEC file is not valid") if errs:
ui.error("PSPEC file is not valid\n")
for e in errs:
ui.error(e + '\n')
raise PisiBuildError, "invalid PSPEC file %s" % self.ctx.pspecfile raise PisiBuildError, "invalid PSPEC file %s" % self.ctx.pspecfile
def setState(self, state): def setState(self, state):
+3 -1
View File
@@ -30,7 +30,9 @@ class BuildContext(object):
self.pspecfile = pspecfile self.pspecfile = pspecfile
spec = SpecFile() spec = SpecFile()
spec.read(pspecfile) spec.read(pspecfile)
spec.verify() # check pspec integrity # FIXME: following checks the integrity but does nothing when it is wrong
# -gurer
#spec.verify() # check pspec integrity
self.spec = spec self.spec = spec
# directory accessor functions # directory accessor functions
+5 -3
View File
@@ -18,6 +18,7 @@ from ui import ui
from version import Version from version import Version
from xmlext import * from xmlext import *
from xmlfile import XmlFile from xmlfile import XmlFile
from util import Checks
class DepInfo: class DepInfo:
def __init__(self, node = None): def __init__(self, node = None):
@@ -44,9 +45,10 @@ class DepInfo:
node.setAttribute("releaseTo", self.versionTo) node.setAttribute("releaseTo", self.versionTo)
return node return node
def verify(self): def has_errors(self):
if not self.package: return False if not self.package:
return True return [ "Dependency should have a package string" ]
return None
def satisfies(self, pkg_name, version, release): def satisfies(self, pkg_name, version, release):
"""determine if a package ver. satisfies given dependency spec""" """determine if a package ver. satisfies given dependency spec"""
+12 -9
View File
@@ -15,6 +15,7 @@
from xmlext import * from xmlext import *
from xmlfile import XmlFile from xmlfile import XmlFile
from util import Checks
class FileInfo: class FileInfo:
"""FileInfo holds the information for a File node/tag in files.xml""" """FileInfo holds the information for a File node/tag in files.xml"""
@@ -54,12 +55,13 @@ class FileInfo:
elt.appendChild(hashElt) elt.appendChild(hashElt)
return elt return elt
def verify(self): def has_errors(self):
if not self.path: return False err = Checks()
if not self.type: return False err.has_tag(self.path, "File", "Path")
if not self.size: return False err.has_tag(self.type, "File", "Type")
if not self.hash: return False err.has_tag(self.size, "File", "Size")
return True err.has_tag(self.hash, "File", "Hash")
return err.list
class Files(XmlFile): class Files(XmlFile):
@@ -83,7 +85,8 @@ class Files(XmlFile):
document.appendChild(x.elt(self.dom)) document.appendChild(x.elt(self.dom))
self.writexml(filename) self.writexml(filename)
def verify(self): def has_errors(self):
err = Checks()
for finfo in self.list: for finfo in self.list:
if not finfo.verify(): return False err.join(finfo.has_errors())
return True return err.list
+3 -3
View File
@@ -94,7 +94,7 @@ class Index(XmlFile):
#md.package.packageURI = util.removepathprefix(repo_uri, path) #md.package.packageURI = util.removepathprefix(repo_uri, path)
md.package.packageURI = os.path.realpath(path) md.package.packageURI = os.path.realpath(path)
# check package semantics # check package semantics
if md.verify(): if md.has_errors():
self.packages.append(md.package)
else:
ui.error('Package ' + md.package.name + ': metadata corrupt\n') ui.error('Package ' + md.package.name + ': metadata corrupt\n')
else:
self.packages.append(md.package)
+22 -12
View File
@@ -20,6 +20,7 @@ from ui import ui
from xmlfile import * from xmlfile import *
import specfile import specfile
from util import Checks
class SourceInfo: class SourceInfo:
@@ -39,9 +40,10 @@ class SourceInfo:
node.appendChild(self.packager.elt(xml)) node.appendChild(self.packager.elt(xml))
return node return node
def verify(self): def has_errors(self):
if not self.name: return False if not self.name:
return True return [ "SourceInfo should have a Name" ]
return None
class PackageInfo(specfile.PackageInfo): class PackageInfo(specfile.PackageInfo):
@@ -71,12 +73,16 @@ class PackageInfo(specfile.PackageInfo):
xml.addTextNodeUnder(node, "PackageURI", str(self.packageURI)) xml.addTextNodeUnder(node, "PackageURI", str(self.packageURI))
return node return node
def verify(self): def has_errors(self):
ret = specfile.PackageInfo.verify(self) and self.build!=None # FIXME: there should be real error msgs
# and comment the logic here please, it isn't very clear -gurer
ret = (specfile.PackageInfo.has_errors(self) == None) and self.build!=None
ret = ret and self.distribution!=None ret = ret and self.distribution!=None
ret = ret and self.distributionRelease!=None ret = ret and self.distributionRelease!=None
ret = ret and self.architecture!=None and self.installedSize!=None ret = ret and self.architecture!=None and self.installedSize!=None
return ret if ret:
return None
return [ "Some error in package metadata" ]
def __str__(self): def __str__(self):
s = specfile.PackageInfo.__str__(self) s = specfile.PackageInfo.__str__(self)
@@ -126,10 +132,14 @@ class MetaData(XmlFile):
self.addChild(self.package.elt(self)) self.addChild(self.package.elt(self))
self.writexml(filename) self.writexml(filename)
def verify(self): def has_errors(self):
if not hasattr(self, 'source'): return False err = Checks()
if not self.source.verify(): return False # FIXME: is this an internal error?? -gurer
if not hasattr(self, 'source'):
err.add("Metadata should have source")
err.join(self.source.has_errors())
if not self.package: return False if not self.package:
if not self.package.verify(): return False err.add("Metadata should have a package")
return True err.join(self.package.has_errors())
return err.list
+2 -3
View File
@@ -25,7 +25,6 @@ from pisi.purl import PUrl
from pisi.metadata import MetaData from pisi.metadata import MetaData
from pisi.files import Files from pisi.files import Files
class PackageError(pisi.Error): class PackageError(pisi.Error):
pass pass
@@ -92,12 +91,12 @@ class Package:
self.metadata = MetaData() self.metadata = MetaData()
self.metadata.read( join(outdir, const.metadata_xml) ) self.metadata.read( join(outdir, const.metadata_xml) )
if not self.metadata.verify(): if self.metadata.has_errors():
raise PackageError, "MetaData format wrong" raise PackageError, "MetaData format wrong"
self.files = Files() self.files = Files()
self.files.read( join(outdir, const.files_xml) ) self.files.read( join(outdir, const.files_xml) )
if not self.files.verify(): if self.files.has_errors():
raise PackageError, "invalid %s" % const.files_xml raise PackageError, "invalid %s" % const.files_xml
def pkg_dir(self): def pkg_dir(self):
+3 -1
View File
@@ -49,7 +49,9 @@ class SourceDB(object):
return self.d[name] return self.d[name]
def add_source(self, source_info): def add_source(self, source_info):
assert source_info.verify() # FIXME: how can you make a negative assertion -gurer
# and yes i'm not very clever :)
# assert source_info.has_errors()
name = str(source_info.name) name = str(source_info.name)
self.d[name] = source_info self.d[name] = source_info
+75 -56
View File
@@ -25,12 +25,16 @@ from xmlext import *
from xmlfile import XmlFile from xmlfile import XmlFile
from ui import ui from ui import ui
from dependency import DepInfo from dependency import DepInfo
from util import Checks
class PackagerInfo: class PackagerInfo:
def __init__(self, node = None): def __init__(self, node = None):
if node: if node:
self.name = getNodeText(getNode(node, "Name")) self.name = getNodeText(getNode(node, "Name"))
self.email = getNodeText(getNode(node, "Email")) self.email = getNodeText(getNode(node, "Email"))
else:
self.name = None
self.email = None
def elt(self, xml): def elt(self, xml):
node = xml.newNode("Packager") node = xml.newNode("Packager")
@@ -38,10 +42,11 @@ class PackagerInfo:
xml.addTextNodeUnder(node, "Email", self.email) xml.addTextNodeUnder(node, "Email", self.email)
return node return node
def verify(self): def has_errors(self):
if not self.name: return False err = Checks()
if not self.email: return False err.has_tag(self.name, "Packager", "Name")
return True err.has_tag(self.email, "Packager", "Email")
return err.list
def __str__(self): def __str__(self):
s = " ".join(self.name, self.email) s = " ".join(self.name, self.email)
@@ -61,10 +66,13 @@ class AdditionalFileInfo:
if self.permission: if self.permission:
node.setAttribute("permission", self.permission) node.setAttribute("permission", self.permission)
def verify(self): def has_errors(self):
if not self.filename: return False err = Checks()
if not self.target: return False if not self.filename:
return True err.add("AdditionalFile should have file name string")
if not self.target:
err.add("AdditionalFile should have a target attribute")
return err.list
def __str__(self): def __str__(self):
s = "->".join(self.filename, self.target) s = "->".join(self.filename, self.target)
@@ -98,9 +106,10 @@ class PatchInfo:
node.setAttribute("target", self.target) node.setAttribute("target", self.target)
return node return node
def verify(self): def has_errors(self):
if not self.filename: return False if not self.filename:
return True return [ "Patch should have a filename string" ]
return None
def __str__(self): def __str__(self):
s = self.filename s = self.filename
@@ -128,11 +137,12 @@ class UpdateInfo:
xml.addTextNodeUnder(node, "Type", self.type) xml.addTextNodeUnder(node, "Type", self.type)
return node return node
def verify(self): def has_errors(self):
if not self.date: return False err = Checks()
if not self.version: return False err.has_tag(self.date, "Update", "Date")
if not self.release: return False err.has_tag(self.version, "Update", "Version")
return True err.has_tag(self.release, "Update", "Release")
return err.list
def __str__(self): def __str__(self):
s = self.date s = self.date
@@ -155,9 +165,10 @@ class PathInfo:
node.setAttribute("fileType", self.fileType) node.setAttribute("fileType", self.fileType)
return node return node
def verify(self): def has_errors(self):
if not self.pathname: return False if not self.pathname:
return True return [ "Path tag should have a name string" ]
return None
def __str__(self): def __str__(self):
s = self.pathname s = self.pathname
@@ -176,10 +187,10 @@ class ComarProvide:
node.setAttribute("script", self.script) node.setAttribute("script", self.script)
return node return node
def verify(self): def has_errors(self):
if not self.om or not self.script: if not self.om or not self.script:
return False return [ "COMAR provide should have something :)" ]
return True return None
def __str__(self): def __str__(self):
s = self.script s = self.script
@@ -236,25 +247,29 @@ class SourceInfo:
xml.addNodeUnder(node, "History", update.elt(xml)) xml.addNodeUnder(node, "History", update.elt(xml))
return node return node
def verify(self): def has_errors(self):
if not self.name: return False err = Checks()
if not self.summary: return False err.has_tag(self.name, "Source", "Name")
if not self.description: return False err.has_tag(self.description, "Source", "Description")
if not self.packager: return False err.has_tag(self.summary, "Source", "Summary")
if not self.license: return False err.has_tag(self.packager, "Source", "Packager")
if (not self.archiveUri) or (not self.archiveType): return False err.has_tag(self.license, "Source", "License")
if not self.archiveSHA1: return False if (not self.archiveUri) or (not self.archiveType):
if len(self.history) <= 0: return False err.add("Source archive URI and type should be given")
if not self.archiveSHA1:
errd.add("Source archive should have a SHA1 sum")
if len(self.history) <= 0:
err.add("Source needs some education about History :)")
if not self.packager.verify(): return False err.join(self.packager.has_errors())
for update in self.history: for update in self.history:
if not update.verify(): return False err.join(update.has_errors())
for patch in self.patches: for patch in self.patches:
if not patch.verify(): return False err.join(patch.has_errors())
for dep in self.buildDeps: for dep in self.buildDeps:
if not dep.verify(): return False err.join(dep.has_errors())
return True return err.list
class PackageInfo(object): class PackageInfo(object):
"""A structure to hold package information. Package information is """A structure to hold package information. Package information is
@@ -309,20 +324,23 @@ class PackageInfo(object):
xml.addNodeUnder(node, "AdditionalFiles", afile.elt(xml)) xml.addNodeUnder(node, "AdditionalFiles", afile.elt(xml))
return node return node
def verify(self): def has_errors(self):
if not self.name: return False err = Checks()
if not self.summary: return False err.has_tag(self.name, "Package", "Name")
if not self.description: return False err.has_tag(self.summary, "Package", "Summary")
if not self.license: return False err.has_tag(self.description, "Package", "Description")
if len(self.paths) <= 0: return False err.has_tag(self.license, "Package", "License")
if len(self.paths) <= 0:
err.add("Package should have some files")
for path in self.paths: for path in self.paths:
if not path.verify(): return False err.join(path.has_errors())
for dep in self.runtimeDeps: for dep in self.runtimeDeps:
if not dep.verify(): return False err.join(dep.has_errors())
for afile in self.additionalFiles: for afile in self.additionalFiles:
if not afile.verify(): return False err.join(afile.has_errors())
return True
return err.list
def __str__(self): def __str__(self):
s = 'Name: ' + self.name s = 'Name: ' + self.name
@@ -389,14 +407,15 @@ class SpecFile(XmlFile):
elif not pkg.isa and self.source.isa: elif not pkg.isa and self.source.isa:
pkg.isa = self.source.isa pkg.isa = self.source.isa
def has_errors(self):
def verify(self): """Return errors of the PSPEC file if there are any."""
"""Verify PSPEC structures, are they what we want of them?""" err = Checks()
if not self.source.verify(): return False err.join(self.source.has_errors())
if len(self.packages) <= 0: return False if len(self.packages) <= 0:
for x in self.packages: errs.add("There should be at least one Package section")
if not x.verify(): return False for p in self.packages:
return True err.join(p.has_errors())
return err.list
def write(self, filename): def write(self, filename):
"""Write PSPEC file""" """Write PSPEC file"""
+26
View File
@@ -37,6 +37,32 @@ class UtilError(pisi.Error):
pass pass
#########################
# spec validation utility #
#########################
class Checks:
def __init__(self):
self.list = None
def add(self, err):
if not self.list:
self.list = []
self.list.append(err)
def join(self, list):
if list != None:
if not self.list:
self.list = []
self.list.extend(list)
def has_tag(self, var, section, name):
if not var:
if not self.list:
self.list = []
self.list.append("%s section should have a '%s' tag" % (section, name))
######################### #########################
# string/list functions # # string/list functions #
######################### #########################
+1 -1
View File
@@ -68,7 +68,7 @@ class SpecFileTestCase(unittest.TestCase):
self.fail("Failed to match PartOf in Package") self.fail("Failed to match PartOf in Package")
def testVerify(self): def testVerify(self):
if not self.spec.verify(): if self.spec.has_errors():
self.fail("Failed to verify specfile") self.fail("Failed to verify specfile")
def testCopy(self): def testCopy(self):
+4 -2
View File
@@ -72,8 +72,10 @@ for pak in paks:
except Exception, inst: except Exception, inst:
errors.append([pak, str(inst)]) errors.append([pak, str(inst)])
continue continue
if spec.verify() is False: errs = spec.has_errors()
errors.append([pak, "specfile verification failed"]) if errs:
for e in errs:
errors.append([pak, e])
continue continue
nr_binpaks += len(spec.packages) nr_binpaks += len(spec.packages)
nr_patches += len(spec.source.patches) nr_patches += len(spec.source.patches)