diff options
Diffstat (limited to 'subcmds/start.py')
| -rw-r--r-- | subcmds/start.py | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/subcmds/start.py b/subcmds/start.py index aa2f915a..ff2bae56 100644 --- a/subcmds/start.py +++ b/subcmds/start.py | |||
| @@ -13,11 +13,10 @@ | |||
| 13 | # limitations under the License. | 13 | # limitations under the License. |
| 14 | 14 | ||
| 15 | import functools | 15 | import functools |
| 16 | import multiprocessing | ||
| 17 | import os | 16 | import os |
| 18 | import sys | 17 | import sys |
| 19 | 18 | ||
| 20 | from command import Command, DEFAULT_LOCAL_JOBS, WORKER_BATCH_SIZE | 19 | from command import Command, DEFAULT_LOCAL_JOBS |
| 21 | from git_config import IsImmutable | 20 | from git_config import IsImmutable |
| 22 | from git_command import git | 21 | from git_command import git |
| 23 | import gitc_utils | 22 | import gitc_utils |
| @@ -55,7 +54,7 @@ revision specified in the manifest. | |||
| 55 | if not git.check_ref_format('heads/%s' % nb): | 54 | if not git.check_ref_format('heads/%s' % nb): |
| 56 | self.OptionParser.error("'%s' is not a valid name" % nb) | 55 | self.OptionParser.error("'%s' is not a valid name" % nb) |
| 57 | 56 | ||
| 58 | def _ExecuteOne(self, opt, nb, project): | 57 | def _ExecuteOne(self, revision, nb, project): |
| 59 | """Start one project.""" | 58 | """Start one project.""" |
| 60 | # If the current revision is immutable, such as a SHA1, a tag or | 59 | # If the current revision is immutable, such as a SHA1, a tag or |
| 61 | # a change, then we can't push back to it. Substitute with | 60 | # a change, then we can't push back to it. Substitute with |
| @@ -69,7 +68,7 @@ revision specified in the manifest. | |||
| 69 | 68 | ||
| 70 | try: | 69 | try: |
| 71 | ret = project.StartBranch( | 70 | ret = project.StartBranch( |
| 72 | nb, branch_merge=branch_merge, revision=opt.revision) | 71 | nb, branch_merge=branch_merge, revision=revision) |
| 73 | except Exception as e: | 72 | except Exception as e: |
| 74 | print('error: unable to checkout %s: %s' % (project.name, e), file=sys.stderr) | 73 | print('error: unable to checkout %s: %s' % (project.name, e), file=sys.stderr) |
| 75 | ret = False | 74 | ret = False |
| @@ -123,23 +122,18 @@ revision specified in the manifest. | |||
| 123 | pm.update() | 122 | pm.update() |
| 124 | pm.end() | 123 | pm.end() |
| 125 | 124 | ||
| 126 | def _ProcessResults(results): | 125 | def _ProcessResults(_pool, pm, results): |
| 127 | for (result, project) in results: | 126 | for (result, project) in results: |
| 128 | if not result: | 127 | if not result: |
| 129 | err.append(project) | 128 | err.append(project) |
| 130 | pm.update() | 129 | pm.update() |
| 131 | 130 | ||
| 132 | pm = Progress('Starting %s' % nb, len(all_projects), quiet=opt.quiet) | 131 | self.ExecuteInParallel( |
| 133 | # NB: Multiprocessing is heavy, so don't spin it up for one job. | 132 | opt.jobs, |
| 134 | if len(all_projects) == 1 or opt.jobs == 1: | 133 | functools.partial(self._ExecuteOne, opt.revision, nb), |
| 135 | _ProcessResults(self._ExecuteOne(opt, nb, x) for x in all_projects) | 134 | all_projects, |
| 136 | else: | 135 | callback=_ProcessResults, |
| 137 | with multiprocessing.Pool(opt.jobs) as pool: | 136 | output=Progress('Starting %s' % (nb,), len(all_projects), quiet=opt.quiet)) |
| 138 | results = pool.imap_unordered( | ||
| 139 | functools.partial(self._ExecuteOne, opt, nb), all_projects, | ||
| 140 | chunksize=WORKER_BATCH_SIZE) | ||
| 141 | _ProcessResults(results) | ||
| 142 | pm.end() | ||
| 143 | 137 | ||
| 144 | if err: | 138 | if err: |
| 145 | for p in err: | 139 | for p in err: |
