summaryrefslogtreecommitdiffstats
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'main.py')
-rwxr-xr-xmain.py56
1 files changed, 47 insertions, 9 deletions
diff --git a/main.py b/main.py
index 4c5f1043..57a59acb 100755
--- a/main.py
+++ b/main.py
@@ -30,6 +30,7 @@ import sys
30import textwrap 30import textwrap
31import time 31import time
32import urllib.request 32import urllib.request
33import json
33 34
34try: 35try:
35 import kerberos 36 import kerberos
@@ -50,10 +51,12 @@ from editor import Editor
50from error import DownloadError 51from error import DownloadError
51from error import InvalidProjectGroupsError 52from error import InvalidProjectGroupsError
52from error import ManifestInvalidRevisionError 53from error import ManifestInvalidRevisionError
53from error import ManifestParseError
54from error import NoManifestException 54from error import NoManifestException
55from error import NoSuchProjectError 55from error import NoSuchProjectError
56from error import RepoChangedException 56from error import RepoChangedException
57from error import RepoExitError
58from error import RepoUnhandledExceptionError
59from error import RepoError
57import gitc_utils 60import gitc_utils
58from manifest_xml import GitcClient, RepoClient 61from manifest_xml import GitcClient, RepoClient
59from pager import RunPager, TerminatePager 62from pager import RunPager, TerminatePager
@@ -97,6 +100,7 @@ else:
97 ) 100 )
98 101
99KEYBOARD_INTERRUPT_EXIT = 128 + signal.SIGINT 102KEYBOARD_INTERRUPT_EXIT = 128 + signal.SIGINT
103MAX_PRINT_ERRORS = 5
100 104
101global_options = optparse.OptionParser( 105global_options = optparse.OptionParser(
102 usage="repo [-p|--paginate|--no-pager] COMMAND [ARGS]", 106 usage="repo [-p|--paginate|--no-pager] COMMAND [ARGS]",
@@ -422,10 +426,33 @@ class _Repo(object):
422 """ 426 """
423 try: 427 try:
424 execute_command_helper() 428 execute_command_helper()
425 except (KeyboardInterrupt, SystemExit, Exception) as e: 429 except (
430 KeyboardInterrupt,
431 SystemExit,
432 Exception,
433 RepoExitError,
434 ) as e:
426 ok = isinstance(e, SystemExit) and not e.code 435 ok = isinstance(e, SystemExit) and not e.code
436 exception_name = type(e).__name__
437 if isinstance(e, RepoUnhandledExceptionError):
438 exception_name = type(e.error).__name__
439 if isinstance(e, RepoExitError):
440 aggregated_errors = e.aggregate_errors or []
441 for error in aggregated_errors:
442 project = None
443 if isinstance(error, RepoError):
444 project = error.project
445 error_info = json.dumps(
446 {
447 "ErrorType": type(error).__name__,
448 "Project": project,
449 "Message": str(error),
450 }
451 )
452 git_trace2_event_log.ErrorEvent(
453 f"AggregateExitError:{error_info}"
454 )
427 if not ok: 455 if not ok:
428 exception_name = type(e).__name__
429 git_trace2_event_log.ErrorEvent( 456 git_trace2_event_log.ErrorEvent(
430 f"RepoExitError:{exception_name}" 457 f"RepoExitError:{exception_name}"
431 ) 458 )
@@ -447,13 +474,13 @@ class _Repo(object):
447 "error: manifest missing or unreadable -- please run init", 474 "error: manifest missing or unreadable -- please run init",
448 file=sys.stderr, 475 file=sys.stderr,
449 ) 476 )
450 result = 1 477 result = e.exit_code
451 except NoSuchProjectError as e: 478 except NoSuchProjectError as e:
452 if e.name: 479 if e.name:
453 print("error: project %s not found" % e.name, file=sys.stderr) 480 print("error: project %s not found" % e.name, file=sys.stderr)
454 else: 481 else:
455 print("error: no project in current directory", file=sys.stderr) 482 print("error: no project in current directory", file=sys.stderr)
456 result = 1 483 result = e.exit_code
457 except InvalidProjectGroupsError as e: 484 except InvalidProjectGroupsError as e:
458 if e.name: 485 if e.name:
459 print( 486 print(
@@ -467,7 +494,7 @@ class _Repo(object):
467 "the current directory", 494 "the current directory",
468 file=sys.stderr, 495 file=sys.stderr,
469 ) 496 )
470 result = 1 497 result = e.exit_code
471 except SystemExit as e: 498 except SystemExit as e:
472 if e.code: 499 if e.code:
473 result = e.code 500 result = e.code
@@ -475,6 +502,9 @@ class _Repo(object):
475 except KeyboardInterrupt: 502 except KeyboardInterrupt:
476 result = KEYBOARD_INTERRUPT_EXIT 503 result = KEYBOARD_INTERRUPT_EXIT
477 raise 504 raise
505 except RepoExitError as e:
506 result = e.exit_code
507 raise
478 except Exception: 508 except Exception:
479 result = 1 509 result = 1
480 raise 510 raise
@@ -841,12 +871,20 @@ def _Main(argv):
841 SetTraceToStderr() 871 SetTraceToStderr()
842 872
843 result = repo._Run(name, gopts, argv) or 0 873 result = repo._Run(name, gopts, argv) or 0
874 except RepoExitError as e:
875 exception_name = type(e).__name__
876 result = e.exit_code
877 print("fatal: %s" % e, file=sys.stderr)
878 if e.aggregate_errors:
879 print(f"{exception_name} Aggregate Errors")
880 for err in e.aggregate_errors[:MAX_PRINT_ERRORS]:
881 print(err)
882 if len(e.aggregate_errors) > MAX_PRINT_ERRORS:
883 diff = len(e.aggregate_errors) - MAX_PRINT_ERRORS
884 print(f"+{diff} additional errors ...")
844 except KeyboardInterrupt: 885 except KeyboardInterrupt:
845 print("aborted by user", file=sys.stderr) 886 print("aborted by user", file=sys.stderr)
846 result = KEYBOARD_INTERRUPT_EXIT 887 result = KEYBOARD_INTERRUPT_EXIT
847 except ManifestParseError as mpe:
848 print("fatal: %s" % mpe, file=sys.stderr)
849 result = 1
850 except RepoChangedException as rce: 888 except RepoChangedException as rce:
851 # If repo changed, re-exec ourselves. 889 # If repo changed, re-exec ourselves.
852 # 890 #