summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Frysinger <vapier@google.com>2019-10-01 00:18:46 -0400
committerMike Frysinger <vapier@google.com>2019-10-01 05:45:58 +0000
commit72ab852ca503d1c8e32e493edc3fa3e1157e930b (patch)
tree842079bd38846936cb6f3da6d73f17d20ea478db
parent0a9265e2d633b608090eff79ab4553f0e1c8c7c4 (diff)
downloadgit-repo-72ab852ca503d1c8e32e493edc3fa3e1157e930b.tar.gz
grep: handle errors gracefully
If `git grep` 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: I31de1134fdcc7aaa9814cf2eb6a67d398eebf9cf Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/239237 Reviewed-by: David Pursehouse <dpursehouse@collab.net> Tested-by: Mike Frysinger <vapier@google.com>
-rw-r--r--subcmds/grep.py30
1 files changed, 23 insertions, 7 deletions
diff --git a/subcmds/grep.py b/subcmds/grep.py
index a588a78e..4dd85d57 100644
--- a/subcmds/grep.py
+++ b/subcmds/grep.py
@@ -15,15 +15,19 @@
15# limitations under the License. 15# limitations under the License.
16 16
17from __future__ import print_function 17from __future__ import print_function
18
18import sys 19import sys
20
19from color import Coloring 21from color import Coloring
20from command import PagedCommand 22from command import PagedCommand
23from error import GitError
21from git_command import git_require, GitCommand 24from git_command import git_require, GitCommand
22 25
23class GrepColoring(Coloring): 26class GrepColoring(Coloring):
24 def __init__(self, config): 27 def __init__(self, config):
25 Coloring.__init__(self, config, 'grep') 28 Coloring.__init__(self, config, 'grep')
26 self.project = self.printer('project', attr='bold') 29 self.project = self.printer('project', attr='bold')
30 self.fail = self.printer('fail', fg='red')
27 31
28class Grep(PagedCommand): 32class Grep(PagedCommand):
29 common = True 33 common = True
@@ -184,15 +188,25 @@ contain a line that matches both expressions:
184 cmd_argv.extend(opt.revision) 188 cmd_argv.extend(opt.revision)
185 cmd_argv.append('--') 189 cmd_argv.append('--')
186 190
191 git_failed = False
187 bad_rev = False 192 bad_rev = False
188 have_match = False 193 have_match = False
189 194
190 for project in projects: 195 for project in projects:
191 p = GitCommand(project, 196 try:
192 cmd_argv, 197 p = GitCommand(project,
193 bare = False, 198 cmd_argv,
194 capture_stdout = True, 199 bare=False,
195 capture_stderr = True) 200 capture_stdout=True,
201 capture_stderr=True)
202 except GitError as e:
203 git_failed = True
204 out.project('--- project %s ---' % project.relpath)
205 out.nl()
206 out.fail('%s', str(e))
207 out.nl()
208 continue
209
196 if p.Wait() != 0: 210 if p.Wait() != 0:
197 # no results 211 # no results
198 # 212 #
@@ -202,7 +216,7 @@ contain a line that matches both expressions:
202 else: 216 else:
203 out.project('--- project %s ---' % project.relpath) 217 out.project('--- project %s ---' % project.relpath)
204 out.nl() 218 out.nl()
205 out.write("%s", p.stderr) 219 out.fail('%s', p.stderr.strip())
206 out.nl() 220 out.nl()
207 continue 221 continue
208 have_match = True 222 have_match = True
@@ -231,7 +245,9 @@ contain a line that matches both expressions:
231 for line in r: 245 for line in r:
232 print(line) 246 print(line)
233 247
234 if have_match: 248 if git_failed:
249 sys.exit(1)
250 elif have_match:
235 sys.exit(0) 251 sys.exit(0)
236 elif have_rev and bad_rev: 252 elif have_rev and bad_rev:
237 for r in opt.revision: 253 for r in opt.revision: