From 1a3612fe6d347e458a53d7a9e920a91ea502e6ba Mon Sep 17 00:00:00 2001 From: Jason Chang Date: Tue, 8 Aug 2023 14:12:53 -0700 Subject: Raise RepoExitError in place of sys.exit Bug: b/293344017 Change-Id: Icae4932b00e4068cba502a5ab4a0274fd7854d9d Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/382214 Reviewed-by: Gavin Mak Tested-by: Jason Chang Reviewed-by: Aravind Vasudevan Commit-Queue: Jason Chang --- subcmds/start.py | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) (limited to 'subcmds/start.py') diff --git a/subcmds/start.py b/subcmds/start.py index f6355126..67ac7df9 100644 --- a/subcmds/start.py +++ b/subcmds/start.py @@ -21,7 +21,18 @@ from git_config import IsImmutable from git_command import git import gitc_utils from progress import Progress -from project import SyncBuffer +from project import SyncBuffer, Project +from typing import NamedTuple +from error import RepoExitError + + +class ExecuteOneResult(NamedTuple): + project: Project + error: Exception + + +class StartError(RepoExitError): + """Exit error for failed start command.""" class Start(Command): @@ -73,6 +84,7 @@ revision specified in the manifest. # a change, then we can't push back to it. Substitute with # dest_branch, if defined; or with manifest default revision instead. branch_merge = "" + error = None if IsImmutable(project.revisionExpr): if project.dest_branch: branch_merge = project.dest_branch @@ -80,7 +92,7 @@ revision specified in the manifest. branch_merge = self.manifest.default.revisionExpr try: - ret = project.StartBranch( + project.StartBranch( nb, branch_merge=branch_merge, revision=revision ) except Exception as e: @@ -88,11 +100,12 @@ revision specified in the manifest. "error: unable to checkout %s: %s" % (project.name, e), file=sys.stderr, ) - ret = False - return (ret, project) + error = e + return ExecuteOneResult(project, error) def Execute(self, opt, args): nb = args[0] + err_projects = [] err = [] projects = [] if not opt.all: @@ -146,9 +159,10 @@ revision specified in the manifest. pm.end() def _ProcessResults(_pool, pm, results): - for result, project in results: - if not result: - err.append(project) + for result in results: + if result.error: + err_projects.append(result.project) + err.append(result.error) pm.update(msg="") self.ExecuteInParallel( @@ -161,13 +175,15 @@ revision specified in the manifest. ), ) - if err: - for p in err: + if err_projects: + for p in err_projects: print( "error: %s/: cannot start %s" % (p.RelPath(local=opt.this_manifest_only), nb), file=sys.stderr, ) msg_fmt = "cannot start %d project(s)" - self.git_event_log.ErrorEvent(msg_fmt % (len(err)), msg_fmt) - sys.exit(1) + self.git_event_log.ErrorEvent( + msg_fmt % (len(err_projects)), msg_fmt + ) + raise StartError(aggregate_errors=err) -- cgit v1.2.3-54-g00ecf