changeset 196:86ea689eda5f

Extend debian/control file parser to cope with more real-world file. Add some test cases.
author Bernhard Herzog <bh@intevation.de>
date Fri, 01 Aug 2008 19:54:58 +0000
parents e3ab8aca2b08
children bd887d02068a
files test/test_debian.py treepkg/debian.py
diffstat 2 files changed, 141 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/test/test_debian.py	Thu Jul 31 10:36:17 2008 +0000
+++ b/test/test_debian.py	Fri Aug 01 19:54:58 2008 +0000
@@ -53,3 +53,121 @@
         self.assertEquals(parsed.build_depends,
                           ['debhelper', 'libgpg-error-dev', 'bison',
                            'autotools-dev', 'cdbs'])
+
+
+class TestDebianControlFileBuildDepsWithContinuation(unittest.TestCase,
+                                                     FileTestMixin):
+
+    control_contents = """\
+Source: kdebase
+Section: kde
+Priority: optional
+Maintainer: Kolab-Konsortium Packager <packaging@kolab-konsortium.de>
+Build-Depends: cdbs (>= 0.4.51), debhelper (>= 6), quilt, cmake (>= 2.4.5),
+ kdepimlibs5-dev (>= 4:4.0.84), libphonon-dev (>= 4:4.2~),
+ libplasma-dev (>= 4:4.0.84), libqimageblitz-dev (>= 1:0.0.4-2),
+ libsmbclient-dev, libusb-dev, libxkbfile-dev, libraw1394-dev,
+ libstreamanalyzer-dev, libxrender-dev, zlib1g-dev, libglu1-mesa-dev, 
+ libpci-dev, libxt-dev, libxext-dev, pkg-config, libglib2.0-dev
+Standards-Version: 3.7.3
+
+Package: kdebase
+Section: kde
+Architecture: all
+Description: base applications from the official KDE release
+"""
+
+    def test(self):
+        filename = self.create_temp_file("control", self.control_contents)
+        parsed = DebianControlFile(filename)
+        self.assertEquals(parsed.packages,
+                          [('kdebase', 'all')])
+        self.assertEquals(parsed.build_depends,
+                          ['cdbs', 'debhelper', 'quilt', 'cmake',
+                           'kdepimlibs5-dev', 'libphonon-dev', 'libplasma-dev',
+                           'libqimageblitz-dev', 'libsmbclient-dev',
+                           'libusb-dev', 'libxkbfile-dev', 'libraw1394-dev',
+                           'libstreamanalyzer-dev', 'libxrender-dev',
+                           'zlib1g-dev', 'libglu1-mesa-dev', 'libpci-dev',
+                           'libxt-dev', 'libxext-dev', 'pkg-config',
+                           'libglib2.0-dev'])
+
+
+class TestDebianControlFileWithComments(unittest.TestCase, FileTestMixin):
+
+    control_contents = """\
+Source: kdebase
+Section: kde
+Priority: optional
+Maintainer: Kolab-Konsortium Packager <packaging@kolab-konsortium.de>
+Build-Depends: cdbs (>= 0.4.51), debhelper (>= 6), quilt, cmake (>= 2.4.5),
+ kdepimlibs5-dev (>= 4:4.0.84), libphonon-dev (>= 4:4.2~), libplasma-dev (>= 4:4.0.84),
+ libqimageblitz-dev (>= 1:0.0.4-2), libsmbclient-dev, libusb-dev, libxkbfile-dev,
+ libraw1394-dev, libstreamanalyzer-dev, libxrender-dev, zlib1g-dev, libglu1-mesa-dev, 
+ libpci-dev, libxt-dev, libxext-dev, pkg-config, libglib2.0-dev
+Standards-Version: 3.7.3
+
+# commented out
+# Package: foo
+# Section: kde
+# Architecture: all
+
+Package: kdebase
+Section: kde
+Architecture: all
+Description: base applications from the official KDE release
+"""
+
+    def test(self):
+        filename = self.create_temp_file("control", self.control_contents)
+        parsed = DebianControlFile(filename)
+        self.assertEquals(parsed.packages,
+                          [('kdebase', 'all')])
+        self.assertEquals(parsed.build_depends,
+                          ['cdbs', 'debhelper', 'quilt', 'cmake',
+                           'kdepimlibs5-dev', 'libphonon-dev', 'libplasma-dev',
+                           'libqimageblitz-dev', 'libsmbclient-dev',
+                           'libusb-dev', 'libxkbfile-dev', 'libraw1394-dev',
+                           'libstreamanalyzer-dev', 'libxrender-dev',
+                           'zlib1g-dev', 'libglu1-mesa-dev', 'libpci-dev',
+                           'libxt-dev', 'libxext-dev', 'pkg-config',
+                           'libglib2.0-dev'])
+
+
+class TestDebianControlFileWithExtraEmptyLines(unittest.TestCase,
+                                               FileTestMixin):
+
+    control_contents = """\
+Source: kdebase
+Section: kde
+Priority: optional
+Maintainer: Kolab-Konsortium Packager <packaging@kolab-konsortium.de>
+Build-Depends: cdbs (>= 0.4.51), debhelper (>= 6), quilt, cmake (>= 2.4.5),
+ kdepimlibs5-dev (>= 4:4.0.84), libphonon-dev (>= 4:4.2~), libplasma-dev (>= 4:4.0.84),
+ libqimageblitz-dev (>= 1:0.0.4-2), libsmbclient-dev, libusb-dev, libxkbfile-dev,
+ libraw1394-dev, libstreamanalyzer-dev, libxrender-dev, zlib1g-dev, libglu1-mesa-dev, 
+ libpci-dev, libxt-dev, libxext-dev, pkg-config, libglib2.0-dev
+Standards-Version: 3.7.3
+
+
+Package: kdebase
+Section: kde
+Architecture: all
+Description: base applications from the official KDE release
+
+"""
+
+    def test(self):
+        filename = self.create_temp_file("control", self.control_contents)
+        parsed = DebianControlFile(filename)
+        self.assertEquals(parsed.packages,
+                          [('kdebase', 'all')])
+        self.assertEquals(parsed.build_depends,
+                          ['cdbs', 'debhelper', 'quilt', 'cmake',
+                           'kdepimlibs5-dev', 'libphonon-dev', 'libplasma-dev',
+                           'libqimageblitz-dev', 'libsmbclient-dev',
+                           'libusb-dev', 'libxkbfile-dev', 'libraw1394-dev',
+                           'libstreamanalyzer-dev', 'libxrender-dev',
+                           'zlib1g-dev', 'libglu1-mesa-dev', 'libpci-dev',
+                           'libxt-dev', 'libxext-dev', 'pkg-config',
+                           'libglib2.0-dev'])
--- a/treepkg/debian.py	Thu Jul 31 10:36:17 2008 +0000
+++ b/treepkg/debian.py	Fri Aug 01 19:54:58 2008 +0000
@@ -33,15 +33,29 @@
         self.parse(filename)
 
     def parse(self, filename):
-        lines = [line.strip() for line in open(filename).readlines()]
-        paragraphs = []
-        while lines:
-            try:
-                empty_line = lines.index("")
-            except ValueError:
-                empty_line = len(lines)
-            paragraphs.append(lines[:empty_line])
-            lines = lines[empty_line + 1:]
+        paragraph = []
+        paragraphs = [paragraph]
+        for lineno, line in enumerate(open(filename)):
+            stripped = line.strip()
+            if stripped.startswith("#"):
+                continue
+            if not stripped:
+                if paragraph:
+                    paragraph = []
+                    paragraphs.append(paragraph)
+            else:
+                if line[:1] in " \t":
+                    # handle continuation line
+                    if paragraph:
+                        paragraph[-1] += " " + stripped
+                    else:
+                        raise RuntimeError("%s:%d: Continuation line without"
+                                           " preceding line"
+                                           % (filename, lineno))
+                else:
+                    paragraph.append(stripped)
+        if not paragraphs[-1]:
+            del paragraphs[-1]
 
         self.handle_source_paragraph(paragraphs[0])
         for paragraph in paragraphs[1:]:
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)