##// END OF EJS Templates
pager: rename 'pager.enable' to 'ui.paginate'...
Pierre-Yves David -
r32105:f06d23af stable
parent child Browse files
Show More
@@ -1,2409 +1,2410 b''
1 1 The Mercurial system uses a set of configuration files to control
2 2 aspects of its behavior.
3 3
4 4 Troubleshooting
5 5 ===============
6 6
7 7 If you're having problems with your configuration,
8 8 :hg:`config --debug` can help you understand what is introducing
9 9 a setting into your environment.
10 10
11 11 See :hg:`help config.syntax` and :hg:`help config.files`
12 12 for information about how and where to override things.
13 13
14 14 Structure
15 15 =========
16 16
17 17 The configuration files use a simple ini-file format. A configuration
18 18 file consists of sections, led by a ``[section]`` header and followed
19 19 by ``name = value`` entries::
20 20
21 21 [ui]
22 22 username = Firstname Lastname <firstname.lastname@example.net>
23 23 verbose = True
24 24
25 25 The above entries will be referred to as ``ui.username`` and
26 26 ``ui.verbose``, respectively. See :hg:`help config.syntax`.
27 27
28 28 Files
29 29 =====
30 30
31 31 Mercurial reads configuration data from several files, if they exist.
32 32 These files do not exist by default and you will have to create the
33 33 appropriate configuration files yourself:
34 34
35 35 Local configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
36 36
37 37 Global configuration like the username setting is typically put into:
38 38
39 39 .. container:: windows
40 40
41 41 - ``%USERPROFILE%\mercurial.ini`` (on Windows)
42 42
43 43 .. container:: unix.plan9
44 44
45 45 - ``$HOME/.hgrc`` (on Unix, Plan9)
46 46
47 47 The names of these files depend on the system on which Mercurial is
48 48 installed. ``*.rc`` files from a single directory are read in
49 49 alphabetical order, later ones overriding earlier ones. Where multiple
50 50 paths are given below, settings from earlier paths override later
51 51 ones.
52 52
53 53 .. container:: verbose.unix
54 54
55 55 On Unix, the following files are consulted:
56 56
57 57 - ``<repo>/.hg/hgrc`` (per-repository)
58 58 - ``$HOME/.hgrc`` (per-user)
59 59 - ``${XDG_CONFIG_HOME:-$HOME/.config}/hg/hgrc`` (per-user)
60 60 - ``<install-root>/etc/mercurial/hgrc`` (per-installation)
61 61 - ``<install-root>/etc/mercurial/hgrc.d/*.rc`` (per-installation)
62 62 - ``/etc/mercurial/hgrc`` (per-system)
63 63 - ``/etc/mercurial/hgrc.d/*.rc`` (per-system)
64 64 - ``<internal>/default.d/*.rc`` (defaults)
65 65
66 66 .. container:: verbose.windows
67 67
68 68 On Windows, the following files are consulted:
69 69
70 70 - ``<repo>/.hg/hgrc`` (per-repository)
71 71 - ``%USERPROFILE%\.hgrc`` (per-user)
72 72 - ``%USERPROFILE%\Mercurial.ini`` (per-user)
73 73 - ``%HOME%\.hgrc`` (per-user)
74 74 - ``%HOME%\Mercurial.ini`` (per-user)
75 75 - ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial`` (per-installation)
76 76 - ``<install-dir>\hgrc.d\*.rc`` (per-installation)
77 77 - ``<install-dir>\Mercurial.ini`` (per-installation)
78 78 - ``<internal>/default.d/*.rc`` (defaults)
79 79
80 80 .. note::
81 81
82 82 The registry key ``HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Mercurial``
83 83 is used when running 32-bit Python on 64-bit Windows.
84 84
85 85 .. container:: windows
86 86
87 87 On Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``.
88 88
89 89 .. container:: verbose.plan9
90 90
91 91 On Plan9, the following files are consulted:
92 92
93 93 - ``<repo>/.hg/hgrc`` (per-repository)
94 94 - ``$home/lib/hgrc`` (per-user)
95 95 - ``<install-root>/lib/mercurial/hgrc`` (per-installation)
96 96 - ``<install-root>/lib/mercurial/hgrc.d/*.rc`` (per-installation)
97 97 - ``/lib/mercurial/hgrc`` (per-system)
98 98 - ``/lib/mercurial/hgrc.d/*.rc`` (per-system)
99 99 - ``<internal>/default.d/*.rc`` (defaults)
100 100
101 101 Per-repository configuration options only apply in a
102 102 particular repository. This file is not version-controlled, and
103 103 will not get transferred during a "clone" operation. Options in
104 104 this file override options in all other configuration files.
105 105
106 106 .. container:: unix.plan9
107 107
108 108 On Plan 9 and Unix, most of this file will be ignored if it doesn't
109 109 belong to a trusted user or to a trusted group. See
110 110 :hg:`help config.trusted` for more details.
111 111
112 112 Per-user configuration file(s) are for the user running Mercurial. Options
113 113 in these files apply to all Mercurial commands executed by this user in any
114 114 directory. Options in these files override per-system and per-installation
115 115 options.
116 116
117 117 Per-installation configuration files are searched for in the
118 118 directory where Mercurial is installed. ``<install-root>`` is the
119 119 parent directory of the **hg** executable (or symlink) being run.
120 120
121 121 .. container:: unix.plan9
122 122
123 123 For example, if installed in ``/shared/tools/bin/hg``, Mercurial
124 124 will look in ``/shared/tools/etc/mercurial/hgrc``. Options in these
125 125 files apply to all Mercurial commands executed by any user in any
126 126 directory.
127 127
128 128 Per-installation configuration files are for the system on
129 129 which Mercurial is running. Options in these files apply to all
130 130 Mercurial commands executed by any user in any directory. Registry
131 131 keys contain PATH-like strings, every part of which must reference
132 132 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
133 133 be read. Mercurial checks each of these locations in the specified
134 134 order until one or more configuration files are detected.
135 135
136 136 Per-system configuration files are for the system on which Mercurial
137 137 is running. Options in these files apply to all Mercurial commands
138 138 executed by any user in any directory. Options in these files
139 139 override per-installation options.
140 140
141 141 Mercurial comes with some default configuration. The default configuration
142 142 files are installed with Mercurial and will be overwritten on upgrades. Default
143 143 configuration files should never be edited by users or administrators but can
144 144 be overridden in other configuration files. So far the directory only contains
145 145 merge tool configuration but packagers can also put other default configuration
146 146 there.
147 147
148 148 Syntax
149 149 ======
150 150
151 151 A configuration file consists of sections, led by a ``[section]`` header
152 152 and followed by ``name = value`` entries (sometimes called
153 153 ``configuration keys``)::
154 154
155 155 [spam]
156 156 eggs=ham
157 157 green=
158 158 eggs
159 159
160 160 Each line contains one entry. If the lines that follow are indented,
161 161 they are treated as continuations of that entry. Leading whitespace is
162 162 removed from values. Empty lines are skipped. Lines beginning with
163 163 ``#`` or ``;`` are ignored and may be used to provide comments.
164 164
165 165 Configuration keys can be set multiple times, in which case Mercurial
166 166 will use the value that was configured last. As an example::
167 167
168 168 [spam]
169 169 eggs=large
170 170 ham=serrano
171 171 eggs=small
172 172
173 173 This would set the configuration key named ``eggs`` to ``small``.
174 174
175 175 It is also possible to define a section multiple times. A section can
176 176 be redefined on the same and/or on different configuration files. For
177 177 example::
178 178
179 179 [foo]
180 180 eggs=large
181 181 ham=serrano
182 182 eggs=small
183 183
184 184 [bar]
185 185 eggs=ham
186 186 green=
187 187 eggs
188 188
189 189 [foo]
190 190 ham=prosciutto
191 191 eggs=medium
192 192 bread=toasted
193 193
194 194 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
195 195 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
196 196 respectively. As you can see there only thing that matters is the last
197 197 value that was set for each of the configuration keys.
198 198
199 199 If a configuration key is set multiple times in different
200 200 configuration files the final value will depend on the order in which
201 201 the different configuration files are read, with settings from earlier
202 202 paths overriding later ones as described on the ``Files`` section
203 203 above.
204 204
205 205 A line of the form ``%include file`` will include ``file`` into the
206 206 current configuration file. The inclusion is recursive, which means
207 207 that included files can include other files. Filenames are relative to
208 208 the configuration file in which the ``%include`` directive is found.
209 209 Environment variables and ``~user`` constructs are expanded in
210 210 ``file``. This lets you do something like::
211 211
212 212 %include ~/.hgrc.d/$HOST.rc
213 213
214 214 to include a different configuration file on each computer you use.
215 215
216 216 A line with ``%unset name`` will remove ``name`` from the current
217 217 section, if it has been set previously.
218 218
219 219 The values are either free-form text strings, lists of text strings,
220 220 or Boolean values. Boolean values can be set to true using any of "1",
221 221 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
222 222 (all case insensitive).
223 223
224 224 List values are separated by whitespace or comma, except when values are
225 225 placed in double quotation marks::
226 226
227 227 allow_read = "John Doe, PhD", brian, betty
228 228
229 229 Quotation marks can be escaped by prefixing them with a backslash. Only
230 230 quotation marks at the beginning of a word is counted as a quotation
231 231 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
232 232
233 233 Sections
234 234 ========
235 235
236 236 This section describes the different sections that may appear in a
237 237 Mercurial configuration file, the purpose of each section, its possible
238 238 keys, and their possible values.
239 239
240 240 ``alias``
241 241 ---------
242 242
243 243 Defines command aliases.
244 244
245 245 Aliases allow you to define your own commands in terms of other
246 246 commands (or aliases), optionally including arguments. Positional
247 247 arguments in the form of ``$1``, ``$2``, etc. in the alias definition
248 248 are expanded by Mercurial before execution. Positional arguments not
249 249 already used by ``$N`` in the definition are put at the end of the
250 250 command to be executed.
251 251
252 252 Alias definitions consist of lines of the form::
253 253
254 254 <alias> = <command> [<argument>]...
255 255
256 256 For example, this definition::
257 257
258 258 latest = log --limit 5
259 259
260 260 creates a new command ``latest`` that shows only the five most recent
261 261 changesets. You can define subsequent aliases using earlier ones::
262 262
263 263 stable5 = latest -b stable
264 264
265 265 .. note::
266 266
267 267 It is possible to create aliases with the same names as
268 268 existing commands, which will then override the original
269 269 definitions. This is almost always a bad idea!
270 270
271 271 An alias can start with an exclamation point (``!``) to make it a
272 272 shell alias. A shell alias is executed with the shell and will let you
273 273 run arbitrary commands. As an example, ::
274 274
275 275 echo = !echo $@
276 276
277 277 will let you do ``hg echo foo`` to have ``foo`` printed in your
278 278 terminal. A better example might be::
279 279
280 280 purge = !$HG status --no-status --unknown -0 re: | xargs -0 rm -f
281 281
282 282 which will make ``hg purge`` delete all unknown files in the
283 283 repository in the same manner as the purge extension.
284 284
285 285 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
286 286 expand to the command arguments. Unmatched arguments are
287 287 removed. ``$0`` expands to the alias name and ``$@`` expands to all
288 288 arguments separated by a space. ``"$@"`` (with quotes) expands to all
289 289 arguments quoted individually and separated by a space. These expansions
290 290 happen before the command is passed to the shell.
291 291
292 292 Shell aliases are executed in an environment where ``$HG`` expands to
293 293 the path of the Mercurial that was used to execute the alias. This is
294 294 useful when you want to call further Mercurial commands in a shell
295 295 alias, as was done above for the purge alias. In addition,
296 296 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
297 297 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
298 298
299 299 .. note::
300 300
301 301 Some global configuration options such as ``-R`` are
302 302 processed before shell aliases and will thus not be passed to
303 303 aliases.
304 304
305 305
306 306 ``annotate``
307 307 ------------
308 308
309 309 Settings used when displaying file annotations. All values are
310 310 Booleans and default to False. See :hg:`help config.diff` for
311 311 related options for the diff command.
312 312
313 313 ``ignorews``
314 314 Ignore white space when comparing lines.
315 315
316 316 ``ignorewsamount``
317 317 Ignore changes in the amount of white space.
318 318
319 319 ``ignoreblanklines``
320 320 Ignore changes whose lines are all blank.
321 321
322 322
323 323 ``auth``
324 324 --------
325 325
326 326 Authentication credentials and other authentication-like configuration
327 327 for HTTP connections. This section allows you to store usernames and
328 328 passwords for use when logging *into* HTTP servers. See
329 329 :hg:`help config.web` if you want to configure *who* can login to
330 330 your HTTP server.
331 331
332 332 The following options apply to all hosts.
333 333
334 334 ``cookiefile``
335 335 Path to a file containing HTTP cookie lines. Cookies matching a
336 336 host will be sent automatically.
337 337
338 338 The file format uses the Mozilla cookies.txt format, which defines cookies
339 339 on their own lines. Each line contains 7 fields delimited by the tab
340 340 character (domain, is_domain_cookie, path, is_secure, expires, name,
341 341 value). For more info, do an Internet search for "Netscape cookies.txt
342 342 format."
343 343
344 344 Note: the cookies parser does not handle port numbers on domains. You
345 345 will need to remove ports from the domain for the cookie to be recognized.
346 346 This could result in a cookie being disclosed to an unwanted server.
347 347
348 348 The cookies file is read-only.
349 349
350 350 Other options in this section are grouped by name and have the following
351 351 format::
352 352
353 353 <name>.<argument> = <value>
354 354
355 355 where ``<name>`` is used to group arguments into authentication
356 356 entries. Example::
357 357
358 358 foo.prefix = hg.intevation.de/mercurial
359 359 foo.username = foo
360 360 foo.password = bar
361 361 foo.schemes = http https
362 362
363 363 bar.prefix = secure.example.org
364 364 bar.key = path/to/file.key
365 365 bar.cert = path/to/file.cert
366 366 bar.schemes = https
367 367
368 368 Supported arguments:
369 369
370 370 ``prefix``
371 371 Either ``*`` or a URI prefix with or without the scheme part.
372 372 The authentication entry with the longest matching prefix is used
373 373 (where ``*`` matches everything and counts as a match of length
374 374 1). If the prefix doesn't include a scheme, the match is performed
375 375 against the URI with its scheme stripped as well, and the schemes
376 376 argument, q.v., is then subsequently consulted.
377 377
378 378 ``username``
379 379 Optional. Username to authenticate with. If not given, and the
380 380 remote site requires basic or digest authentication, the user will
381 381 be prompted for it. Environment variables are expanded in the
382 382 username letting you do ``foo.username = $USER``. If the URI
383 383 includes a username, only ``[auth]`` entries with a matching
384 384 username or without a username will be considered.
385 385
386 386 ``password``
387 387 Optional. Password to authenticate with. If not given, and the
388 388 remote site requires basic or digest authentication, the user
389 389 will be prompted for it.
390 390
391 391 ``key``
392 392 Optional. PEM encoded client certificate key file. Environment
393 393 variables are expanded in the filename.
394 394
395 395 ``cert``
396 396 Optional. PEM encoded client certificate chain file. Environment
397 397 variables are expanded in the filename.
398 398
399 399 ``schemes``
400 400 Optional. Space separated list of URI schemes to use this
401 401 authentication entry with. Only used if the prefix doesn't include
402 402 a scheme. Supported schemes are http and https. They will match
403 403 static-http and static-https respectively, as well.
404 404 (default: https)
405 405
406 406 If no suitable authentication entry is found, the user is prompted
407 407 for credentials as usual if required by the remote.
408 408
409 409 ``color``
410 410 ---------
411 411
412 412 Configure the Mercurial color mode. For details about how to define your custom
413 413 effect and style see :hg:`help color`.
414 414
415 415 ``mode``
416 416 String: control the method used to output color. One of ``auto``, ``ansi``,
417 417 ``win32``, ``terminfo`` or ``debug``. In auto mode, Mercurial will
418 418 use ANSI mode by default (or win32 mode on Windows) if it detects a
419 419 terminal. Any invalid value will disable color.
420 420
421 421 ``pagermode``
422 422 String: optinal override of ``color.mode`` used with pager.
423 423
424 424 On some systems, terminfo mode may cause problems when using
425 425 color with ``less -R`` as a pager program. less with the -R option
426 426 will only display ECMA-48 color codes, and terminfo mode may sometimes
427 427 emit codes that less doesn't understand. You can work around this by
428 428 either using ansi mode (or auto mode), or by using less -r (which will
429 429 pass through all terminal control codes, not just color control
430 430 codes).
431 431
432 432 On some systems (such as MSYS in Windows), the terminal may support
433 433 a different color mode than the pager program.
434 434
435 435 ``commands``
436 436 ------------
437 437
438 438 ``status.relative``
439 439 Make paths in :hg:`status` output relative to the current directory.
440 440 (default: False)
441 441
442 442 ``update.requiredest``
443 443 Require that the user pass a destination when running :hg:`update`.
444 444 For example, :hg:`update .::` will be allowed, but a plain :hg:`update`
445 445 will be disallowed.
446 446 (default: False)
447 447
448 448 ``committemplate``
449 449 ------------------
450 450
451 451 ``changeset``
452 452 String: configuration in this section is used as the template to
453 453 customize the text shown in the editor when committing.
454 454
455 455 In addition to pre-defined template keywords, commit log specific one
456 456 below can be used for customization:
457 457
458 458 ``extramsg``
459 459 String: Extra message (typically 'Leave message empty to abort
460 460 commit.'). This may be changed by some commands or extensions.
461 461
462 462 For example, the template configuration below shows as same text as
463 463 one shown by default::
464 464
465 465 [committemplate]
466 466 changeset = {desc}\n\n
467 467 HG: Enter commit message. Lines beginning with 'HG:' are removed.
468 468 HG: {extramsg}
469 469 HG: --
470 470 HG: user: {author}\n{ifeq(p2rev, "-1", "",
471 471 "HG: branch merge\n")
472 472 }HG: branch '{branch}'\n{if(activebookmark,
473 473 "HG: bookmark '{activebookmark}'\n") }{subrepos %
474 474 "HG: subrepo {subrepo}\n" }{file_adds %
475 475 "HG: added {file}\n" }{file_mods %
476 476 "HG: changed {file}\n" }{file_dels %
477 477 "HG: removed {file}\n" }{if(files, "",
478 478 "HG: no files changed\n")}
479 479
480 480 ``diff()``
481 481 String: show the diff (see :hg:`help templates` for detail)
482 482
483 483 Sometimes it is helpful to show the diff of the changeset in the editor without
484 484 having to prefix 'HG: ' to each line so that highlighting works correctly. For
485 485 this, Mercurial provides a special string which will ignore everything below
486 486 it::
487 487
488 488 HG: ------------------------ >8 ------------------------
489 489
490 490 For example, the template configuration below will show the diff below the
491 491 extra message::
492 492
493 493 [committemplate]
494 494 changeset = {desc}\n\n
495 495 HG: Enter commit message. Lines beginning with 'HG:' are removed.
496 496 HG: {extramsg}
497 497 HG: ------------------------ >8 ------------------------
498 498 HG: Do not touch the line above.
499 499 HG: Everything below will be removed.
500 500 {diff()}
501 501
502 502 .. note::
503 503
504 504 For some problematic encodings (see :hg:`help win32mbcs` for
505 505 detail), this customization should be configured carefully, to
506 506 avoid showing broken characters.
507 507
508 508 For example, if a multibyte character ending with backslash (0x5c) is
509 509 followed by the ASCII character 'n' in the customized template,
510 510 the sequence of backslash and 'n' is treated as line-feed unexpectedly
511 511 (and the multibyte character is broken, too).
512 512
513 513 Customized template is used for commands below (``--edit`` may be
514 514 required):
515 515
516 516 - :hg:`backout`
517 517 - :hg:`commit`
518 518 - :hg:`fetch` (for merge commit only)
519 519 - :hg:`graft`
520 520 - :hg:`histedit`
521 521 - :hg:`import`
522 522 - :hg:`qfold`, :hg:`qnew` and :hg:`qrefresh`
523 523 - :hg:`rebase`
524 524 - :hg:`shelve`
525 525 - :hg:`sign`
526 526 - :hg:`tag`
527 527 - :hg:`transplant`
528 528
529 529 Configuring items below instead of ``changeset`` allows showing
530 530 customized message only for specific actions, or showing different
531 531 messages for each action.
532 532
533 533 - ``changeset.backout`` for :hg:`backout`
534 534 - ``changeset.commit.amend.merge`` for :hg:`commit --amend` on merges
535 535 - ``changeset.commit.amend.normal`` for :hg:`commit --amend` on other
536 536 - ``changeset.commit.normal.merge`` for :hg:`commit` on merges
537 537 - ``changeset.commit.normal.normal`` for :hg:`commit` on other
538 538 - ``changeset.fetch`` for :hg:`fetch` (impling merge commit)
539 539 - ``changeset.gpg.sign`` for :hg:`sign`
540 540 - ``changeset.graft`` for :hg:`graft`
541 541 - ``changeset.histedit.edit`` for ``edit`` of :hg:`histedit`
542 542 - ``changeset.histedit.fold`` for ``fold`` of :hg:`histedit`
543 543 - ``changeset.histedit.mess`` for ``mess`` of :hg:`histedit`
544 544 - ``changeset.histedit.pick`` for ``pick`` of :hg:`histedit`
545 545 - ``changeset.import.bypass`` for :hg:`import --bypass`
546 546 - ``changeset.import.normal.merge`` for :hg:`import` on merges
547 547 - ``changeset.import.normal.normal`` for :hg:`import` on other
548 548 - ``changeset.mq.qnew`` for :hg:`qnew`
549 549 - ``changeset.mq.qfold`` for :hg:`qfold`
550 550 - ``changeset.mq.qrefresh`` for :hg:`qrefresh`
551 551 - ``changeset.rebase.collapse`` for :hg:`rebase --collapse`
552 552 - ``changeset.rebase.merge`` for :hg:`rebase` on merges
553 553 - ``changeset.rebase.normal`` for :hg:`rebase` on other
554 554 - ``changeset.shelve.shelve`` for :hg:`shelve`
555 555 - ``changeset.tag.add`` for :hg:`tag` without ``--remove``
556 556 - ``changeset.tag.remove`` for :hg:`tag --remove`
557 557 - ``changeset.transplant.merge`` for :hg:`transplant` on merges
558 558 - ``changeset.transplant.normal`` for :hg:`transplant` on other
559 559
560 560 These dot-separated lists of names are treated as hierarchical ones.
561 561 For example, ``changeset.tag.remove`` customizes the commit message
562 562 only for :hg:`tag --remove`, but ``changeset.tag`` customizes the
563 563 commit message for :hg:`tag` regardless of ``--remove`` option.
564 564
565 565 When the external editor is invoked for a commit, the corresponding
566 566 dot-separated list of names without the ``changeset.`` prefix
567 567 (e.g. ``commit.normal.normal``) is in the ``HGEDITFORM`` environment
568 568 variable.
569 569
570 570 In this section, items other than ``changeset`` can be referred from
571 571 others. For example, the configuration to list committed files up
572 572 below can be referred as ``{listupfiles}``::
573 573
574 574 [committemplate]
575 575 listupfiles = {file_adds %
576 576 "HG: added {file}\n" }{file_mods %
577 577 "HG: changed {file}\n" }{file_dels %
578 578 "HG: removed {file}\n" }{if(files, "",
579 579 "HG: no files changed\n")}
580 580
581 581 ``decode/encode``
582 582 -----------------
583 583
584 584 Filters for transforming files on checkout/checkin. This would
585 585 typically be used for newline processing or other
586 586 localization/canonicalization of files.
587 587
588 588 Filters consist of a filter pattern followed by a filter command.
589 589 Filter patterns are globs by default, rooted at the repository root.
590 590 For example, to match any file ending in ``.txt`` in the root
591 591 directory only, use the pattern ``*.txt``. To match any file ending
592 592 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
593 593 For each file only the first matching filter applies.
594 594
595 595 The filter command can start with a specifier, either ``pipe:`` or
596 596 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
597 597
598 598 A ``pipe:`` command must accept data on stdin and return the transformed
599 599 data on stdout.
600 600
601 601 Pipe example::
602 602
603 603 [encode]
604 604 # uncompress gzip files on checkin to improve delta compression
605 605 # note: not necessarily a good idea, just an example
606 606 *.gz = pipe: gunzip
607 607
608 608 [decode]
609 609 # recompress gzip files when writing them to the working dir (we
610 610 # can safely omit "pipe:", because it's the default)
611 611 *.gz = gzip
612 612
613 613 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
614 614 with the name of a temporary file that contains the data to be
615 615 filtered by the command. The string ``OUTFILE`` is replaced with the name
616 616 of an empty temporary file, where the filtered data must be written by
617 617 the command.
618 618
619 619 .. container:: windows
620 620
621 621 .. note::
622 622
623 623 The tempfile mechanism is recommended for Windows systems,
624 624 where the standard shell I/O redirection operators often have
625 625 strange effects and may corrupt the contents of your files.
626 626
627 627 This filter mechanism is used internally by the ``eol`` extension to
628 628 translate line ending characters between Windows (CRLF) and Unix (LF)
629 629 format. We suggest you use the ``eol`` extension for convenience.
630 630
631 631
632 632 ``defaults``
633 633 ------------
634 634
635 635 (defaults are deprecated. Don't use them. Use aliases instead.)
636 636
637 637 Use the ``[defaults]`` section to define command defaults, i.e. the
638 638 default options/arguments to pass to the specified commands.
639 639
640 640 The following example makes :hg:`log` run in verbose mode, and
641 641 :hg:`status` show only the modified files, by default::
642 642
643 643 [defaults]
644 644 log = -v
645 645 status = -m
646 646
647 647 The actual commands, instead of their aliases, must be used when
648 648 defining command defaults. The command defaults will also be applied
649 649 to the aliases of the commands defined.
650 650
651 651
652 652 ``diff``
653 653 --------
654 654
655 655 Settings used when displaying diffs. Everything except for ``unified``
656 656 is a Boolean and defaults to False. See :hg:`help config.annotate`
657 657 for related options for the annotate command.
658 658
659 659 ``git``
660 660 Use git extended diff format.
661 661
662 662 ``nobinary``
663 663 Omit git binary patches.
664 664
665 665 ``nodates``
666 666 Don't include dates in diff headers.
667 667
668 668 ``noprefix``
669 669 Omit 'a/' and 'b/' prefixes from filenames. Ignored in plain mode.
670 670
671 671 ``showfunc``
672 672 Show which function each change is in.
673 673
674 674 ``ignorews``
675 675 Ignore white space when comparing lines.
676 676
677 677 ``ignorewsamount``
678 678 Ignore changes in the amount of white space.
679 679
680 680 ``ignoreblanklines``
681 681 Ignore changes whose lines are all blank.
682 682
683 683 ``unified``
684 684 Number of lines of context to show.
685 685
686 686 ``email``
687 687 ---------
688 688
689 689 Settings for extensions that send email messages.
690 690
691 691 ``from``
692 692 Optional. Email address to use in "From" header and SMTP envelope
693 693 of outgoing messages.
694 694
695 695 ``to``
696 696 Optional. Comma-separated list of recipients' email addresses.
697 697
698 698 ``cc``
699 699 Optional. Comma-separated list of carbon copy recipients'
700 700 email addresses.
701 701
702 702 ``bcc``
703 703 Optional. Comma-separated list of blind carbon copy recipients'
704 704 email addresses.
705 705
706 706 ``method``
707 707 Optional. Method to use to send email messages. If value is ``smtp``
708 708 (default), use SMTP (see the ``[smtp]`` section for configuration).
709 709 Otherwise, use as name of program to run that acts like sendmail
710 710 (takes ``-f`` option for sender, list of recipients on command line,
711 711 message on stdin). Normally, setting this to ``sendmail`` or
712 712 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
713 713
714 714 ``charsets``
715 715 Optional. Comma-separated list of character sets considered
716 716 convenient for recipients. Addresses, headers, and parts not
717 717 containing patches of outgoing messages will be encoded in the
718 718 first character set to which conversion from local encoding
719 719 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
720 720 conversion fails, the text in question is sent as is.
721 721 (default: '')
722 722
723 723 Order of outgoing email character sets:
724 724
725 725 1. ``us-ascii``: always first, regardless of settings
726 726 2. ``email.charsets``: in order given by user
727 727 3. ``ui.fallbackencoding``: if not in email.charsets
728 728 4. ``$HGENCODING``: if not in email.charsets
729 729 5. ``utf-8``: always last, regardless of settings
730 730
731 731 Email example::
732 732
733 733 [email]
734 734 from = Joseph User <joe.user@example.com>
735 735 method = /usr/sbin/sendmail
736 736 # charsets for western Europeans
737 737 # us-ascii, utf-8 omitted, as they are tried first and last
738 738 charsets = iso-8859-1, iso-8859-15, windows-1252
739 739
740 740
741 741 ``extensions``
742 742 --------------
743 743
744 744 Mercurial has an extension mechanism for adding new features. To
745 745 enable an extension, create an entry for it in this section.
746 746
747 747 If you know that the extension is already in Python's search path,
748 748 you can give the name of the module, followed by ``=``, with nothing
749 749 after the ``=``.
750 750
751 751 Otherwise, give a name that you choose, followed by ``=``, followed by
752 752 the path to the ``.py`` file (including the file name extension) that
753 753 defines the extension.
754 754
755 755 To explicitly disable an extension that is enabled in an hgrc of
756 756 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
757 757 or ``foo = !`` when path is not supplied.
758 758
759 759 Example for ``~/.hgrc``::
760 760
761 761 [extensions]
762 762 # (the churn extension will get loaded from Mercurial's path)
763 763 churn =
764 764 # (this extension will get loaded from the file specified)
765 765 myfeature = ~/.hgext/myfeature.py
766 766
767 767
768 768 ``format``
769 769 ----------
770 770
771 771 ``usegeneraldelta``
772 772 Enable or disable the "generaldelta" repository format which improves
773 773 repository compression by allowing "revlog" to store delta against arbitrary
774 774 revision instead of the previous stored one. This provides significant
775 775 improvement for repositories with branches.
776 776
777 777 Repositories with this on-disk format require Mercurial version 1.9.
778 778
779 779 Enabled by default.
780 780
781 781 ``dotencode``
782 782 Enable or disable the "dotencode" repository format which enhances
783 783 the "fncache" repository format (which has to be enabled to use
784 784 dotencode) to avoid issues with filenames starting with ._ on
785 785 Mac OS X and spaces on Windows.
786 786
787 787 Repositories with this on-disk format require Mercurial version 1.7.
788 788
789 789 Enabled by default.
790 790
791 791 ``usefncache``
792 792 Enable or disable the "fncache" repository format which enhances
793 793 the "store" repository format (which has to be enabled to use
794 794 fncache) to allow longer filenames and avoids using Windows
795 795 reserved names, e.g. "nul".
796 796
797 797 Repositories with this on-disk format require Mercurial version 1.1.
798 798
799 799 Enabled by default.
800 800
801 801 ``usestore``
802 802 Enable or disable the "store" repository format which improves
803 803 compatibility with systems that fold case or otherwise mangle
804 804 filenames. Disabling this option will allow you to store longer filenames
805 805 in some situations at the expense of compatibility.
806 806
807 807 Repositories with this on-disk format require Mercurial version 0.9.4.
808 808
809 809 Enabled by default.
810 810
811 811 ``graph``
812 812 ---------
813 813
814 814 Web graph view configuration. This section let you change graph
815 815 elements display properties by branches, for instance to make the
816 816 ``default`` branch stand out.
817 817
818 818 Each line has the following format::
819 819
820 820 <branch>.<argument> = <value>
821 821
822 822 where ``<branch>`` is the name of the branch being
823 823 customized. Example::
824 824
825 825 [graph]
826 826 # 2px width
827 827 default.width = 2
828 828 # red color
829 829 default.color = FF0000
830 830
831 831 Supported arguments:
832 832
833 833 ``width``
834 834 Set branch edges width in pixels.
835 835
836 836 ``color``
837 837 Set branch edges color in hexadecimal RGB notation.
838 838
839 839 ``hooks``
840 840 ---------
841 841
842 842 Commands or Python functions that get automatically executed by
843 843 various actions such as starting or finishing a commit. Multiple
844 844 hooks can be run for the same action by appending a suffix to the
845 845 action. Overriding a site-wide hook can be done by changing its
846 846 value or setting it to an empty string. Hooks can be prioritized
847 847 by adding a prefix of ``priority.`` to the hook name on a new line
848 848 and setting the priority. The default priority is 0.
849 849
850 850 Example ``.hg/hgrc``::
851 851
852 852 [hooks]
853 853 # update working directory after adding changesets
854 854 changegroup.update = hg update
855 855 # do not use the site-wide hook
856 856 incoming =
857 857 incoming.email = /my/email/hook
858 858 incoming.autobuild = /my/build/hook
859 859 # force autobuild hook to run before other incoming hooks
860 860 priority.incoming.autobuild = 1
861 861
862 862 Most hooks are run with environment variables set that give useful
863 863 additional information. For each hook below, the environment variables
864 864 it is passed are listed with names of the form ``$HG_foo``. The
865 865 ``$HG_HOOKTYPE`` and ``$HG_HOOKNAME`` variables are set for all hooks.
866 866 their respectively contains the type of hook which triggered the run and
867 867 the full name of the hooks in the config. In the example about this will
868 868 be ``$HG_HOOKTYPE=incoming`` and ``$HG_HOOKNAME=incoming.email``.
869 869
870 870 ``changegroup``
871 871 Run after a changegroup has been added via push, pull or unbundle. ID of the
872 872 first new changeset is in ``$HG_NODE`` and last in ``$HG_NODE_LAST``. URL
873 873 from which changes came is in ``$HG_URL``.
874 874
875 875 ``commit``
876 876 Run after a changeset has been created in the local repository. ID
877 877 of the newly created changeset is in ``$HG_NODE``. Parent changeset
878 878 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
879 879
880 880 ``incoming``
881 881 Run after a changeset has been pulled, pushed, or unbundled into
882 882 the local repository. The ID of the newly arrived changeset is in
883 883 ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
884 884
885 885 ``outgoing``
886 886 Run after sending changes from local repository to another. ID of
887 887 first changeset sent is in ``$HG_NODE``. Source of operation is in
888 888 ``$HG_SOURCE``; Also see :hg:`help config.hooks.preoutgoing` hook.
889 889
890 890 ``post-<command>``
891 891 Run after successful invocations of the associated command. The
892 892 contents of the command line are passed as ``$HG_ARGS`` and the result
893 893 code in ``$HG_RESULT``. Parsed command line arguments are passed as
894 894 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
895 895 the python data internally passed to <command>. ``$HG_OPTS`` is a
896 896 dictionary of options (with unspecified options set to their defaults).
897 897 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
898 898
899 899 ``fail-<command>``
900 900 Run after a failed invocation of an associated command. The contents
901 901 of the command line are passed as ``$HG_ARGS``. Parsed command line
902 902 arguments are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain
903 903 string representations of the python data internally passed to
904 904 <command>. ``$HG_OPTS`` is a dictionary of options (with unspecified
905 905 options set to their defaults). ``$HG_PATS`` is a list of arguments.
906 906 Hook failure is ignored.
907 907
908 908 ``pre-<command>``
909 909 Run before executing the associated command. The contents of the
910 910 command line are passed as ``$HG_ARGS``. Parsed command line arguments
911 911 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
912 912 representations of the data internally passed to <command>. ``$HG_OPTS``
913 913 is a dictionary of options (with unspecified options set to their
914 914 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
915 915 failure, the command doesn't execute and Mercurial returns the failure
916 916 code.
917 917
918 918 ``prechangegroup``
919 919 Run before a changegroup is added via push, pull or unbundle. Exit
920 920 status 0 allows the changegroup to proceed. Non-zero status will
921 921 cause the push, pull or unbundle to fail. URL from which changes
922 922 will come is in ``$HG_URL``.
923 923
924 924 ``precommit``
925 925 Run before starting a local commit. Exit status 0 allows the
926 926 commit to proceed. Non-zero status will cause the commit to fail.
927 927 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
928 928
929 929 ``prelistkeys``
930 930 Run before listing pushkeys (like bookmarks) in the
931 931 repository. Non-zero status will cause failure. The key namespace is
932 932 in ``$HG_NAMESPACE``.
933 933
934 934 ``preoutgoing``
935 935 Run before collecting changes to send from the local repository to
936 936 another. Non-zero status will cause failure. This lets you prevent
937 937 pull over HTTP or SSH. Also prevents against local pull, push
938 938 (outbound) or bundle commands, but not effective, since you can
939 939 just copy files instead then. Source of operation is in
940 940 ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
941 941 SSH or HTTP repository. If "push", "pull" or "bundle", operation
942 942 is happening on behalf of repository on same system.
943 943
944 944 ``prepushkey``
945 945 Run before a pushkey (like a bookmark) is added to the
946 946 repository. Non-zero status will cause the key to be rejected. The
947 947 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
948 948 the old value (if any) is in ``$HG_OLD``, and the new value is in
949 949 ``$HG_NEW``.
950 950
951 951 ``pretag``
952 952 Run before creating a tag. Exit status 0 allows the tag to be
953 953 created. Non-zero status will cause the tag to fail. ID of
954 954 changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
955 955 local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
956 956
957 957 ``pretxnopen``
958 958 Run before any new repository transaction is open. The reason for the
959 959 transaction will be in ``$HG_TXNNAME`` and a unique identifier for the
960 960 transaction will be in ``HG_TXNID``. A non-zero status will prevent the
961 961 transaction from being opened.
962 962
963 963 ``pretxnclose``
964 964 Run right before the transaction is actually finalized. Any repository change
965 965 will be visible to the hook program. This lets you validate the transaction
966 966 content or change it. Exit status 0 allows the commit to proceed. Non-zero
967 967 status will cause the transaction to be rolled back. The reason for the
968 968 transaction opening will be in ``$HG_TXNNAME`` and a unique identifier for
969 969 the transaction will be in ``HG_TXNID``. The rest of the available data will
970 970 vary according the transaction type. New changesets will add ``$HG_NODE`` (id
971 971 of the first added changeset), ``$HG_NODE_LAST`` (id of the last added
972 972 changeset), ``$HG_URL`` and ``$HG_SOURCE`` variables, bookmarks and phases
973 973 changes will set ``HG_BOOKMARK_MOVED`` and ``HG_PHASES_MOVED`` to ``1``, etc.
974 974
975 975 ``txnclose``
976 976 Run after any repository transaction has been committed. At this
977 977 point, the transaction can no longer be rolled back. The hook will run
978 978 after the lock is released. See :hg:`help config.hooks.pretxnclose` docs for
979 979 details about available variables.
980 980
981 981 ``txnabort``
982 982 Run when a transaction is aborted. See :hg:`help config.hooks.pretxnclose`
983 983 docs for details about available variables.
984 984
985 985 ``pretxnchangegroup``
986 986 Run after a changegroup has been added via push, pull or unbundle, but before
987 987 the transaction has been committed. Changegroup is visible to hook program.
988 988 This lets you validate incoming changes before accepting them. Passed the ID
989 989 of the first new changeset in ``$HG_NODE`` and last in ``$HG_NODE_LAST``.
990 990 Exit status 0 allows the transaction to commit. Non-zero status will cause
991 991 the transaction to be rolled back and the push, pull or unbundle will fail.
992 992 URL that was source of changes is in ``$HG_URL``.
993 993
994 994 ``pretxncommit``
995 995 Run after a changeset has been created but the transaction not yet
996 996 committed. Changeset is visible to hook program. This lets you
997 997 validate commit message and changes. Exit status 0 allows the
998 998 commit to proceed. Non-zero status will cause the transaction to
999 999 be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
1000 1000 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
1001 1001
1002 1002 ``preupdate``
1003 1003 Run before updating the working directory. Exit status 0 allows
1004 1004 the update to proceed. Non-zero status will prevent the update.
1005 1005 Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
1006 1006 of second new parent is in ``$HG_PARENT2``.
1007 1007
1008 1008 ``listkeys``
1009 1009 Run after listing pushkeys (like bookmarks) in the repository. The
1010 1010 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
1011 1011 dictionary containing the keys and values.
1012 1012
1013 1013 ``pushkey``
1014 1014 Run after a pushkey (like a bookmark) is added to the
1015 1015 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
1016 1016 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
1017 1017 value is in ``$HG_NEW``.
1018 1018
1019 1019 ``tag``
1020 1020 Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
1021 1021 Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
1022 1022 repository if ``$HG_LOCAL=0``.
1023 1023
1024 1024 ``update``
1025 1025 Run after updating the working directory. Changeset ID of first
1026 1026 new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
1027 1027 in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
1028 1028 update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
1029 1029
1030 1030 .. note::
1031 1031
1032 1032 It is generally better to use standard hooks rather than the
1033 1033 generic pre- and post- command hooks as they are guaranteed to be
1034 1034 called in the appropriate contexts for influencing transactions.
1035 1035 Also, hooks like "commit" will be called in all contexts that
1036 1036 generate a commit (e.g. tag) and not just the commit command.
1037 1037
1038 1038 .. note::
1039 1039
1040 1040 Environment variables with empty values may not be passed to
1041 1041 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
1042 1042 will have an empty value under Unix-like platforms for non-merge
1043 1043 changesets, while it will not be available at all under Windows.
1044 1044
1045 1045 The syntax for Python hooks is as follows::
1046 1046
1047 1047 hookname = python:modulename.submodule.callable
1048 1048 hookname = python:/path/to/python/module.py:callable
1049 1049
1050 1050 Python hooks are run within the Mercurial process. Each hook is
1051 1051 called with at least three keyword arguments: a ui object (keyword
1052 1052 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
1053 1053 keyword that tells what kind of hook is used. Arguments listed as
1054 1054 environment variables above are passed as keyword arguments, with no
1055 1055 ``HG_`` prefix, and names in lower case.
1056 1056
1057 1057 If a Python hook returns a "true" value or raises an exception, this
1058 1058 is treated as a failure.
1059 1059
1060 1060
1061 1061 ``hostfingerprints``
1062 1062 --------------------
1063 1063
1064 1064 (Deprecated. Use ``[hostsecurity]``'s ``fingerprints`` options instead.)
1065 1065
1066 1066 Fingerprints of the certificates of known HTTPS servers.
1067 1067
1068 1068 A HTTPS connection to a server with a fingerprint configured here will
1069 1069 only succeed if the servers certificate matches the fingerprint.
1070 1070 This is very similar to how ssh known hosts works.
1071 1071
1072 1072 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
1073 1073 Multiple values can be specified (separated by spaces or commas). This can
1074 1074 be used to define both old and new fingerprints while a host transitions
1075 1075 to a new certificate.
1076 1076
1077 1077 The CA chain and web.cacerts is not used for servers with a fingerprint.
1078 1078
1079 1079 For example::
1080 1080
1081 1081 [hostfingerprints]
1082 1082 hg.intevation.de = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1083 1083 hg.intevation.org = fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1084 1084
1085 1085 ``hostsecurity``
1086 1086 ----------------
1087 1087
1088 1088 Used to specify global and per-host security settings for connecting to
1089 1089 other machines.
1090 1090
1091 1091 The following options control default behavior for all hosts.
1092 1092
1093 1093 ``ciphers``
1094 1094 Defines the cryptographic ciphers to use for connections.
1095 1095
1096 1096 Value must be a valid OpenSSL Cipher List Format as documented at
1097 1097 https://www.openssl.org/docs/manmaster/apps/ciphers.html#CIPHER-LIST-FORMAT.
1098 1098
1099 1099 This setting is for advanced users only. Setting to incorrect values
1100 1100 can significantly lower connection security or decrease performance.
1101 1101 You have been warned.
1102 1102
1103 1103 This option requires Python 2.7.
1104 1104
1105 1105 ``minimumprotocol``
1106 1106 Defines the minimum channel encryption protocol to use.
1107 1107
1108 1108 By default, the highest version of TLS supported by both client and server
1109 1109 is used.
1110 1110
1111 1111 Allowed values are: ``tls1.0``, ``tls1.1``, ``tls1.2``.
1112 1112
1113 1113 When running on an old Python version, only ``tls1.0`` is allowed since
1114 1114 old versions of Python only support up to TLS 1.0.
1115 1115
1116 1116 When running a Python that supports modern TLS versions, the default is
1117 1117 ``tls1.1``. ``tls1.0`` can still be used to allow TLS 1.0. However, this
1118 1118 weakens security and should only be used as a feature of last resort if
1119 1119 a server does not support TLS 1.1+.
1120 1120
1121 1121 Options in the ``[hostsecurity]`` section can have the form
1122 1122 ``hostname``:``setting``. This allows multiple settings to be defined on a
1123 1123 per-host basis.
1124 1124
1125 1125 The following per-host settings can be defined.
1126 1126
1127 1127 ``ciphers``
1128 1128 This behaves like ``ciphers`` as described above except it only applies
1129 1129 to the host on which it is defined.
1130 1130
1131 1131 ``fingerprints``
1132 1132 A list of hashes of the DER encoded peer/remote certificate. Values have
1133 1133 the form ``algorithm``:``fingerprint``. e.g.
1134 1134 ``sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2``.
1135 1135
1136 1136 The following algorithms/prefixes are supported: ``sha1``, ``sha256``,
1137 1137 ``sha512``.
1138 1138
1139 1139 Use of ``sha256`` or ``sha512`` is preferred.
1140 1140
1141 1141 If a fingerprint is specified, the CA chain is not validated for this
1142 1142 host and Mercurial will require the remote certificate to match one
1143 1143 of the fingerprints specified. This means if the server updates its
1144 1144 certificate, Mercurial will abort until a new fingerprint is defined.
1145 1145 This can provide stronger security than traditional CA-based validation
1146 1146 at the expense of convenience.
1147 1147
1148 1148 This option takes precedence over ``verifycertsfile``.
1149 1149
1150 1150 ``minimumprotocol``
1151 1151 This behaves like ``minimumprotocol`` as described above except it
1152 1152 only applies to the host on which it is defined.
1153 1153
1154 1154 ``verifycertsfile``
1155 1155 Path to file a containing a list of PEM encoded certificates used to
1156 1156 verify the server certificate. Environment variables and ``~user``
1157 1157 constructs are expanded in the filename.
1158 1158
1159 1159 The server certificate or the certificate's certificate authority (CA)
1160 1160 must match a certificate from this file or certificate verification
1161 1161 will fail and connections to the server will be refused.
1162 1162
1163 1163 If defined, only certificates provided by this file will be used:
1164 1164 ``web.cacerts`` and any system/default certificates will not be
1165 1165 used.
1166 1166
1167 1167 This option has no effect if the per-host ``fingerprints`` option
1168 1168 is set.
1169 1169
1170 1170 The format of the file is as follows::
1171 1171
1172 1172 -----BEGIN CERTIFICATE-----
1173 1173 ... (certificate in base64 PEM encoding) ...
1174 1174 -----END CERTIFICATE-----
1175 1175 -----BEGIN CERTIFICATE-----
1176 1176 ... (certificate in base64 PEM encoding) ...
1177 1177 -----END CERTIFICATE-----
1178 1178
1179 1179 For example::
1180 1180
1181 1181 [hostsecurity]
1182 1182 hg.example.com:fingerprints = sha256:c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2
1183 1183 hg2.example.com:fingerprints = sha1:914f1aff87249c09b6859b88b1906d30756491ca, sha1:fc:e2:8d:d9:51:cd:cb:c1:4d:18:6b:b7:44:8d:49:72:57:e6:cd:33
1184 1184 foo.example.com:verifycertsfile = /etc/ssl/trusted-ca-certs.pem
1185 1185
1186 1186 To change the default minimum protocol version to TLS 1.2 but to allow TLS 1.1
1187 1187 when connecting to ``hg.example.com``::
1188 1188
1189 1189 [hostsecurity]
1190 1190 minimumprotocol = tls1.2
1191 1191 hg.example.com:minimumprotocol = tls1.1
1192 1192
1193 1193 ``http_proxy``
1194 1194 --------------
1195 1195
1196 1196 Used to access web-based Mercurial repositories through a HTTP
1197 1197 proxy.
1198 1198
1199 1199 ``host``
1200 1200 Host name and (optional) port of the proxy server, for example
1201 1201 "myproxy:8000".
1202 1202
1203 1203 ``no``
1204 1204 Optional. Comma-separated list of host names that should bypass
1205 1205 the proxy.
1206 1206
1207 1207 ``passwd``
1208 1208 Optional. Password to authenticate with at the proxy server.
1209 1209
1210 1210 ``user``
1211 1211 Optional. User name to authenticate with at the proxy server.
1212 1212
1213 1213 ``always``
1214 1214 Optional. Always use the proxy, even for localhost and any entries
1215 1215 in ``http_proxy.no``. (default: False)
1216 1216
1217 1217 ``merge``
1218 1218 ---------
1219 1219
1220 1220 This section specifies behavior during merges and updates.
1221 1221
1222 1222 ``checkignored``
1223 1223 Controls behavior when an ignored file on disk has the same name as a tracked
1224 1224 file in the changeset being merged or updated to, and has different
1225 1225 contents. Options are ``abort``, ``warn`` and ``ignore``. With ``abort``,
1226 1226 abort on such files. With ``warn``, warn on such files and back them up as
1227 1227 ``.orig``. With ``ignore``, don't print a warning and back them up as
1228 1228 ``.orig``. (default: ``abort``)
1229 1229
1230 1230 ``checkunknown``
1231 1231 Controls behavior when an unknown file that isn't ignored has the same name
1232 1232 as a tracked file in the changeset being merged or updated to, and has
1233 1233 different contents. Similar to ``merge.checkignored``, except for files that
1234 1234 are not ignored. (default: ``abort``)
1235 1235
1236 1236 ``merge-patterns``
1237 1237 ------------------
1238 1238
1239 1239 This section specifies merge tools to associate with particular file
1240 1240 patterns. Tools matched here will take precedence over the default
1241 1241 merge tool. Patterns are globs by default, rooted at the repository
1242 1242 root.
1243 1243
1244 1244 Example::
1245 1245
1246 1246 [merge-patterns]
1247 1247 **.c = kdiff3
1248 1248 **.jpg = myimgmerge
1249 1249
1250 1250 ``merge-tools``
1251 1251 ---------------
1252 1252
1253 1253 This section configures external merge tools to use for file-level
1254 1254 merges. This section has likely been preconfigured at install time.
1255 1255 Use :hg:`config merge-tools` to check the existing configuration.
1256 1256 Also see :hg:`help merge-tools` for more details.
1257 1257
1258 1258 Example ``~/.hgrc``::
1259 1259
1260 1260 [merge-tools]
1261 1261 # Override stock tool location
1262 1262 kdiff3.executable = ~/bin/kdiff3
1263 1263 # Specify command line
1264 1264 kdiff3.args = $base $local $other -o $output
1265 1265 # Give higher priority
1266 1266 kdiff3.priority = 1
1267 1267
1268 1268 # Changing the priority of preconfigured tool
1269 1269 meld.priority = 0
1270 1270
1271 1271 # Disable a preconfigured tool
1272 1272 vimdiff.disabled = yes
1273 1273
1274 1274 # Define new tool
1275 1275 myHtmlTool.args = -m $local $other $base $output
1276 1276 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
1277 1277 myHtmlTool.priority = 1
1278 1278
1279 1279 Supported arguments:
1280 1280
1281 1281 ``priority``
1282 1282 The priority in which to evaluate this tool.
1283 1283 (default: 0)
1284 1284
1285 1285 ``executable``
1286 1286 Either just the name of the executable or its pathname.
1287 1287
1288 1288 .. container:: windows
1289 1289
1290 1290 On Windows, the path can use environment variables with ${ProgramFiles}
1291 1291 syntax.
1292 1292
1293 1293 (default: the tool name)
1294 1294
1295 1295 ``args``
1296 1296 The arguments to pass to the tool executable. You can refer to the
1297 1297 files being merged as well as the output file through these
1298 1298 variables: ``$base``, ``$local``, ``$other``, ``$output``. The meaning
1299 1299 of ``$local`` and ``$other`` can vary depending on which action is being
1300 1300 performed. During and update or merge, ``$local`` represents the original
1301 1301 state of the file, while ``$other`` represents the commit you are updating
1302 1302 to or the commit you are merging with. During a rebase ``$local``
1303 1303 represents the destination of the rebase, and ``$other`` represents the
1304 1304 commit being rebased.
1305 1305 (default: ``$local $base $other``)
1306 1306
1307 1307 ``premerge``
1308 1308 Attempt to run internal non-interactive 3-way merge tool before
1309 1309 launching external tool. Options are ``true``, ``false``, ``keep`` or
1310 1310 ``keep-merge3``. The ``keep`` option will leave markers in the file if the
1311 1311 premerge fails. The ``keep-merge3`` will do the same but include information
1312 1312 about the base of the merge in the marker (see internal :merge3 in
1313 1313 :hg:`help merge-tools`).
1314 1314 (default: True)
1315 1315
1316 1316 ``binary``
1317 1317 This tool can merge binary files. (default: False, unless tool
1318 1318 was selected by file pattern match)
1319 1319
1320 1320 ``symlink``
1321 1321 This tool can merge symlinks. (default: False)
1322 1322
1323 1323 ``check``
1324 1324 A list of merge success-checking options:
1325 1325
1326 1326 ``changed``
1327 1327 Ask whether merge was successful when the merged file shows no changes.
1328 1328 ``conflicts``
1329 1329 Check whether there are conflicts even though the tool reported success.
1330 1330 ``prompt``
1331 1331 Always prompt for merge success, regardless of success reported by tool.
1332 1332
1333 1333 ``fixeol``
1334 1334 Attempt to fix up EOL changes caused by the merge tool.
1335 1335 (default: False)
1336 1336
1337 1337 ``gui``
1338 1338 This tool requires a graphical interface to run. (default: False)
1339 1339
1340 1340 .. container:: windows
1341 1341
1342 1342 ``regkey``
1343 1343 Windows registry key which describes install location of this
1344 1344 tool. Mercurial will search for this key first under
1345 1345 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
1346 1346 (default: None)
1347 1347
1348 1348 ``regkeyalt``
1349 1349 An alternate Windows registry key to try if the first key is not
1350 1350 found. The alternate key uses the same ``regname`` and ``regappend``
1351 1351 semantics of the primary key. The most common use for this key
1352 1352 is to search for 32bit applications on 64bit operating systems.
1353 1353 (default: None)
1354 1354
1355 1355 ``regname``
1356 1356 Name of value to read from specified registry key.
1357 1357 (default: the unnamed (default) value)
1358 1358
1359 1359 ``regappend``
1360 1360 String to append to the value read from the registry, typically
1361 1361 the executable name of the tool.
1362 1362 (default: None)
1363 1363
1364 1364 ``pager``
1365 1365 ---------
1366 1366
1367 1367 Setting used to control when to paginate and with what external tool. See
1368 1368 :hg:`help pager` for details.
1369 1369
1370 ``enable``
1371 Control the pagination of command output (default: True).
1372
1373 1370 ``pager``
1374 1371 Define the external tool used as pager.
1375 1372
1376 1373 If no pager is set, Mercurial uses the environment variable $PAGER.
1377 1374 If neither pager.pager, nor $PAGER is set, a default pager will be
1378 1375 used, typically `less` on Unix and `more` on Windows. Example::
1379 1376
1380 1377 [pager]
1381 1378 pager = less -FRX
1382 1379
1383 1380 ``ignore``
1384 1381 List of commands to disable the pager for. Example::
1385 1382
1386 1383 [pager]
1387 1384 ignore = version, help, update
1388 1385
1389 1386 ``patch``
1390 1387 ---------
1391 1388
1392 1389 Settings used when applying patches, for instance through the 'import'
1393 1390 command or with Mercurial Queues extension.
1394 1391
1395 1392 ``eol``
1396 1393 When set to 'strict' patch content and patched files end of lines
1397 1394 are preserved. When set to ``lf`` or ``crlf``, both files end of
1398 1395 lines are ignored when patching and the result line endings are
1399 1396 normalized to either LF (Unix) or CRLF (Windows). When set to
1400 1397 ``auto``, end of lines are again ignored while patching but line
1401 1398 endings in patched files are normalized to their original setting
1402 1399 on a per-file basis. If target file does not exist or has no end
1403 1400 of line, patch line endings are preserved.
1404 1401 (default: strict)
1405 1402
1406 1403 ``fuzz``
1407 1404 The number of lines of 'fuzz' to allow when applying patches. This
1408 1405 controls how much context the patcher is allowed to ignore when
1409 1406 trying to apply a patch.
1410 1407 (default: 2)
1411 1408
1412 1409 ``paths``
1413 1410 ---------
1414 1411
1415 1412 Assigns symbolic names and behavior to repositories.
1416 1413
1417 1414 Options are symbolic names defining the URL or directory that is the
1418 1415 location of the repository. Example::
1419 1416
1420 1417 [paths]
1421 1418 my_server = https://example.com/my_repo
1422 1419 local_path = /home/me/repo
1423 1420
1424 1421 These symbolic names can be used from the command line. To pull
1425 1422 from ``my_server``: :hg:`pull my_server`. To push to ``local_path``:
1426 1423 :hg:`push local_path`.
1427 1424
1428 1425 Options containing colons (``:``) denote sub-options that can influence
1429 1426 behavior for that specific path. Example::
1430 1427
1431 1428 [paths]
1432 1429 my_server = https://example.com/my_path
1433 1430 my_server:pushurl = ssh://example.com/my_path
1434 1431
1435 1432 The following sub-options can be defined:
1436 1433
1437 1434 ``pushurl``
1438 1435 The URL to use for push operations. If not defined, the location
1439 1436 defined by the path's main entry is used.
1440 1437
1441 1438 ``pushrev``
1442 1439 A revset defining which revisions to push by default.
1443 1440
1444 1441 When :hg:`push` is executed without a ``-r`` argument, the revset
1445 1442 defined by this sub-option is evaluated to determine what to push.
1446 1443
1447 1444 For example, a value of ``.`` will push the working directory's
1448 1445 revision by default.
1449 1446
1450 1447 Revsets specifying bookmarks will not result in the bookmark being
1451 1448 pushed.
1452 1449
1453 1450 The following special named paths exist:
1454 1451
1455 1452 ``default``
1456 1453 The URL or directory to use when no source or remote is specified.
1457 1454
1458 1455 :hg:`clone` will automatically define this path to the location the
1459 1456 repository was cloned from.
1460 1457
1461 1458 ``default-push``
1462 1459 (deprecated) The URL or directory for the default :hg:`push` location.
1463 1460 ``default:pushurl`` should be used instead.
1464 1461
1465 1462 ``phases``
1466 1463 ----------
1467 1464
1468 1465 Specifies default handling of phases. See :hg:`help phases` for more
1469 1466 information about working with phases.
1470 1467
1471 1468 ``publish``
1472 1469 Controls draft phase behavior when working as a server. When true,
1473 1470 pushed changesets are set to public in both client and server and
1474 1471 pulled or cloned changesets are set to public in the client.
1475 1472 (default: True)
1476 1473
1477 1474 ``new-commit``
1478 1475 Phase of newly-created commits.
1479 1476 (default: draft)
1480 1477
1481 1478 ``checksubrepos``
1482 1479 Check the phase of the current revision of each subrepository. Allowed
1483 1480 values are "ignore", "follow" and "abort". For settings other than
1484 1481 "ignore", the phase of the current revision of each subrepository is
1485 1482 checked before committing the parent repository. If any of those phases is
1486 1483 greater than the phase of the parent repository (e.g. if a subrepo is in a
1487 1484 "secret" phase while the parent repo is in "draft" phase), the commit is
1488 1485 either aborted (if checksubrepos is set to "abort") or the higher phase is
1489 1486 used for the parent repository commit (if set to "follow").
1490 1487 (default: follow)
1491 1488
1492 1489
1493 1490 ``profiling``
1494 1491 -------------
1495 1492
1496 1493 Specifies profiling type, format, and file output. Two profilers are
1497 1494 supported: an instrumenting profiler (named ``ls``), and a sampling
1498 1495 profiler (named ``stat``).
1499 1496
1500 1497 In this section description, 'profiling data' stands for the raw data
1501 1498 collected during profiling, while 'profiling report' stands for a
1502 1499 statistical text report generated from the profiling data. The
1503 1500 profiling is done using lsprof.
1504 1501
1505 1502 ``enabled``
1506 1503 Enable the profiler.
1507 1504 (default: false)
1508 1505
1509 1506 This is equivalent to passing ``--profile`` on the command line.
1510 1507
1511 1508 ``type``
1512 1509 The type of profiler to use.
1513 1510 (default: stat)
1514 1511
1515 1512 ``ls``
1516 1513 Use Python's built-in instrumenting profiler. This profiler
1517 1514 works on all platforms, but each line number it reports is the
1518 1515 first line of a function. This restriction makes it difficult to
1519 1516 identify the expensive parts of a non-trivial function.
1520 1517 ``stat``
1521 1518 Use a statistical profiler, statprof. This profiler is most
1522 1519 useful for profiling commands that run for longer than about 0.1
1523 1520 seconds.
1524 1521
1525 1522 ``format``
1526 1523 Profiling format. Specific to the ``ls`` instrumenting profiler.
1527 1524 (default: text)
1528 1525
1529 1526 ``text``
1530 1527 Generate a profiling report. When saving to a file, it should be
1531 1528 noted that only the report is saved, and the profiling data is
1532 1529 not kept.
1533 1530 ``kcachegrind``
1534 1531 Format profiling data for kcachegrind use: when saving to a
1535 1532 file, the generated file can directly be loaded into
1536 1533 kcachegrind.
1537 1534
1538 1535 ``statformat``
1539 1536 Profiling format for the ``stat`` profiler.
1540 1537 (default: hotpath)
1541 1538
1542 1539 ``hotpath``
1543 1540 Show a tree-based display containing the hot path of execution (where
1544 1541 most time was spent).
1545 1542 ``bymethod``
1546 1543 Show a table of methods ordered by how frequently they are active.
1547 1544 ``byline``
1548 1545 Show a table of lines in files ordered by how frequently they are active.
1549 1546 ``json``
1550 1547 Render profiling data as JSON.
1551 1548
1552 1549 ``frequency``
1553 1550 Sampling frequency. Specific to the ``stat`` sampling profiler.
1554 1551 (default: 1000)
1555 1552
1556 1553 ``output``
1557 1554 File path where profiling data or report should be saved. If the
1558 1555 file exists, it is replaced. (default: None, data is printed on
1559 1556 stderr)
1560 1557
1561 1558 ``sort``
1562 1559 Sort field. Specific to the ``ls`` instrumenting profiler.
1563 1560 One of ``callcount``, ``reccallcount``, ``totaltime`` and
1564 1561 ``inlinetime``.
1565 1562 (default: inlinetime)
1566 1563
1567 1564 ``limit``
1568 1565 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1569 1566 (default: 30)
1570 1567
1571 1568 ``nested``
1572 1569 Show at most this number of lines of drill-down info after each main entry.
1573 1570 This can help explain the difference between Total and Inline.
1574 1571 Specific to the ``ls`` instrumenting profiler.
1575 1572 (default: 5)
1576 1573
1577 1574 ``progress``
1578 1575 ------------
1579 1576
1580 1577 Mercurial commands can draw progress bars that are as informative as
1581 1578 possible. Some progress bars only offer indeterminate information, while others
1582 1579 have a definite end point.
1583 1580
1584 1581 ``delay``
1585 1582 Number of seconds (float) before showing the progress bar. (default: 3)
1586 1583
1587 1584 ``changedelay``
1588 1585 Minimum delay before showing a new topic. When set to less than 3 * refresh,
1589 1586 that value will be used instead. (default: 1)
1590 1587
1591 1588 ``refresh``
1592 1589 Time in seconds between refreshes of the progress bar. (default: 0.1)
1593 1590
1594 1591 ``format``
1595 1592 Format of the progress bar.
1596 1593
1597 1594 Valid entries for the format field are ``topic``, ``bar``, ``number``,
1598 1595 ``unit``, ``estimate``, ``speed``, and ``item``. ``item`` defaults to the
1599 1596 last 20 characters of the item, but this can be changed by adding either
1600 1597 ``-<num>`` which would take the last num characters, or ``+<num>`` for the
1601 1598 first num characters.
1602 1599
1603 1600 (default: topic bar number estimate)
1604 1601
1605 1602 ``width``
1606 1603 If set, the maximum width of the progress information (that is, min(width,
1607 1604 term width) will be used).
1608 1605
1609 1606 ``clear-complete``
1610 1607 Clear the progress bar after it's done. (default: True)
1611 1608
1612 1609 ``disable``
1613 1610 If true, don't show a progress bar.
1614 1611
1615 1612 ``assume-tty``
1616 1613 If true, ALWAYS show a progress bar, unless disable is given.
1617 1614
1618 1615 ``rebase``
1619 1616 ----------
1620 1617
1621 1618 ``allowdivergence``
1622 1619 Default to False, when True allow creating divergence when performing
1623 1620 rebase of obsolete changesets.
1624 1621
1625 1622 ``revsetalias``
1626 1623 ---------------
1627 1624
1628 1625 Alias definitions for revsets. See :hg:`help revsets` for details.
1629 1626
1630 1627 ``server``
1631 1628 ----------
1632 1629
1633 1630 Controls generic server settings.
1634 1631
1635 1632 ``compressionengines``
1636 1633 List of compression engines and their relative priority to advertise
1637 1634 to clients.
1638 1635
1639 1636 The order of compression engines determines their priority, the first
1640 1637 having the highest priority. If a compression engine is not listed
1641 1638 here, it won't be advertised to clients.
1642 1639
1643 1640 If not set (the default), built-in defaults are used. Run
1644 1641 :hg:`debuginstall` to list available compression engines and their
1645 1642 default wire protocol priority.
1646 1643
1647 1644 Older Mercurial clients only support zlib compression and this setting
1648 1645 has no effect for legacy clients.
1649 1646
1650 1647 ``uncompressed``
1651 1648 Whether to allow clients to clone a repository using the
1652 1649 uncompressed streaming protocol. This transfers about 40% more
1653 1650 data than a regular clone, but uses less memory and CPU on both
1654 1651 server and client. Over a LAN (100 Mbps or better) or a very fast
1655 1652 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1656 1653 regular clone. Over most WAN connections (anything slower than
1657 1654 about 6 Mbps), uncompressed streaming is slower, because of the
1658 1655 extra data transfer overhead. This mode will also temporarily hold
1659 1656 the write lock while determining what data to transfer.
1660 1657 (default: True)
1661 1658
1662 1659 ``preferuncompressed``
1663 1660 When set, clients will try to use the uncompressed streaming
1664 1661 protocol. (default: False)
1665 1662
1666 1663 ``validate``
1667 1664 Whether to validate the completeness of pushed changesets by
1668 1665 checking that all new file revisions specified in manifests are
1669 1666 present. (default: False)
1670 1667
1671 1668 ``maxhttpheaderlen``
1672 1669 Instruct HTTP clients not to send request headers longer than this
1673 1670 many bytes. (default: 1024)
1674 1671
1675 1672 ``bundle1``
1676 1673 Whether to allow clients to push and pull using the legacy bundle1
1677 1674 exchange format. (default: True)
1678 1675
1679 1676 ``bundle1gd``
1680 1677 Like ``bundle1`` but only used if the repository is using the
1681 1678 *generaldelta* storage format. (default: True)
1682 1679
1683 1680 ``bundle1.push``
1684 1681 Whether to allow clients to push using the legacy bundle1 exchange
1685 1682 format. (default: True)
1686 1683
1687 1684 ``bundle1gd.push``
1688 1685 Like ``bundle1.push`` but only used if the repository is using the
1689 1686 *generaldelta* storage format. (default: True)
1690 1687
1691 1688 ``bundle1.pull``
1692 1689 Whether to allow clients to pull using the legacy bundle1 exchange
1693 1690 format. (default: True)
1694 1691
1695 1692 ``bundle1gd.pull``
1696 1693 Like ``bundle1.pull`` but only used if the repository is using the
1697 1694 *generaldelta* storage format. (default: True)
1698 1695
1699 1696 Large repositories using the *generaldelta* storage format should
1700 1697 consider setting this option because converting *generaldelta*
1701 1698 repositories to the exchange format required by the bundle1 data
1702 1699 format can consume a lot of CPU.
1703 1700
1704 1701 ``zliblevel``
1705 1702 Integer between ``-1`` and ``9`` that controls the zlib compression level
1706 1703 for wire protocol commands that send zlib compressed output (notably the
1707 1704 commands that send repository history data).
1708 1705
1709 1706 The default (``-1``) uses the default zlib compression level, which is
1710 1707 likely equivalent to ``6``. ``0`` means no compression. ``9`` means
1711 1708 maximum compression.
1712 1709
1713 1710 Setting this option allows server operators to make trade-offs between
1714 1711 bandwidth and CPU used. Lowering the compression lowers CPU utilization
1715 1712 but sends more bytes to clients.
1716 1713
1717 1714 This option only impacts the HTTP server.
1718 1715
1719 1716 ``zstdlevel``
1720 1717 Integer between ``1`` and ``22`` that controls the zstd compression level
1721 1718 for wire protocol commands. ``1`` is the minimal amount of compression and
1722 1719 ``22`` is the highest amount of compression.
1723 1720
1724 1721 The default (``3``) should be significantly faster than zlib while likely
1725 1722 delivering better compression ratios.
1726 1723
1727 1724 This option only impacts the HTTP server.
1728 1725
1729 1726 See also ``server.zliblevel``.
1730 1727
1731 1728 ``smtp``
1732 1729 --------
1733 1730
1734 1731 Configuration for extensions that need to send email messages.
1735 1732
1736 1733 ``host``
1737 1734 Host name of mail server, e.g. "mail.example.com".
1738 1735
1739 1736 ``port``
1740 1737 Optional. Port to connect to on mail server. (default: 465 if
1741 1738 ``tls`` is smtps; 25 otherwise)
1742 1739
1743 1740 ``tls``
1744 1741 Optional. Method to enable TLS when connecting to mail server: starttls,
1745 1742 smtps or none. (default: none)
1746 1743
1747 1744 ``username``
1748 1745 Optional. User name for authenticating with the SMTP server.
1749 1746 (default: None)
1750 1747
1751 1748 ``password``
1752 1749 Optional. Password for authenticating with the SMTP server. If not
1753 1750 specified, interactive sessions will prompt the user for a
1754 1751 password; non-interactive sessions will fail. (default: None)
1755 1752
1756 1753 ``local_hostname``
1757 1754 Optional. The hostname that the sender can use to identify
1758 1755 itself to the MTA.
1759 1756
1760 1757
1761 1758 ``subpaths``
1762 1759 ------------
1763 1760
1764 1761 Subrepository source URLs can go stale if a remote server changes name
1765 1762 or becomes temporarily unavailable. This section lets you define
1766 1763 rewrite rules of the form::
1767 1764
1768 1765 <pattern> = <replacement>
1769 1766
1770 1767 where ``pattern`` is a regular expression matching a subrepository
1771 1768 source URL and ``replacement`` is the replacement string used to
1772 1769 rewrite it. Groups can be matched in ``pattern`` and referenced in
1773 1770 ``replacements``. For instance::
1774 1771
1775 1772 http://server/(.*)-hg/ = http://hg.server/\1/
1776 1773
1777 1774 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1778 1775
1779 1776 Relative subrepository paths are first made absolute, and the
1780 1777 rewrite rules are then applied on the full (absolute) path. If ``pattern``
1781 1778 doesn't match the full path, an attempt is made to apply it on the
1782 1779 relative path alone. The rules are applied in definition order.
1783 1780
1784 1781 ``templatealias``
1785 1782 -----------------
1786 1783
1787 1784 Alias definitions for templates. See :hg:`help templates` for details.
1788 1785
1789 1786 ``templates``
1790 1787 -------------
1791 1788
1792 1789 Use the ``[templates]`` section to define template strings.
1793 1790 See :hg:`help templates` for details.
1794 1791
1795 1792 ``trusted``
1796 1793 -----------
1797 1794
1798 1795 Mercurial will not use the settings in the
1799 1796 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1800 1797 user or to a trusted group, as various hgrc features allow arbitrary
1801 1798 commands to be run. This issue is often encountered when configuring
1802 1799 hooks or extensions for shared repositories or servers. However,
1803 1800 the web interface will use some safe settings from the ``[web]``
1804 1801 section.
1805 1802
1806 1803 This section specifies what users and groups are trusted. The
1807 1804 current user is always trusted. To trust everybody, list a user or a
1808 1805 group with name ``*``. These settings must be placed in an
1809 1806 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1810 1807 user or service running Mercurial.
1811 1808
1812 1809 ``users``
1813 1810 Comma-separated list of trusted users.
1814 1811
1815 1812 ``groups``
1816 1813 Comma-separated list of trusted groups.
1817 1814
1818 1815
1819 1816 ``ui``
1820 1817 ------
1821 1818
1822 1819 User interface controls.
1823 1820
1824 1821 ``archivemeta``
1825 1822 Whether to include the .hg_archival.txt file containing meta data
1826 1823 (hashes for the repository base and for tip) in archives created
1827 1824 by the :hg:`archive` command or downloaded via hgweb.
1828 1825 (default: True)
1829 1826
1830 1827 ``askusername``
1831 1828 Whether to prompt for a username when committing. If True, and
1832 1829 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
1833 1830 be prompted to enter a username. If no username is entered, the
1834 1831 default ``USER@HOST`` is used instead.
1835 1832 (default: False)
1836 1833
1837 1834 ``clonebundles``
1838 1835 Whether the "clone bundles" feature is enabled.
1839 1836
1840 1837 When enabled, :hg:`clone` may download and apply a server-advertised
1841 1838 bundle file from a URL instead of using the normal exchange mechanism.
1842 1839
1843 1840 This can likely result in faster and more reliable clones.
1844 1841
1845 1842 (default: True)
1846 1843
1847 1844 ``clonebundlefallback``
1848 1845 Whether failure to apply an advertised "clone bundle" from a server
1849 1846 should result in fallback to a regular clone.
1850 1847
1851 1848 This is disabled by default because servers advertising "clone
1852 1849 bundles" often do so to reduce server load. If advertised bundles
1853 1850 start mass failing and clients automatically fall back to a regular
1854 1851 clone, this would add significant and unexpected load to the server
1855 1852 since the server is expecting clone operations to be offloaded to
1856 1853 pre-generated bundles. Failing fast (the default behavior) ensures
1857 1854 clients don't overwhelm the server when "clone bundle" application
1858 1855 fails.
1859 1856
1860 1857 (default: False)
1861 1858
1862 1859 ``clonebundleprefers``
1863 1860 Defines preferences for which "clone bundles" to use.
1864 1861
1865 1862 Servers advertising "clone bundles" may advertise multiple available
1866 1863 bundles. Each bundle may have different attributes, such as the bundle
1867 1864 type and compression format. This option is used to prefer a particular
1868 1865 bundle over another.
1869 1866
1870 1867 The following keys are defined by Mercurial:
1871 1868
1872 1869 BUNDLESPEC
1873 1870 A bundle type specifier. These are strings passed to :hg:`bundle -t`.
1874 1871 e.g. ``gzip-v2`` or ``bzip2-v1``.
1875 1872
1876 1873 COMPRESSION
1877 1874 The compression format of the bundle. e.g. ``gzip`` and ``bzip2``.
1878 1875
1879 1876 Server operators may define custom keys.
1880 1877
1881 1878 Example values: ``COMPRESSION=bzip2``,
1882 1879 ``BUNDLESPEC=gzip-v2, COMPRESSION=gzip``.
1883 1880
1884 1881 By default, the first bundle advertised by the server is used.
1885 1882
1886 1883 ``color``
1887 1884 When to colorize output. Possible value are Boolean ("yes" or "no"), or
1888 1885 "debug", or "always". (default: "yes"). "yes" will use color whenever it
1889 1886 seems possible. See :hg:`help color` for details.
1890 1887
1891 1888 ``commitsubrepos``
1892 1889 Whether to commit modified subrepositories when committing the
1893 1890 parent repository. If False and one subrepository has uncommitted
1894 1891 changes, abort the commit.
1895 1892 (default: False)
1896 1893
1897 1894 ``debug``
1898 1895 Print debugging information. (default: False)
1899 1896
1900 1897 ``editor``
1901 1898 The editor to use during a commit. (default: ``$EDITOR`` or ``vi``)
1902 1899
1903 1900 ``fallbackencoding``
1904 1901 Encoding to try if it's not possible to decode the changelog using
1905 1902 UTF-8. (default: ISO-8859-1)
1906 1903
1907 1904 ``graphnodetemplate``
1908 1905 The template used to print changeset nodes in an ASCII revision graph.
1909 1906 (default: ``{graphnode}``)
1910 1907
1911 1908 ``ignore``
1912 1909 A file to read per-user ignore patterns from. This file should be
1913 1910 in the same format as a repository-wide .hgignore file. Filenames
1914 1911 are relative to the repository root. This option supports hook syntax,
1915 1912 so if you want to specify multiple ignore files, you can do so by
1916 1913 setting something like ``ignore.other = ~/.hgignore2``. For details
1917 1914 of the ignore file format, see the ``hgignore(5)`` man page.
1918 1915
1919 1916 ``interactive``
1920 1917 Allow to prompt the user. (default: True)
1921 1918
1922 1919 ``interface``
1923 1920 Select the default interface for interactive features (default: text).
1924 1921 Possible values are 'text' and 'curses'.
1925 1922
1926 1923 ``interface.chunkselector``
1927 1924 Select the interface for change recording (e.g. :hg:`commit -i`).
1928 1925 Possible values are 'text' and 'curses'.
1929 1926 This config overrides the interface specified by ui.interface.
1930 1927
1931 1928 ``logtemplate``
1932 1929 Template string for commands that print changesets.
1933 1930
1934 1931 ``merge``
1935 1932 The conflict resolution program to use during a manual merge.
1936 1933 For more information on merge tools see :hg:`help merge-tools`.
1937 1934 For configuring merge tools see the ``[merge-tools]`` section.
1938 1935
1939 1936 ``mergemarkers``
1940 1937 Sets the merge conflict marker label styling. The ``detailed``
1941 1938 style uses the ``mergemarkertemplate`` setting to style the labels.
1942 1939 The ``basic`` style just uses 'local' and 'other' as the marker label.
1943 1940 One of ``basic`` or ``detailed``.
1944 1941 (default: ``basic``)
1945 1942
1946 1943 ``mergemarkertemplate``
1947 1944 The template used to print the commit description next to each conflict
1948 1945 marker during merge conflicts. See :hg:`help templates` for the template
1949 1946 format.
1950 1947
1951 1948 Defaults to showing the hash, tags, branches, bookmarks, author, and
1952 1949 the first line of the commit description.
1953 1950
1954 1951 If you use non-ASCII characters in names for tags, branches, bookmarks,
1955 1952 authors, and/or commit descriptions, you must pay attention to encodings of
1956 1953 managed files. At template expansion, non-ASCII characters use the encoding
1957 1954 specified by the ``--encoding`` global option, ``HGENCODING`` or other
1958 1955 environment variables that govern your locale. If the encoding of the merge
1959 1956 markers is different from the encoding of the merged files,
1960 1957 serious problems may occur.
1961 1958
1962 1959 ``origbackuppath``
1963 1960 The path to a directory used to store generated .orig files. If the path is
1964 1961 not a directory, one will be created.
1965 1962
1963 ``paginate``
1964 Control the pagination of command output (default: True). See :hg:`help pager`
1965 for details.
1966
1966 1967 ``patch``
1967 1968 An optional external tool that ``hg import`` and some extensions
1968 1969 will use for applying patches. By default Mercurial uses an
1969 1970 internal patch utility. The external tool must work as the common
1970 1971 Unix ``patch`` program. In particular, it must accept a ``-p``
1971 1972 argument to strip patch headers, a ``-d`` argument to specify the
1972 1973 current directory, a file name to patch, and a patch file to take
1973 1974 from stdin.
1974 1975
1975 1976 It is possible to specify a patch tool together with extra
1976 1977 arguments. For example, setting this option to ``patch --merge``
1977 1978 will use the ``patch`` program with its 2-way merge option.
1978 1979
1979 1980 ``portablefilenames``
1980 1981 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
1981 1982 (default: ``warn``)
1982 1983
1983 1984 ``warn``
1984 1985 Print a warning message on POSIX platforms, if a file with a non-portable
1985 1986 filename is added (e.g. a file with a name that can't be created on
1986 1987 Windows because it contains reserved parts like ``AUX``, reserved
1987 1988 characters like ``:``, or would cause a case collision with an existing
1988 1989 file).
1989 1990
1990 1991 ``ignore``
1991 1992 Don't print a warning.
1992 1993
1993 1994 ``abort``
1994 1995 The command is aborted.
1995 1996
1996 1997 ``true``
1997 1998 Alias for ``warn``.
1998 1999
1999 2000 ``false``
2000 2001 Alias for ``ignore``.
2001 2002
2002 2003 .. container:: windows
2003 2004
2004 2005 On Windows, this configuration option is ignored and the command aborted.
2005 2006
2006 2007 ``quiet``
2007 2008 Reduce the amount of output printed.
2008 2009 (default: False)
2009 2010
2010 2011 ``remotecmd``
2011 2012 Remote command to use for clone/push/pull operations.
2012 2013 (default: ``hg``)
2013 2014
2014 2015 ``report_untrusted``
2015 2016 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
2016 2017 trusted user or group.
2017 2018 (default: True)
2018 2019
2019 2020 ``slash``
2020 2021 Display paths using a slash (``/``) as the path separator. This
2021 2022 only makes a difference on systems where the default path
2022 2023 separator is not the slash character (e.g. Windows uses the
2023 2024 backslash character (``\``)).
2024 2025 (default: False)
2025 2026
2026 2027 ``statuscopies``
2027 2028 Display copies in the status command.
2028 2029
2029 2030 ``ssh``
2030 2031 Command to use for SSH connections. (default: ``ssh``)
2031 2032
2032 2033 ``strict``
2033 2034 Require exact command names, instead of allowing unambiguous
2034 2035 abbreviations. (default: False)
2035 2036
2036 2037 ``style``
2037 2038 Name of style to use for command output.
2038 2039
2039 2040 ``supportcontact``
2040 2041 A URL where users should report a Mercurial traceback. Use this if you are a
2041 2042 large organisation with its own Mercurial deployment process and crash
2042 2043 reports should be addressed to your internal support.
2043 2044
2044 2045 ``textwidth``
2045 2046 Maximum width of help text. A longer line generated by ``hg help`` or
2046 2047 ``hg subcommand --help`` will be broken after white space to get this
2047 2048 width or the terminal width, whichever comes first.
2048 2049 A non-positive value will disable this and the terminal width will be
2049 2050 used. (default: 78)
2050 2051
2051 2052 ``timeout``
2052 2053 The timeout used when a lock is held (in seconds), a negative value
2053 2054 means no timeout. (default: 600)
2054 2055
2055 2056 ``traceback``
2056 2057 Mercurial always prints a traceback when an unknown exception
2057 2058 occurs. Setting this to True will make Mercurial print a traceback
2058 2059 on all exceptions, even those recognized by Mercurial (such as
2059 2060 IOError or MemoryError). (default: False)
2060 2061
2061 2062 ``username``
2062 2063 The committer of a changeset created when running "commit".
2063 2064 Typically a person's name and email address, e.g. ``Fred Widget
2064 2065 <fred@example.com>``. Environment variables in the
2065 2066 username are expanded.
2066 2067
2067 2068 (default: ``$EMAIL`` or ``username@hostname``. If the username in
2068 2069 hgrc is empty, e.g. if the system admin set ``username =`` in the
2069 2070 system hgrc, it has to be specified manually or in a different
2070 2071 hgrc file)
2071 2072
2072 2073 ``verbose``
2073 2074 Increase the amount of output printed. (default: False)
2074 2075
2075 2076
2076 2077 ``web``
2077 2078 -------
2078 2079
2079 2080 Web interface configuration. The settings in this section apply to
2080 2081 both the builtin webserver (started by :hg:`serve`) and the script you
2081 2082 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
2082 2083 and WSGI).
2083 2084
2084 2085 The Mercurial webserver does no authentication (it does not prompt for
2085 2086 usernames and passwords to validate *who* users are), but it does do
2086 2087 authorization (it grants or denies access for *authenticated users*
2087 2088 based on settings in this section). You must either configure your
2088 2089 webserver to do authentication for you, or disable the authorization
2089 2090 checks.
2090 2091
2091 2092 For a quick setup in a trusted environment, e.g., a private LAN, where
2092 2093 you want it to accept pushes from anybody, you can use the following
2093 2094 command line::
2094 2095
2095 2096 $ hg --config web.allow_push=* --config web.push_ssl=False serve
2096 2097
2097 2098 Note that this will allow anybody to push anything to the server and
2098 2099 that this should not be used for public servers.
2099 2100
2100 2101 The full set of options is:
2101 2102
2102 2103 ``accesslog``
2103 2104 Where to output the access log. (default: stdout)
2104 2105
2105 2106 ``address``
2106 2107 Interface address to bind to. (default: all)
2107 2108
2108 2109 ``allow_archive``
2109 2110 List of archive format (bz2, gz, zip) allowed for downloading.
2110 2111 (default: empty)
2111 2112
2112 2113 ``allowbz2``
2113 2114 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
2114 2115 revisions.
2115 2116 (default: False)
2116 2117
2117 2118 ``allowgz``
2118 2119 (DEPRECATED) Whether to allow .tar.gz downloading of repository
2119 2120 revisions.
2120 2121 (default: False)
2121 2122
2122 2123 ``allowpull``
2123 2124 Whether to allow pulling from the repository. (default: True)
2124 2125
2125 2126 ``allow_push``
2126 2127 Whether to allow pushing to the repository. If empty or not set,
2127 2128 pushing is not allowed. If the special value ``*``, any remote
2128 2129 user can push, including unauthenticated users. Otherwise, the
2129 2130 remote user must have been authenticated, and the authenticated
2130 2131 user name must be present in this list. The contents of the
2131 2132 allow_push list are examined after the deny_push list.
2132 2133
2133 2134 ``allow_read``
2134 2135 If the user has not already been denied repository access due to
2135 2136 the contents of deny_read, this list determines whether to grant
2136 2137 repository access to the user. If this list is not empty, and the
2137 2138 user is unauthenticated or not present in the list, then access is
2138 2139 denied for the user. If the list is empty or not set, then access
2139 2140 is permitted to all users by default. Setting allow_read to the
2140 2141 special value ``*`` is equivalent to it not being set (i.e. access
2141 2142 is permitted to all users). The contents of the allow_read list are
2142 2143 examined after the deny_read list.
2143 2144
2144 2145 ``allowzip``
2145 2146 (DEPRECATED) Whether to allow .zip downloading of repository
2146 2147 revisions. This feature creates temporary files.
2147 2148 (default: False)
2148 2149
2149 2150 ``archivesubrepos``
2150 2151 Whether to recurse into subrepositories when archiving.
2151 2152 (default: False)
2152 2153
2153 2154 ``baseurl``
2154 2155 Base URL to use when publishing URLs in other locations, so
2155 2156 third-party tools like email notification hooks can construct
2156 2157 URLs. Example: ``http://hgserver/repos/``.
2157 2158
2158 2159 ``cacerts``
2159 2160 Path to file containing a list of PEM encoded certificate
2160 2161 authority certificates. Environment variables and ``~user``
2161 2162 constructs are expanded in the filename. If specified on the
2162 2163 client, then it will verify the identity of remote HTTPS servers
2163 2164 with these certificates.
2164 2165
2165 2166 To disable SSL verification temporarily, specify ``--insecure`` from
2166 2167 command line.
2167 2168
2168 2169 You can use OpenSSL's CA certificate file if your platform has
2169 2170 one. On most Linux systems this will be
2170 2171 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
2171 2172 generate this file manually. The form must be as follows::
2172 2173
2173 2174 -----BEGIN CERTIFICATE-----
2174 2175 ... (certificate in base64 PEM encoding) ...
2175 2176 -----END CERTIFICATE-----
2176 2177 -----BEGIN CERTIFICATE-----
2177 2178 ... (certificate in base64 PEM encoding) ...
2178 2179 -----END CERTIFICATE-----
2179 2180
2180 2181 ``cache``
2181 2182 Whether to support caching in hgweb. (default: True)
2182 2183
2183 2184 ``certificate``
2184 2185 Certificate to use when running :hg:`serve`.
2185 2186
2186 2187 ``collapse``
2187 2188 With ``descend`` enabled, repositories in subdirectories are shown at
2188 2189 a single level alongside repositories in the current path. With
2189 2190 ``collapse`` also enabled, repositories residing at a deeper level than
2190 2191 the current path are grouped behind navigable directory entries that
2191 2192 lead to the locations of these repositories. In effect, this setting
2192 2193 collapses each collection of repositories found within a subdirectory
2193 2194 into a single entry for that subdirectory. (default: False)
2194 2195
2195 2196 ``comparisoncontext``
2196 2197 Number of lines of context to show in side-by-side file comparison. If
2197 2198 negative or the value ``full``, whole files are shown. (default: 5)
2198 2199
2199 2200 This setting can be overridden by a ``context`` request parameter to the
2200 2201 ``comparison`` command, taking the same values.
2201 2202
2202 2203 ``contact``
2203 2204 Name or email address of the person in charge of the repository.
2204 2205 (default: ui.username or ``$EMAIL`` or "unknown" if unset or empty)
2205 2206
2206 2207 ``csp``
2207 2208 Send a ``Content-Security-Policy`` HTTP header with this value.
2208 2209
2209 2210 The value may contain a special string ``%nonce%``, which will be replaced
2210 2211 by a randomly-generated one-time use value. If the value contains
2211 2212 ``%nonce%``, ``web.cache`` will be disabled, as caching undermines the
2212 2213 one-time property of the nonce. This nonce will also be inserted into
2213 2214 ``<script>`` elements containing inline JavaScript.
2214 2215
2215 2216 Note: lots of HTML content sent by the server is derived from repository
2216 2217 data. Please consider the potential for malicious repository data to
2217 2218 "inject" itself into generated HTML content as part of your security
2218 2219 threat model.
2219 2220
2220 2221 ``deny_push``
2221 2222 Whether to deny pushing to the repository. If empty or not set,
2222 2223 push is not denied. If the special value ``*``, all remote users are
2223 2224 denied push. Otherwise, unauthenticated users are all denied, and
2224 2225 any authenticated user name present in this list is also denied. The
2225 2226 contents of the deny_push list are examined before the allow_push list.
2226 2227
2227 2228 ``deny_read``
2228 2229 Whether to deny reading/viewing of the repository. If this list is
2229 2230 not empty, unauthenticated users are all denied, and any
2230 2231 authenticated user name present in this list is also denied access to
2231 2232 the repository. If set to the special value ``*``, all remote users
2232 2233 are denied access (rarely needed ;). If deny_read is empty or not set,
2233 2234 the determination of repository access depends on the presence and
2234 2235 content of the allow_read list (see description). If both
2235 2236 deny_read and allow_read are empty or not set, then access is
2236 2237 permitted to all users by default. If the repository is being
2237 2238 served via hgwebdir, denied users will not be able to see it in
2238 2239 the list of repositories. The contents of the deny_read list have
2239 2240 priority over (are examined before) the contents of the allow_read
2240 2241 list.
2241 2242
2242 2243 ``descend``
2243 2244 hgwebdir indexes will not descend into subdirectories. Only repositories
2244 2245 directly in the current path will be shown (other repositories are still
2245 2246 available from the index corresponding to their containing path).
2246 2247
2247 2248 ``description``
2248 2249 Textual description of the repository's purpose or contents.
2249 2250 (default: "unknown")
2250 2251
2251 2252 ``encoding``
2252 2253 Character encoding name. (default: the current locale charset)
2253 2254 Example: "UTF-8".
2254 2255
2255 2256 ``errorlog``
2256 2257 Where to output the error log. (default: stderr)
2257 2258
2258 2259 ``guessmime``
2259 2260 Control MIME types for raw download of file content.
2260 2261 Set to True to let hgweb guess the content type from the file
2261 2262 extension. This will serve HTML files as ``text/html`` and might
2262 2263 allow cross-site scripting attacks when serving untrusted
2263 2264 repositories. (default: False)
2264 2265
2265 2266 ``hidden``
2266 2267 Whether to hide the repository in the hgwebdir index.
2267 2268 (default: False)
2268 2269
2269 2270 ``ipv6``
2270 2271 Whether to use IPv6. (default: False)
2271 2272
2272 2273 ``labels``
2273 2274 List of string *labels* associated with the repository.
2274 2275
2275 2276 Labels are exposed as a template keyword and can be used to customize
2276 2277 output. e.g. the ``index`` template can group or filter repositories
2277 2278 by labels and the ``summary`` template can display additional content
2278 2279 if a specific label is present.
2279 2280
2280 2281 ``logoimg``
2281 2282 File name of the logo image that some templates display on each page.
2282 2283 The file name is relative to ``staticurl``. That is, the full path to
2283 2284 the logo image is "staticurl/logoimg".
2284 2285 If unset, ``hglogo.png`` will be used.
2285 2286
2286 2287 ``logourl``
2287 2288 Base URL to use for logos. If unset, ``https://mercurial-scm.org/``
2288 2289 will be used.
2289 2290
2290 2291 ``maxchanges``
2291 2292 Maximum number of changes to list on the changelog. (default: 10)
2292 2293
2293 2294 ``maxfiles``
2294 2295 Maximum number of files to list per changeset. (default: 10)
2295 2296
2296 2297 ``maxshortchanges``
2297 2298 Maximum number of changes to list on the shortlog, graph or filelog
2298 2299 pages. (default: 60)
2299 2300
2300 2301 ``name``
2301 2302 Repository name to use in the web interface.
2302 2303 (default: current working directory)
2303 2304
2304 2305 ``port``
2305 2306 Port to listen on. (default: 8000)
2306 2307
2307 2308 ``prefix``
2308 2309 Prefix path to serve from. (default: '' (server root))
2309 2310
2310 2311 ``push_ssl``
2311 2312 Whether to require that inbound pushes be transported over SSL to
2312 2313 prevent password sniffing. (default: True)
2313 2314
2314 2315 ``refreshinterval``
2315 2316 How frequently directory listings re-scan the filesystem for new
2316 2317 repositories, in seconds. This is relevant when wildcards are used
2317 2318 to define paths. Depending on how much filesystem traversal is
2318 2319 required, refreshing may negatively impact performance.
2319 2320
2320 2321 Values less than or equal to 0 always refresh.
2321 2322 (default: 20)
2322 2323
2323 2324 ``staticurl``
2324 2325 Base URL to use for static files. If unset, static files (e.g. the
2325 2326 hgicon.png favicon) will be served by the CGI script itself. Use
2326 2327 this setting to serve them directly with the HTTP server.
2327 2328 Example: ``http://hgserver/static/``.
2328 2329
2329 2330 ``stripes``
2330 2331 How many lines a "zebra stripe" should span in multi-line output.
2331 2332 Set to 0 to disable. (default: 1)
2332 2333
2333 2334 ``style``
2334 2335 Which template map style to use. The available options are the names of
2335 2336 subdirectories in the HTML templates path. (default: ``paper``)
2336 2337 Example: ``monoblue``.
2337 2338
2338 2339 ``templates``
2339 2340 Where to find the HTML templates. The default path to the HTML templates
2340 2341 can be obtained from ``hg debuginstall``.
2341 2342
2342 2343 ``websub``
2343 2344 ----------
2344 2345
2345 2346 Web substitution filter definition. You can use this section to
2346 2347 define a set of regular expression substitution patterns which
2347 2348 let you automatically modify the hgweb server output.
2348 2349
2349 2350 The default hgweb templates only apply these substitution patterns
2350 2351 on the revision description fields. You can apply them anywhere
2351 2352 you want when you create your own templates by adding calls to the
2352 2353 "websub" filter (usually after calling the "escape" filter).
2353 2354
2354 2355 This can be used, for example, to convert issue references to links
2355 2356 to your issue tracker, or to convert "markdown-like" syntax into
2356 2357 HTML (see the examples below).
2357 2358
2358 2359 Each entry in this section names a substitution filter.
2359 2360 The value of each entry defines the substitution expression itself.
2360 2361 The websub expressions follow the old interhg extension syntax,
2361 2362 which in turn imitates the Unix sed replacement syntax::
2362 2363
2363 2364 patternname = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
2364 2365
2365 2366 You can use any separator other than "/". The final "i" is optional
2366 2367 and indicates that the search must be case insensitive.
2367 2368
2368 2369 Examples::
2369 2370
2370 2371 [websub]
2371 2372 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
2372 2373 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
2373 2374 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
2374 2375
2375 2376 ``worker``
2376 2377 ----------
2377 2378
2378 2379 Parallel master/worker configuration. We currently perform working
2379 2380 directory updates in parallel on Unix-like systems, which greatly
2380 2381 helps performance.
2381 2382
2382 2383 ``numcpus``
2383 2384 Number of CPUs to use for parallel operations. A zero or
2384 2385 negative value is treated as ``use the default``.
2385 2386 (default: 4 or the number of CPUs on the system, whichever is larger)
2386 2387
2387 2388 ``backgroundclose``
2388 2389 Whether to enable closing file handles on background threads during certain
2389 2390 operations. Some platforms aren't very efficient at closing file
2390 2391 handles that have been written or appended to. By performing file closing
2391 2392 on background threads, file write rate can increase substantially.
2392 2393 (default: true on Windows, false elsewhere)
2393 2394
2394 2395 ``backgroundcloseminfilecount``
2395 2396 Minimum number of files required to trigger background file closing.
2396 2397 Operations not writing this many files won't start background close
2397 2398 threads.
2398 2399 (default: 2048)
2399 2400
2400 2401 ``backgroundclosemaxqueue``
2401 2402 The maximum number of opened file handles waiting to be closed in the
2402 2403 background. This option only has an effect if ``backgroundclose`` is
2403 2404 enabled.
2404 2405 (default: 384)
2405 2406
2406 2407 ``backgroundclosethreadcount``
2407 2408 Number of threads to process background file closes. Only relevant if
2408 2409 ``backgroundclose`` is enabled.
2409 2410 (default: 4)
@@ -1,35 +1,35 b''
1 1 Some Mercurial commands produce a lot of output, and Mercurial will
2 2 attempt to use a pager to make those commands more pleasant.
3 3
4 4 To set the pager that should be used, set the application variable::
5 5
6 6 [pager]
7 7 pager = less -FRX
8 8
9 9 If no pager is set, Mercurial uses the environment variable
10 10 $PAGER. If neither pager.pager, nor $PAGER is set, a default pager
11 11 will be used, typically `less` on Unix and `more` on Windows.
12 12
13 13 You can disable the pager for certain commands by adding them to the
14 14 pager.ignore list::
15 15
16 16 [pager]
17 17 ignore = version, help, update
18 18
19 19 To ignore global commands like :hg:`version` or :hg:`help`, you have
20 20 to specify them in your user configuration file.
21 21
22 22 To control whether the pager is used at all for an individual command,
23 23 you can use --pager=<value>:
24 24
25 25 - use as needed: `auto`.
26 26 - require the pager: `yes` or `on`.
27 27 - suppress the pager: `no` or `off` (any unrecognized value
28 28 will also work).
29 29
30 30 To globally turn off all attempts to use a pager, set::
31 31
32 [pager]
33 enable = false
32 [ui]
33 paginate = never
34 34
35 35 which will prevent the pager from running.
@@ -1,1688 +1,1687 b''
1 1 # ui.py - user interface bits for mercurial
2 2 #
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 import collections
11 11 import contextlib
12 12 import errno
13 13 import getpass
14 14 import inspect
15 15 import os
16 16 import re
17 17 import signal
18 18 import socket
19 19 import subprocess
20 20 import sys
21 21 import tempfile
22 22 import traceback
23 23
24 24 from .i18n import _
25 25 from .node import hex
26 26
27 27 from . import (
28 28 color,
29 29 config,
30 30 encoding,
31 31 error,
32 32 formatter,
33 33 progress,
34 34 pycompat,
35 35 rcutil,
36 36 scmutil,
37 37 util,
38 38 )
39 39
40 40 urlreq = util.urlreq
41 41
42 42 # for use with str.translate(None, _keepalnum), to keep just alphanumerics
43 43 _keepalnum = ''.join(c for c in map(pycompat.bytechr, range(256))
44 44 if not c.isalnum())
45 45
46 46 samplehgrcs = {
47 47 'user':
48 48 """# example user config (see 'hg help config' for more info)
49 49 [ui]
50 50 # name and email, e.g.
51 51 # username = Jane Doe <jdoe@example.com>
52 52 username =
53 53
54 54 # uncomment to disable color in command output
55 55 # (see 'hg help color' for details)
56 56 # color = never
57 57
58 [pager]
59 58 # uncomment to disable command output pagination
60 59 # (see 'hg help pager' for details)
61 # enable = never
60 # paginate = never
62 61
63 62 [extensions]
64 63 # uncomment these lines to enable some popular extensions
65 64 # (see 'hg help extensions' for more info)
66 65 #
67 66 # churn =
68 67 """,
69 68
70 69 'cloned':
71 70 """# example repository config (see 'hg help config' for more info)
72 71 [paths]
73 72 default = %s
74 73
75 74 # path aliases to other clones of this repo in URLs or filesystem paths
76 75 # (see 'hg help config.paths' for more info)
77 76 #
78 77 # default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork
79 78 # my-fork = ssh://jdoe@example.net/hg/jdoes-fork
80 79 # my-clone = /home/jdoe/jdoes-clone
81 80
82 81 [ui]
83 82 # name and email (local to this repository, optional), e.g.
84 83 # username = Jane Doe <jdoe@example.com>
85 84 """,
86 85
87 86 'local':
88 87 """# example repository config (see 'hg help config' for more info)
89 88 [paths]
90 89 # path aliases to other clones of this repo in URLs or filesystem paths
91 90 # (see 'hg help config.paths' for more info)
92 91 #
93 92 # default = http://example.com/hg/example-repo
94 93 # default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork
95 94 # my-fork = ssh://jdoe@example.net/hg/jdoes-fork
96 95 # my-clone = /home/jdoe/jdoes-clone
97 96
98 97 [ui]
99 98 # name and email (local to this repository, optional), e.g.
100 99 # username = Jane Doe <jdoe@example.com>
101 100 """,
102 101
103 102 'global':
104 103 """# example system-wide hg config (see 'hg help config' for more info)
105 104
106 105 [ui]
107 106 # uncomment to disable color in command output
108 107 # (see 'hg help color' for details)
109 108 # color = never
110 109
111 [pager]
112 110 # uncomment to disable command output pagination
113 111 # (see 'hg help pager' for details)
114 # enable = never
112 # paginate = never
115 113
116 114 [extensions]
117 115 # uncomment these lines to enable some popular extensions
118 116 # (see 'hg help extensions' for more info)
119 117 #
120 118 # blackbox =
121 119 # churn =
122 120 """,
123 121 }
124 122
125 123
126 124 class httppasswordmgrdbproxy(object):
127 125 """Delays loading urllib2 until it's needed."""
128 126 def __init__(self):
129 127 self._mgr = None
130 128
131 129 def _get_mgr(self):
132 130 if self._mgr is None:
133 131 self._mgr = urlreq.httppasswordmgrwithdefaultrealm()
134 132 return self._mgr
135 133
136 134 def add_password(self, *args, **kwargs):
137 135 return self._get_mgr().add_password(*args, **kwargs)
138 136
139 137 def find_user_password(self, *args, **kwargs):
140 138 return self._get_mgr().find_user_password(*args, **kwargs)
141 139
142 140 def _catchterm(*args):
143 141 raise error.SignalInterrupt
144 142
145 143 class ui(object):
146 144 def __init__(self, src=None):
147 145 """Create a fresh new ui object if no src given
148 146
149 147 Use uimod.ui.load() to create a ui which knows global and user configs.
150 148 In most cases, you should use ui.copy() to create a copy of an existing
151 149 ui object.
152 150 """
153 151 # _buffers: used for temporary capture of output
154 152 self._buffers = []
155 153 # _exithandlers: callbacks run at the end of a request
156 154 self._exithandlers = []
157 155 # 3-tuple describing how each buffer in the stack behaves.
158 156 # Values are (capture stderr, capture subprocesses, apply labels).
159 157 self._bufferstates = []
160 158 # When a buffer is active, defines whether we are expanding labels.
161 159 # This exists to prevent an extra list lookup.
162 160 self._bufferapplylabels = None
163 161 self.quiet = self.verbose = self.debugflag = self.tracebackflag = False
164 162 self._reportuntrusted = True
165 163 self._ocfg = config.config() # overlay
166 164 self._tcfg = config.config() # trusted
167 165 self._ucfg = config.config() # untrusted
168 166 self._trustusers = set()
169 167 self._trustgroups = set()
170 168 self.callhooks = True
171 169 # Insecure server connections requested.
172 170 self.insecureconnections = False
173 171 # Blocked time
174 172 self.logblockedtimes = False
175 173 # color mode: see mercurial/color.py for possible value
176 174 self._colormode = None
177 175 self._terminfoparams = {}
178 176 self._styles = {}
179 177
180 178 if src:
181 179 self._exithandlers = src._exithandlers
182 180 self.fout = src.fout
183 181 self.ferr = src.ferr
184 182 self.fin = src.fin
185 183 self.pageractive = src.pageractive
186 184 self._disablepager = src._disablepager
187 185
188 186 self._tcfg = src._tcfg.copy()
189 187 self._ucfg = src._ucfg.copy()
190 188 self._ocfg = src._ocfg.copy()
191 189 self._trustusers = src._trustusers.copy()
192 190 self._trustgroups = src._trustgroups.copy()
193 191 self.environ = src.environ
194 192 self.callhooks = src.callhooks
195 193 self.insecureconnections = src.insecureconnections
196 194 self._colormode = src._colormode
197 195 self._terminfoparams = src._terminfoparams.copy()
198 196 self._styles = src._styles.copy()
199 197
200 198 self.fixconfig()
201 199
202 200 self.httppasswordmgrdb = src.httppasswordmgrdb
203 201 self._blockedtimes = src._blockedtimes
204 202 else:
205 203 self.fout = util.stdout
206 204 self.ferr = util.stderr
207 205 self.fin = util.stdin
208 206 self.pageractive = False
209 207 self._disablepager = False
210 208
211 209 # shared read-only environment
212 210 self.environ = encoding.environ
213 211
214 212 self.httppasswordmgrdb = httppasswordmgrdbproxy()
215 213 self._blockedtimes = collections.defaultdict(int)
216 214
217 215 allowed = self.configlist('experimental', 'exportableenviron')
218 216 if '*' in allowed:
219 217 self._exportableenviron = self.environ
220 218 else:
221 219 self._exportableenviron = {}
222 220 for k in allowed:
223 221 if k in self.environ:
224 222 self._exportableenviron[k] = self.environ[k]
225 223
226 224 @classmethod
227 225 def load(cls):
228 226 """Create a ui and load global and user configs"""
229 227 u = cls()
230 228 # we always trust global config files and environment variables
231 229 for t, f in rcutil.rccomponents():
232 230 if t == 'path':
233 231 u.readconfig(f, trust=True)
234 232 elif t == 'items':
235 233 sections = set()
236 234 for section, name, value, source in f:
237 235 # do not set u._ocfg
238 236 # XXX clean this up once immutable config object is a thing
239 237 u._tcfg.set(section, name, value, source)
240 238 u._ucfg.set(section, name, value, source)
241 239 sections.add(section)
242 240 for section in sections:
243 241 u.fixconfig(section=section)
244 242 else:
245 243 raise error.ProgrammingError('unknown rctype: %s' % t)
246 244 return u
247 245
248 246 def copy(self):
249 247 return self.__class__(self)
250 248
251 249 def resetstate(self):
252 250 """Clear internal state that shouldn't persist across commands"""
253 251 if self._progbar:
254 252 self._progbar.resetstate() # reset last-print time of progress bar
255 253 self.httppasswordmgrdb = httppasswordmgrdbproxy()
256 254
257 255 @contextlib.contextmanager
258 256 def timeblockedsection(self, key):
259 257 # this is open-coded below - search for timeblockedsection to find them
260 258 starttime = util.timer()
261 259 try:
262 260 yield
263 261 finally:
264 262 self._blockedtimes[key + '_blocked'] += \
265 263 (util.timer() - starttime) * 1000
266 264
267 265 def formatter(self, topic, opts):
268 266 return formatter.formatter(self, topic, opts)
269 267
270 268 def _trusted(self, fp, f):
271 269 st = util.fstat(fp)
272 270 if util.isowner(st):
273 271 return True
274 272
275 273 tusers, tgroups = self._trustusers, self._trustgroups
276 274 if '*' in tusers or '*' in tgroups:
277 275 return True
278 276
279 277 user = util.username(st.st_uid)
280 278 group = util.groupname(st.st_gid)
281 279 if user in tusers or group in tgroups or user == util.username():
282 280 return True
283 281
284 282 if self._reportuntrusted:
285 283 self.warn(_('not trusting file %s from untrusted '
286 284 'user %s, group %s\n') % (f, user, group))
287 285 return False
288 286
289 287 def readconfig(self, filename, root=None, trust=False,
290 288 sections=None, remap=None):
291 289 try:
292 290 fp = open(filename, u'rb')
293 291 except IOError:
294 292 if not sections: # ignore unless we were looking for something
295 293 return
296 294 raise
297 295
298 296 cfg = config.config()
299 297 trusted = sections or trust or self._trusted(fp, filename)
300 298
301 299 try:
302 300 cfg.read(filename, fp, sections=sections, remap=remap)
303 301 fp.close()
304 302 except error.ConfigError as inst:
305 303 if trusted:
306 304 raise
307 305 self.warn(_("ignored: %s\n") % str(inst))
308 306
309 307 if self.plain():
310 308 for k in ('debug', 'fallbackencoding', 'quiet', 'slash',
311 309 'logtemplate', 'statuscopies', 'style',
312 310 'traceback', 'verbose'):
313 311 if k in cfg['ui']:
314 312 del cfg['ui'][k]
315 313 for k, v in cfg.items('defaults'):
316 314 del cfg['defaults'][k]
317 315 for k, v in cfg.items('commands'):
318 316 del cfg['commands'][k]
319 317 # Don't remove aliases from the configuration if in the exceptionlist
320 318 if self.plain('alias'):
321 319 for k, v in cfg.items('alias'):
322 320 del cfg['alias'][k]
323 321 if self.plain('revsetalias'):
324 322 for k, v in cfg.items('revsetalias'):
325 323 del cfg['revsetalias'][k]
326 324 if self.plain('templatealias'):
327 325 for k, v in cfg.items('templatealias'):
328 326 del cfg['templatealias'][k]
329 327
330 328 if trusted:
331 329 self._tcfg.update(cfg)
332 330 self._tcfg.update(self._ocfg)
333 331 self._ucfg.update(cfg)
334 332 self._ucfg.update(self._ocfg)
335 333
336 334 if root is None:
337 335 root = os.path.expanduser('~')
338 336 self.fixconfig(root=root)
339 337
340 338 def fixconfig(self, root=None, section=None):
341 339 if section in (None, 'paths'):
342 340 # expand vars and ~
343 341 # translate paths relative to root (or home) into absolute paths
344 342 root = root or pycompat.getcwd()
345 343 for c in self._tcfg, self._ucfg, self._ocfg:
346 344 for n, p in c.items('paths'):
347 345 # Ignore sub-options.
348 346 if ':' in n:
349 347 continue
350 348 if not p:
351 349 continue
352 350 if '%%' in p:
353 351 s = self.configsource('paths', n) or 'none'
354 352 self.warn(_("(deprecated '%%' in path %s=%s from %s)\n")
355 353 % (n, p, s))
356 354 p = p.replace('%%', '%')
357 355 p = util.expandpath(p)
358 356 if not util.hasscheme(p) and not os.path.isabs(p):
359 357 p = os.path.normpath(os.path.join(root, p))
360 358 c.set("paths", n, p)
361 359
362 360 if section in (None, 'ui'):
363 361 # update ui options
364 362 self.debugflag = self.configbool('ui', 'debug')
365 363 self.verbose = self.debugflag or self.configbool('ui', 'verbose')
366 364 self.quiet = not self.debugflag and self.configbool('ui', 'quiet')
367 365 if self.verbose and self.quiet:
368 366 self.quiet = self.verbose = False
369 367 self._reportuntrusted = self.debugflag or self.configbool("ui",
370 368 "report_untrusted", True)
371 369 self.tracebackflag = self.configbool('ui', 'traceback', False)
372 370 self.logblockedtimes = self.configbool('ui', 'logblockedtimes')
373 371
374 372 if section in (None, 'trusted'):
375 373 # update trust information
376 374 self._trustusers.update(self.configlist('trusted', 'users'))
377 375 self._trustgroups.update(self.configlist('trusted', 'groups'))
378 376
379 377 def backupconfig(self, section, item):
380 378 return (self._ocfg.backup(section, item),
381 379 self._tcfg.backup(section, item),
382 380 self._ucfg.backup(section, item),)
383 381 def restoreconfig(self, data):
384 382 self._ocfg.restore(data[0])
385 383 self._tcfg.restore(data[1])
386 384 self._ucfg.restore(data[2])
387 385
388 386 def setconfig(self, section, name, value, source=''):
389 387 for cfg in (self._ocfg, self._tcfg, self._ucfg):
390 388 cfg.set(section, name, value, source)
391 389 self.fixconfig(section=section)
392 390
393 391 def _data(self, untrusted):
394 392 return untrusted and self._ucfg or self._tcfg
395 393
396 394 def configsource(self, section, name, untrusted=False):
397 395 return self._data(untrusted).source(section, name)
398 396
399 397 def config(self, section, name, default=None, untrusted=False):
400 398 if isinstance(name, list):
401 399 alternates = name
402 400 else:
403 401 alternates = [name]
404 402
405 403 for n in alternates:
406 404 value = self._data(untrusted).get(section, n, None)
407 405 if value is not None:
408 406 name = n
409 407 break
410 408 else:
411 409 value = default
412 410
413 411 if self.debugflag and not untrusted and self._reportuntrusted:
414 412 for n in alternates:
415 413 uvalue = self._ucfg.get(section, n)
416 414 if uvalue is not None and uvalue != value:
417 415 self.debug("ignoring untrusted configuration option "
418 416 "%s.%s = %s\n" % (section, n, uvalue))
419 417 return value
420 418
421 419 def configsuboptions(self, section, name, default=None, untrusted=False):
422 420 """Get a config option and all sub-options.
423 421
424 422 Some config options have sub-options that are declared with the
425 423 format "key:opt = value". This method is used to return the main
426 424 option and all its declared sub-options.
427 425
428 426 Returns a 2-tuple of ``(option, sub-options)``, where `sub-options``
429 427 is a dict of defined sub-options where keys and values are strings.
430 428 """
431 429 data = self._data(untrusted)
432 430 main = data.get(section, name, default)
433 431 if self.debugflag and not untrusted and self._reportuntrusted:
434 432 uvalue = self._ucfg.get(section, name)
435 433 if uvalue is not None and uvalue != main:
436 434 self.debug('ignoring untrusted configuration option '
437 435 '%s.%s = %s\n' % (section, name, uvalue))
438 436
439 437 sub = {}
440 438 prefix = '%s:' % name
441 439 for k, v in data.items(section):
442 440 if k.startswith(prefix):
443 441 sub[k[len(prefix):]] = v
444 442
445 443 if self.debugflag and not untrusted and self._reportuntrusted:
446 444 for k, v in sub.items():
447 445 uvalue = self._ucfg.get(section, '%s:%s' % (name, k))
448 446 if uvalue is not None and uvalue != v:
449 447 self.debug('ignoring untrusted configuration option '
450 448 '%s:%s.%s = %s\n' % (section, name, k, uvalue))
451 449
452 450 return main, sub
453 451
454 452 def configpath(self, section, name, default=None, untrusted=False):
455 453 'get a path config item, expanded relative to repo root or config file'
456 454 v = self.config(section, name, default, untrusted)
457 455 if v is None:
458 456 return None
459 457 if not os.path.isabs(v) or "://" not in v:
460 458 src = self.configsource(section, name, untrusted)
461 459 if ':' in src:
462 460 base = os.path.dirname(src.rsplit(':')[0])
463 461 v = os.path.join(base, os.path.expanduser(v))
464 462 return v
465 463
466 464 def configbool(self, section, name, default=False, untrusted=False):
467 465 """parse a configuration element as a boolean
468 466
469 467 >>> u = ui(); s = 'foo'
470 468 >>> u.setconfig(s, 'true', 'yes')
471 469 >>> u.configbool(s, 'true')
472 470 True
473 471 >>> u.setconfig(s, 'false', 'no')
474 472 >>> u.configbool(s, 'false')
475 473 False
476 474 >>> u.configbool(s, 'unknown')
477 475 False
478 476 >>> u.configbool(s, 'unknown', True)
479 477 True
480 478 >>> u.setconfig(s, 'invalid', 'somevalue')
481 479 >>> u.configbool(s, 'invalid')
482 480 Traceback (most recent call last):
483 481 ...
484 482 ConfigError: foo.invalid is not a boolean ('somevalue')
485 483 """
486 484
487 485 v = self.config(section, name, None, untrusted)
488 486 if v is None:
489 487 return default
490 488 if isinstance(v, bool):
491 489 return v
492 490 b = util.parsebool(v)
493 491 if b is None:
494 492 raise error.ConfigError(_("%s.%s is not a boolean ('%s')")
495 493 % (section, name, v))
496 494 return b
497 495
498 496 def configwith(self, convert, section, name, default=None,
499 497 desc=None, untrusted=False):
500 498 """parse a configuration element with a conversion function
501 499
502 500 >>> u = ui(); s = 'foo'
503 501 >>> u.setconfig(s, 'float1', '42')
504 502 >>> u.configwith(float, s, 'float1')
505 503 42.0
506 504 >>> u.setconfig(s, 'float2', '-4.25')
507 505 >>> u.configwith(float, s, 'float2')
508 506 -4.25
509 507 >>> u.configwith(float, s, 'unknown', 7)
510 508 7
511 509 >>> u.setconfig(s, 'invalid', 'somevalue')
512 510 >>> u.configwith(float, s, 'invalid')
513 511 Traceback (most recent call last):
514 512 ...
515 513 ConfigError: foo.invalid is not a valid float ('somevalue')
516 514 >>> u.configwith(float, s, 'invalid', desc='womble')
517 515 Traceback (most recent call last):
518 516 ...
519 517 ConfigError: foo.invalid is not a valid womble ('somevalue')
520 518 """
521 519
522 520 v = self.config(section, name, None, untrusted)
523 521 if v is None:
524 522 return default
525 523 try:
526 524 return convert(v)
527 525 except ValueError:
528 526 if desc is None:
529 527 desc = convert.__name__
530 528 raise error.ConfigError(_("%s.%s is not a valid %s ('%s')")
531 529 % (section, name, desc, v))
532 530
533 531 def configint(self, section, name, default=None, untrusted=False):
534 532 """parse a configuration element as an integer
535 533
536 534 >>> u = ui(); s = 'foo'
537 535 >>> u.setconfig(s, 'int1', '42')
538 536 >>> u.configint(s, 'int1')
539 537 42
540 538 >>> u.setconfig(s, 'int2', '-42')
541 539 >>> u.configint(s, 'int2')
542 540 -42
543 541 >>> u.configint(s, 'unknown', 7)
544 542 7
545 543 >>> u.setconfig(s, 'invalid', 'somevalue')
546 544 >>> u.configint(s, 'invalid')
547 545 Traceback (most recent call last):
548 546 ...
549 547 ConfigError: foo.invalid is not a valid integer ('somevalue')
550 548 """
551 549
552 550 return self.configwith(int, section, name, default, 'integer',
553 551 untrusted)
554 552
555 553 def configbytes(self, section, name, default=0, untrusted=False):
556 554 """parse a configuration element as a quantity in bytes
557 555
558 556 Units can be specified as b (bytes), k or kb (kilobytes), m or
559 557 mb (megabytes), g or gb (gigabytes).
560 558
561 559 >>> u = ui(); s = 'foo'
562 560 >>> u.setconfig(s, 'val1', '42')
563 561 >>> u.configbytes(s, 'val1')
564 562 42
565 563 >>> u.setconfig(s, 'val2', '42.5 kb')
566 564 >>> u.configbytes(s, 'val2')
567 565 43520
568 566 >>> u.configbytes(s, 'unknown', '7 MB')
569 567 7340032
570 568 >>> u.setconfig(s, 'invalid', 'somevalue')
571 569 >>> u.configbytes(s, 'invalid')
572 570 Traceback (most recent call last):
573 571 ...
574 572 ConfigError: foo.invalid is not a byte quantity ('somevalue')
575 573 """
576 574
577 575 value = self.config(section, name, None, untrusted)
578 576 if value is None:
579 577 if not isinstance(default, str):
580 578 return default
581 579 value = default
582 580 try:
583 581 return util.sizetoint(value)
584 582 except error.ParseError:
585 583 raise error.ConfigError(_("%s.%s is not a byte quantity ('%s')")
586 584 % (section, name, value))
587 585
588 586 def configlist(self, section, name, default=None, untrusted=False):
589 587 """parse a configuration element as a list of comma/space separated
590 588 strings
591 589
592 590 >>> u = ui(); s = 'foo'
593 591 >>> u.setconfig(s, 'list1', 'this,is "a small" ,test')
594 592 >>> u.configlist(s, 'list1')
595 593 ['this', 'is', 'a small', 'test']
596 594 """
597 595 # default is not always a list
598 596 if isinstance(default, bytes):
599 597 default = config.parselist(default)
600 598 return self.configwith(config.parselist, section, name, default or [],
601 599 'list', untrusted)
602 600
603 601 def hasconfig(self, section, name, untrusted=False):
604 602 return self._data(untrusted).hasitem(section, name)
605 603
606 604 def has_section(self, section, untrusted=False):
607 605 '''tell whether section exists in config.'''
608 606 return section in self._data(untrusted)
609 607
610 608 def configitems(self, section, untrusted=False, ignoresub=False):
611 609 items = self._data(untrusted).items(section)
612 610 if ignoresub:
613 611 newitems = {}
614 612 for k, v in items:
615 613 if ':' not in k:
616 614 newitems[k] = v
617 615 items = newitems.items()
618 616 if self.debugflag and not untrusted and self._reportuntrusted:
619 617 for k, v in self._ucfg.items(section):
620 618 if self._tcfg.get(section, k) != v:
621 619 self.debug("ignoring untrusted configuration option "
622 620 "%s.%s = %s\n" % (section, k, v))
623 621 return items
624 622
625 623 def walkconfig(self, untrusted=False):
626 624 cfg = self._data(untrusted)
627 625 for section in cfg.sections():
628 626 for name, value in self.configitems(section, untrusted):
629 627 yield section, name, value
630 628
631 629 def plain(self, feature=None):
632 630 '''is plain mode active?
633 631
634 632 Plain mode means that all configuration variables which affect
635 633 the behavior and output of Mercurial should be
636 634 ignored. Additionally, the output should be stable,
637 635 reproducible and suitable for use in scripts or applications.
638 636
639 637 The only way to trigger plain mode is by setting either the
640 638 `HGPLAIN' or `HGPLAINEXCEPT' environment variables.
641 639
642 640 The return value can either be
643 641 - False if HGPLAIN is not set, or feature is in HGPLAINEXCEPT
644 642 - True otherwise
645 643 '''
646 644 if ('HGPLAIN' not in encoding.environ and
647 645 'HGPLAINEXCEPT' not in encoding.environ):
648 646 return False
649 647 exceptions = encoding.environ.get('HGPLAINEXCEPT',
650 648 '').strip().split(',')
651 649 if feature and exceptions:
652 650 return feature not in exceptions
653 651 return True
654 652
655 653 def username(self):
656 654 """Return default username to be used in commits.
657 655
658 656 Searched in this order: $HGUSER, [ui] section of hgrcs, $EMAIL
659 657 and stop searching if one of these is set.
660 658 If not found and ui.askusername is True, ask the user, else use
661 659 ($LOGNAME or $USER or $LNAME or $USERNAME) + "@full.hostname".
662 660 """
663 661 user = encoding.environ.get("HGUSER")
664 662 if user is None:
665 663 user = self.config("ui", ["username", "user"])
666 664 if user is not None:
667 665 user = os.path.expandvars(user)
668 666 if user is None:
669 667 user = encoding.environ.get("EMAIL")
670 668 if user is None and self.configbool("ui", "askusername"):
671 669 user = self.prompt(_("enter a commit username:"), default=None)
672 670 if user is None and not self.interactive():
673 671 try:
674 672 user = '%s@%s' % (util.getuser(), socket.getfqdn())
675 673 self.warn(_("no username found, using '%s' instead\n") % user)
676 674 except KeyError:
677 675 pass
678 676 if not user:
679 677 raise error.Abort(_('no username supplied'),
680 678 hint=_("use 'hg config --edit' "
681 679 'to set your username'))
682 680 if "\n" in user:
683 681 raise error.Abort(_("username %s contains a newline\n")
684 682 % repr(user))
685 683 return user
686 684
687 685 def shortuser(self, user):
688 686 """Return a short representation of a user name or email address."""
689 687 if not self.verbose:
690 688 user = util.shortuser(user)
691 689 return user
692 690
693 691 def expandpath(self, loc, default=None):
694 692 """Return repository location relative to cwd or from [paths]"""
695 693 try:
696 694 p = self.paths.getpath(loc)
697 695 if p:
698 696 return p.rawloc
699 697 except error.RepoError:
700 698 pass
701 699
702 700 if default:
703 701 try:
704 702 p = self.paths.getpath(default)
705 703 if p:
706 704 return p.rawloc
707 705 except error.RepoError:
708 706 pass
709 707
710 708 return loc
711 709
712 710 @util.propertycache
713 711 def paths(self):
714 712 return paths(self)
715 713
716 714 def pushbuffer(self, error=False, subproc=False, labeled=False):
717 715 """install a buffer to capture standard output of the ui object
718 716
719 717 If error is True, the error output will be captured too.
720 718
721 719 If subproc is True, output from subprocesses (typically hooks) will be
722 720 captured too.
723 721
724 722 If labeled is True, any labels associated with buffered
725 723 output will be handled. By default, this has no effect
726 724 on the output returned, but extensions and GUI tools may
727 725 handle this argument and returned styled output. If output
728 726 is being buffered so it can be captured and parsed or
729 727 processed, labeled should not be set to True.
730 728 """
731 729 self._buffers.append([])
732 730 self._bufferstates.append((error, subproc, labeled))
733 731 self._bufferapplylabels = labeled
734 732
735 733 def popbuffer(self):
736 734 '''pop the last buffer and return the buffered output'''
737 735 self._bufferstates.pop()
738 736 if self._bufferstates:
739 737 self._bufferapplylabels = self._bufferstates[-1][2]
740 738 else:
741 739 self._bufferapplylabels = None
742 740
743 741 return "".join(self._buffers.pop())
744 742
745 743 def write(self, *args, **opts):
746 744 '''write args to output
747 745
748 746 By default, this method simply writes to the buffer or stdout.
749 747 Color mode can be set on the UI class to have the output decorated
750 748 with color modifier before being written to stdout.
751 749
752 750 The color used is controlled by an optional keyword argument, "label".
753 751 This should be a string containing label names separated by space.
754 752 Label names take the form of "topic.type". For example, ui.debug()
755 753 issues a label of "ui.debug".
756 754
757 755 When labeling output for a specific command, a label of
758 756 "cmdname.type" is recommended. For example, status issues
759 757 a label of "status.modified" for modified files.
760 758 '''
761 759 if self._buffers and not opts.get('prompt', False):
762 760 if self._bufferapplylabels:
763 761 label = opts.get('label', '')
764 762 self._buffers[-1].extend(self.label(a, label) for a in args)
765 763 else:
766 764 self._buffers[-1].extend(args)
767 765 elif self._colormode == 'win32':
768 766 # windows color printing is its own can of crab, defer to
769 767 # the color module and that is it.
770 768 color.win32print(self, self._write, *args, **opts)
771 769 else:
772 770 msgs = args
773 771 if self._colormode is not None:
774 772 label = opts.get('label', '')
775 773 msgs = [self.label(a, label) for a in args]
776 774 self._write(*msgs, **opts)
777 775
778 776 def _write(self, *msgs, **opts):
779 777 self._progclear()
780 778 # opencode timeblockedsection because this is a critical path
781 779 starttime = util.timer()
782 780 try:
783 781 for a in msgs:
784 782 self.fout.write(a)
785 783 except IOError as err:
786 784 raise error.StdioError(err)
787 785 finally:
788 786 self._blockedtimes['stdio_blocked'] += \
789 787 (util.timer() - starttime) * 1000
790 788
791 789 def write_err(self, *args, **opts):
792 790 self._progclear()
793 791 if self._bufferstates and self._bufferstates[-1][0]:
794 792 self.write(*args, **opts)
795 793 elif self._colormode == 'win32':
796 794 # windows color printing is its own can of crab, defer to
797 795 # the color module and that is it.
798 796 color.win32print(self, self._write_err, *args, **opts)
799 797 else:
800 798 msgs = args
801 799 if self._colormode is not None:
802 800 label = opts.get('label', '')
803 801 msgs = [self.label(a, label) for a in args]
804 802 self._write_err(*msgs, **opts)
805 803
806 804 def _write_err(self, *msgs, **opts):
807 805 try:
808 806 with self.timeblockedsection('stdio'):
809 807 if not getattr(self.fout, 'closed', False):
810 808 self.fout.flush()
811 809 for a in msgs:
812 810 self.ferr.write(a)
813 811 # stderr may be buffered under win32 when redirected to files,
814 812 # including stdout.
815 813 if not getattr(self.ferr, 'closed', False):
816 814 self.ferr.flush()
817 815 except IOError as inst:
818 816 raise error.StdioError(inst)
819 817
820 818 def flush(self):
821 819 # opencode timeblockedsection because this is a critical path
822 820 starttime = util.timer()
823 821 try:
824 822 try:
825 823 self.fout.flush()
826 824 except IOError as err:
827 825 raise error.StdioError(err)
828 826 finally:
829 827 try:
830 828 self.ferr.flush()
831 829 except IOError as err:
832 830 raise error.StdioError(err)
833 831 finally:
834 832 self._blockedtimes['stdio_blocked'] += \
835 833 (util.timer() - starttime) * 1000
836 834
837 835 def _isatty(self, fh):
838 836 if self.configbool('ui', 'nontty', False):
839 837 return False
840 838 return util.isatty(fh)
841 839
842 840 def disablepager(self):
843 841 self._disablepager = True
844 842
845 843 def pager(self, command):
846 844 """Start a pager for subsequent command output.
847 845
848 846 Commands which produce a long stream of output should call
849 847 this function to activate the user's preferred pagination
850 848 mechanism (which may be no pager). Calling this function
851 849 precludes any future use of interactive functionality, such as
852 850 prompting the user or activating curses.
853 851
854 852 Args:
855 853 command: The full, non-aliased name of the command. That is, "log"
856 854 not "history, "summary" not "summ", etc.
857 855 """
858 856 if (self._disablepager
859 857 or self.pageractive
860 858 or command in self.configlist('pager', 'ignore')
861 or not self.configbool('pager', 'enable', True)
859 or not self.configbool('ui', 'paginate',
860 self.configbool('pager', 'enable', True))
862 861 or not self.configbool('pager', 'attend-' + command, True)
863 862 # TODO: if we want to allow HGPLAINEXCEPT=pager,
864 863 # formatted() will need some adjustment.
865 864 or not self.formatted()
866 865 or self.plain()
867 866 # TODO: expose debugger-enabled on the UI object
868 867 or '--debugger' in pycompat.sysargv):
869 868 # We only want to paginate if the ui appears to be
870 869 # interactive, the user didn't say HGPLAIN or
871 870 # HGPLAINEXCEPT=pager, and the user didn't specify --debug.
872 871 return
873 872
874 873 pagercmd = self.config('pager', 'pager', rcutil.fallbackpager)
875 874 if not pagercmd:
876 875 return
877 876
878 877 pagerenv = {}
879 878 for name, value in rcutil.defaultpagerenv().items():
880 879 if name not in encoding.environ:
881 880 pagerenv[name] = value
882 881
883 882 self.debug('starting pager for command %r\n' % command)
884 883 self.flush()
885 884
886 885 wasformatted = self.formatted()
887 886 if util.safehasattr(signal, "SIGPIPE"):
888 887 signal.signal(signal.SIGPIPE, _catchterm)
889 888 if self._runpager(pagercmd, pagerenv):
890 889 self.pageractive = True
891 890 # Preserve the formatted-ness of the UI. This is important
892 891 # because we mess with stdout, which might confuse
893 892 # auto-detection of things being formatted.
894 893 self.setconfig('ui', 'formatted', wasformatted, 'pager')
895 894 self.setconfig('ui', 'interactive', False, 'pager')
896 895
897 896 # If pagermode differs from color.mode, reconfigure color now that
898 897 # pageractive is set.
899 898 cm = self._colormode
900 899 if cm != self.config('color', 'pagermode', cm):
901 900 color.setup(self)
902 901 else:
903 902 # If the pager can't be spawned in dispatch when --pager=on is
904 903 # given, don't try again when the command runs, to avoid a duplicate
905 904 # warning about a missing pager command.
906 905 self.disablepager()
907 906
908 907 def _runpager(self, command, env=None):
909 908 """Actually start the pager and set up file descriptors.
910 909
911 910 This is separate in part so that extensions (like chg) can
912 911 override how a pager is invoked.
913 912 """
914 913 if command == 'cat':
915 914 # Save ourselves some work.
916 915 return False
917 916 # If the command doesn't contain any of these characters, we
918 917 # assume it's a binary and exec it directly. This means for
919 918 # simple pager command configurations, we can degrade
920 919 # gracefully and tell the user about their broken pager.
921 920 shell = any(c in command for c in "|&;<>()$`\\\"' \t\n*?[#~=%")
922 921
923 922 if pycompat.osname == 'nt' and not shell:
924 923 # Window's built-in `more` cannot be invoked with shell=False, but
925 924 # its `more.com` can. Hide this implementation detail from the
926 925 # user so we can also get sane bad PAGER behavior. MSYS has
927 926 # `more.exe`, so do a cmd.exe style resolution of the executable to
928 927 # determine which one to use.
929 928 fullcmd = util.findexe(command)
930 929 if not fullcmd:
931 930 self.warn(_("missing pager command '%s', skipping pager\n")
932 931 % command)
933 932 return False
934 933
935 934 command = fullcmd
936 935
937 936 try:
938 937 pager = subprocess.Popen(
939 938 command, shell=shell, bufsize=-1,
940 939 close_fds=util.closefds, stdin=subprocess.PIPE,
941 940 stdout=util.stdout, stderr=util.stderr,
942 941 env=util.shellenviron(env))
943 942 except OSError as e:
944 943 if e.errno == errno.ENOENT and not shell:
945 944 self.warn(_("missing pager command '%s', skipping pager\n")
946 945 % command)
947 946 return False
948 947 raise
949 948
950 949 # back up original file descriptors
951 950 stdoutfd = os.dup(util.stdout.fileno())
952 951 stderrfd = os.dup(util.stderr.fileno())
953 952
954 953 os.dup2(pager.stdin.fileno(), util.stdout.fileno())
955 954 if self._isatty(util.stderr):
956 955 os.dup2(pager.stdin.fileno(), util.stderr.fileno())
957 956
958 957 @self.atexit
959 958 def killpager():
960 959 if util.safehasattr(signal, "SIGINT"):
961 960 signal.signal(signal.SIGINT, signal.SIG_IGN)
962 961 # restore original fds, closing pager.stdin copies in the process
963 962 os.dup2(stdoutfd, util.stdout.fileno())
964 963 os.dup2(stderrfd, util.stderr.fileno())
965 964 pager.stdin.close()
966 965 pager.wait()
967 966
968 967 return True
969 968
970 969 def atexit(self, func, *args, **kwargs):
971 970 '''register a function to run after dispatching a request
972 971
973 972 Handlers do not stay registered across request boundaries.'''
974 973 self._exithandlers.append((func, args, kwargs))
975 974 return func
976 975
977 976 def interface(self, feature):
978 977 """what interface to use for interactive console features?
979 978
980 979 The interface is controlled by the value of `ui.interface` but also by
981 980 the value of feature-specific configuration. For example:
982 981
983 982 ui.interface.histedit = text
984 983 ui.interface.chunkselector = curses
985 984
986 985 Here the features are "histedit" and "chunkselector".
987 986
988 987 The configuration above means that the default interfaces for commands
989 988 is curses, the interface for histedit is text and the interface for
990 989 selecting chunk is crecord (the best curses interface available).
991 990
992 991 Consider the following example:
993 992 ui.interface = curses
994 993 ui.interface.histedit = text
995 994
996 995 Then histedit will use the text interface and chunkselector will use
997 996 the default curses interface (crecord at the moment).
998 997 """
999 998 alldefaults = frozenset(["text", "curses"])
1000 999
1001 1000 featureinterfaces = {
1002 1001 "chunkselector": [
1003 1002 "text",
1004 1003 "curses",
1005 1004 ]
1006 1005 }
1007 1006
1008 1007 # Feature-specific interface
1009 1008 if feature not in featureinterfaces.keys():
1010 1009 # Programming error, not user error
1011 1010 raise ValueError("Unknown feature requested %s" % feature)
1012 1011
1013 1012 availableinterfaces = frozenset(featureinterfaces[feature])
1014 1013 if alldefaults > availableinterfaces:
1015 1014 # Programming error, not user error. We need a use case to
1016 1015 # define the right thing to do here.
1017 1016 raise ValueError(
1018 1017 "Feature %s does not handle all default interfaces" %
1019 1018 feature)
1020 1019
1021 1020 if self.plain():
1022 1021 return "text"
1023 1022
1024 1023 # Default interface for all the features
1025 1024 defaultinterface = "text"
1026 1025 i = self.config("ui", "interface", None)
1027 1026 if i in alldefaults:
1028 1027 defaultinterface = i
1029 1028
1030 1029 choseninterface = defaultinterface
1031 1030 f = self.config("ui", "interface.%s" % feature, None)
1032 1031 if f in availableinterfaces:
1033 1032 choseninterface = f
1034 1033
1035 1034 if i is not None and defaultinterface != i:
1036 1035 if f is not None:
1037 1036 self.warn(_("invalid value for ui.interface: %s\n") %
1038 1037 (i,))
1039 1038 else:
1040 1039 self.warn(_("invalid value for ui.interface: %s (using %s)\n") %
1041 1040 (i, choseninterface))
1042 1041 if f is not None and choseninterface != f:
1043 1042 self.warn(_("invalid value for ui.interface.%s: %s (using %s)\n") %
1044 1043 (feature, f, choseninterface))
1045 1044
1046 1045 return choseninterface
1047 1046
1048 1047 def interactive(self):
1049 1048 '''is interactive input allowed?
1050 1049
1051 1050 An interactive session is a session where input can be reasonably read
1052 1051 from `sys.stdin'. If this function returns false, any attempt to read
1053 1052 from stdin should fail with an error, unless a sensible default has been
1054 1053 specified.
1055 1054
1056 1055 Interactiveness is triggered by the value of the `ui.interactive'
1057 1056 configuration variable or - if it is unset - when `sys.stdin' points
1058 1057 to a terminal device.
1059 1058
1060 1059 This function refers to input only; for output, see `ui.formatted()'.
1061 1060 '''
1062 1061 i = self.configbool("ui", "interactive", None)
1063 1062 if i is None:
1064 1063 # some environments replace stdin without implementing isatty
1065 1064 # usually those are non-interactive
1066 1065 return self._isatty(self.fin)
1067 1066
1068 1067 return i
1069 1068
1070 1069 def termwidth(self):
1071 1070 '''how wide is the terminal in columns?
1072 1071 '''
1073 1072 if 'COLUMNS' in encoding.environ:
1074 1073 try:
1075 1074 return int(encoding.environ['COLUMNS'])
1076 1075 except ValueError:
1077 1076 pass
1078 1077 return scmutil.termsize(self)[0]
1079 1078
1080 1079 def formatted(self):
1081 1080 '''should formatted output be used?
1082 1081
1083 1082 It is often desirable to format the output to suite the output medium.
1084 1083 Examples of this are truncating long lines or colorizing messages.
1085 1084 However, this is not often not desirable when piping output into other
1086 1085 utilities, e.g. `grep'.
1087 1086
1088 1087 Formatted output is triggered by the value of the `ui.formatted'
1089 1088 configuration variable or - if it is unset - when `sys.stdout' points
1090 1089 to a terminal device. Please note that `ui.formatted' should be
1091 1090 considered an implementation detail; it is not intended for use outside
1092 1091 Mercurial or its extensions.
1093 1092
1094 1093 This function refers to output only; for input, see `ui.interactive()'.
1095 1094 This function always returns false when in plain mode, see `ui.plain()'.
1096 1095 '''
1097 1096 if self.plain():
1098 1097 return False
1099 1098
1100 1099 i = self.configbool("ui", "formatted", None)
1101 1100 if i is None:
1102 1101 # some environments replace stdout without implementing isatty
1103 1102 # usually those are non-interactive
1104 1103 return self._isatty(self.fout)
1105 1104
1106 1105 return i
1107 1106
1108 1107 def _readline(self, prompt=''):
1109 1108 if self._isatty(self.fin):
1110 1109 try:
1111 1110 # magically add command line editing support, where
1112 1111 # available
1113 1112 import readline
1114 1113 # force demandimport to really load the module
1115 1114 readline.read_history_file
1116 1115 # windows sometimes raises something other than ImportError
1117 1116 except Exception:
1118 1117 pass
1119 1118
1120 1119 # call write() so output goes through subclassed implementation
1121 1120 # e.g. color extension on Windows
1122 1121 self.write(prompt, prompt=True)
1123 1122
1124 1123 # instead of trying to emulate raw_input, swap (self.fin,
1125 1124 # self.fout) with (sys.stdin, sys.stdout)
1126 1125 oldin = sys.stdin
1127 1126 oldout = sys.stdout
1128 1127 sys.stdin = self.fin
1129 1128 sys.stdout = self.fout
1130 1129 # prompt ' ' must exist; otherwise readline may delete entire line
1131 1130 # - http://bugs.python.org/issue12833
1132 1131 with self.timeblockedsection('stdio'):
1133 1132 line = raw_input(' ')
1134 1133 sys.stdin = oldin
1135 1134 sys.stdout = oldout
1136 1135
1137 1136 # When stdin is in binary mode on Windows, it can cause
1138 1137 # raw_input() to emit an extra trailing carriage return
1139 1138 if pycompat.oslinesep == '\r\n' and line and line[-1] == '\r':
1140 1139 line = line[:-1]
1141 1140 return line
1142 1141
1143 1142 def prompt(self, msg, default="y"):
1144 1143 """Prompt user with msg, read response.
1145 1144 If ui is not interactive, the default is returned.
1146 1145 """
1147 1146 if not self.interactive():
1148 1147 self.write(msg, ' ', default or '', "\n")
1149 1148 return default
1150 1149 try:
1151 1150 r = self._readline(self.label(msg, 'ui.prompt'))
1152 1151 if not r:
1153 1152 r = default
1154 1153 if self.configbool('ui', 'promptecho'):
1155 1154 self.write(r, "\n")
1156 1155 return r
1157 1156 except EOFError:
1158 1157 raise error.ResponseExpected()
1159 1158
1160 1159 @staticmethod
1161 1160 def extractchoices(prompt):
1162 1161 """Extract prompt message and list of choices from specified prompt.
1163 1162
1164 1163 This returns tuple "(message, choices)", and "choices" is the
1165 1164 list of tuple "(response character, text without &)".
1166 1165
1167 1166 >>> ui.extractchoices("awake? $$ &Yes $$ &No")
1168 1167 ('awake? ', [('y', 'Yes'), ('n', 'No')])
1169 1168 >>> ui.extractchoices("line\\nbreak? $$ &Yes $$ &No")
1170 1169 ('line\\nbreak? ', [('y', 'Yes'), ('n', 'No')])
1171 1170 >>> ui.extractchoices("want lots of $$money$$?$$Ye&s$$N&o")
1172 1171 ('want lots of $$money$$?', [('s', 'Yes'), ('o', 'No')])
1173 1172 """
1174 1173
1175 1174 # Sadly, the prompt string may have been built with a filename
1176 1175 # containing "$$" so let's try to find the first valid-looking
1177 1176 # prompt to start parsing. Sadly, we also can't rely on
1178 1177 # choices containing spaces, ASCII, or basically anything
1179 1178 # except an ampersand followed by a character.
1180 1179 m = re.match(r'(?s)(.+?)\$\$([^\$]*&[^ \$].*)', prompt)
1181 1180 msg = m.group(1)
1182 1181 choices = [p.strip(' ') for p in m.group(2).split('$$')]
1183 1182 return (msg,
1184 1183 [(s[s.index('&') + 1].lower(), s.replace('&', '', 1))
1185 1184 for s in choices])
1186 1185
1187 1186 def promptchoice(self, prompt, default=0):
1188 1187 """Prompt user with a message, read response, and ensure it matches
1189 1188 one of the provided choices. The prompt is formatted as follows:
1190 1189
1191 1190 "would you like fries with that (Yn)? $$ &Yes $$ &No"
1192 1191
1193 1192 The index of the choice is returned. Responses are case
1194 1193 insensitive. If ui is not interactive, the default is
1195 1194 returned.
1196 1195 """
1197 1196
1198 1197 msg, choices = self.extractchoices(prompt)
1199 1198 resps = [r for r, t in choices]
1200 1199 while True:
1201 1200 r = self.prompt(msg, resps[default])
1202 1201 if r.lower() in resps:
1203 1202 return resps.index(r.lower())
1204 1203 self.write(_("unrecognized response\n"))
1205 1204
1206 1205 def getpass(self, prompt=None, default=None):
1207 1206 if not self.interactive():
1208 1207 return default
1209 1208 try:
1210 1209 self.write_err(self.label(prompt or _('password: '), 'ui.prompt'))
1211 1210 # disable getpass() only if explicitly specified. it's still valid
1212 1211 # to interact with tty even if fin is not a tty.
1213 1212 with self.timeblockedsection('stdio'):
1214 1213 if self.configbool('ui', 'nontty'):
1215 1214 l = self.fin.readline()
1216 1215 if not l:
1217 1216 raise EOFError
1218 1217 return l.rstrip('\n')
1219 1218 else:
1220 1219 return getpass.getpass('')
1221 1220 except EOFError:
1222 1221 raise error.ResponseExpected()
1223 1222 def status(self, *msg, **opts):
1224 1223 '''write status message to output (if ui.quiet is False)
1225 1224
1226 1225 This adds an output label of "ui.status".
1227 1226 '''
1228 1227 if not self.quiet:
1229 1228 opts[r'label'] = opts.get(r'label', '') + ' ui.status'
1230 1229 self.write(*msg, **opts)
1231 1230 def warn(self, *msg, **opts):
1232 1231 '''write warning message to output (stderr)
1233 1232
1234 1233 This adds an output label of "ui.warning".
1235 1234 '''
1236 1235 opts[r'label'] = opts.get(r'label', '') + ' ui.warning'
1237 1236 self.write_err(*msg, **opts)
1238 1237 def note(self, *msg, **opts):
1239 1238 '''write note to output (if ui.verbose is True)
1240 1239
1241 1240 This adds an output label of "ui.note".
1242 1241 '''
1243 1242 if self.verbose:
1244 1243 opts[r'label'] = opts.get(r'label', '') + ' ui.note'
1245 1244 self.write(*msg, **opts)
1246 1245 def debug(self, *msg, **opts):
1247 1246 '''write debug message to output (if ui.debugflag is True)
1248 1247
1249 1248 This adds an output label of "ui.debug".
1250 1249 '''
1251 1250 if self.debugflag:
1252 1251 opts[r'label'] = opts.get(r'label', '') + ' ui.debug'
1253 1252 self.write(*msg, **opts)
1254 1253
1255 1254 def edit(self, text, user, extra=None, editform=None, pending=None,
1256 1255 repopath=None):
1257 1256 extra_defaults = {
1258 1257 'prefix': 'editor',
1259 1258 'suffix': '.txt',
1260 1259 }
1261 1260 if extra is not None:
1262 1261 extra_defaults.update(extra)
1263 1262 extra = extra_defaults
1264 1263
1265 1264 rdir = None
1266 1265 if self.configbool('experimental', 'editortmpinhg'):
1267 1266 rdir = repopath
1268 1267 (fd, name) = tempfile.mkstemp(prefix='hg-' + extra['prefix'] + '-',
1269 1268 suffix=extra['suffix'],
1270 1269 dir=rdir)
1271 1270 try:
1272 1271 f = os.fdopen(fd, r'wb')
1273 1272 f.write(util.tonativeeol(text))
1274 1273 f.close()
1275 1274
1276 1275 environ = {'HGUSER': user}
1277 1276 if 'transplant_source' in extra:
1278 1277 environ.update({'HGREVISION': hex(extra['transplant_source'])})
1279 1278 for label in ('intermediate-source', 'source', 'rebase_source'):
1280 1279 if label in extra:
1281 1280 environ.update({'HGREVISION': extra[label]})
1282 1281 break
1283 1282 if editform:
1284 1283 environ.update({'HGEDITFORM': editform})
1285 1284 if pending:
1286 1285 environ.update({'HG_PENDING': pending})
1287 1286
1288 1287 editor = self.geteditor()
1289 1288
1290 1289 self.system("%s \"%s\"" % (editor, name),
1291 1290 environ=environ,
1292 1291 onerr=error.Abort, errprefix=_("edit failed"),
1293 1292 blockedtag='editor')
1294 1293
1295 1294 f = open(name, r'rb')
1296 1295 t = util.fromnativeeol(f.read())
1297 1296 f.close()
1298 1297 finally:
1299 1298 os.unlink(name)
1300 1299
1301 1300 return t
1302 1301
1303 1302 def system(self, cmd, environ=None, cwd=None, onerr=None, errprefix=None,
1304 1303 blockedtag=None):
1305 1304 '''execute shell command with appropriate output stream. command
1306 1305 output will be redirected if fout is not stdout.
1307 1306
1308 1307 if command fails and onerr is None, return status, else raise onerr
1309 1308 object as exception.
1310 1309 '''
1311 1310 if blockedtag is None:
1312 1311 # Long cmds tend to be because of an absolute path on cmd. Keep
1313 1312 # the tail end instead
1314 1313 cmdsuffix = cmd.translate(None, _keepalnum)[-85:]
1315 1314 blockedtag = 'unknown_system_' + cmdsuffix
1316 1315 out = self.fout
1317 1316 if any(s[1] for s in self._bufferstates):
1318 1317 out = self
1319 1318 with self.timeblockedsection(blockedtag):
1320 1319 rc = self._runsystem(cmd, environ=environ, cwd=cwd, out=out)
1321 1320 if rc and onerr:
1322 1321 errmsg = '%s %s' % (os.path.basename(cmd.split(None, 1)[0]),
1323 1322 util.explainexit(rc)[0])
1324 1323 if errprefix:
1325 1324 errmsg = '%s: %s' % (errprefix, errmsg)
1326 1325 raise onerr(errmsg)
1327 1326 return rc
1328 1327
1329 1328 def _runsystem(self, cmd, environ, cwd, out):
1330 1329 """actually execute the given shell command (can be overridden by
1331 1330 extensions like chg)"""
1332 1331 return util.system(cmd, environ=environ, cwd=cwd, out=out)
1333 1332
1334 1333 def traceback(self, exc=None, force=False):
1335 1334 '''print exception traceback if traceback printing enabled or forced.
1336 1335 only to call in exception handler. returns true if traceback
1337 1336 printed.'''
1338 1337 if self.tracebackflag or force:
1339 1338 if exc is None:
1340 1339 exc = sys.exc_info()
1341 1340 cause = getattr(exc[1], 'cause', None)
1342 1341
1343 1342 if cause is not None:
1344 1343 causetb = traceback.format_tb(cause[2])
1345 1344 exctb = traceback.format_tb(exc[2])
1346 1345 exconly = traceback.format_exception_only(cause[0], cause[1])
1347 1346
1348 1347 # exclude frame where 'exc' was chained and rethrown from exctb
1349 1348 self.write_err('Traceback (most recent call last):\n',
1350 1349 ''.join(exctb[:-1]),
1351 1350 ''.join(causetb),
1352 1351 ''.join(exconly))
1353 1352 else:
1354 1353 output = traceback.format_exception(exc[0], exc[1], exc[2])
1355 1354 data = r''.join(output)
1356 1355 if pycompat.ispy3:
1357 1356 enc = pycompat.sysstr(encoding.encoding)
1358 1357 data = data.encode(enc, errors=r'replace')
1359 1358 self.write_err(data)
1360 1359 return self.tracebackflag or force
1361 1360
1362 1361 def geteditor(self):
1363 1362 '''return editor to use'''
1364 1363 if pycompat.sysplatform == 'plan9':
1365 1364 # vi is the MIPS instruction simulator on Plan 9. We
1366 1365 # instead default to E to plumb commit messages to
1367 1366 # avoid confusion.
1368 1367 editor = 'E'
1369 1368 else:
1370 1369 editor = 'vi'
1371 1370 return (encoding.environ.get("HGEDITOR") or
1372 1371 self.config("ui", "editor", editor))
1373 1372
1374 1373 @util.propertycache
1375 1374 def _progbar(self):
1376 1375 """setup the progbar singleton to the ui object"""
1377 1376 if (self.quiet or self.debugflag
1378 1377 or self.configbool('progress', 'disable', False)
1379 1378 or not progress.shouldprint(self)):
1380 1379 return None
1381 1380 return getprogbar(self)
1382 1381
1383 1382 def _progclear(self):
1384 1383 """clear progress bar output if any. use it before any output"""
1385 1384 if '_progbar' not in vars(self): # nothing loaded yet
1386 1385 return
1387 1386 if self._progbar is not None and self._progbar.printed:
1388 1387 self._progbar.clear()
1389 1388
1390 1389 def progress(self, topic, pos, item="", unit="", total=None):
1391 1390 '''show a progress message
1392 1391
1393 1392 By default a textual progress bar will be displayed if an operation
1394 1393 takes too long. 'topic' is the current operation, 'item' is a
1395 1394 non-numeric marker of the current position (i.e. the currently
1396 1395 in-process file), 'pos' is the current numeric position (i.e.
1397 1396 revision, bytes, etc.), unit is a corresponding unit label,
1398 1397 and total is the highest expected pos.
1399 1398
1400 1399 Multiple nested topics may be active at a time.
1401 1400
1402 1401 All topics should be marked closed by setting pos to None at
1403 1402 termination.
1404 1403 '''
1405 1404 if self._progbar is not None:
1406 1405 self._progbar.progress(topic, pos, item=item, unit=unit,
1407 1406 total=total)
1408 1407 if pos is None or not self.configbool('progress', 'debug'):
1409 1408 return
1410 1409
1411 1410 if unit:
1412 1411 unit = ' ' + unit
1413 1412 if item:
1414 1413 item = ' ' + item
1415 1414
1416 1415 if total:
1417 1416 pct = 100.0 * pos / total
1418 1417 self.debug('%s:%s %s/%s%s (%4.2f%%)\n'
1419 1418 % (topic, item, pos, total, unit, pct))
1420 1419 else:
1421 1420 self.debug('%s:%s %s%s\n' % (topic, item, pos, unit))
1422 1421
1423 1422 def log(self, service, *msg, **opts):
1424 1423 '''hook for logging facility extensions
1425 1424
1426 1425 service should be a readily-identifiable subsystem, which will
1427 1426 allow filtering.
1428 1427
1429 1428 *msg should be a newline-terminated format string to log, and
1430 1429 then any values to %-format into that format string.
1431 1430
1432 1431 **opts currently has no defined meanings.
1433 1432 '''
1434 1433
1435 1434 def label(self, msg, label):
1436 1435 '''style msg based on supplied label
1437 1436
1438 1437 If some color mode is enabled, this will add the necessary control
1439 1438 characters to apply such color. In addition, 'debug' color mode adds
1440 1439 markup showing which label affects a piece of text.
1441 1440
1442 1441 ui.write(s, 'label') is equivalent to
1443 1442 ui.write(ui.label(s, 'label')).
1444 1443 '''
1445 1444 if self._colormode is not None:
1446 1445 return color.colorlabel(self, msg, label)
1447 1446 return msg
1448 1447
1449 1448 def develwarn(self, msg, stacklevel=1, config=None):
1450 1449 """issue a developer warning message
1451 1450
1452 1451 Use 'stacklevel' to report the offender some layers further up in the
1453 1452 stack.
1454 1453 """
1455 1454 if not self.configbool('devel', 'all-warnings'):
1456 1455 if config is not None and not self.configbool('devel', config):
1457 1456 return
1458 1457 msg = 'devel-warn: ' + msg
1459 1458 stacklevel += 1 # get in develwarn
1460 1459 if self.tracebackflag:
1461 1460 util.debugstacktrace(msg, stacklevel, self.ferr, self.fout)
1462 1461 self.log('develwarn', '%s at:\n%s' %
1463 1462 (msg, ''.join(util.getstackframes(stacklevel))))
1464 1463 else:
1465 1464 curframe = inspect.currentframe()
1466 1465 calframe = inspect.getouterframes(curframe, 2)
1467 1466 self.write_err('%s at: %s:%s (%s)\n'
1468 1467 % ((msg,) + calframe[stacklevel][1:4]))
1469 1468 self.log('develwarn', '%s at: %s:%s (%s)\n',
1470 1469 msg, *calframe[stacklevel][1:4])
1471 1470 curframe = calframe = None # avoid cycles
1472 1471
1473 1472 def deprecwarn(self, msg, version):
1474 1473 """issue a deprecation warning
1475 1474
1476 1475 - msg: message explaining what is deprecated and how to upgrade,
1477 1476 - version: last version where the API will be supported,
1478 1477 """
1479 1478 if not (self.configbool('devel', 'all-warnings')
1480 1479 or self.configbool('devel', 'deprec-warn')):
1481 1480 return
1482 1481 msg += ("\n(compatibility will be dropped after Mercurial-%s,"
1483 1482 " update your code.)") % version
1484 1483 self.develwarn(msg, stacklevel=2, config='deprec-warn')
1485 1484
1486 1485 def exportableenviron(self):
1487 1486 """The environment variables that are safe to export, e.g. through
1488 1487 hgweb.
1489 1488 """
1490 1489 return self._exportableenviron
1491 1490
1492 1491 @contextlib.contextmanager
1493 1492 def configoverride(self, overrides, source=""):
1494 1493 """Context manager for temporary config overrides
1495 1494 `overrides` must be a dict of the following structure:
1496 1495 {(section, name) : value}"""
1497 1496 backups = {}
1498 1497 try:
1499 1498 for (section, name), value in overrides.items():
1500 1499 backups[(section, name)] = self.backupconfig(section, name)
1501 1500 self.setconfig(section, name, value, source)
1502 1501 yield
1503 1502 finally:
1504 1503 for __, backup in backups.items():
1505 1504 self.restoreconfig(backup)
1506 1505 # just restoring ui.quiet config to the previous value is not enough
1507 1506 # as it does not update ui.quiet class member
1508 1507 if ('ui', 'quiet') in overrides:
1509 1508 self.fixconfig(section='ui')
1510 1509
1511 1510 class paths(dict):
1512 1511 """Represents a collection of paths and their configs.
1513 1512
1514 1513 Data is initially derived from ui instances and the config files they have
1515 1514 loaded.
1516 1515 """
1517 1516 def __init__(self, ui):
1518 1517 dict.__init__(self)
1519 1518
1520 1519 for name, loc in ui.configitems('paths', ignoresub=True):
1521 1520 # No location is the same as not existing.
1522 1521 if not loc:
1523 1522 continue
1524 1523 loc, sub = ui.configsuboptions('paths', name)
1525 1524 self[name] = path(ui, name, rawloc=loc, suboptions=sub)
1526 1525
1527 1526 def getpath(self, name, default=None):
1528 1527 """Return a ``path`` from a string, falling back to default.
1529 1528
1530 1529 ``name`` can be a named path or locations. Locations are filesystem
1531 1530 paths or URIs.
1532 1531
1533 1532 Returns None if ``name`` is not a registered path, a URI, or a local
1534 1533 path to a repo.
1535 1534 """
1536 1535 # Only fall back to default if no path was requested.
1537 1536 if name is None:
1538 1537 if not default:
1539 1538 default = ()
1540 1539 elif not isinstance(default, (tuple, list)):
1541 1540 default = (default,)
1542 1541 for k in default:
1543 1542 try:
1544 1543 return self[k]
1545 1544 except KeyError:
1546 1545 continue
1547 1546 return None
1548 1547
1549 1548 # Most likely empty string.
1550 1549 # This may need to raise in the future.
1551 1550 if not name:
1552 1551 return None
1553 1552
1554 1553 try:
1555 1554 return self[name]
1556 1555 except KeyError:
1557 1556 # Try to resolve as a local path or URI.
1558 1557 try:
1559 1558 # We don't pass sub-options in, so no need to pass ui instance.
1560 1559 return path(None, None, rawloc=name)
1561 1560 except ValueError:
1562 1561 raise error.RepoError(_('repository %s does not exist') %
1563 1562 name)
1564 1563
1565 1564 _pathsuboptions = {}
1566 1565
1567 1566 def pathsuboption(option, attr):
1568 1567 """Decorator used to declare a path sub-option.
1569 1568
1570 1569 Arguments are the sub-option name and the attribute it should set on
1571 1570 ``path`` instances.
1572 1571
1573 1572 The decorated function will receive as arguments a ``ui`` instance,
1574 1573 ``path`` instance, and the string value of this option from the config.
1575 1574 The function should return the value that will be set on the ``path``
1576 1575 instance.
1577 1576
1578 1577 This decorator can be used to perform additional verification of
1579 1578 sub-options and to change the type of sub-options.
1580 1579 """
1581 1580 def register(func):
1582 1581 _pathsuboptions[option] = (attr, func)
1583 1582 return func
1584 1583 return register
1585 1584
1586 1585 @pathsuboption('pushurl', 'pushloc')
1587 1586 def pushurlpathoption(ui, path, value):
1588 1587 u = util.url(value)
1589 1588 # Actually require a URL.
1590 1589 if not u.scheme:
1591 1590 ui.warn(_('(paths.%s:pushurl not a URL; ignoring)\n') % path.name)
1592 1591 return None
1593 1592
1594 1593 # Don't support the #foo syntax in the push URL to declare branch to
1595 1594 # push.
1596 1595 if u.fragment:
1597 1596 ui.warn(_('("#fragment" in paths.%s:pushurl not supported; '
1598 1597 'ignoring)\n') % path.name)
1599 1598 u.fragment = None
1600 1599
1601 1600 return str(u)
1602 1601
1603 1602 @pathsuboption('pushrev', 'pushrev')
1604 1603 def pushrevpathoption(ui, path, value):
1605 1604 return value
1606 1605
1607 1606 class path(object):
1608 1607 """Represents an individual path and its configuration."""
1609 1608
1610 1609 def __init__(self, ui, name, rawloc=None, suboptions=None):
1611 1610 """Construct a path from its config options.
1612 1611
1613 1612 ``ui`` is the ``ui`` instance the path is coming from.
1614 1613 ``name`` is the symbolic name of the path.
1615 1614 ``rawloc`` is the raw location, as defined in the config.
1616 1615 ``pushloc`` is the raw locations pushes should be made to.
1617 1616
1618 1617 If ``name`` is not defined, we require that the location be a) a local
1619 1618 filesystem path with a .hg directory or b) a URL. If not,
1620 1619 ``ValueError`` is raised.
1621 1620 """
1622 1621 if not rawloc:
1623 1622 raise ValueError('rawloc must be defined')
1624 1623
1625 1624 # Locations may define branches via syntax <base>#<branch>.
1626 1625 u = util.url(rawloc)
1627 1626 branch = None
1628 1627 if u.fragment:
1629 1628 branch = u.fragment
1630 1629 u.fragment = None
1631 1630
1632 1631 self.url = u
1633 1632 self.branch = branch
1634 1633
1635 1634 self.name = name
1636 1635 self.rawloc = rawloc
1637 1636 self.loc = '%s' % u
1638 1637
1639 1638 # When given a raw location but not a symbolic name, validate the
1640 1639 # location is valid.
1641 1640 if not name and not u.scheme and not self._isvalidlocalpath(self.loc):
1642 1641 raise ValueError('location is not a URL or path to a local '
1643 1642 'repo: %s' % rawloc)
1644 1643
1645 1644 suboptions = suboptions or {}
1646 1645
1647 1646 # Now process the sub-options. If a sub-option is registered, its
1648 1647 # attribute will always be present. The value will be None if there
1649 1648 # was no valid sub-option.
1650 1649 for suboption, (attr, func) in _pathsuboptions.iteritems():
1651 1650 if suboption not in suboptions:
1652 1651 setattr(self, attr, None)
1653 1652 continue
1654 1653
1655 1654 value = func(ui, self, suboptions[suboption])
1656 1655 setattr(self, attr, value)
1657 1656
1658 1657 def _isvalidlocalpath(self, path):
1659 1658 """Returns True if the given path is a potentially valid repository.
1660 1659 This is its own function so that extensions can change the definition of
1661 1660 'valid' in this case (like when pulling from a git repo into a hg
1662 1661 one)."""
1663 1662 return os.path.isdir(os.path.join(path, '.hg'))
1664 1663
1665 1664 @property
1666 1665 def suboptions(self):
1667 1666 """Return sub-options and their values for this path.
1668 1667
1669 1668 This is intended to be used for presentation purposes.
1670 1669 """
1671 1670 d = {}
1672 1671 for subopt, (attr, _func) in _pathsuboptions.iteritems():
1673 1672 value = getattr(self, attr)
1674 1673 if value is not None:
1675 1674 d[subopt] = value
1676 1675 return d
1677 1676
1678 1677 # we instantiate one globally shared progress bar to avoid
1679 1678 # competing progress bars when multiple UI objects get created
1680 1679 _progresssingleton = None
1681 1680
1682 1681 def getprogbar(ui):
1683 1682 global _progresssingleton
1684 1683 if _progresssingleton is None:
1685 1684 # passing 'ui' object to the singleton is fishy,
1686 1685 # this is how the extension used to work but feel free to rework it.
1687 1686 _progresssingleton = progress.progbar(ui)
1688 1687 return _progresssingleton
@@ -1,326 +1,326 b''
1 1 $ cat >> fakepager.py <<EOF
2 2 > import sys
3 3 > for line in sys.stdin:
4 4 > sys.stdout.write('paged! %r\n' % line)
5 5 > EOF
6 6
7 7 Enable ui.formatted because pager won't fire without it, and set up
8 8 pager and tell it to use our fake pager that lets us see when the
9 9 pager was running.
10 10 $ cat >> $HGRCPATH <<EOF
11 11 > [ui]
12 12 > formatted = yes
13 13 > color = no
14 14 > [pager]
15 15 > pager = python $TESTTMP/fakepager.py
16 16 > EOF
17 17
18 18 $ hg init repo
19 19 $ cd repo
20 20 $ echo a >> a
21 21 $ hg add a
22 22 $ hg ci -m 'add a'
23 23 $ for x in `python $TESTDIR/seq.py 1 10`; do
24 24 > echo a $x >> a
25 25 > hg ci -m "modify a $x"
26 26 > done
27 27
28 28 By default diff and log are paged, but id is not:
29 29
30 30 $ hg diff -c 2 --pager=yes
31 31 paged! 'diff -r f4be7687d414 -r bce265549556 a\n'
32 32 paged! '--- a/a\tThu Jan 01 00:00:00 1970 +0000\n'
33 33 paged! '+++ b/a\tThu Jan 01 00:00:00 1970 +0000\n'
34 34 paged! '@@ -1,2 +1,3 @@\n'
35 35 paged! ' a\n'
36 36 paged! ' a 1\n'
37 37 paged! '+a 2\n'
38 38
39 39 $ hg log --limit 2
40 40 paged! 'changeset: 10:46106edeeb38\n'
41 41 paged! 'tag: tip\n'
42 42 paged! 'user: test\n'
43 43 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
44 44 paged! 'summary: modify a 10\n'
45 45 paged! '\n'
46 46 paged! 'changeset: 9:6dd8ea7dd621\n'
47 47 paged! 'user: test\n'
48 48 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
49 49 paged! 'summary: modify a 9\n'
50 50 paged! '\n'
51 51
52 52 $ hg id
53 53 46106edeeb38 tip
54 54
55 55 We can control the pager from the config
56 56
57 $ hg log --limit 1 --config 'pager.enable=False'
57 $ hg log --limit 1 --config 'ui.paginate=False'
58 58 changeset: 10:46106edeeb38
59 59 tag: tip
60 60 user: test
61 61 date: Thu Jan 01 00:00:00 1970 +0000
62 62 summary: modify a 10
63 63
64 $ hg log --limit 1 --config 'pager.enable=0'
64 $ hg log --limit 1 --config 'ui.paginate=0'
65 65 changeset: 10:46106edeeb38
66 66 tag: tip
67 67 user: test
68 68 date: Thu Jan 01 00:00:00 1970 +0000
69 69 summary: modify a 10
70 70
71 $ hg log --limit 1 --config 'pager.enable=1'
71 $ hg log --limit 1 --config 'ui.paginate=1'
72 72 paged! 'changeset: 10:46106edeeb38\n'
73 73 paged! 'tag: tip\n'
74 74 paged! 'user: test\n'
75 75 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
76 76 paged! 'summary: modify a 10\n'
77 77 paged! '\n'
78 78
79 79 We can enable the pager on id:
80 80
81 81 BROKEN: should be paged
82 82 $ hg --config pager.attend-id=yes id
83 83 46106edeeb38 tip
84 84
85 85 Setting attend-$COMMAND to a false value works, even with pager in
86 86 core:
87 87 $ hg --config pager.attend-diff=no diff -c 2
88 88 diff -r f4be7687d414 -r bce265549556 a
89 89 --- a/a Thu Jan 01 00:00:00 1970 +0000
90 90 +++ b/a Thu Jan 01 00:00:00 1970 +0000
91 91 @@ -1,2 +1,3 @@
92 92 a
93 93 a 1
94 94 +a 2
95 95
96 96 Command aliases should have same behavior as main command
97 97
98 98 $ hg history --limit 2
99 99 paged! 'changeset: 10:46106edeeb38\n'
100 100 paged! 'tag: tip\n'
101 101 paged! 'user: test\n'
102 102 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
103 103 paged! 'summary: modify a 10\n'
104 104 paged! '\n'
105 105 paged! 'changeset: 9:6dd8ea7dd621\n'
106 106 paged! 'user: test\n'
107 107 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
108 108 paged! 'summary: modify a 9\n'
109 109 paged! '\n'
110 110
111 111 Abbreviated command alias should also be paged
112 112
113 113 $ hg hist -l 1
114 114 paged! 'changeset: 10:46106edeeb38\n'
115 115 paged! 'tag: tip\n'
116 116 paged! 'user: test\n'
117 117 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
118 118 paged! 'summary: modify a 10\n'
119 119 paged! '\n'
120 120
121 121 Attend for an abbreviated command does not work
122 122
123 123 $ hg --config pager.attend-ident=true ident
124 124 46106edeeb38 tip
125 125
126 126 $ hg --config extensions.pager= --config pager.attend-ident=true ident
127 127 46106edeeb38 tip
128 128
129 129 Pager should not start if stdout is not a tty.
130 130
131 131 $ hg log -l1 -q --config ui.formatted=False
132 132 10:46106edeeb38
133 133
134 134 Pager should be disabled if pager.pager is empty (otherwise the output would
135 135 be silently lost.)
136 136
137 137 $ hg log -l1 -q --config pager.pager=
138 138 10:46106edeeb38
139 139
140 140 Pager with color enabled allows colors to come through by default,
141 141 even though stdout is no longer a tty.
142 142 $ cat >> $HGRCPATH <<EOF
143 143 > [ui]
144 144 > color = always
145 145 > [color]
146 146 > mode = ansi
147 147 > EOF
148 148 $ hg log --limit 3
149 149 paged! '\x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m\n'
150 150 paged! 'tag: tip\n'
151 151 paged! 'user: test\n'
152 152 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
153 153 paged! 'summary: modify a 10\n'
154 154 paged! '\n'
155 155 paged! '\x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m\n'
156 156 paged! 'user: test\n'
157 157 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
158 158 paged! 'summary: modify a 9\n'
159 159 paged! '\n'
160 160 paged! '\x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m\n'
161 161 paged! 'user: test\n'
162 162 paged! 'date: Thu Jan 01 00:00:00 1970 +0000\n'
163 163 paged! 'summary: modify a 8\n'
164 164 paged! '\n'
165 165
166 166 An invalid pager command name is reported sensibly if we don't have to
167 167 use shell=True in the subprocess call:
168 168 $ hg log --limit 3 --config pager.pager=this-command-better-never-exist
169 169 missing pager command 'this-command-better-never-exist', skipping pager
170 170 \x1b[0;33mchangeset: 10:46106edeeb38\x1b[0m (esc)
171 171 tag: tip
172 172 user: test
173 173 date: Thu Jan 01 00:00:00 1970 +0000
174 174 summary: modify a 10
175 175
176 176 \x1b[0;33mchangeset: 9:6dd8ea7dd621\x1b[0m (esc)
177 177 user: test
178 178 date: Thu Jan 01 00:00:00 1970 +0000
179 179 summary: modify a 9
180 180
181 181 \x1b[0;33mchangeset: 8:cff05a6312fe\x1b[0m (esc)
182 182 user: test
183 183 date: Thu Jan 01 00:00:00 1970 +0000
184 184 summary: modify a 8
185 185
186 186
187 187 A complicated pager command gets worse behavior. Bonus points if you can
188 188 improve this.
189 189 $ hg log --limit 3 \
190 190 > --config pager.pager='this-command-better-never-exist --seriously' \
191 191 > 2>/dev/null || true
192 192
193 193 Pager works with shell aliases.
194 194
195 195 $ cat >> $HGRCPATH <<EOF
196 196 > [alias]
197 197 > echoa = !echo a
198 198 > EOF
199 199
200 200 $ hg echoa
201 201 a
202 202 BROKEN: should be paged
203 203 $ hg --config pager.attend-echoa=yes echoa
204 204 a
205 205
206 206 Pager works with hg aliases including environment variables.
207 207
208 208 $ cat >> $HGRCPATH <<'EOF'
209 209 > [alias]
210 210 > printa = log -T "$A\n" -r 0
211 211 > EOF
212 212
213 213 $ A=1 hg --config pager.attend-printa=yes printa
214 214 paged! '1\n'
215 215 $ A=2 hg --config pager.attend-printa=yes printa
216 216 paged! '2\n'
217 217
218 218 Something that's explicitly attended is still not paginated if the
219 219 pager is globally set to off using a flag:
220 220 $ A=2 hg --config pager.attend-printa=yes printa --pager=no
221 221 2
222 222
223 223 Pager should not override the exit code of other commands
224 224
225 225 $ cat >> $TESTTMP/fortytwo.py <<'EOF'
226 226 > from mercurial import cmdutil, commands
227 227 > cmdtable = {}
228 228 > command = cmdutil.command(cmdtable)
229 229 > @command('fortytwo', [], 'fortytwo', norepo=True)
230 230 > def fortytwo(ui, *opts):
231 231 > ui.write('42\n')
232 232 > return 42
233 233 > EOF
234 234
235 235 $ cat >> $HGRCPATH <<'EOF'
236 236 > [extensions]
237 237 > fortytwo = $TESTTMP/fortytwo.py
238 238 > EOF
239 239
240 240 $ hg fortytwo --pager=on
241 241 paged! '42\n'
242 242 [42]
243 243
244 244 A command that asks for paging using ui.pager() directly works:
245 245 $ hg blame a
246 246 paged! ' 0: a\n'
247 247 paged! ' 1: a 1\n'
248 248 paged! ' 2: a 2\n'
249 249 paged! ' 3: a 3\n'
250 250 paged! ' 4: a 4\n'
251 251 paged! ' 5: a 5\n'
252 252 paged! ' 6: a 6\n'
253 253 paged! ' 7: a 7\n'
254 254 paged! ' 8: a 8\n'
255 255 paged! ' 9: a 9\n'
256 256 paged! '10: a 10\n'
257 257 but not with HGPLAIN
258 258 $ HGPLAIN=1 hg blame a
259 259 0: a
260 260 1: a 1
261 261 2: a 2
262 262 3: a 3
263 263 4: a 4
264 264 5: a 5
265 265 6: a 6
266 266 7: a 7
267 267 8: a 8
268 268 9: a 9
269 269 10: a 10
270 270 explicit flags work too:
271 271 $ hg blame --pager=no a
272 272 0: a
273 273 1: a 1
274 274 2: a 2
275 275 3: a 3
276 276 4: a 4
277 277 5: a 5
278 278 6: a 6
279 279 7: a 7
280 280 8: a 8
281 281 9: a 9
282 282 10: a 10
283 283
284 284 Put annotate in the ignore list for pager:
285 285 $ cat >> $HGRCPATH <<EOF
286 286 > [pager]
287 287 > ignore = annotate
288 288 > EOF
289 289 $ hg blame a
290 290 0: a
291 291 1: a 1
292 292 2: a 2
293 293 3: a 3
294 294 4: a 4
295 295 5: a 5
296 296 6: a 6
297 297 7: a 7
298 298 8: a 8
299 299 9: a 9
300 300 10: a 10
301 301
302 302 Environment variables like LESS and LV are set automatically:
303 303 $ cat > $TESTTMP/printlesslv.py <<EOF
304 304 > import os, sys
305 305 > sys.stdin.read()
306 306 > for name in ['LESS', 'LV']:
307 307 > sys.stdout.write(('%s=%s\n') % (name, os.environ.get(name, '-')))
308 308 > sys.stdout.flush()
309 309 > EOF
310 310
311 311 $ cat >> $HGRCPATH <<EOF
312 312 > [alias]
313 313 > noop = log -r 0 -T ''
314 314 > [ui]
315 315 > formatted=1
316 316 > [pager]
317 317 > pager = $PYTHON $TESTTMP/printlesslv.py
318 318 > EOF
319 319 $ unset LESS
320 320 $ unset LV
321 321 $ hg noop --pager=on
322 322 LESS=FRX
323 323 LV=-c
324 324 $ LESS=EFGH hg noop --pager=on
325 325 LESS=EFGH
326 326 LV=-c
General Comments 0
You need to be logged in to leave comments. Login now