summaryrefslogtreecommitdiffstats
path: root/subcmds/forall.py
diff options
context:
space:
mode:
Diffstat (limited to 'subcmds/forall.py')
-rw-r--r--subcmds/forall.py27
1 files changed, 22 insertions, 5 deletions
diff --git a/subcmds/forall.py b/subcmds/forall.py
index 88b23fbd..ebc8beca 100644
--- a/subcmds/forall.py
+++ b/subcmds/forall.py
@@ -20,6 +20,7 @@ import multiprocessing
20import re 20import re
21import os 21import os
22import select 22import select
23import signal
23import sys 24import sys
24import subprocess 25import subprocess
25 26
@@ -207,14 +208,12 @@ without iterating through the remaining projects.
207 208
208 os.environ['REPO_COUNT'] = str(len(projects)) 209 os.environ['REPO_COUNT'] = str(len(projects))
209 210
210 pool = multiprocessing.Pool(opt.jobs) 211 pool = multiprocessing.Pool(opt.jobs, InitWorker)
211 try: 212 try:
212 config = self.manifest.manifestProject.config 213 config = self.manifest.manifestProject.config
213 results_it = pool.imap( 214 results_it = pool.imap(
214 DoWorkWrapper, 215 DoWorkWrapper,
215 ([mirror, opt, cmd, shell, cnt, config, self._SerializeProject(p)] 216 self.ProjectArgs(projects, mirror, opt, cmd, shell, config))
216 for cnt, p in enumerate(projects))
217 )
218 pool.close() 217 pool.close()
219 for r in results_it: 218 for r in results_it:
220 rc = rc or r 219 rc = rc or r
@@ -236,12 +235,28 @@ without iterating through the remaining projects.
236 if rc != 0: 235 if rc != 0:
237 sys.exit(rc) 236 sys.exit(rc)
238 237
238 def ProjectArgs(self, projects, mirror, opt, cmd, shell, config):
239 for cnt, p in enumerate(projects):
240 try:
241 project = self._SerializeProject(p)
242 except Exception as e:
243 print('Project list error: %r' % e,
244 file=sys.stderr)
245 return
246 except KeyboardInterrupt:
247 print('Project list interrupted',
248 file=sys.stderr)
249 return
250 yield [mirror, opt, cmd, shell, cnt, config, project]
239 251
240class WorkerKeyboardInterrupt(Exception): 252class WorkerKeyboardInterrupt(Exception):
241 """ Keyboard interrupt exception for worker processes. """ 253 """ Keyboard interrupt exception for worker processes. """
242 pass 254 pass
243 255
244 256
257def InitWorker():
258 signal.signal(signal.SIGINT, signal.SIG_IGN)
259
245def DoWorkWrapper(args): 260def DoWorkWrapper(args):
246 """ A wrapper around the DoWork() method. 261 """ A wrapper around the DoWork() method.
247 262
@@ -263,7 +278,9 @@ def DoWork(project, mirror, opt, cmd, shell, cnt, config):
263 def setenv(name, val): 278 def setenv(name, val):
264 if val is None: 279 if val is None:
265 val = '' 280 val = ''
266 env[name] = val.encode() 281 if hasattr(val, 'encode'):
282 val = val.encode()
283 env[name] = val
267 284
268 setenv('REPO_PROJECT', project['name']) 285 setenv('REPO_PROJECT', project['name'])
269 setenv('REPO_PATH', project['relpath']) 286 setenv('REPO_PATH', project['relpath'])