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:
+5
-2
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"""
|
||||||
|
|||||||
@@ -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 #
|
||||||
#########################
|
#########################
|
||||||
|
|||||||
@@ -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
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user