diff options
Diffstat (limited to 'subcmds')
| -rw-r--r-- | subcmds/status.py | 48 |
1 files changed, 15 insertions, 33 deletions
diff --git a/subcmds/status.py b/subcmds/status.py index 8537e6c5..c380dba3 100644 --- a/subcmds/status.py +++ b/subcmds/status.py | |||
| @@ -16,17 +16,13 @@ | |||
| 16 | 16 | ||
| 17 | from __future__ import print_function | 17 | from __future__ import print_function |
| 18 | 18 | ||
| 19 | import functools | ||
| 19 | import glob | 20 | import glob |
| 20 | import itertools | 21 | import multiprocessing |
| 21 | import os | 22 | import os |
| 22 | 23 | ||
| 23 | from command import PagedCommand | 24 | from command import PagedCommand |
| 24 | 25 | ||
| 25 | try: | ||
| 26 | import threading as _threading | ||
| 27 | except ImportError: | ||
| 28 | import dummy_threading as _threading | ||
| 29 | |||
| 30 | from color import Coloring | 26 | from color import Coloring |
| 31 | import platform_utils | 27 | import platform_utils |
| 32 | 28 | ||
| @@ -95,25 +91,20 @@ the following meanings: | |||
| 95 | p.add_option('-q', '--quiet', action='store_true', | 91 | p.add_option('-q', '--quiet', action='store_true', |
| 96 | help="only print the name of modified projects") | 92 | help="only print the name of modified projects") |
| 97 | 93 | ||
| 98 | def _StatusHelper(self, project, clean_counter, sem, quiet): | 94 | def _StatusHelper(self, quiet, project): |
| 99 | """Obtains the status for a specific project. | 95 | """Obtains the status for a specific project. |
| 100 | 96 | ||
| 101 | Obtains the status for a project, redirecting the output to | 97 | Obtains the status for a project, redirecting the output to |
| 102 | the specified object. It will release the semaphore | 98 | the specified object. |
| 103 | when done. | ||
| 104 | 99 | ||
| 105 | Args: | 100 | Args: |
| 101 | quiet: Where to output the status. | ||
| 106 | project: Project to get status of. | 102 | project: Project to get status of. |
| 107 | clean_counter: Counter for clean projects. | 103 | |
| 108 | sem: Semaphore, will call release() when complete. | 104 | Returns: |
| 109 | output: Where to output the status. | 105 | The status of the project. |
| 110 | """ | 106 | """ |
| 111 | try: | 107 | return project.PrintWorkTreeStatus(quiet=quiet) |
| 112 | state = project.PrintWorkTreeStatus(quiet=quiet) | ||
| 113 | if state == 'CLEAN': | ||
| 114 | next(clean_counter) | ||
| 115 | finally: | ||
| 116 | sem.release() | ||
| 117 | 108 | ||
| 118 | def _FindOrphans(self, dirs, proj_dirs, proj_dirs_parents, outstring): | 109 | def _FindOrphans(self, dirs, proj_dirs, proj_dirs_parents, outstring): |
| 119 | """find 'dirs' that are present in 'proj_dirs_parents' but not in 'proj_dirs'""" | 110 | """find 'dirs' that are present in 'proj_dirs_parents' but not in 'proj_dirs'""" |
| @@ -133,27 +124,18 @@ the following meanings: | |||
| 133 | 124 | ||
| 134 | def Execute(self, opt, args): | 125 | def Execute(self, opt, args): |
| 135 | all_projects = self.GetProjects(args) | 126 | all_projects = self.GetProjects(args) |
| 136 | counter = itertools.count() | 127 | counter = 0 |
| 137 | 128 | ||
| 138 | if opt.jobs == 1: | 129 | if opt.jobs == 1: |
| 139 | for project in all_projects: | 130 | for project in all_projects: |
| 140 | state = project.PrintWorkTreeStatus(quiet=opt.quiet) | 131 | state = project.PrintWorkTreeStatus(quiet=opt.quiet) |
| 141 | if state == 'CLEAN': | 132 | if state == 'CLEAN': |
| 142 | next(counter) | 133 | counter += 1 |
| 143 | else: | 134 | else: |
| 144 | sem = _threading.Semaphore(opt.jobs) | 135 | with multiprocessing.Pool(opt.jobs) as pool: |
| 145 | threads = [] | 136 | states = pool.map(functools.partial(self._StatusHelper, opt.quiet), all_projects) |
| 146 | for project in all_projects: | 137 | counter += states.count('CLEAN') |
| 147 | sem.acquire() | 138 | if not opt.quiet and len(all_projects) == counter: |
| 148 | |||
| 149 | t = _threading.Thread(target=self._StatusHelper, | ||
| 150 | args=(project, counter, sem, opt.quiet)) | ||
| 151 | threads.append(t) | ||
| 152 | t.daemon = True | ||
| 153 | t.start() | ||
| 154 | for t in threads: | ||
| 155 | t.join() | ||
| 156 | if not opt.quiet and len(all_projects) == next(counter): | ||
| 157 | print('nothing to commit (working directory clean)') | 139 | print('nothing to commit (working directory clean)') |
| 158 | 140 | ||
| 159 | if opt.orphans: | 141 | if opt.orphans: |
