summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2020-02-14 23:38:28 -0500
committerMike Frysinger <vapier@google.com>2020-02-15 19:32:28 +0000
commit6a784ff9a6ea025021a33703152c7b2b1becb7fc (patch)
treec3e6cd849a2545f5b06e3ea03dd8c9446bfb070f
parenta46bf7dc2af111ae4a663d61ed06dc90ddfb8068 (diff)
downloadgit-repo-6a784ff9a6ea025021a33703152c7b2b1becb7fc.tar.gz
repo: handle bad programs a bit better
If programs emit non-UTF-8 output, we currently throw a fatal error. We largely only care about the exit status of programs, and even the output we do parse is a bit minimal. Lets make it into a warning and mangle the invalid bytes into U+FFFD. This should complain enough to annoy but not to break when it's not necessary. Bug: https://crbug.com/gerrit/12337#c2 Change-Id: Idbc94f19ff4d84d2e47e01960dd17d5b492d4a8a Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/255272 Reviewed-by: David Pursehouse <dpursehouse@collab.net> Tested-by: Mike Frysinger <vapier@google.com>
-rwxr-xr-xrepo18
1 files changed, 13 insertions, 5 deletions
diff --git a/repo b/repo
index 30bce52b..7771c2d8 100755
--- a/repo
+++ b/repo
@@ -363,15 +363,23 @@ def run_command(cmd, **kwargs):
363 kwargs.setdefault('stderr', subprocess.PIPE) 363 kwargs.setdefault('stderr', subprocess.PIPE)
364 cmd_input = kwargs.pop('input', None) 364 cmd_input = kwargs.pop('input', None)
365 365
366 def decode(output):
367 """Decode |output| to text."""
368 if output is None:
369 return output
370 try:
371 return output.decode('utf-8')
372 except UnicodeError:
373 print('repo: warning: Invalid UTF-8 output:\ncmd: %r\n%r' % (cmd, output),
374 file=sys.stderr)
375 # TODO(vapier): Once we require Python 3, use 'backslashreplace'.
376 return output.decode('utf-8', 'replace')
377
366 # Run & package the results. 378 # Run & package the results.
367 proc = subprocess.Popen(cmd, **kwargs) 379 proc = subprocess.Popen(cmd, **kwargs)
368 (stdout, stderr) = proc.communicate(input=cmd_input) 380 (stdout, stderr) = proc.communicate(input=cmd_input)
369 if stdout is not None:
370 stdout = stdout.decode('utf-8')
371 if stderr is not None:
372 stderr = stderr.decode('utf-8')
373 trace.print(':', ' '.join(cmd)) 381 trace.print(':', ' '.join(cmd))
374 ret = RunResult(proc.returncode, stdout, stderr) 382 ret = RunResult(proc.returncode, decode(stdout), decode(stderr))
375 383
376 # If things failed, print useful debugging output. 384 # If things failed, print useful debugging output.
377 if check and ret.returncode: 385 if check and ret.returncode: