summaryrefslogtreecommitdiffstats
path: root/layman
diff options
context:
space:
mode:
authorSebastian Pipping <sebastian@pipping.org>2010-01-02 04:23:56 +0100
committerSebastian Pipping <sebastian@pipping.org>2010-01-02 04:23:56 +0100
commita4ce3e5d2076528950155069999873a92b87833e (patch)
tree032e20727a8ef4f83fe1d7cb6565a68887264eca /layman
parent13b8a3969b3fcba55b25d2b593c78abf708fec06 (diff)
downloadlayman-a4ce3e5d2076528950155069999873a92b87833e.tar.gz
layman-a4ce3e5d2076528950155069999873a92b87833e.tar.bz2
layman-a4ce3e5d2076528950155069999873a92b87833e.zip
Fix handling of non-ASCII characters
Diffstat (limited to 'layman')
-rw-r--r--layman/overlays/overlay.py14
-rw-r--r--layman/tests/external.py43
-rw-r--r--layman/tests/testfiles/overlays_bug_286290.xml13
3 files changed, 68 insertions, 2 deletions
diff --git a/layman/overlays/overlay.py b/layman/overlays/overlay.py
index e10f562..99aadad 100644
--- a/layman/overlays/overlay.py
+++ b/layman/overlays/overlay.py
@@ -29,6 +29,7 @@ __version__ = "$Id: overlay.py 273 2006-12-30 15:54:50Z wrobel $"
#-------------------------------------------------------------------------------
import sys, types, re, os, os.path, shutil, subprocess
+import codecs
import xml.etree.ElementTree as ET # Python 2.5
from layman.utils import path, ensure_unicode
@@ -226,6 +227,15 @@ class Overlay:
result = cmd.wait()
return result
+ def _get_encoding(self):
+ if hasattr(sys.stdout, 'encoding'):
+ return sys.stdout.encoding
+ else:
+ return 'ascii'
+
+ def _encode(self, unicode_text):
+ return codecs.encode(unicode_text, self._get_encoding(), 'replace')
+
def __str__(self):
'''
>>> here = os.path.dirname(os.path.realpath(__file__))
@@ -272,7 +282,7 @@ class Overlay:
result += u'\n '.join((u'\n' + link).split(u'\n'))
result += u'\n'
- return result
+ return self._encode(result)
def short_list(self, width = 0):
'''
@@ -321,7 +331,7 @@ class Overlay:
source = source.replace("overlays.gentoo.org", "o.g.o")
source = ' (' + pad(source, srclen) + ')'
- return name + mtype + source
+ return self._encode(name + mtype + source)
def supported(self, binaries = []):
'''Is the overlay type supported?'''
diff --git a/layman/tests/external.py b/layman/tests/external.py
new file mode 100644
index 0000000..f88ea43
--- /dev/null
+++ b/layman/tests/external.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+#################################################################################
+# EXTENRAL LAYMAN TESTS
+#################################################################################
+# File: external.py
+#
+# Runs external (non-doctest) test cases.
+#
+# Copyright:
+# (c) 2009 Sebastian Pipping
+# Distributed under the terms of the GNU General Public License v2
+#
+# Author(s):
+# Sebastian Pipping <sebastian@pipping.org>
+#
+'''Runs external (non-doctest) test cases.'''
+
+import unittest
+import os
+from layman.overlay import Overlays
+
+HERE = os.path.dirname(os.path.realpath(__file__))
+
+
+class Unicode(unittest.TestCase):
+ def _overlays_bug(self, number):
+ config = {}
+ filename = os.path.join(HERE, 'testfiles', 'overlays_bug_%d.xml' % number)
+ o = Overlays([filename], config)
+ for verbose in (True, False):
+ for t in o.list(verbose=verbose):
+ print t[0]
+ print
+
+ def test_184449(self):
+ self._overlays_bug(184449)
+
+ def test_286290(self):
+ self._overlays_bug(286290)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/layman/tests/testfiles/overlays_bug_286290.xml b/layman/tests/testfiles/overlays_bug_286290.xml
new file mode 100644
index 0000000..1d4bd1b
--- /dev/null
+++ b/layman/tests/testfiles/overlays_bug_286290.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<layman>
+ <overlay contact="media-video@gentoo.org"
+ name="multimedia"
+ src="git://gitorious.org/gentoo-multimedia/gentoo-multimedia.git"
+ status="official"
+ type="git">
+ <link>http://gitorious.org/gentoo-multimedia</link>
+ <description>Repository for development of (mostly bleeding-edge)
+ multimedia packages for Gentoo Linux. This is the official overlay
+ for Gentoo’s media herds.</description>
+ </overlay>
+</layman>