info.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #
  2. # Copyright (C) 2012 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. from command import PagedCommand
  16. from color import Coloring
  17. from error import NoSuchProjectError
  18. from git_refs import R_M
  19. class _Coloring(Coloring):
  20. def __init__(self, config):
  21. Coloring.__init__(self, config, "status")
  22. class Info(PagedCommand):
  23. common = True
  24. helpSummary = "Get info on the manifest branch, current branch or unmerged branches"
  25. helpUsage = "%prog [-dl] [-o [-b]] [<project>...]"
  26. def _Options(self, p):
  27. p.add_option('-d', '--diff',
  28. dest='all', action='store_true',
  29. help="show full info and commit diff including remote branches")
  30. p.add_option('-o', '--overview',
  31. dest='overview', action='store_true',
  32. help='show overview of all local commits')
  33. p.add_option('-b', '--current-branch',
  34. dest="current_branch", action="store_true",
  35. help="consider only checked out branches")
  36. p.add_option('-l', '--local-only',
  37. dest="local", action="store_true",
  38. help="Disable all remote operations")
  39. def Execute(self, opt, args):
  40. self.out = _Coloring(self.manifest.globalConfig)
  41. self.heading = self.out.printer('heading', attr = 'bold')
  42. self.headtext = self.out.nofmt_printer('headtext', fg = 'yellow')
  43. self.redtext = self.out.printer('redtext', fg = 'red')
  44. self.sha = self.out.printer("sha", fg = 'yellow')
  45. self.text = self.out.nofmt_printer('text')
  46. self.dimtext = self.out.printer('dimtext', attr = 'dim')
  47. self.opt = opt
  48. manifestConfig = self.manifest.manifestProject.config
  49. mergeBranch = manifestConfig.GetBranch("default").merge
  50. manifestGroups = (manifestConfig.GetString('manifest.groups')
  51. or 'all,-notdefault')
  52. self.heading("Manifest branch: ")
  53. if self.manifest.default.revisionExpr:
  54. self.headtext(self.manifest.default.revisionExpr)
  55. self.out.nl()
  56. self.heading("Manifest merge branch: ")
  57. self.headtext(mergeBranch)
  58. self.out.nl()
  59. self.heading("Manifest groups: ")
  60. self.headtext(manifestGroups)
  61. self.out.nl()
  62. self.printSeparator()
  63. if not opt.overview:
  64. self.printDiffInfo(args)
  65. else:
  66. self.printCommitOverview(args)
  67. def printSeparator(self):
  68. self.text("----------------------------")
  69. self.out.nl()
  70. def printDiffInfo(self, args):
  71. try:
  72. projs = self.GetProjects(args)
  73. except NoSuchProjectError:
  74. return
  75. for p in projs:
  76. self.heading("Project: ")
  77. self.headtext(p.name)
  78. self.out.nl()
  79. self.heading("Mount path: ")
  80. self.headtext(p.worktree)
  81. self.out.nl()
  82. self.heading("Current revision: ")
  83. self.headtext(p.revisionExpr)
  84. self.out.nl()
  85. localBranches = p.GetBranches().keys()
  86. self.heading("Local Branches: ")
  87. self.redtext(str(len(localBranches)))
  88. if len(localBranches) > 0:
  89. self.text(" [")
  90. self.text(", ".join(localBranches))
  91. self.text("]")
  92. self.out.nl()
  93. if self.opt.all:
  94. self.findRemoteLocalDiff(p)
  95. self.printSeparator()
  96. def findRemoteLocalDiff(self, project):
  97. #Fetch all the latest commits
  98. if not self.opt.local:
  99. project.Sync_NetworkHalf(quiet=True, current_branch_only=True)
  100. logTarget = R_M + self.manifest.manifestProject.config.GetBranch("default").merge
  101. bareTmp = project.bare_git._bare
  102. project.bare_git._bare = False
  103. localCommits = project.bare_git.rev_list(
  104. '--abbrev=8',
  105. '--abbrev-commit',
  106. '--pretty=oneline',
  107. logTarget + "..",
  108. '--')
  109. originCommits = project.bare_git.rev_list(
  110. '--abbrev=8',
  111. '--abbrev-commit',
  112. '--pretty=oneline',
  113. ".." + logTarget,
  114. '--')
  115. project.bare_git._bare = bareTmp
  116. self.heading("Local Commits: ")
  117. self.redtext(str(len(localCommits)))
  118. self.dimtext(" (on current branch)")
  119. self.out.nl()
  120. for c in localCommits:
  121. split = c.split()
  122. self.sha(split[0] + " ")
  123. self.text(" ".join(split[1:]))
  124. self.out.nl()
  125. self.printSeparator()
  126. self.heading("Remote Commits: ")
  127. self.redtext(str(len(originCommits)))
  128. self.out.nl()
  129. for c in originCommits:
  130. split = c.split()
  131. self.sha(split[0] + " ")
  132. self.text(" ".join(split[1:]))
  133. self.out.nl()
  134. def printCommitOverview(self, args):
  135. all_branches = []
  136. for project in self.GetProjects(args):
  137. br = [project.GetUploadableBranch(x)
  138. for x in project.GetBranches()]
  139. br = [x for x in br if x]
  140. if self.opt.current_branch:
  141. br = [x for x in br if x.name == project.CurrentBranch]
  142. all_branches.extend(br)
  143. if not all_branches:
  144. return
  145. self.out.nl()
  146. self.heading('Projects Overview')
  147. project = None
  148. for branch in all_branches:
  149. if project != branch.project:
  150. project = branch.project
  151. self.out.nl()
  152. self.headtext(project.relpath)
  153. self.out.nl()
  154. commits = branch.commits
  155. date = branch.date
  156. self.text('%s %-33s (%2d commit%s, %s)' % (
  157. branch.name == project.CurrentBranch and '*' or ' ',
  158. branch.name,
  159. len(commits),
  160. len(commits) != 1 and 's' or '',
  161. date))
  162. self.out.nl()
  163. for commit in commits:
  164. split = commit.split()
  165. self.text('{0:38}{1} '.format('','-'))
  166. self.sha(split[0] + " ")
  167. self.text(" ".join(split[1:]))
  168. self.out.nl()