diff options
Diffstat (limited to 'subcmds/branches.py')
-rw-r--r-- | subcmds/branches.py | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/subcmds/branches.py b/subcmds/branches.py index fb60d7de..6d975ed4 100644 --- a/subcmds/branches.py +++ b/subcmds/branches.py | |||
@@ -1,5 +1,3 @@ | |||
1 | # -*- coding:utf-8 -*- | ||
2 | # | ||
3 | # Copyright (C) 2009 The Android Open Source Project | 1 | # Copyright (C) 2009 The Android Open Source Project |
4 | # | 2 | # |
5 | # Licensed under the Apache License, Version 2.0 (the "License"); | 3 | # Licensed under the Apache License, Version 2.0 (the "License"); |
@@ -14,18 +12,21 @@ | |||
14 | # See the License for the specific language governing permissions and | 12 | # See the License for the specific language governing permissions and |
15 | # limitations under the License. | 13 | # limitations under the License. |
16 | 14 | ||
17 | from __future__ import print_function | 15 | import itertools |
18 | import sys | 16 | import sys |
17 | |||
19 | from color import Coloring | 18 | from color import Coloring |
20 | from command import Command | 19 | from command import Command, DEFAULT_LOCAL_JOBS |
20 | |||
21 | 21 | ||
22 | class BranchColoring(Coloring): | 22 | class BranchColoring(Coloring): |
23 | def __init__(self, config): | 23 | def __init__(self, config): |
24 | Coloring.__init__(self, config, 'branch') | 24 | Coloring.__init__(self, config, 'branch') |
25 | self.current = self.printer('current', fg='green') | 25 | self.current = self.printer('current', fg='green') |
26 | self.local = self.printer('local') | 26 | self.local = self.printer('local') |
27 | self.notinproject = self.printer('notinproject', fg='red') | 27 | self.notinproject = self.printer('notinproject', fg='red') |
28 | 28 | ||
29 | |||
29 | class BranchInfo(object): | 30 | class BranchInfo(object): |
30 | def __init__(self, name): | 31 | def __init__(self, name): |
31 | self.name = name | 32 | self.name = name |
@@ -61,7 +62,7 @@ class BranchInfo(object): | |||
61 | 62 | ||
62 | 63 | ||
63 | class Branches(Command): | 64 | class Branches(Command): |
64 | common = True | 65 | COMMON = True |
65 | helpSummary = "View current topic branches" | 66 | helpSummary = "View current topic branches" |
66 | helpUsage = """ | 67 | helpUsage = """ |
67 | %prog [<project>...] | 68 | %prog [<project>...] |
@@ -94,6 +95,7 @@ the branch appears in, or does not appear in. If no project list | |||
94 | is shown, then the branch appears in all projects. | 95 | is shown, then the branch appears in all projects. |
95 | 96 | ||
96 | """ | 97 | """ |
98 | PARALLEL_JOBS = DEFAULT_LOCAL_JOBS | ||
97 | 99 | ||
98 | def Execute(self, opt, args): | 100 | def Execute(self, opt, args): |
99 | projects = self.GetProjects(args) | 101 | projects = self.GetProjects(args) |
@@ -101,14 +103,19 @@ is shown, then the branch appears in all projects. | |||
101 | all_branches = {} | 103 | all_branches = {} |
102 | project_cnt = len(projects) | 104 | project_cnt = len(projects) |
103 | 105 | ||
104 | for project in projects: | 106 | def _ProcessResults(_pool, _output, results): |
105 | for name, b in project.GetBranches().items(): | 107 | for name, b in itertools.chain.from_iterable(results): |
106 | b.project = project | ||
107 | if name not in all_branches: | 108 | if name not in all_branches: |
108 | all_branches[name] = BranchInfo(name) | 109 | all_branches[name] = BranchInfo(name) |
109 | all_branches[name].add(b) | 110 | all_branches[name].add(b) |
110 | 111 | ||
111 | names = list(sorted(all_branches)) | 112 | self.ExecuteInParallel( |
113 | opt.jobs, | ||
114 | expand_project_to_branches, | ||
115 | projects, | ||
116 | callback=_ProcessResults) | ||
117 | |||
118 | names = sorted(all_branches) | ||
112 | 119 | ||
113 | if not names: | 120 | if not names: |
114 | print(' (no branches)', file=sys.stderr) | 121 | print(' (no branches)', file=sys.stderr) |
@@ -158,7 +165,7 @@ is shown, then the branch appears in all projects. | |||
158 | for b in i.projects: | 165 | for b in i.projects: |
159 | have.add(b.project) | 166 | have.add(b.project) |
160 | for p in projects: | 167 | for p in projects: |
161 | if not p in have: | 168 | if p not in have: |
162 | paths.append(p.relpath) | 169 | paths.append(p.relpath) |
163 | 170 | ||
164 | s = ' %s %s' % (in_type, ', '.join(paths)) | 171 | s = ' %s %s' % (in_type, ', '.join(paths)) |
@@ -170,11 +177,27 @@ is shown, then the branch appears in all projects. | |||
170 | fmt = out.current if i.IsCurrent else out.write | 177 | fmt = out.current if i.IsCurrent else out.write |
171 | for p in paths: | 178 | for p in paths: |
172 | out.nl() | 179 | out.nl() |
173 | fmt(width*' ' + ' %s' % p) | 180 | fmt(width * ' ' + ' %s' % p) |
174 | fmt = out.write | 181 | fmt = out.write |
175 | for p in non_cur_paths: | 182 | for p in non_cur_paths: |
176 | out.nl() | 183 | out.nl() |
177 | fmt(width*' ' + ' %s' % p) | 184 | fmt(width * ' ' + ' %s' % p) |
178 | else: | 185 | else: |
179 | out.write(' in all projects') | 186 | out.write(' in all projects') |
180 | out.nl() | 187 | out.nl() |
188 | |||
189 | |||
190 | def expand_project_to_branches(project): | ||
191 | """Expands a project into a list of branch names & associated information. | ||
192 | |||
193 | Args: | ||
194 | project: project.Project | ||
195 | |||
196 | Returns: | ||
197 | List[Tuple[str, git_config.Branch]] | ||
198 | """ | ||
199 | branches = [] | ||
200 | for name, b in project.GetBranches().items(): | ||
201 | b.project = project | ||
202 | branches.append((name, b)) | ||
203 | return branches | ||