#12536 closed defect (fixed)
TypeError is raised while rendering wiki text on Genshi 0.6 with speedups
| Reported by: | Jun Omae | Owned by: | Jun Omae |
|---|---|---|---|
| Priority: | normal | Milestone: | 1.0.13 |
| Component: | wiki system | Version: | |
| Severity: | normal | Keywords: | |
| Cc: | Branch: | ||
| Release Notes: |
Add workaround for |
||
| API Changes: | |||
| Internal Changes: | |||
Description (last modified by )
Wiki including [[search:|""]] leads a TypeError on Genshi 0.6 with speedups. Root cause of this issue is genshi.core.escape(). I got the same issue on my production environment.
>>> import genshi >>> genshi.__version__ '0.6' >>> from genshi.core import Markup, escape >>> Markup, escape (<type 'genshi._speedups.Markup'>, <built-in method escape of type object at 0x7f5d42f5fb60>) >>> escape('', False) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unicode() argument 2 must be string, not bool
03:34:19 PM Trac[main] ERROR: Internal Server Error: <RequestWithSession "POST '/newticket'">, referrer 'http://27.local:3000/1.0-sqlite/newticket'
Traceback (most recent call last):
File "<venv>/local/lib/python2.7/site-packages/trac/web/main.py", line 562, in _dispatch_request
dispatcher.dispatch(req)
File "<venv>/local/lib/python2.7/site-packages/trac/web/main.py", line 269, in dispatch
iterable=chrome.use_chunked_encoding)
File "<venv>/local/lib/python2.7/site-packages/trac/web/chrome.py", line 1115, in render_template
encoding='utf-8')
File "<venv>/local/lib/python2.7/site-packages/genshi/core.py", line 183, in render
return encode(generator, method=method, encoding=encoding, out=out)
File "<venv>/local/lib/python2.7/site-packages/genshi/output.py", line 58, in encode
for chunk in iterator:
File "<venv>/local/lib/python2.7/site-packages/genshi/output.py", line 339, in __call__
for kind, data, pos in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/output.py", line 826, in __call__
for kind, data, pos in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/output.py", line 670, in __call__
for kind, data, pos in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/output.py", line 771, in __call__
for kind, data, pos in chain(stream, [(None, None, None)]):
File "<venv>/local/lib/python2.7/site-packages/genshi/output.py", line 586, in __call__
for ev in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/core.py", line 288, in _ensure
for event in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/core.py", line 288, in _ensure
for event in stream:
File "<venv>/local/lib/python2.7/site-packages/trac/web/chrome.py", line 1310, in _generate
for kind, data, pos in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/core.py", line 288, in _ensure
for event in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/template/base.py", line 605, in _include
for event in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/template/markup.py", line 327, in _match
for event in stream:
File "<venv>/local/lib/python2.7/site-packages/genshi/template/base.py", line 565, in _flatten
result = _eval_expr(data, ctxt, vars)
File "<venv>/local/lib/python2.7/site-packages/genshi/template/base.py", line 277, in _eval_expr
retval = expr.evaluate(ctxt)
File "<venv>/local/lib/python2.7/site-packages/genshi/template/eval.py", line 178, in evaluate
return eval(self.code, _globals, {'__data__': data})
File "<venv>/local/lib/python2.7/site-packages/trac/ticket/templates/ticket_box.html", line 124, in <Expression u'wiki_to_html(context, ticket.description, escape_newlines=preserve_newlines)'>
${wiki_to_html(context, ticket.description, escape_newlines=preserve_newlines)}
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 1586, in format_to_html
return HtmlFormatter(env, context, wikidom).generate(escape_newlines)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 1541, in generate
escape_newlines)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 1323, in format
result = re.sub(self.wikiparser.rules, self.replace, line)
File "<venv>/lib/python2.7/re.py", line 151, in sub
return _compile(pattern, flags).sub(repl, string, count)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 1241, in replace
replacement = self.handle_match(fullmatch)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 1237, in handle_match
return internal_handler(match, fullmatch)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 782, in _macrolink_formatter
return self._lhref_formatter(match, fullmatch)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 618, in _lhref_formatter
return self._make_lhref_link(match, fullmatch, rel, ns, target, label)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 653, in _make_lhref_link
fullmatch)
File "<venv>/local/lib/python2.7/site-packages/trac/wiki/formatter.py", line 664, in _make_link
return resolver(self, ns, target, escape(label, False))
TypeError: unicode() argument 2 must be string, not bool
The genshi.core.escape() crashes when first argument is None or an empty string. This issue has been filed in genshi:#439 and fixed on Genshi 0.7. However, we recommend Genshi 0.6 due to #11184 and the version still has it….
Then, I think we could detect this issue and fix up it like this. Thoughts?
-
trac/util/html.py
diff --git a/trac/util/html.py b/trac/util/html.py index dd1357728..80d4b5a30 100644
a b class TransposingElementFactory(ElementFactory): 291 291 html = TransposingElementFactory(str.lower) 292 292 293 293 294 try: 295 escape('', False) # detecting genshi:#439 on Genshi 0.6 with speedups... 296 except TypeError: 297 _escape = escape 298 299 def escape(text, quotes=True): 300 if text: 301 return _escape(text, quotes=quotes) 302 else: 303 return Markup(u'') 304 305 294 306 def plaintext(text, keeplinebreaks=True): 295 307 """Extract the text elements from (X)HTML content 296 308
Attachments (0)
Change History (9)
comment:1 by , 9 years ago
| Description: | modified (diff) |
|---|
follow-up: 9 comment:3 by , 9 years ago
Interested. However, escape(None, False) returns <Markup u''> on Genshi 0.7. I think work around should lead the same result for this, at least.
| 0.6 without speedups | 0.6 with speedups | 0.7 without speedups | 0.7 with speedups | |
escape(None, False) | <Markup u''> | TypeError | <Markup u''> | <Markup u''>
|
escape('', False) | <Markup u''> | TypeError | <Markup u''> | <Markup u''>
|
escape(0, False) | <Markup u''> | TypeError | <Markup u''> | <Markup u''>
|
escape(1, False) | AttributeError | <Markup u'1'> | AttributeError | <Markup u'1'>
|
escape(False, False) | <Markup u''> | TypeError | <Markup u''> | <Markup u''>
|
escape(True, False) | AttributeError | <Markup u'True'> | AttributeError | <Markup u'True'>
|
escape('"', False) | <Markup u'"'> | <Markup u'"'> | <Markup u'"'> | <Markup u'"'>
|
escape('"', True) | <Markup u'"'> | <Markup u'"'> | <Markup u'"'> | <Markup u'"'>
|
comment:4 by , 9 years ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
Proposed changes in jomae.git@t12536.
comment:6 by , 9 years ago
Thanks for the review. I'll push it after granting commit right to me for 1.2-stable branch.
comment:8 by , 9 years ago
| Release Notes: | modified (diff) |
|---|---|
| Resolution: | → fixed |
| Status: | assigned → closed |
Thanks. Committed in [14967] and merged to 1.2-stable and trunk in [14968:14969].
comment:9 by , 9 years ago
Replying to Jun Omae:
Interested. However,
escape(None, False)returns<Markup u''>on Genshi 0.7.
Note how this also currently differs from escape in Trac/jinja2 branch:
| Trac jinja2 | |
escape(None, False) | Markup(u'None')
|
escape('', False) | Markup(u'')
|
escape(0, False) | Markup(u'0')
|
escape(1, False) | Markup(u'1')
|
escape(False, False) | Markup(u'False')
|
escape(True, False) | Markup(u'True')
|
escape('"', False) | Markup(u'"')
|
escape('"', True) | Markup(u'"')
|
I somehow find that more consistent, but if we decide to favor backward compatibility, I could adapt it.



That looks like a good workaround.
I noticed the error isn't seen when passing a keyword, so the following might be sufficient: