[Python-modules-commits] r22548 - in packages/python-django/trunk/debian (3 files)
hertzog at users.alioth.debian.org
hertzog at users.alioth.debian.org
Tue Aug 21 06:44:45 UTC 2012
Date: Tuesday, August 21, 2012 @ 06:44:44
Author: hertzog
Revision: 22548
Update a patch to use the version committed upstream (commit 57d9ccc).
Added:
packages/python-django/trunk/debian/patches/01_use_stdlib_htmlparser_when_possible.diff
Modified:
packages/python-django/trunk/debian/changelog
packages/python-django/trunk/debian/patches/series
Modified: packages/python-django/trunk/debian/changelog
===================================================================
--- packages/python-django/trunk/debian/changelog 2012-08-20 19:48:27 UTC (rev 22547)
+++ packages/python-django/trunk/debian/changelog 2012-08-21 06:44:44 UTC (rev 22548)
@@ -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 <david at planetwatson.co.uk> for the patch.
+ * Update the above patch to use the version committed upstream (commit
+ 57d9ccc).
+
+ -- Raphaël Hertzog <hertzog at 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
Added: packages/python-django/trunk/debian/patches/01_use_stdlib_htmlparser_when_possible.diff
===================================================================
--- packages/python-django/trunk/debian/patches/01_use_stdlib_htmlparser_when_possible.diff (rev 0)
+++ packages/python-django/trunk/debian/patches/01_use_stdlib_htmlparser_when_possible.diff 2012-08-21 06:44:44 UTC (rev 22548)
@@ -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 <david at planetwatson.co.uk>
+Reviewed-by: Raphaël Hertzog <hertzog at 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
Modified: packages/python-django/trunk/debian/patches/series
===================================================================
--- packages/python-django/trunk/debian/patches/series 2012-08-20 19:48:27 UTC (rev 22547)
+++ packages/python-django/trunk/debian/patches/series 2012-08-21 06:44:44 UTC (rev 22548)
@@ -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
More information about the Python-modules-commits
mailing list