blob: 821f6bf637e41219da07e65f10f9e328f4f7dee0 [file] [log] [blame]
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -07001# Copyright (C) 2008 The Android Open Source Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Shawn O. Pearce43c3d9e2009-03-04 14:26:50 -080015import re
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070016import sys
Mike Frysinger0888a082021-04-13 20:22:01 -040017import textwrap
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070018
Mike Frysingerd3639c52020-02-25 15:12:37 -050019from subcmds import all_commands
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070020from color import Coloring
Dan Willemsen79360642015-08-31 15:45:06 -070021from command import PagedCommand, MirrorSafeCommand, GitcAvailableCommand, GitcClientCommand
Dan Willemsen9ff2ece2015-08-31 15:45:06 -070022import gitc_utils
Mike Frysingera1cd7702021-04-20 23:38:04 -040023from wrapper import Wrapper
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070024
David Pursehouse819827a2020-02-12 15:20:19 +090025
Shawn O. Pearcec95583b2009-03-03 17:47:06 -080026class Help(PagedCommand, MirrorSafeCommand):
Mike Frysinger4f210542021-06-14 16:05:19 -040027 COMMON = False
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070028 helpSummary = "Display detailed help on a command"
29 helpUsage = """
30%prog [--all|command]
31"""
32 helpDescription = """
33Displays detailed usage information about a command.
34"""
35
Mike Frysinger0b304c02019-12-02 16:49:13 -050036 def _PrintCommands(self, commandNames):
37 """Helper to display |commandNames| summaries."""
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070038 maxlen = 0
39 for name in commandNames:
40 maxlen = max(maxlen, len(name))
41 fmt = ' %%-%ds %%s' % maxlen
42
43 for name in commandNames:
Mike Frysingerbb930462020-02-25 15:18:31 -050044 command = all_commands[name]()
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070045 try:
46 summary = command.helpSummary.strip()
47 except AttributeError:
48 summary = ''
Sarah Owenscecd1d82012-11-01 22:59:27 -070049 print(fmt % (name, summary))
Mike Frysinger0b304c02019-12-02 16:49:13 -050050
51 def _PrintAllCommands(self):
52 print('usage: repo COMMAND [ARGS]')
53 print('The complete list of recognized repo commands are:')
Mike Frysingerd3639c52020-02-25 15:12:37 -050054 commandNames = list(sorted(all_commands))
Mike Frysinger0b304c02019-12-02 16:49:13 -050055 self._PrintCommands(commandNames)
David Pursehouse2f9e7e42013-03-05 17:26:46 +090056 print("See 'repo help <command>' for more information on a "
Sarah Owenscecd1d82012-11-01 22:59:27 -070057 'specific command.')
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070058
59 def _PrintCommonCommands(self):
Sarah Owenscecd1d82012-11-01 22:59:27 -070060 print('usage: repo COMMAND [ARGS]')
61 print('The most commonly used repo commands are:')
Dan Willemsen9ff2ece2015-08-31 15:45:06 -070062
63 def gitc_supported(cmd):
Dan Willemsen79360642015-08-31 15:45:06 -070064 if not isinstance(cmd, GitcAvailableCommand) and not isinstance(cmd, GitcClientCommand):
Dan Willemsen9ff2ece2015-08-31 15:45:06 -070065 return True
Mike Frysinger8c1e9cb2020-09-06 14:53:18 -040066 if self.client.isGitcClient:
Dan Willemsen79360642015-08-31 15:45:06 -070067 return True
68 if isinstance(cmd, GitcClientCommand):
69 return False
Dan Willemsen9ff2ece2015-08-31 15:45:06 -070070 if gitc_utils.get_gitc_manifest_dir():
71 return True
72 return False
73
Chirayu Desai217ea7d2013-03-01 19:14:38 +053074 commandNames = list(sorted([name
Mike Frysingerd3639c52020-02-25 15:12:37 -050075 for name, command in all_commands.items()
Mike Frysinger4f210542021-06-14 16:05:19 -040076 if command.COMMON and gitc_supported(command)]))
Mike Frysinger0b304c02019-12-02 16:49:13 -050077 self._PrintCommands(commandNames)
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070078
Sarah Owenscecd1d82012-11-01 22:59:27 -070079 print(
David Pursehouseabdf7502020-02-12 14:58:39 +090080 "See 'repo help <command>' for more information on a specific command.\n"
81 "See 'repo help --all' for a complete list of recognized commands.")
Mike Frysingera1cd7702021-04-20 23:38:04 -040082 print('Bug reports:', Wrapper().BUG_URL)
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070083
Mike Frysinger898f4e62019-07-31 18:17:44 -040084 def _PrintCommandHelp(self, cmd, header_prefix=''):
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070085 class _Out(Coloring):
86 def __init__(self, gc):
87 Coloring.__init__(self, gc, 'help')
88 self.heading = self.printer('heading', attr='bold')
Mike Frysinger0888a082021-04-13 20:22:01 -040089 self._first = True
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070090
91 def _PrintSection(self, heading, bodyAttr):
92 try:
93 body = getattr(cmd, bodyAttr)
94 except AttributeError:
95 return
Shawn O. Pearcec7c57e32009-06-03 17:43:16 -070096 if body == '' or body is None:
97 return
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -070098
Mike Frysinger0888a082021-04-13 20:22:01 -040099 if not self._first:
100 self.nl()
101 self._first = False
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700102
Mike Frysinger898f4e62019-07-31 18:17:44 -0400103 self.heading('%s%s', header_prefix, heading)
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700104 self.nl()
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700105 self.nl()
106
107 me = 'repo %s' % cmd.NAME
108 body = body.strip()
109 body = body.replace('%prog', me)
110
Mike Frysinger0888a082021-04-13 20:22:01 -0400111 # Extract the title, but skip any trailing {#anchors}.
112 asciidoc_hdr = re.compile(r'^\n?#+ ([^{]+)(\{#.+\})?$')
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700113 for para in body.split("\n\n"):
114 if para.startswith(' '):
115 self.write('%s', para)
116 self.nl()
117 self.nl()
Shawn O. Pearce43c3d9e2009-03-04 14:26:50 -0800118 continue
119
120 m = asciidoc_hdr.match(para)
121 if m:
Mike Frysinger898f4e62019-07-31 18:17:44 -0400122 self.heading('%s%s', header_prefix, m.group(1))
Shawn O. Pearce43c3d9e2009-03-04 14:26:50 -0800123 self.nl()
Shawn O. Pearce43c3d9e2009-03-04 14:26:50 -0800124 self.nl()
125 continue
126
Mike Frysinger0888a082021-04-13 20:22:01 -0400127 lines = textwrap.wrap(para.replace(' ', ' '), width=80,
128 break_long_words=False, break_on_hyphens=False)
129 for line in lines:
130 self.write('%s', line)
131 self.nl()
132 self.nl()
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700133
Mike Frysinger8c1e9cb2020-09-06 14:53:18 -0400134 out = _Out(self.client.globalConfig)
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700135 out._PrintSection('Summary', 'helpSummary')
Shawn O. Pearce5da554f2009-04-18 11:44:00 -0700136 cmd.OptionParser.print_help()
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700137 out._PrintSection('Description', 'helpDescription')
138
Mike Frysinger898f4e62019-07-31 18:17:44 -0400139 def _PrintAllCommandHelp(self):
Mike Frysingerd3639c52020-02-25 15:12:37 -0500140 for name in sorted(all_commands):
Mike Frysingerbb930462020-02-25 15:18:31 -0500141 cmd = all_commands[name]()
Mike Frysinger898f4e62019-07-31 18:17:44 -0400142 cmd.manifest = self.manifest
143 self._PrintCommandHelp(cmd, header_prefix='[%s] ' % (name,))
144
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700145 def _Options(self, p):
146 p.add_option('-a', '--all',
147 dest='show_all', action='store_true',
148 help='show the complete list of commands')
Mike Frysinger898f4e62019-07-31 18:17:44 -0400149 p.add_option('--help-all',
150 dest='show_all_help', action='store_true',
151 help='show the --help of all commands')
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700152
153 def Execute(self, opt, args):
154 if len(args) == 0:
Mike Frysinger898f4e62019-07-31 18:17:44 -0400155 if opt.show_all_help:
156 self._PrintAllCommandHelp()
157 elif opt.show_all:
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700158 self._PrintAllCommands()
159 else:
160 self._PrintCommonCommands()
161
162 elif len(args) == 1:
163 name = args[0]
164
165 try:
Mike Frysingerbb930462020-02-25 15:18:31 -0500166 cmd = all_commands[name]()
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700167 except KeyError:
Sarah Owenscecd1d82012-11-01 22:59:27 -0700168 print("repo: '%s' is not a repo command." % name, file=sys.stderr)
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700169 sys.exit(1)
170
Shawn O. Pearce752371d2011-10-11 15:23:37 -0700171 cmd.manifest = self.manifest
The Android Open Source Projectcf31fe92008-10-21 07:00:00 -0700172 self._PrintCommandHelp(cmd)
173
174 else:
175 self._PrintCommandHelp(self)