diff --git a/pisi/build.py b/pisi/build.py index 1d0244bd..515b0ad4 100644 --- a/pisi/build.py +++ b/pisi/build.py @@ -113,70 +113,18 @@ class PisiBuild: locals[func]() def genMetaDataXml(self, package): - metadata = MetaData() - - def createElt(tagName, text=None): - createElement = metadata.dom.createElement - createTextNode = metadata.dom.createTextNode - elt = createElement(tagName) - if text: - elt.appendChild(createTextNode(text)) - return elt - - metadata.appendElement(createElt("Name", - package.name)) - metadata.appendElement(createElt("Summary", - package.summary)) - metadata.appendElement(createElt("Description", - package.description)) - metadata.appendElement(createElt("Category", - package.category)) - - elt = createElt("InstallDependencies") - for idep in package.installDeps: - d = createElt("Depencency", idep.package) - # we should also have versionTo and version - # attributes. But specfile/DepInfo doesn't defines - # them. So we don't here - if idep.versionFrom: - d.setAttribute("versionFrom", idep.versionFrom) - elt.appendChild(d) - metadata.appendElement(elt) - - elt = createElt("RuntimeDependencies") - for rdep in package.runtimeDeps: - d = createElt("Depencency", rdep.package) - if rdep.versionFrom: - d.setAttribute("versionFrom", rdep.versionFrom) - elt.appendChild(d) - metadata.appendElement(elt) - - metadata.appendElement(createElt("License", - self.spec.source.license)) - metadata.appendElement(createElt("Distribution", - const.distribution)) - metadata.appendElement(createElt("DistributionRelease", - const.distributionRelease)) - metadata.appendElement(createElt("Architecture", - "Any")) # FIXME + metadata = MetaData.fromSpec(self.spec.source, package) + metadata.package.distribution = const.distribution + metadata.package.distributionRelease = const.distributionRelease + metadata.package.architecture = "Any" + # FIXME: Bu hatalı. installsize'ı almak için tüm # pkg_install_dir()'ın boyutunu hesaplayamayız. Bir source # birden fazla kaynak üretebilir. package.paths ile # karşılaştırarak file listesinden boyutları hesaplatmalıyız. d = self.ctx.pkg_install_dir() size = util.dir_size(d) - metadata.appendElement(createElt("InstalledSize", - str(size))) - - elt = createElt("History") - for history in self.spec.source.history: - update = createElt("Update") - update.appendChild(createElt("Date", history.date)) - update.appendChild(createElt("Version", history.version)) - update.appendChild(createElt("Release", history.release)) - elt.appendChild(update) - metadata.appendElement(elt) - + metadata.package.installedSize = str(size) metadata.write(os.path.join(self.ctx.pkg_dir(), const.metadata_xml)) def genFilesXml(self, package): diff --git a/pisi/metadata.py b/pisi/metadata.py index d28fd675..805886ae 100644 --- a/pisi/metadata.py +++ b/pisi/metadata.py @@ -2,49 +2,64 @@ from ui import ui from xmlfile import * -from specfile import * +import specfile +class SourceInfo: + def __init__(self, node): + self.name = getNodeText(node, "Name") + self.homepage = getNodeText(node, "HomePage") + self.packager = specfile.PackagerInfo(getNode(node, "Packager")) + + def elt(self, xml): + node = xml.newNode("Source") + xml.addTextNodeUnder(node, "Name", self.name) + if self.homepage: + xml.addTextNodeUnder(node, "Homepage", self.homepage) + xml.addNodeUnder(node, "", self.packager.elt(xml)) + return node + +class PackageInfo(specfile.PackageInfo): + + def __init__(self, node): + specfile.PackageInfo.__init__(self, node) + self.distribution = getNodeText(node, "Distribution") + self.distributionRelease = getNodeText(node, "DistributionRelease") + self.architecture = getNodeText(node, "Architecture") + + istext = getNodeText(node, "InstalledSize") + if istext: + self.installedSize = int(istext) class MetaData(XmlFile): """Package metadata. Metadata is composed of Specfile and various other information.""" + def __init__(self): - XmlFile.__init__(self, "PISI") - self.eltList = [] + XmlFile.__init__(self,"PISI") + + def fromSpec(src, pkg): + self.source.name = src.source.name + self.source.homepage = src.source.homepage + self.source.packager = src.source.packager + self.package = src.package + self.package.history = self.source.history # FIXME def read(self, filename): self.readxml(filename) - - getNodeText = self.getNodeText - - self.name = getNodeText("Name") - # self.summary # birden fazla olabilir (tr, en) SummaryInfo - # icerisine almakta yarar var. SpecFile'da da - # bu sekilde bir duzenleme gerekiyor. - self.homepage = getNodeText("Homepage") - self.license = getNodeText("License") - - historyElts = self.getAllNodes("History/Update") - self.history = [UpdateInfo(x) for x in historyElts] - self.version = self.history[0].version - self.release = self.history[0].release - - self.distribution = getNodeText("Distribution") - self.distributionRelease = getNodeText("DistributionRelease") - self.architecture = getNodeText("Architecture") - size = self.getNodeText("InstalledSize") - if size: - self.installedSize = int(size) - - def appendElement(self, elt): - self.eltList.append(elt) + self.source = SourceInfo(self.getNode("Source")) + self.package = PackageInfo(self.getNode("Package")) + self.package.version = self.package.history[0].version + self.package.release = self.package.history[0].release def write(self, filename): self.newDOM() - document = self.dom.documentElement - for elt in self.eltList: - document.appendChild(elt) + self.addNode("", self.source.elt(self)) + self.addNode("", self.package.elt(self)) self.writexml(filename) def verify(self): + assert self.getAllNodes("Package")==1 + assert self.source.name != None + assert self.source.homepage != None + assert self.source.packager != None return True diff --git a/pisi/specfile.py b/pisi/specfile.py index 3ff678d0..74e1b1a5 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -7,6 +7,17 @@ from xmlfile import XmlFile from os.path import basename from ui import ui +class PackagerInfo: + def __init__(self, node): + self.name = getNodeText(getNode(node, "Name")) + self.email = getNodeText(getNode(node, "Email")) + + def elt(self, xml): + node = xml.newNode("Update") + xml.addTextNodeUnder(node, "Name", self.name) + xml.addTextNodeUnder(node, "Email", self.email) + return node + class PatchInfo: def __init__(self, filenm, ctype): self.filename = filenm @@ -16,11 +27,12 @@ class PatchInfo: self.filename = getNodeText(node) self.compressionType = getNodeAttribute(node, "compressionType") - def addNode(self, xml): - node = xml.addNode("Source/Patches/Patch") + def elt(self, xml): + node = xml.newNode("Patch") node.setAttribute("filename", self.filename) if self.compressionType: node.setAttribute("compressionType", self.compressionType) + return node class DepInfo: def __init__(self, node): @@ -61,34 +73,80 @@ class PathInfo: node.setAttribute("fileType", self.fileType) return node -# a structure to hold source information class SourceInfo: - pass + "a structure to hold source information" + def __init__(self, node): + self.name = getNodeText(node, "Name") + self.homepage = getNodeText(node, "HomePage") + self.packager = PackagerInfo(getNode(node, "Packager")) + self.license = getNodeText(node, "License") + self.isa = getNodeText(node, "IsA") + self.partof = getNodeText(node, "PartOf") + archiveNode = getNode(node, "Archive") + self.archiveUri = getNodeText(archiveNode).strip() + self.archiveName = basename(self.archiveUri) + self.archiveType = getNodeAttribute(archiveNode, "archType") + self.archiveSHA1 = getNodeAttribute(archiveNode, "sha1sum") + patchElts = getAllNodes(node, "Patches/Patch") + self.patches = [PatchInfo(p) for p in patchElts] + buildDepElts = getAllNodes(node, "BuildDependencies/Dependency") + self.buildDeps = [DepInfo(d) for d in buildDepElts] + historyElts = getAllNodes(node, "History/Update") + self.history = [UpdateInfo(x) for x in historyElts] + + def elt(self, xml): + node = xml.newNode("Source") + xml.addTextNodeUnder(node, "Name", self.name) + if self.homepage: + xml.addTextNodeUnder(node, "Homepage", self.homepage) + xml.addNodeUnder(node, "", self.packager.elt(xml)) + xml.addTextNodeUnder(node, "License", self.license) + xml.addTextNodeUnder(node, "IsA", self.isa) + xml.addTextNodeUnder(node, "PartOf", self.partof) + archiveNode = xml.addNodeUnder(node, "Archive") + archiveNode.setAttribute("archType", self.archiveType) + archiveNode.setAttribute("sha1sum", self.archiveSHA1) + for patch in self.patches: + xml.addNodeUnder(node, "Patches", patch.elt(xml)) + for dep in self.buildDeps: + xml.addNodeUnder(node, "BuildDependencies", dep.elt(xml)) + for update in self.history: + xml.addNodeUnder(node, "History", update.elt(xml)) + return node class PackageInfo: def __init__(self, node): - self.name = getNodeText(getNode(node, "Name")) - self.summary = getNodeText(getNode(node, "Summary")) - self.description = getNodeText(getNode(node, "Description")) - self.category = getNodeText(getNode(node, "Category")) + self.name = getNodeText(node, "Name") + self.summary = getNodeText(node, "Summary") + self.description = getNodeText(node, "Description") + self.isa = getNodeText(node, "IsA") + self.partof = getNodeText(node, "PartOf") + self.license = getNodeText(node, "License") iDepElts = getAllNodes(node, "InstallDependencies/Dependency") self.installDeps = [DepInfo(x) for x in iDepElts] rtDepElts = getAllNodes(node, "RuntimeDependencies/Dependency") self.runtimeDeps = [DepInfo(x) for x in rtDepElts] self.paths = [PathInfo(x) for x in getAllNodes(node, "Files/Path")] + historyElts = getAllNodes(node, "History/Update") + self.history = [UpdateInfo(x) for x in historyElts] def elt(self, xml): node = xml.newNode("Package") xml.addTextNodeUnder(node, "Name", self.name) xml.addTextNodeUnder(node, "Summary", self.summary) xml.addTextNodeUnder(node, "Description", self.description) - xml.addTextNodeUnder(node, "Category", self.category) - for dep in map(lambda x : x.elt(xml), self.installDeps): - xml.addNode("Source/InstallDependencies", dep) - for dep in map(lambda x : x.elt(xml), self.runtimeDeps): - xml.addNode("Source/RuntimeDependencies", dep) - for path in map(lambda x : x.elt(xml), self.paths): - xml.addNode("Files", dep) + if self.isa: + xml.addTextNodeUnder(node, "IsA", self.isa) + if self.partof: + xml.addTextNodeUnder(node, "PartOf", self.partof) + for dep in self.installDeps: + xml.addNodeUnder(node, "InstallDependencies", dep.elt(xml)) + for dep in self.runtimeDeps: + xml.addNodeUnder(node, "RuntimeDependencies", dep.elt(xml)) + for path in self.paths: + xml.addNodeUnder(node, "Files", path.elt(xml)) + for update in self.history: + xml.addNodeUnder(node, "History", update.elt(xml)) return node class SpecFile(XmlFile): @@ -102,20 +160,7 @@ class SpecFile(XmlFile): self.readxml(filename) - self.source = SourceInfo() - self.source.name = self.getChildText("Source/Name") - self.source.license = self.getChildText("Source/License") - archiveNode = self.getNode("Source/Archive") - self.source.archiveUri = getNodeText(archiveNode).strip() - self.source.archiveName = basename(self.source.archiveUri) - self.source.archiveType = getNodeAttribute(archiveNode, "archType") - self.source.archiveSHA1 = getNodeAttribute(archiveNode, "sha1sum") - patchElts = self.getAllNodes("Source/Patches/Patch") - self.source.patches = [PatchInfo(p) for p in patchElts] - buildDepElts = self.getAllNodes("Source/BuildDependencies/Dependency") - self.source.buildDeps = [DepInfo(d) for d in buildDepElts] - historyElts = self.getAllNodes("History/Update") - self.source.history = [UpdateInfo(x) for x in historyElts] + self.source = SourceInfo(self.getNode("Source")) # As we have no Source/Version tag we need to get # the last version and release information @@ -136,16 +181,7 @@ class SpecFile(XmlFile): def write(self, filename): """Write PSPEC file""" self.newDOM() - self.addTextNode("Source/Name", self.source.name) - archiveNode = self.addNode("Source/Archive") - archiveNode.setAttribute("archType", self.source.archiveType) - archiveNode.setAttribute("sha1sum", self.source.archiveSHA1) - for patch in self.source.patches: - patch.addNode(self) - for dep in map(lambda x : x.elt(self), self.source.buildDeps): - self.addNode("Source/BuildDependencies", dep) - for update in map(lambda x : x.elt(self), self.source.history): - self.addNode("Source/History", dep) + self.addNode("", self.source.elt(self)) for pkg in map(lambda x : x.elt(self), self.packages): self.addNode("", pkg) self.writexml(filename) diff --git a/pisi/xmlext.py b/pisi/xmlext.py index 7598dd65..3badf0f0 100644 --- a/pisi/xmlext.py +++ b/pisi/xmlext.py @@ -13,8 +13,10 @@ def getNodeAttribute(node, attrname): if attr.name == attrname: return attr.childNodes[0].data -def getNodeText(node): +def getNodeText(node, tagpath = ""): """get the first child and expect it to be text!""" + if tagpath!="": + node = getNode(node, tagpath) try: child = node.childNodes[0] except IndexError: diff --git a/pisi/xmlfile.py b/pisi/xmlfile.py index 9d893afa..e42125c8 100644 --- a/pisi/xmlfile.py +++ b/pisi/xmlfile.py @@ -37,6 +37,8 @@ class XmlFile(object): if self.dom.documentElement.tagName != self.rootTag: raise XmlError("Root tagname not " + self.rootTag + " as expected") + # construction helpers + def newNode(self, tag): return self.dom.createElement(tag) @@ -55,8 +57,10 @@ class XmlFile(object): def getNodeText(self, tagPath): """returns the text of *first* matching node for given tag path.""" - self.verifyRootTag() - return getNodeText(getNode(self.dom.documentElement, tagPath)) + node = self.getNode(tagpath) + if not node: + return None + return getNodeText(node) def getAllNodes(self, tagPath): """returns all nodes matching a given tag path.""" @@ -84,12 +88,6 @@ class XmlFile(object): except AttributeError: return None - def getChildText(self, tagpath): - node = self.getNode(tagpath) - if not node: - return None - return getNodeText(node) - # write helpers def addNode(self, tagPath, newnode = None): diff --git a/samples/popt/popt.pspec b/samples/popt/popt.pspec index 3590d009..7a8a5477 100644 --- a/samples/popt/popt.pspec +++ b/samples/popt/popt.pspec @@ -13,6 +13,8 @@ hotmail@redhat.com As-Is + library:util + rpm:archive ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.1.x/popt-1.7.tar.gz @@ -66,5 +68,12 @@ /usr/share/locale /usr/include/popt.h + + + 06/14/2005 + 1.7 + 2 + + diff --git a/tests/actionsapitests.py b/tests/actionsapitests.py index 74ded5a0..6cff7452 100644 --- a/tests/actionsapitests.py +++ b/tests/actionsapitests.py @@ -7,6 +7,6 @@ class gnuConfigTestCase(unittest.TestCase): self.gnuconfig = gnuconfig.gnuconfig_findnewest() def testFindNewest(self): - self.assertEqual(self.gnuconfig, '/usr/share/automake-1.4') + self.assert_ (self.gnuconfig > '/usr/share/automake-1.4') suite = unittest.makeSuite(gnuConfigTestCase) diff --git a/tests/metadatatests.py b/tests/metadatatests.py index 8b6cf50e..4df64340 100644 --- a/tests/metadatatests.py +++ b/tests/metadatatests.py @@ -4,7 +4,7 @@ import os from pisi import metadata from pisi import util -from pisi import context +from pisi.config import config class MetaDataTestCase(unittest.TestCase): def setUp(self): @@ -14,13 +14,16 @@ class MetaDataTestCase(unittest.TestCase): md = metadata.MetaData() md.read('tests/sandbox/metadata.xml') - self.assertEqual(md.license, "As-Is") + self.assertEqual(md.package.license, "As-Is") - self.assertEqual(md.version, "1.7") - - self.assertEqual(md.installedSize, 546542) + self.assertEqual(md.package.version, "1.7") + self.assertEqual(md.package.installedSize, 546542) + return md + def testWrite(self): - pass + md = self.testRead() + md.write(os.path.join(config.tmp_dir(),'metadata-test.xml' )) + suite = unittest.makeSuite(MetaDataTestCase) diff --git a/tests/sandbox/metadata.xml b/tests/sandbox/metadata.xml index 0d00555b..1b88ae8c 100644 --- a/tests/sandbox/metadata.xml +++ b/tests/sandbox/metadata.xml @@ -1,6 +1,6 @@ - + sandbox @@ -13,20 +13,22 @@ sandbox Bla + Life sucks then you die http://cekirdek.uludag.org.tr/~meren/ + temprorary:zip + tools:archive As-Is - temprorary:zip 06/15/2005 - 0.1 + 1.7 1 Pardus 0.1 x86 - 40500 + 546542 - +