##// END OF EJS Templates
helptext: fix sentence in extensions documentation...
Matt Harbison -
r46542:cb728894 default
parent child Browse files
Show More
@@ -1,367 +1,367 b''
1 1 Extensions allow the creation of new features and using them directly from
2 2 the main hg command line as if they were built-in commands. The extensions
3 3 have full access to the *internal* API.
4 4
5 5 Use of Mercurial's internal API very likely makes your code subject to
6 6 Mercurial's license. Before going any further, read the License page.
7 7
8 8 There are NO guarantees that third-party code calling into Mercurial's
9 9 internals won't break from release to release. If you do use Mercurial's API
10 10 for published third-party code, we expect you to test your code before each
11 11 major Mercurial release. This will prevent various bug reports from your users
12 12 when they upgrade their copy of Mercurial.
13 13
14 14 File Layout
15 15 ===========
16 16
17 17 Extensions are usually written as simple python modules. Larger ones are
18 18 better split into multiple modules of a single package (see the convert
19 19 extension). The package root module gives its name to the extension and
20 20 implements the ``cmdtable`` and optional callbacks described below.
21 21
22 22 Command table
23 23 =============
24 24
25 25 To write your own extension, your python module can provide an optional dict
26 26 named ``cmdtable`` with entries describing each command. A command should be
27 27 registered to the ``cmdtable`` by ``@command`` decorator.
28 28
29 29 Example using ``@command`` decorator (requires Mercurial 1.9)::
30 30
31 31 from mercurial.i18n import _
32 32
33 33 cmdtable = {}
34 34 try:
35 35 from mercurial import registrar
36 36 command = registrar.command(cmdtable)
37 37 except (AttributeError, ImportError):
38 38 # Fallback to hg < 4.3 support
39 39 from mercurial import cmdutil
40 40 command = cmdutil.command(cmdtable)
41 41
42 42 @command('print-parents',
43 43 [('s', 'short', None, _('print short form')),
44 44 ('l', 'long', None, _('print long form'))],
45 45 _('[options] node'))
46 46 def printparents(ui, repo, node, **opts):
47 47 ...
48 48
49 49 The cmdtable dictionary
50 50 -----------------------
51 51
52 52 The ``cmdtable`` dictionary uses as key the new command names, and, as value,
53 53 a tuple containing:
54 54
55 55 1. the function to be called when the command is used.
56 56 2. a list of options the command can take.
57 57 3. a command line synopsis for the command (the function docstring is used for
58 58 the full help).
59 59
60 60 List of options
61 61 ---------------
62 62
63 63 All the command flag options are documented in the mercurial/fancyopts.py
64 64 sources.
65 65
66 66 The options list is a list of tuples containing:
67 67
68 68 1. the short option letter, or ``''`` if no short option is available
69 69 (for example, ``o`` for a ``-o`` option).
70 70 2. the long option name (for example, ``option`` for a ``--option`` option).
71 71 3. a default value for the option.
72 72 4. a help string for the option (it's possible to omit the "hg newcommand"
73 73 part and only the options and parameter substring is needed).
74 74
75 75 Command function signatures
76 76 ---------------------------
77 77
78 78 Functions that implement new commands always receive a ``ui`` and usually
79 79 a ``repo`` parameter. The rest of parameters are taken from the command line
80 80 items that don't start with a dash and are passed in the same order they were
81 81 written. If no default value is given in the parameter list they are required.
82 82
83 83 If there is no repo to be associated with the command and consequently no
84 84 ``repo`` passed, then ``norepo=True`` should be passed to the ``@command``
85 85 decorator::
86 86
87 87 @command('mycommand', [], norepo=True)
88 88 def mycommand(ui, **opts):
89 89 ...
90 90
91 91 For examples of ``norepo``, see the convert extension.
92 92
93 93 Command function docstrings
94 94 ===========================
95 95
96 96 The docstring of your function is used as the main help text, shown by
97 97 ``hg help mycommand``. The docstring should be formatted using a simple
98 98 subset of reStructuredText markup. The supported constructs include:
99 99
100 100 Paragraphs::
101 101
102 102 This is a paragraph.
103 103
104 104 Paragraphs are separated
105 105 by blank lines.
106 106
107 107 A verbatim block is introduced with a double colon followed by an indented
108 108 block. The double colon is turned into a single colon on display::
109 109
110 110 Some text::
111 111
112 112 verbatim
113 113 text
114 114 !!
115 115
116 116 We have field lists::
117 117
118 118 :key1: value1
119 119 :key2: value2
120 120
121 121 Bullet lists::
122 122
123 123 - foo
124 124 - bar
125 125
126 126 Enumerated lists::
127 127
128 128 1. foo
129 129 2. bar
130 130
131 131 Inline markup::
132 132
133 133 ``*bold*``, ``monospace``, :hg:`command`
134 134
135 135 Mark Mercurial commands with ``:hg:`` to make a nice link to the corresponding
136 136 documentation. We'll expand the support if new constructs can be parsed
137 137 without too much trouble.
138 138
139 139 Communicating with the user
140 140 ===========================
141 141
142 142 Besides the ``ui`` methods, like ``ui.write(*msg)`` or
143 143 ``ui.prompt(msg, default="y")``, an extension can add help text for each
144 144 of its commands and the extension itself.
145 145
146 146 The module docstring will be used as help string when ``hg help extensionname``
147 147 is used and, similarly, the help string for a command and the docstring
148 148 belonging to the function that's wrapped by the command will be shown when
149 149 ``hg help command`` is invoked.
150 150
151 151 Setup Callbacks
152 152 ===============
153 153
154 154 Extensions are loaded in phases. All extensions are processed in a given phase
155 155 before the next phase begins. In the first phase, all extension modules are
156 156 loaded and registered with Mercurial. This means that you can find all enabled
157 157 extensions with ``extensions.find`` in the following phases.
158 158
159 159 Extension setup
160 160 ---------------
161 161
162 162 There are two callbacks to be called when extensions are loaded, named
163 163 ``uisetup`` and ``extsetup``. ``uisetup`` is called first for each extension,
164 164 then ``extsetup`` is called. This means ``extsetup`` can be useful in case
165 165 one extension optionally depends on another extension.
166 166
167 167 Both ``uisetup`` and ``extsetup`` receive a ui object with the local
168 168 repository configuration::
169 169
170 170 def uisetup(ui):
171 171 # ...
172 172
173 173 def extsetup(ui):
174 174 # ...
175 175
176 176 Be aware that ``uisetup`` in NOT the function to configure a ``ui`` instance.
177 177 It's called only once per process, not per ``ui`` instance. Also, any changes
178 to the ``ui`` may be discarded because the ``ui`` here temporarily loaded
178 to the ``ui`` may be discarded because the ``ui`` here is a temporarily loaded
179 179 local configuration. So, it's generally wrong to do `ui.setconfig()` in
180 180 these callbacks. Notable exception is setting ``pre/post-<command>`` hooks
181 181 and extending ``ui.__class__``.
182 182
183 183 In Mercurial 1.3.1 or earlier, ``extsetup`` takes no argument.
184 184
185 185 Command table setup
186 186 -------------------
187 187
188 188 After ``extsetup``, the ``cmdtable`` is copied into the global command table
189 189 in Mercurial.
190 190
191 191 Ui instance setup
192 192 -----------------
193 193
194 194 The optional ``uipopulate`` is called for each ``ui`` instance after
195 195 configuration is loaded, where extensions can set up additional ui members,
196 196 update configuration by ``ui.setconfig()``, and extend the class dynamically.
197 197
198 198 Typically there are three ``ui`` instances involved in command execution:
199 199
200 200 ``req.ui`` (or ``repo.baseui``)
201 201 Only system and user configurations are loaded into it.
202 202 ``lui``
203 203 Local repository configuration is loaded as well. This will be used at
204 204 early dispatching stage where a repository isn't available.
205 205 ``repo.ui``
206 206 The fully-loaded ``ui`` used after a repository is instantiated. This
207 207 will be created from the ``req.ui`` per repository.
208 208
209 209 In command server and hgweb, this may be called more than once for the same
210 210 ``ui`` instance.
211 211
212 212 (New in Mercurial 4.9)
213 213
214 214 Repository setup
215 215 ----------------
216 216
217 217 Extensions can implement an optional callback named ``reposetup``. It is
218 218 called after the main Mercurial repository initialization, and can be used
219 219 to setup any local state the extension might need.
220 220
221 221 As other command functions it receives an ``ui`` object and a ``repo`` object
222 222 (no additional parameters for this, though)::
223 223
224 224 def reposetup(ui, repo):
225 225 #do initialization here.
226 226
227 227 It is important to take into account that the ``ui`` object that is received
228 228 by the ``reposetup`` function is not the same as the one received by the
229 229 ``uisetup`` and ``extsetup`` functions. This is particularly important when
230 230 setting up hooks as described in the following section, since not all hooks
231 231 use the same ``ui`` object and hence different hooks must be configured in
232 232 different setup functions.
233 233
234 234 Wrapping methods on the ui and repo classes
235 235 -------------------------------------------
236 236
237 237 Because extensions can be loaded *per repository*, you should avoid using
238 238 ``extensions.wrapfunction()`` on methods of the ``ui`` and ``repo`` objects.
239 239 Instead, create a subclass of the specific class of the instance passed into
240 240 the ``*setup()`` hook; e.g. use ``ui.__class__`` as the base class, then
241 241 reassign your new class to ``ui.__class__`` again. Mercurial will then use
242 242 your updated ``ui`` or ``repo`` instance only for repositories where your
243 243 extension is enabled (or copies thereof, reusing your new class).
244 244
245 245 For example::
246 246
247 247 def uisetup(ui):
248 248 class echologui(ui.__class__):
249 249 def log(self, service, *msg, **opts):
250 250 if msg:
251 251 self.write('%s: %s\n' % (service, msg[0] % msg[1:]))
252 252 super(echologui, self).log(service, *msg, **opts)
253 253
254 254 ui.__class__ = echologui
255 255
256 256 Configuring Hooks
257 257 =================
258 258
259 259 Some extensions must use hooks to do their work. These required hooks can
260 260 be configured manually by the user by modifying the ``[hook]`` section of
261 261 their hgrc, but they can also be configured automatically by calling the
262 262 ``ui.setconfig('hooks', ...)`` function in one of the setup functions
263 263 described above.
264 264
265 265 The main difference between manually modifying the hooks section in the hgrc
266 266 and using ``ui.setconfig()`` is that when using ``ui.setconfig()`` you have
267 267 access to the actual hook function object, which you can pass directly to
268 268 ``ui.setconfig()``, while when you use the hooks section of the hgrc file
269 269 you must refer to the hook function by using the
270 270 ``python:modulename.functioname`` idiom (e.g. ``python:hgext.notify.hook``).
271 271
272 272 For example::
273 273
274 274 # Define hooks -- note that the actual function name it irrelevant.
275 275 def preupdatehook(ui, repo, **kwargs):
276 276 ui.write("Pre-update hook triggered\n")
277 277
278 278 def updatehook(ui, repo, **kwargs):
279 279 ui.write("Update hook triggered\n")
280 280
281 281 def uisetup(ui):
282 282 # When pre-<cmd> and post-<cmd> hooks are configured by means of
283 283 # the ui.setconfig() function, you must use the ui object passed
284 284 # to uisetup or extsetup.
285 285 ui.setconfig("hooks", "pre-update.myextension", preupdatehook)
286 286
287 287 def reposetup(ui, repo):
288 288 # Repository-specific hooks can be configured here. These include
289 289 # the update hook.
290 290 ui.setconfig("hooks", "update.myextension", updatehook)
291 291
292 292 Note how different hooks may need to be configured in different setup
293 293 functions. In the example you can see that the ``update`` hook must be
294 294 configured in the ``reposetup`` function, while the ``pre-update`` hook
295 295 must be configured on the ``uisetup`` or the ``extsetup`` functions.
296 296
297 297 Marking compatible versions
298 298 ===========================
299 299
300 300 Every extension should use the ``testedwith`` variable to specify Mercurial
301 301 releases it's known to be compatible with. This helps us and users diagnose
302 302 where problems are coming from::
303 303
304 304 testedwith = '2.0 2.0.1 2.1 2.1.1 2.1.2'
305 305
306 306 Do not use the ``internal`` marker in third-party extensions; we will
307 307 immediately drop all bug reports mentioning your extension if we catch you
308 308 doing this.
309 309
310 310 Similarly, an extension can use the ``buglink`` variable to specify how users
311 311 should report issues with the extension. This link will be included in the
312 312 error message if the extension produces errors::
313 313
314 314 buglink = 'https://bitbucket.org/USER/REPO/issues'
315 315
316 316 If an extension requires a minimum version of Mercurial, it can be declared
317 317 with the ``minimumhgversion`` variable::
318 318
319 319 minimumhgversion = '4.6'
320 320
321 321 Older clients will print a warning that the extension requires a new version,
322 322 instead of attempting to load it.
323 323
324 324 Wrap up: what belongs where?
325 325 ============================
326 326
327 327 You will find here a list of most common tasks, based on setups from the
328 328 extensions included in Mercurial core.
329 329
330 330 uisetup
331 331 -------
332 332
333 333 * Changes to ``ui.__class__`` . The ``ui`` object that will be used to run
334 334 the command has not yet been created. Changes made here will affect ``ui``
335 335 objects created after this, and in particular the ``ui`` that will be passed
336 336 to ``runcommand``
337 337 * Command wraps (``extensions.wrapcommand``)
338 338 * Changes that need to be visible by other extensions: because initialization
339 339 occurs in phases (all extensions run ``uisetup``, then all run ``extsetup``),
340 340 a change made here will be visible by other extensions during ``extsetup``.
341 341 * Monkeypatches or function wraps (``extensions.wrapfunction``) of ``dispatch``
342 342 module members
343 343 * Set up ``pre-*`` and ``post-*`` hooks. (DEPRECATED. ``uipopulate`` is
344 344 preferred on Mercurial 4.9 and later.)
345 345 * ``pushkey`` setup
346 346
347 347 extsetup
348 348 --------
349 349
350 350 * Changes depending on the status of other extensions. (``if extensions.find('mq')``)
351 351 * Add a global option to all commands
352 352 * Extend revsets
353 353
354 354 uipopulate
355 355 ----------
356 356
357 357 * Modify ``ui`` instance attributes and configuration variables.
358 358 * Changes to ``ui.__class__`` per instance.
359 359 * Set up all hooks per scoped configuration.
360 360
361 361 reposetup
362 362 ---------
363 363
364 364 * Set up all hooks but ``pre-*`` and ``post-*``. (DEPRECATED. ``uipopulate`` is
365 365 preferred on Mercurial 4.9 and later.)
366 366 * Modify configuration variables
367 367 * Changes to ``repo.__class__``, ``repo.dirstate.__class__``
General Comments 0
You need to be logged in to leave comments. Login now