Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please unblock package python-django The current testing version is incompatible with python 2.7.3 (which is in unstable). The version of python in wheezy (2.7.3~rc2) does not trigger the bug but somehow I expect that doko will ask for an unblock and it does not hurt to be forward-compatible in this case. In python-django/1.4.1-2, I only added the upstream patch which fixes this issue. This whole problem was tracked in the RC bug #683648. unblock python-django/1.4.1-2 The full debdiff is here: diff -Nru python-django-1.4.1/debian/changelog python-django-1.4.1/debian/changelog --- python-django-1.4.1/debian/changelog 2012-08-02 10:52:42.000000000 +0200 +++ python-django-1.4.1/debian/changelog 2012-08-21 08:42:54.000000000 +0200 @@ -1,3 +1,14 @@ +python-django (1.4.1-2) unstable; urgency=low + + * New patch 01_use_stdlib_htmlparser_when_possible.diff to not override + Python stdlib's HTMLParser with Python versions which are unaffected by + http://bugs.python.org/issue670664 Closes: #683648 + Thanks to David Watson <da...@planetwatson.co.uk> for the patch. + * Update the above patch to use the version committed upstream (commit + 57d9ccc). + + -- Raphaël Hertzog <hert...@debian.org> Tue, 21 Aug 2012 08:42:10 +0200 + python-django (1.4.1-1) unstable; urgency=low * New upstream security and maintenance release. Closes: #683364 diff -Nru python-django-1.4.1/debian/patches/01_use_stdlib_htmlparser_when_possible.diff python-django-1.4.1/debian/patches/01_use_stdlib_htmlparser_when_possible.diff --- python-django-1.4.1/debian/patches/01_use_stdlib_htmlparser_when_possible.diff 1970-01-01 01:00:00.000000000 +0100 +++ python-django-1.4.1/debian/patches/01_use_stdlib_htmlparser_when_possible.diff 2012-08-21 08:40:30.000000000 +0200 @@ -0,0 +1,213 @@ +Description: Do not use Django's custom HTMLParser when the stdlib version works + Django provided its own HTMLParser derived from stdlib's HTMLParser to + work around a bug (http://bugs.python.org/issue670664). Unfortunately, + this derived object breaks when the stdlib's HTMLParser is fixed. + . + Thus we modify Django to only use the derived objects with Python + versions which are known to be affected by the problem. +Author: David Watson <da...@planetwatson.co.uk> +Reviewed-by: Raphaël Hertzog <hert...@debian.org> +Origin: upstream, https://github.com/django/django/commit/57d9ccc4aaef0420f6ba60a26e6af4e83b803ae9 +Bug: https://code.djangoproject.com/ticket/18239 +Bug-Debian: http://bugs.debian.org/683648 + +diff --git a/django/utils/html_parser.py b/django/utils/html_parser.py +index b280057..4449461 100644 +--- a/django/utils/html_parser.py ++++ b/django/utils/html_parser.py +@@ -1,98 +1,109 @@ + import HTMLParser as _HTMLParser + import re ++import sys + ++current_version = sys.version_info + +-class HTMLParser(_HTMLParser.HTMLParser): +- """ +- Patched version of stdlib's HTMLParser with patch from: +- http://bugs.python.org/issue670664 +- """ +- def __init__(self): +- _HTMLParser.HTMLParser.__init__(self) +- self.cdata_tag = None ++use_workaround = ( ++ (current_version < (2, 6, 8)) or ++ (current_version >= (2, 7) and current_version < (2, 7, 3)) or ++ (current_version >= (3, 0) and current_version < (3, 2, 3)) ++) + +- def set_cdata_mode(self, tag): +- try: +- self.interesting = _HTMLParser.interesting_cdata +- except AttributeError: +- self.interesting = re.compile(r'</\s*%s\s*>' % tag.lower(), re.I) +- self.cdata_tag = tag.lower() ++if not use_workaround: ++ HTMLParser = _HTMLParser.HTMLParser ++else: ++ class HTMLParser(_HTMLParser.HTMLParser): ++ """ ++ Patched version of stdlib's HTMLParser with patch from: ++ http://bugs.python.org/issue670664 ++ """ ++ def __init__(self): ++ _HTMLParser.HTMLParser.__init__(self) ++ self.cdata_tag = None + +- def clear_cdata_mode(self): +- self.interesting = _HTMLParser.interesting_normal +- self.cdata_tag = None ++ def set_cdata_mode(self, tag): ++ try: ++ self.interesting = _HTMLParser.interesting_cdata ++ except AttributeError: ++ self.interesting = re.compile(r'</\s*%s\s*>' % tag.lower(), re.I) ++ self.cdata_tag = tag.lower() + +- # Internal -- handle starttag, return end or -1 if not terminated +- def parse_starttag(self, i): +- self.__starttag_text = None +- endpos = self.check_for_whole_start_tag(i) +- if endpos < 0: +- return endpos +- rawdata = self.rawdata +- self.__starttag_text = rawdata[i:endpos] ++ def clear_cdata_mode(self): ++ self.interesting = _HTMLParser.interesting_normal ++ self.cdata_tag = None ++ ++ # Internal -- handle starttag, return end or -1 if not terminated ++ def parse_starttag(self, i): ++ self.__starttag_text = None ++ endpos = self.check_for_whole_start_tag(i) ++ if endpos < 0: ++ return endpos ++ rawdata = self.rawdata ++ self.__starttag_text = rawdata[i:endpos] + +- # Now parse the data between i+1 and j into a tag and attrs +- attrs = [] +- match = _HTMLParser.tagfind.match(rawdata, i + 1) +- assert match, 'unexpected call to parse_starttag()' +- k = match.end() +- self.lasttag = tag = rawdata[i + 1:k].lower() ++ # Now parse the data between i+1 and j into a tag and attrs ++ attrs = [] ++ match = _HTMLParser.tagfind.match(rawdata, i + 1) ++ assert match, 'unexpected call to parse_starttag()' ++ k = match.end() ++ self.lasttag = tag = rawdata[i + 1:k].lower() + +- while k < endpos: +- m = _HTMLParser.attrfind.match(rawdata, k) +- if not m: +- break +- attrname, rest, attrvalue = m.group(1, 2, 3) +- if not rest: +- attrvalue = None +- elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ +- attrvalue[:1] == '"' == attrvalue[-1:]: +- attrvalue = attrvalue[1:-1] +- attrvalue = self.unescape(attrvalue) +- attrs.append((attrname.lower(), attrvalue)) +- k = m.end() ++ while k < endpos: ++ m = _HTMLParser.attrfind.match(rawdata, k) ++ if not m: ++ break ++ attrname, rest, attrvalue = m.group(1, 2, 3) ++ if not rest: ++ attrvalue = None ++ elif attrvalue[:1] == '\'' == attrvalue[-1:] or \ ++ attrvalue[:1] == '"' == attrvalue[-1:]: ++ attrvalue = attrvalue[1:-1] ++ attrvalue = self.unescape(attrvalue) ++ attrs.append((attrname.lower(), attrvalue)) ++ k = m.end() + +- end = rawdata[k:endpos].strip() +- if end not in (">", "/>"): +- lineno, offset = self.getpos() +- if "\n" in self.__starttag_text: +- lineno = lineno + self.__starttag_text.count("\n") +- offset = len(self.__starttag_text) \ +- - self.__starttag_text.rfind("\n") ++ end = rawdata[k:endpos].strip() ++ if end not in (">", "/>"): ++ lineno, offset = self.getpos() ++ if "\n" in self.__starttag_text: ++ lineno = lineno + self.__starttag_text.count("\n") ++ offset = len(self.__starttag_text) \ ++ - self.__starttag_text.rfind("\n") ++ else: ++ offset = offset + len(self.__starttag_text) ++ self.error("junk characters in start tag: %r" ++ % (rawdata[k:endpos][:20],)) ++ if end.endswith('/>'): ++ # XHTML-style empty tag: <span attr="value" /> ++ self.handle_startendtag(tag, attrs) + else: +- offset = offset + len(self.__starttag_text) +- self.error("junk characters in start tag: %r" +- % (rawdata[k:endpos][:20],)) +- if end.endswith('/>'): +- # XHTML-style empty tag: <span attr="value" /> +- self.handle_startendtag(tag, attrs) +- else: +- self.handle_starttag(tag, attrs) +- if tag in self.CDATA_CONTENT_ELEMENTS: +- self.set_cdata_mode(tag) # <--------------------------- Changed +- return endpos ++ self.handle_starttag(tag, attrs) ++ if tag in self.CDATA_CONTENT_ELEMENTS: ++ self.set_cdata_mode(tag) # <--------------------------- Changed ++ return endpos + +- # Internal -- parse endtag, return end or -1 if incomplete +- def parse_endtag(self, i): +- rawdata = self.rawdata +- assert rawdata[i:i + 2] == "</", "unexpected call to parse_endtag" +- match = _HTMLParser.endendtag.search(rawdata, i + 1) # > +- if not match: +- return -1 +- j = match.end() +- match = _HTMLParser.endtagfind.match(rawdata, i) # </ + tag + > +- if not match: +- if self.cdata_tag is not None: # *** add *** +- self.handle_data(rawdata[i:j]) # *** add *** +- return j # *** add *** +- self.error("bad end tag: %r" % (rawdata[i:j],)) +- # --- changed start --------------------------------------------------- +- tag = match.group(1).strip() +- if self.cdata_tag is not None: +- if tag.lower() != self.cdata_tag: +- self.handle_data(rawdata[i:j]) +- return j +- # --- changed end ----------------------------------------------------- +- self.handle_endtag(tag.lower()) +- self.clear_cdata_mode() +- return j ++ # Internal -- parse endtag, return end or -1 if incomplete ++ def parse_endtag(self, i): ++ rawdata = self.rawdata ++ assert rawdata[i:i + 2] == "</", "unexpected call to parse_endtag" ++ match = _HTMLParser.endendtag.search(rawdata, i + 1) # > ++ if not match: ++ return -1 ++ j = match.end() ++ match = _HTMLParser.endtagfind.match(rawdata, i) # </ + tag + > ++ if not match: ++ if self.cdata_tag is not None: # *** add *** ++ self.handle_data(rawdata[i:j]) # *** add *** ++ return j # *** add *** ++ self.error("bad end tag: %r" % (rawdata[i:j],)) ++ # --- changed start --------------------------------------------------- ++ tag = match.group(1).strip() ++ if self.cdata_tag is not None: ++ if tag.lower() != self.cdata_tag: ++ self.handle_data(rawdata[i:j]) ++ return j ++ # --- changed end ----------------------------------------------------- ++ self.handle_endtag(tag.lower()) ++ self.clear_cdata_mode() ++ return j diff -Nru python-django-1.4.1/debian/patches/series python-django-1.4.1/debian/patches/series --- python-django-1.4.1/debian/patches/series 2012-08-02 10:48:35.000000000 +0200 +++ python-django-1.4.1/debian/patches/series 2012-08-03 08:40:12.000000000 +0200 @@ -1,3 +1,4 @@ +01_use_stdlib_htmlparser_when_possible.diff 02_disable-sources-in-sphinxdoc.diff 03_manpage.diff 06_use_debian_geoip_database_as_default.diff -- System Information: Debian Release: wheezy/sid APT prefers stable-updates APT policy: (500, 'stable-updates'), (500, 'proposed-updates'), (500, 'unstable'), (500, 'testing'), (500, 'stable'), (150, 'experimental') Architecture: i386 (x86_64) Foreign Architectures: amd64 Kernel: Linux 3.4-trunk-amd64 (SMP w/2 CPU cores) Locale: LANG=fr_FR.utf8, LC_CTYPE=fr_FR.utf8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash -- To UNSUBSCRIBE, email to debian-release-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20120821072328.27354.52432.reportbug@rivendell.localdomain