summaryrefslogtreecommitdiffstats
path: root/subcmds/start.py
diff options
context:
space:
mode:
Diffstat (limited to 'subcmds/start.py')
-rw-r--r--subcmds/start.py38
1 files changed, 27 insertions, 11 deletions
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
21from git_command import git 21from git_command import git
22import gitc_utils 22import gitc_utils
23from progress import Progress 23from progress import Progress
24from project import SyncBuffer 24from project import SyncBuffer, Project
25from typing import NamedTuple
26from error import RepoExitError
27
28
29class ExecuteOneResult(NamedTuple):
30 project: Project
31 error: Exception
32
33
34class StartError(RepoExitError):
35 """Exit error for failed start command."""
25 36
26 37
27class Start(Command): 38class Start(Command):
@@ -73,6 +84,7 @@ revision specified in the manifest.
73 # a change, then we can't push back to it. Substitute with 84 # a change, then we can't push back to it. Substitute with
74 # dest_branch, if defined; or with manifest default revision instead. 85 # dest_branch, if defined; or with manifest default revision instead.
75 branch_merge = "" 86 branch_merge = ""
87 error = None
76 if IsImmutable(project.revisionExpr): 88 if IsImmutable(project.revisionExpr):
77 if project.dest_branch: 89 if project.dest_branch:
78 branch_merge = project.dest_branch 90 branch_merge = project.dest_branch
@@ -80,7 +92,7 @@ revision specified in the manifest.
80 branch_merge = self.manifest.default.revisionExpr 92 branch_merge = self.manifest.default.revisionExpr
81 93
82 try: 94 try:
83 ret = project.StartBranch( 95 project.StartBranch(
84 nb, branch_merge=branch_merge, revision=revision 96 nb, branch_merge=branch_merge, revision=revision
85 ) 97 )
86 except Exception as e: 98 except Exception as e:
@@ -88,11 +100,12 @@ revision specified in the manifest.
88 "error: unable to checkout %s: %s" % (project.name, e), 100 "error: unable to checkout %s: %s" % (project.name, e),
89 file=sys.stderr, 101 file=sys.stderr,
90 ) 102 )
91 ret = False 103 error = e
92 return (ret, project) 104 return ExecuteOneResult(project, error)
93 105
94 def Execute(self, opt, args): 106 def Execute(self, opt, args):
95 nb = args[0] 107 nb = args[0]
108 err_projects = []
96 err = [] 109 err = []
97 projects = [] 110 projects = []
98 if not opt.all: 111 if not opt.all:
@@ -146,9 +159,10 @@ revision specified in the manifest.
146 pm.end() 159 pm.end()
147 160
148 def _ProcessResults(_pool, pm, results): 161 def _ProcessResults(_pool, pm, results):
149 for result, project in results: 162 for result in results:
150 if not result: 163 if result.error:
151 err.append(project) 164 err_projects.append(result.project)
165 err.append(result.error)
152 pm.update(msg="") 166 pm.update(msg="")
153 167
154 self.ExecuteInParallel( 168 self.ExecuteInParallel(
@@ -161,13 +175,15 @@ revision specified in the manifest.
161 ), 175 ),
162 ) 176 )
163 177
164 if err: 178 if err_projects:
165 for p in err: 179 for p in err_projects:
166 print( 180 print(
167 "error: %s/: cannot start %s" 181 "error: %s/: cannot start %s"
168 % (p.RelPath(local=opt.this_manifest_only), nb), 182 % (p.RelPath(local=opt.this_manifest_only), nb),
169 file=sys.stderr, 183 file=sys.stderr,
170 ) 184 )
171 msg_fmt = "cannot start %d project(s)" 185 msg_fmt = "cannot start %d project(s)"
172 self.git_event_log.ErrorEvent(msg_fmt % (len(err)), msg_fmt) 186 self.git_event_log.ErrorEvent(
173 sys.exit(1) 187 msg_fmt % (len(err_projects)), msg_fmt
188 )
189 raise StartError(aggregate_errors=err)