From 1fb046306b9ebe160eeacc7843ee1ddd15a47ffa Mon Sep 17 00:00:00 2001 From: Raul Tambre Date: Mon, 8 Apr 2019 19:13:37 +0000 Subject: [PATCH] Fix UTF-8 output in gclient_utils.CheckCallAndFilter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 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 Reviewed-by: Dirk Pranke Commit-Queue: Raul Tambre --- gclient_utils.py | 2 +- tests/gclient_utils_test.py | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/gclient_utils.py b/gclient_utils.py index ae9d7217ad..5b751b4678 100644 --- a/gclient_utils.py +++ b/gclient_utils.py @@ -573,7 +573,7 @@ def CheckCallAndFilter(args, stdout=None, filter_fn=None, while in_byte: output.write(in_byte) if print_stdout: - stdout.write(in_byte.decode()) + stdout.write(in_byte) if in_byte not in ['\r', '\n']: in_line += in_byte else: diff --git a/tests/gclient_utils_test.py b/tests/gclient_utils_test.py index fe0c424b7c..8ffd1d3f66 100755 --- a/tests/gclient_utils_test.py +++ b/tests/gclient_utils_test.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# coding=utf-8 # Copyright (c) 2012 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -60,16 +61,18 @@ class CheckCallAndFilterTestCase(GclientUtilBase): capture_list.append(match.group(1)) gclient_utils.CheckCallAndFilterAndHeader( 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']) def testCheckCallAndFilter(self): 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.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')