[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[dak/master] Revert "daklib/dbconn.py: use apt_pkg.TagSection instead of implementing our own parser"



This reverts commit 1b70efbb284c409256589036ffe6d54c832421ea.

Problem: The TagSection code strips leading whitespace (here, newline and space),
which generates wrong data for us.

Signed-off-by: Joerg Jaspert <joerg@debian.org>
---
 daklib/dbconn.py |   60 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/daklib/dbconn.py b/daklib/dbconn.py
index 46c9b49..e994a52 100644
--- a/daklib/dbconn.py
+++ b/daklib/dbconn.py
@@ -42,8 +42,6 @@ import traceback
 import commands
 import signal
 
-from daklib.gpg import SignedFile
-
 try:
     # python >= 2.6
     import json
@@ -1883,6 +1881,60 @@ __all__.append('SrcContents')
 
 ################################################################################
 
+from debian.debfile import Deb822
+
+# Temporary Deb822 subclass to fix bugs with : handling; see #597249
+class Dak822(Deb822):
+    def _internal_parser(self, sequence, fields=None):
+        # The key is non-whitespace, non-colon characters before any colon.
+        key_part = r"^(?P<key>[^: \t\n\r\f\v]+)\s*:\s*"
+        single = re.compile(key_part + r"(?P<data>\S.*?)\s*$")
+        multi = re.compile(key_part + r"$")
+        multidata = re.compile(r"^\s(?P<data>.+?)\s*$")
+
+        wanted_field = lambda f: fields is None or f in fields
+
+        if isinstance(sequence, basestring):
+            sequence = sequence.splitlines()
+
+        curkey = None
+        content = ""
+        for line in self.gpg_stripped_paragraph(sequence):
+            m = single.match(line)
+            if m:
+                if curkey:
+                    self[curkey] = content
+
+                if not wanted_field(m.group('key')):
+                    curkey = None
+                    continue
+
+                curkey = m.group('key')
+                content = m.group('data')
+                continue
+
+            m = multi.match(line)
+            if m:
+                if curkey:
+                    self[curkey] = content
+
+                if not wanted_field(m.group('key')):
+                    curkey = None
+                    continue
+
+                curkey = m.group('key')
+                content = ""
+                continue
+
+            m = multidata.match(line)
+            if m:
+                content += '\n' + line # XXX not m.group('data')?
+                continue
+
+        if curkey:
+            self[curkey] = content
+
+
 class DBSource(ORMObject):
     def __init__(self, source = None, version = None, maintainer = None, \
         changedby = None, poolfile = None, install_date = None, fingerprint = None):
@@ -1915,9 +1967,7 @@ class DBSource(ORMObject):
         @return: fields is the dsc information in a dictionary form
         '''
         fullpath = self.poolfile.fullpath
-        contents = open(fullpath, 'r').read()
-        signed_file = SignedFile(contents, keyrings=[], require_signature=False)
-        fields = apt_pkg.TagSection(signed_file.contents)
+        fields = Dak822(open(self.poolfile.fullpath, 'r'))
         return fields
 
     metadata = association_proxy('key', 'value')
-- 
1.7.2.5


Reply to: