blob: fa1dff6748c70aa77cc6ec92fe072354e40a1126 [file] [log] [blame]
Shawn O. Pearce27b07322009-04-10 16:02:48 -07001#
2# Copyright (C) 2009 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
Sarah Owenscecd1d82012-11-01 22:59:27 -070016from __future__ import print_function
Shawn O. Pearce27b07322009-04-10 16:02:48 -070017import sys
18from color import Coloring
19from command import Command
20
21class BranchColoring(Coloring):
22 def __init__(self, config):
23 Coloring.__init__(self, config, 'branch')
24 self.current = self.printer('current', fg='green')
25 self.local = self.printer('local')
26 self.notinproject = self.printer('notinproject', fg='red')
27
28class BranchInfo(object):
29 def __init__(self, name):
30 self.name = name
31 self.current = 0
32 self.published = 0
33 self.published_equal = 0
34 self.projects = []
35
36 def add(self, b):
37 if b.current:
38 self.current += 1
39 if b.published:
40 self.published += 1
41 if b.revision == b.published:
42 self.published_equal += 1
43 self.projects.append(b)
44
45 @property
46 def IsCurrent(self):
47 return self.current > 0
48
49 @property
Etan Cohen588142d2014-07-09 21:33:31 -070050 def IsSplitCurrent(self):
51 return self.current != 0 and self.current != len(self.projects)
52
53 @property
Shawn O. Pearce27b07322009-04-10 16:02:48 -070054 def IsPublished(self):
55 return self.published > 0
56
57 @property
58 def IsPublishedEqual(self):
59 return self.published_equal == len(self.projects)
60
61
62class Branches(Command):
63 common = True
64 helpSummary = "View current topic branches"
65 helpUsage = """
66%prog [<project>...]
67
68Summarizes the currently available topic branches.
Shawn O. Pearce7da73d62009-06-12 17:35:43 -070069
Mike Frysingerb8f7bb02018-10-10 01:05:11 -040070# Branch Display
Shawn O. Pearce7da73d62009-06-12 17:35:43 -070071
72The branch display output by this command is organized into four
73columns of information; for example:
74
75 *P nocolor | in repo
76 repo2 |
77
78The first column contains a * if the branch is the currently
79checked out branch in any of the specified projects, or a blank
80if no project has the branch checked out.
81
82The second column contains either blank, p or P, depending upon
83the upload status of the branch.
84
85 (blank): branch not yet published by repo upload
86 P: all commits were published by repo upload
87 p: only some commits were published by repo upload
88
89The third column contains the branch name.
90
91The fourth column (after the | separator) lists the projects that
92the branch appears in, or does not appear in. If no project list
93is shown, then the branch appears in all projects.
94
Shawn O. Pearce27b07322009-04-10 16:02:48 -070095"""
96
Shawn O. Pearce27b07322009-04-10 16:02:48 -070097 def Execute(self, opt, args):
98 projects = self.GetProjects(args)
99 out = BranchColoring(self.manifest.manifestProject.config)
David Pursehouse5c6eeac2012-10-11 16:44:48 +0900100 all_branches = {}
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700101 project_cnt = len(projects)
102
103 for project in projects:
Chirayu Desai217ea7d2013-03-01 19:14:38 +0530104 for name, b in project.GetBranches().items():
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700105 b.project = project
David Pursehouse5c6eeac2012-10-11 16:44:48 +0900106 if name not in all_branches:
107 all_branches[name] = BranchInfo(name)
108 all_branches[name].add(b)
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700109
Chirayu Desai217ea7d2013-03-01 19:14:38 +0530110 names = list(sorted(all_branches))
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700111
Shawn O. Pearce4e3d6732009-04-18 15:18:35 -0700112 if not names:
Sarah Owenscecd1d82012-11-01 22:59:27 -0700113 print(' (no branches)', file=sys.stderr)
Shawn O. Pearce4e3d6732009-04-18 15:18:35 -0700114 return
115
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700116 width = 25
117 for name in names:
118 if width < len(name):
119 width = len(name)
120
121 for name in names:
David Pursehouse5c6eeac2012-10-11 16:44:48 +0900122 i = all_branches[name]
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700123 in_cnt = len(i.projects)
124
125 if i.IsCurrent:
126 current = '*'
127 hdr = out.current
128 else:
129 current = ' '
130 hdr = out.local
131
132 if i.IsPublishedEqual:
133 published = 'P'
134 elif i.IsPublished:
135 published = 'p'
136 else:
137 published = ' '
138
139 hdr('%c%c %-*s' % (current, published, width, name))
140 out.write(' |')
141
Pär Åsfältff6929d2009-09-05 23:10:56 +0200142 if in_cnt < project_cnt:
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700143 fmt = out.write
144 paths = []
Etan Cohen588142d2014-07-09 21:33:31 -0700145 non_cur_paths = []
146 if i.IsSplitCurrent or (in_cnt < project_cnt - in_cnt):
David Pursehouse8a68ff92012-09-24 12:15:13 +0900147 in_type = 'in'
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700148 for b in i.projects:
Etan Cohen588142d2014-07-09 21:33:31 -0700149 if not i.IsSplitCurrent or b.current:
150 paths.append(b.project.relpath)
151 else:
152 non_cur_paths.append(b.project.relpath)
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700153 else:
154 fmt = out.notinproject
David Pursehouse8a68ff92012-09-24 12:15:13 +0900155 in_type = 'not in'
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700156 have = set()
157 for b in i.projects:
158 have.add(b.project)
159 for p in projects:
Pär Åsfältff6929d2009-09-05 23:10:56 +0200160 if not p in have:
161 paths.append(p.relpath)
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700162
David Pursehouse8a68ff92012-09-24 12:15:13 +0900163 s = ' %s %s' % (in_type, ', '.join(paths))
Etan Cohen588142d2014-07-09 21:33:31 -0700164 if not i.IsSplitCurrent and (width + 7 + len(s) < 80):
165 fmt = out.current if i.IsCurrent else fmt
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700166 fmt(s)
167 else:
David Pursehouse8a68ff92012-09-24 12:15:13 +0900168 fmt(' %s:' % in_type)
Etan Cohen588142d2014-07-09 21:33:31 -0700169 fmt = out.current if i.IsCurrent else out.write
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700170 for p in paths:
171 out.nl()
Pär Åsfältff6929d2009-09-05 23:10:56 +0200172 fmt(width*' ' + ' %s' % p)
Etan Cohen588142d2014-07-09 21:33:31 -0700173 fmt = out.write
174 for p in non_cur_paths:
175 out.nl()
176 fmt(width*' ' + ' %s' % p)
Pär Åsfältff6929d2009-09-05 23:10:56 +0200177 else:
178 out.write(' in all projects')
Shawn O. Pearce27b07322009-04-10 16:02:48 -0700179 out.nl()