90 lines
3.9 KiB
Diff
90 lines
3.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Tanguy Ortolo <tanguy+debian@ortolo.eu>
|
|
Date: Fri, 7 Dec 2018 00:00:00 +0000
|
|
Subject: [PATCH] Fix the crash from #912099
|
|
|
|
ITS Tool 2.0.4 crashes when building some documentation, as reported in #912099.
|
|
This comes from translations with invalid XML markup, which ITS Tool fails to
|
|
merge (which is not abnormal), and to report these issues, needlessly encodes
|
|
the original msgstr from unicode to bytes, causing it to be recoded using the
|
|
default ascii codec, which fails when the msgstr contains anything out of ascii.
|
|
|
|
This patch removes the useless decoding, avoiding the failing subsequent
|
|
recoding. It also explicitly encodes the output strings to be able to print them
|
|
in all cases, even when the output encoding cannot be detected.
|
|
|
|
Bug: https://github.com/itstool/itstool/issues/25
|
|
Bug-Debian: https://bugs.debian.org/912099
|
|
Forwarded: https://github.com/itstool/itstool/issues/25
|
|
---
|
|
itstool.in | 21 +++++++++++++++++----
|
|
1 file changed, 17 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/itstool.in b/itstool.in
|
|
index c21ad4bfeb86..f34673581c88 100755
|
|
--- a/itstool.in
|
|
+++ b/itstool.in
|
|
@@ -44,9 +44,22 @@ if PY3:
|
|
else:
|
|
return str(s)
|
|
ustr_type = str
|
|
+ def pr_str(s):
|
|
+ """Return a string that can be safely print()ed"""
|
|
+ # Since print works on both bytes and unicode, just return the argument
|
|
+ return s
|
|
else:
|
|
string_types = basestring,
|
|
ustr = ustr_type = unicode
|
|
+ def pr_str(s):
|
|
+ """Return a string that can be safely print()ed"""
|
|
+ if isinstance(s, str):
|
|
+ # Since print works on str, just return the argument
|
|
+ return s
|
|
+ else:
|
|
+ # print may not work on unicode if the output encoding cannot be
|
|
+ # detected, so just encode with UTF-8
|
|
+ return unicode.encode(s, 'utf-8')
|
|
|
|
NS_ITS = 'http://www.w3.org/2005/11/its'
|
|
NS_ITST = 'http://itstool.org/extensions/'
|
|
@@ -1077,36 +1090,36 @@ class Document (object):
|
|
if strict:
|
|
raise
|
|
else:
|
|
- sys.stderr.write('Warning: Could not merge %stranslation for msgid:\n%s\n' % (
|
|
+ sys.stderr.write(pr_str('Warning: Could not merge %stranslation for msgid:\n%s\n' % (
|
|
(lang + ' ') if lang is not None else '',
|
|
- msgstr.encode('utf-8')))
|
|
+ msgstr)))
|
|
self._xml_err = ''
|
|
return node
|
|
def scan_node(node):
|
|
children = [child for child in xml_child_iter(node)]
|
|
for child in children:
|
|
if child.type != 'element':
|
|
continue
|
|
if child.ns() is not None and child.ns().content == NS_BLANK:
|
|
ph_node = msg.get_placeholder(child.name).node
|
|
if self.has_child_elements(ph_node):
|
|
self.merge_translations(translations, None, ph_node, strict=strict)
|
|
newnode = ph_node.copyNode(1)
|
|
newnode.setTreeDoc(self._doc)
|
|
child.replaceNode(newnode)
|
|
else:
|
|
repl = self.get_translated(ph_node, translations, strict=strict, lang=lang)
|
|
child.replaceNode(repl)
|
|
scan_node(child)
|
|
try:
|
|
scan_node(trnode)
|
|
except:
|
|
if strict:
|
|
raise
|
|
else:
|
|
- sys.stderr.write('Warning: Could not merge %stranslation for msgid:\n%s\n' % (
|
|
+ sys.stderr.write(pr_str('Warning: Could not merge %stranslation for msgid:\n%s\n' % (
|
|
(lang + ' ') if lang is not None else '',
|
|
- msgstr.encode('utf-8')))
|
|
+ msgstr)))
|
|
self._xml_err = ''
|
|
ctxt.doc().freeDoc()
|
|
return node
|