summaryrefslogtreecommitdiff
path: root/debian/patches/fix-unicode-errors.patch
blob: 459ff47fdb02bd3175a16828eea8f65f620c5394 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Description: fix for several UnicodeDecode/Encode/Error if DEFAULT_ENCODING cannot encode unicode characters
Author: Ben Carrillo <ben@futeisha.org>
Bug: https://github.com/amoffat/sh/issues/123
Forwarded: yes
--- a/sh.py
+++ b/sh.py
@@ -117,8 +117,14 @@
             if err_delta: 
                 tstderr += ("... (%d more, please see e.stderr)" % err_delta).encode()
 
-        msg = "\n\n  RAN: %r\n\n  STDOUT:\n%s\n\n  STDERR:\n%s" %\
-            (full_cmd, tstdout.decode(DEFAULT_ENCODING), tstderr.decode(DEFAULT_ENCODING))
+        try:
+            msg = "\n\n  ran: %r\n\n  stdout:\n%s\n\n  stderr:\n%s" %\
+                (full_cmd, tstdout.decode(DEFAULT_ENCODING),
+                    tstderr.decode(DEFAULT_ENCODING))
+        except UnicodeDecodeError:
+            msg = "\n\n  ran: %r\n\n  stdout:\n%s\n\n  stderr:\n%s" %\
+                (full_cmd, tstdout.decode('utf-8'), tstderr.decode('utf-8'))
+
         super(ErrorReturnCode, self).__init__(msg)
         
         
@@ -371,8 +377,12 @@
         
     def __unicode__(self):
         if self.process and self.stdout:
-            return self.stdout.decode(self.call_args["encoding"],
-                self.call_args["decode_errors"])
+            try:
+                return self.stdout.decode(self.call_args["encoding"],
+                    self.call_args["decode_errors"])
+            except UnicodeDecodeError:
+                return self.stdout.decode('utf-8',
+                    self.call_args["decode_errors"])
         return ""
 
     def __eq__(self, other):
@@ -561,7 +571,11 @@
             # if the argument is already unicode, or a number or whatever,
             # this first call will fail.  
             try: arg = unicode(arg, DEFAULT_ENCODING).encode(DEFAULT_ENCODING)
-            except TypeError: arg = unicode(arg).encode(DEFAULT_ENCODING)
+            except TypeError:
+                try:
+                    arg = unicode(arg).encode(DEFAULT_ENCODING)
+                except UnicodeEncodeError:
+                    arg = unicode(arg).encode('utf-8')
         return arg
 
         
@@ -633,7 +647,11 @@
        
     def __str__(self):
         if IS_PY3: return self.__unicode__()
-        else: return unicode(self).encode(DEFAULT_ENCODING)
+        else:
+            try:
+                return unicode(self).encode(DEFAULT_ENCODING)
+            except UnicodeEncodeError:
+                return unicode(self).encode('utf-8')
         
     def __eq__(self, other):
         try: return str(self) == str(other)
@@ -839,7 +857,11 @@
                 self.setwinsize(1)
             
             # actually execute the process
-            if self.call_args["env"] is None: os.execv(cmd[0], cmd)
+            if self.call_args["env"] is None:
+                if IS_PY3:
+                    os.execv(cmd[0], [c.encode('utf-8') for c in cmd])
+                else:
+                    os.execv(cmd[0], cmd)
             else: os.execve(cmd[0], cmd, self.call_args["env"])
 
             os._exit(255)
--- a/test.py
+++ b/test.py
@@ -1338,9 +1338,9 @@
 import sys
 sys.stdout.write("te漢字st")
 """)
-        fn = partial(python, py.name, _encoding="ascii")
-        def s(fn): str(fn())
-        self.assertRaises(UnicodeDecodeError, s, fn)
+        #fn = partial(python, py.name, _encoding="ascii")
+        #def s(fn): str(fn())
+        #self.assertRaises(UnicodeDecodeError, s, fn)
         
         p = python(py.name, _encoding="ascii", _decode_errors="ignore")
         self.assertEqual(p, "test")