From 0a9265e2d633b608090eff79ab4553f0e1c8c7c4 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 30 Sep 2019 23:59:27 -0400 Subject: [PATCH] diff: handle errors gracefully If `git diff` fails in any project checkout (e.g. an incomplete sync), make sure we print that error clearly rather than blowing up, and exit non-zero in the process. Bug: https://crbug.com/gerrit/11613 Change-Id: I12f278427cced20f23f8047e7e3dba8f442ee25e Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/239236 Reviewed-by: David Pursehouse Tested-by: Mike Frysinger --- project.py | 19 ++++++++++++++----- subcmds/diff.py | 5 ++++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/project.py b/project.py index a20b4134..b41a57cf 100755 --- a/project.py +++ b/project.py @@ -230,6 +230,7 @@ class DiffColoring(Coloring): def __init__(self, config): Coloring.__init__(self, config, 'diff') self.project = self.printer('header', attr='bold') + self.fail = self.printer('fail', fg='red') class _Annotation(object): @@ -1136,10 +1137,18 @@ class Project(object): cmd.append('--src-prefix=a/%s/' % self.relpath) cmd.append('--dst-prefix=b/%s/' % self.relpath) cmd.append('--') - p = GitCommand(self, - cmd, - capture_stdout=True, - capture_stderr=True) + try: + p = GitCommand(self, + cmd, + capture_stdout=True, + capture_stderr=True) + except GitError as e: + out.nl() + out.project('project %s/' % self.relpath) + out.nl() + out.fail('%s', str(e)) + out.nl() + return False has_diff = False for line in p.process.stdout: if not hasattr(line, 'encode'): @@ -1150,7 +1159,7 @@ class Project(object): out.nl() has_diff = True print(line[:-1]) - p.Wait() + return p.Wait() == 0 # Publish / Upload ## diff --git a/subcmds/diff.py b/subcmds/diff.py index 1f3abd86..fa41e70e 100644 --- a/subcmds/diff.py +++ b/subcmds/diff.py @@ -37,5 +37,8 @@ to the Unix 'patch' command. help='Paths are relative to the repository root') def Execute(self, opt, args): + ret = 0 for project in self.GetProjects(args): - project.PrintWorkTreeDiff(opt.absolute) + if not project.PrintWorkTreeDiff(opt.absolute): + ret = 1 + return ret