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
-
+