| |
@@ -14,6 +14,8 @@
|
| |
import re
|
| |
from distutils.version import LooseVersion
|
| |
|
| |
+ import six
|
| |
+
|
| |
import kobo.pkgset
|
| |
from kobo.rpmlib import parse_nvra, make_nvr, make_nvra, get_changelogs_from_header
|
| |
from kobo.threads import ThreadPool, WorkerThread
|
| |
@@ -37,6 +39,23 @@
|
| |
return '{0:.{1}f} {2}'.format(size, prec, chosen)
|
| |
|
| |
|
| |
+ def to_utf8(text):
|
| |
+ if six.PY3:
|
| |
+ # Nothing needs to happen on Python 3, we already get correctly decoded
|
| |
+ # data from kobo or rpm.
|
| |
+ return text
|
| |
+ if not isinstance(text, str):
|
| |
+ # Text is already decoded to unicode, nothing to do...
|
| |
+ return text
|
| |
+ encodings = ["ascii", "utf8", "latin1", "latin2"]
|
| |
+ for encoding in encodings:
|
| |
+ try:
|
| |
+ return text.decode(encoding)
|
| |
+ except UnicodeDecodeError:
|
| |
+ pass
|
| |
+ return text.decode("ascii", "ignore")
|
| |
+
|
| |
+
|
| |
clogs = {}
|
| |
|
| |
|
| |
@@ -51,7 +70,7 @@
|
| |
ts = kwargs.pop("ts", None)
|
| |
header = kobo.rpmlib.get_rpm_header(file_path, ts=ts)
|
| |
|
| |
- self.summary = kobo.rpmlib.get_header_field(header, "summary")
|
| |
+ self.summary = to_utf8(kobo.rpmlib.get_header_field(header, "summary"))
|
| |
|
| |
if self.sourcerpm:
|
| |
key = self.sourcerpm
|
| |
@@ -96,10 +115,10 @@
|
| |
result = []
|
| |
try:
|
| |
old_time = old_changelog[0].time
|
| |
- old_nvr = LooseVersion(old_changelog[0].name.rsplit(None, 1)[-1])
|
| |
+ old_nvr = LooseVersion(to_utf8(old_changelog[0].name).rsplit(None, 1)[-1])
|
| |
while new_changelog:
|
| |
entry = new_changelog.pop(0)
|
| |
- new_nvr = LooseVersion(entry.name.rsplit(None, 1)[-1])
|
| |
+ new_nvr = LooseVersion(to_utf8(entry.name).rsplit(None, 1)[-1])
|
| |
if entry.time < old_time or (
|
| |
entry.time == old_time and new_nvr <= old_nvr
|
| |
):
|
| |
@@ -365,7 +384,9 @@
|
| |
|
| |
data["changelog"] = []
|
| |
for i in get_changelog_diff_from_headers(old_package, new_package, max_logs):
|
| |
- data["changelog"].append("* %s %s\n%s" % (i.ctime, i.name, i.text))
|
| |
+ data["changelog"].append(
|
| |
+ "* %s %s\n%s" % (i.ctime, to_utf8(i.name), to_utf8(i.text))
|
| |
+ )
|
| |
|
| |
# TODO: comps, system release
|
| |
# if rpm.versionCompare(old_package, new_package.header) == -1:
|
| |
When changelogs contain non-ascii data, there could be a decoding problem on old Python version when the changelog is serialized. This was not exercised by the test suite.
This partially reverts 86c951c, but only for Python 2.