# HG changeset patch # User Bernhard Herzog # Date 1217620498 0 # Node ID 86ea689eda5f8dbe63c372e64ab3cd41b6be965d # Parent e3ab8aca2b0846afea509cc4ea16325339ac8855 Extend debian/control file parser to cope with more real-world file. Add some test cases. diff -r e3ab8aca2b08 -r 86ea689eda5f test/test_debian.py --- 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 +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 +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 +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']) diff -r e3ab8aca2b08 -r 86ea689eda5f treepkg/debian.py --- 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:]: