Răsfoiți Sursa

Fix UTF-8 output in gclient_utils.CheckCallAndFilter

Hooks for Electron output UTF-8 characters.
Example error for when "✔" is output:
  File "/home/markus/depot_tools/metrics.py", line 266, in print_notice_and_exit
    yield
  File "/home/markus/depot_tools/gclient.py", line 3112, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/home/markus/depot_tools/gclient.py", line 3098, in main
    return dispatcher.execute(OptionParser(), argv)
  File "/home/markus/depot_tools/subcommand.py", line 252, in execute
    return command(parser, args[1:])
  File "/home/markus/depot_tools/gclient.py", line 2677, in CMDsync
    ret = client.RunOnDeps('update', args)
  File "/home/markus/depot_tools/gclient.py", line 1746, in RunOnDeps
    self.RunHooksRecursively(self._options, pm)
  File "/home/markus/depot_tools/gclient.py", line 1052, in RunHooksRecursively
    hook.run()
  File "/home/markus/depot_tools/gclient.py", line 245, in run
    cmd, cwd=self.effective_cwd, always=self._verbose)
  File "/home/markus/depot_tools/gclient_utils.py", line 344, in CheckCallAndFilterAndHeader
    return CheckCallAndFilter(args, **kwargs)
  File "/home/markus/depot_tools/gclient_utils.py", line 576, in CheckCallAndFilter
    stdout.write(in_byte.decode())
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 0: unexpected end of data

This issue was introduced in CL:1524583.

Bug: 942522
Change-Id: I3c4355b925b34398c800d142f942531a829e0297
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/1541334
Auto-Submit: Raul Tambre <raul@tambre.ee>
Reviewed-by: Dirk Pranke <dpranke@chromium.org>
Commit-Queue: Raul Tambre <raul@tambre.ee>
Raul Tambre 6 ani în urmă
părinte
comite
1fb046306b
2 a modificat fișierele cu 9 adăugiri și 6 ștergeri
  1. 1 1
      gclient_utils.py
  2. 8 5
      tests/gclient_utils_test.py

+ 1 - 1
gclient_utils.py

@@ -573,7 +573,7 @@ def CheckCallAndFilter(args, stdout=None, filter_fn=None,
         while in_byte:
         while in_byte:
           output.write(in_byte)
           output.write(in_byte)
           if print_stdout:
           if print_stdout:
-            stdout.write(in_byte.decode())
+            stdout.write(in_byte)
           if in_byte not in ['\r', '\n']:
           if in_byte not in ['\r', '\n']:
             in_line += in_byte
             in_line += in_byte
           else:
           else:

+ 8 - 5
tests/gclient_utils_test.py

@@ -1,4 +1,5 @@
 #!/usr/bin/env python
 #!/usr/bin/env python
+# coding=utf-8
 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 # found in the LICENSE file.
@@ -60,16 +61,18 @@ class CheckCallAndFilterTestCase(GclientUtilBase):
         capture_list.append(match.group(1))
         capture_list.append(match.group(1))
     gclient_utils.CheckCallAndFilterAndHeader(
     gclient_utils.CheckCallAndFilterAndHeader(
         args, cwd=cwd, always=True, filter_fn=FilterLines)
         args, cwd=cwd, always=True, filter_fn=FilterLines)
-    self.assertEquals(line_list, ['ahah', 'accb', 'allo', 'addb'])
+    self.assertEquals(line_list, ['ahah', 'accb', 'allo', 'addb', '✔'])
     self.assertEquals(capture_list, ['cc', 'dd'])
     self.assertEquals(capture_list, ['cc', 'dd'])
 
 
   def testCheckCallAndFilter(self):
   def testCheckCallAndFilter(self):
     args = ['boo', 'foo', 'bar']
     args = ['boo', 'foo', 'bar']
-    test_string = 'ahah\naccb\nallo\naddb\n'
+    test_string = 'ahah\naccb\nallo\naddb\n✔\n'
     self._inner(args, test_string)
     self._inner(args, test_string)
-    self.checkstdout('________ running \'boo foo bar\' in \'bleh\'\n'
-        'ahah\naccb\nallo\naddb\n'
-        '________ running \'boo foo bar\' in \'bleh\'\nahah\naccb\nallo\naddb'
+    self.checkstdout(
+        '________ running \'boo foo bar\' in \'bleh\'\n'
+        'ahah\naccb\nallo\naddb\n✔\n'
+        '________ running \'boo foo bar\' in \'bleh\'\n'
+        'ahah\naccb\nallo\naddb\n✔'
         '\n')
         '\n')