##// END OF EJS Templates
hgweb: support alternate logo url...
Steven Stallion -
r13964:616ad3f6 default
parent child Browse files
Show More
@@ -1,1140 +1,1143 b''
1 1 ======
2 2 hgrc
3 3 ======
4 4
5 5 ---------------------------------
6 6 configuration files for Mercurial
7 7 ---------------------------------
8 8
9 9 :Author: Bryan O'Sullivan <bos@serpentine.com>
10 10 :Organization: Mercurial
11 11 :Manual section: 5
12 12 :Manual group: Mercurial Manual
13 13
14 14 .. contents::
15 15 :backlinks: top
16 16 :class: htmlonly
17 17
18 18
19 19 Synopsis
20 20 --------
21 21
22 22 The Mercurial system uses a set of configuration files to control
23 23 aspects of its behavior.
24 24
25 25 Files
26 26 -----
27 27
28 28 Mercurial reads configuration data from several files, if they exist.
29 29 The names of these files depend on the system on which Mercurial is
30 30 installed. ``*.rc`` files from a single directory are read in
31 31 alphabetical order, later ones overriding earlier ones. Where multiple
32 32 paths are given below, settings from earlier paths override later
33 33 ones.
34 34
35 35 | (Unix, Windows) ``<repo>/.hg/hgrc``
36 36
37 37 Per-repository configuration options that only apply in a
38 38 particular repository. This file is not version-controlled, and
39 39 will not get transferred during a "clone" operation. Options in
40 40 this file override options in all other configuration files. On
41 41 Unix, most of this file will be ignored if it doesn't belong to a
42 42 trusted user or to a trusted group. See the documentation for the
43 43 trusted_ section below for more details.
44 44
45 45 | (Unix) ``$HOME/.hgrc``
46 46 | (Windows) ``%USERPROFILE%\.hgrc``
47 47 | (Windows) ``%USERPROFILE%\Mercurial.ini``
48 48 | (Windows) ``%HOME%\.hgrc``
49 49 | (Windows) ``%HOME%\Mercurial.ini``
50 50
51 51 Per-user configuration file(s), for the user running Mercurial. On
52 52 Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these
53 53 files apply to all Mercurial commands executed by this user in any
54 54 directory. Options in these files override per-system and per-installation
55 55 options.
56 56
57 57 | (Unix) ``/etc/mercurial/hgrc``
58 58 | (Unix) ``/etc/mercurial/hgrc.d/*.rc``
59 59
60 60 Per-system configuration files, for the system on which Mercurial
61 61 is running. Options in these files apply to all Mercurial commands
62 62 executed by any user in any directory. Options in these files
63 63 override per-installation options.
64 64
65 65 | (Unix) ``<install-root>/etc/mercurial/hgrc``
66 66 | (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``
67 67
68 68 Per-installation configuration files, searched for in the
69 69 directory where Mercurial is installed. ``<install-root>`` is the
70 70 parent directory of the **hg** executable (or symlink) being run. For
71 71 example, if installed in ``/shared/tools/bin/hg``, Mercurial will look
72 72 in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply
73 73 to all Mercurial commands executed by any user in any directory.
74 74
75 75 | (Windows) ``<install-dir>\Mercurial.ini``
76 76 | (Windows) ``<install-dir>\hgrc.d\*.rc``
77 77 | (Windows) ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial``
78 78
79 79 Per-installation/system configuration files, for the system on
80 80 which Mercurial is running. Options in these files apply to all
81 81 Mercurial commands executed by any user in any directory. Registry
82 82 keys contain PATH-like strings, every part of which must reference
83 83 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
84 84 be read. Mercurial checks each of these locations in the specified
85 85 order until one or more configuration files are detected. If the
86 86 pywin32 extensions are not installed, Mercurial will only look for
87 87 site-wide configuration in ``C:\Mercurial\Mercurial.ini``.
88 88
89 89 Syntax
90 90 ------
91 91
92 92 A configuration file consists of sections, led by a ``[section]`` header
93 93 and followed by ``name = value`` entries (sometimes called
94 94 ``configuration keys``)::
95 95
96 96 [spam]
97 97 eggs=ham
98 98 green=
99 99 eggs
100 100
101 101 Each line contains one entry. If the lines that follow are indented,
102 102 they are treated as continuations of that entry. Leading whitespace is
103 103 removed from values. Empty lines are skipped. Lines beginning with
104 104 ``#`` or ``;`` are ignored and may be used to provide comments.
105 105
106 106 Configuration keys can be set multiple times, in which case mercurial
107 107 will use the value that was configured last. As an example::
108 108
109 109 [spam]
110 110 eggs=large
111 111 ham=serrano
112 112 eggs=small
113 113
114 114 This would set the configuration key named ``eggs`` to ``small``.
115 115
116 116 It is also possible to define a section multiple times. A section can
117 117 be redefined on the same and/or on different hgrc files. For example::
118 118
119 119 [foo]
120 120 eggs=large
121 121 ham=serrano
122 122 eggs=small
123 123
124 124 [bar]
125 125 eggs=ham
126 126 green=
127 127 eggs
128 128
129 129 [foo]
130 130 ham=prosciutto
131 131 eggs=medium
132 132 bread=toasted
133 133
134 134 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
135 135 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
136 136 respectively. As you can see there only thing that matters is the last
137 137 value that was set for each of the configuration keys.
138 138
139 139 If a configuration key is set multiple times in different
140 140 configuration files the final value will depend on the order in which
141 141 the different configuration files are read, with settings from earlier
142 142 paths overriding later ones as described on the ``Files`` section
143 143 above.
144 144
145 145 A line of the form ``%include file`` will include ``file`` into the
146 146 current configuration file. The inclusion is recursive, which means
147 147 that included files can include other files. Filenames are relative to
148 148 the configuration file in which the ``%include`` directive is found.
149 149 Environment variables and ``~user`` constructs are expanded in
150 150 ``file``. This lets you do something like::
151 151
152 152 %include ~/.hgrc.d/$HOST.rc
153 153
154 154 to include a different configuration file on each computer you use.
155 155
156 156 A line with ``%unset name`` will remove ``name`` from the current
157 157 section, if it has been set previously.
158 158
159 159 The values are either free-form text strings, lists of text strings,
160 160 or Boolean values. Boolean values can be set to true using any of "1",
161 161 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
162 162 (all case insensitive).
163 163
164 164 List values are separated by whitespace or comma, except when values are
165 165 placed in double quotation marks::
166 166
167 167 allow_read = "John Doe, PhD", brian, betty
168 168
169 169 Quotation marks can be escaped by prefixing them with a backslash. Only
170 170 quotation marks at the beginning of a word is counted as a quotation
171 171 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
172 172
173 173 Sections
174 174 --------
175 175
176 176 This section describes the different sections that may appear in a
177 177 Mercurial "hgrc" file, the purpose of each section, its possible keys,
178 178 and their possible values.
179 179
180 180 ``alias``
181 181 """""""""
182 182 Defines command aliases.
183 183 Aliases allow you to define your own commands in terms of other
184 184 commands (or aliases), optionally including arguments.
185 185
186 186 Alias definitions consist of lines of the form::
187 187
188 188 <alias> = <command> [<argument]...
189 189
190 190 For example, this definition::
191 191
192 192 latest = log --limit 5
193 193
194 194 creates a new command ``latest`` that shows only the five most recent
195 195 changesets. You can define subsequent aliases using earlier ones::
196 196
197 197 stable5 = latest -b stable
198 198
199 199 .. note:: It is possible to create aliases with the same names as
200 200 existing commands, which will then override the original
201 201 definitions. This is almost always a bad idea!
202 202
203 203
204 204 ``auth``
205 205 """"""""
206 206
207 207 Authentication credentials for HTTP authentication. This section
208 208 allows you to store usernames and passwords for use when logging
209 209 *into* HTTP servers. See the web_ configuration section if you want to
210 210 configure *who* can login to your HTTP server.
211 211
212 212 Each line has the following format::
213 213
214 214 <name>.<argument> = <value>
215 215
216 216 where ``<name>`` is used to group arguments into authentication
217 217 entries. Example::
218 218
219 219 foo.prefix = hg.intevation.org/mercurial
220 220 foo.username = foo
221 221 foo.password = bar
222 222 foo.schemes = http https
223 223
224 224 bar.prefix = secure.example.org
225 225 bar.key = path/to/file.key
226 226 bar.cert = path/to/file.cert
227 227 bar.schemes = https
228 228
229 229 Supported arguments:
230 230
231 231 ``prefix``
232 232 Either ``*`` or a URI prefix with or without the scheme part.
233 233 The authentication entry with the longest matching prefix is used
234 234 (where ``*`` matches everything and counts as a match of length
235 235 1). If the prefix doesn't include a scheme, the match is performed
236 236 against the URI with its scheme stripped as well, and the schemes
237 237 argument, q.v., is then subsequently consulted.
238 238 ``username``
239 239 Optional. Username to authenticate with. If not given, and the
240 240 remote site requires basic or digest authentication, the user will
241 241 be prompted for it. Environment variables are expanded in the
242 242 username letting you do ``foo.username = $USER``.
243 243 ``password``
244 244 Optional. Password to authenticate with. If not given, and the
245 245 remote site requires basic or digest authentication, the user
246 246 will be prompted for it.
247 247 ``key``
248 248 Optional. PEM encoded client certificate key file. Environment
249 249 variables are expanded in the filename.
250 250 ``cert``
251 251 Optional. PEM encoded client certificate chain file. Environment
252 252 variables are expanded in the filename.
253 253 ``schemes``
254 254 Optional. Space separated list of URI schemes to use this
255 255 authentication entry with. Only used if the prefix doesn't include
256 256 a scheme. Supported schemes are http and https. They will match
257 257 static-http and static-https respectively, as well.
258 258 Default: https.
259 259
260 260 If no suitable authentication entry is found, the user is prompted
261 261 for credentials as usual if required by the remote.
262 262
263 263
264 264 ``decode/encode``
265 265 """""""""""""""""
266 266 Filters for transforming files on checkout/checkin. This would
267 267 typically be used for newline processing or other
268 268 localization/canonicalization of files.
269 269
270 270 Filters consist of a filter pattern followed by a filter command.
271 271 Filter patterns are globs by default, rooted at the repository root.
272 272 For example, to match any file ending in ``.txt`` in the root
273 273 directory only, use the pattern ``*.txt``. To match any file ending
274 274 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
275 275 For each file only the first matching filter applies.
276 276
277 277 The filter command can start with a specifier, either ``pipe:`` or
278 278 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
279 279
280 280 A ``pipe:`` command must accept data on stdin and return the transformed
281 281 data on stdout.
282 282
283 283 Pipe example::
284 284
285 285 [encode]
286 286 # uncompress gzip files on checkin to improve delta compression
287 287 # note: not necessarily a good idea, just an example
288 288 *.gz = pipe: gunzip
289 289
290 290 [decode]
291 291 # recompress gzip files when writing them to the working dir (we
292 292 # can safely omit "pipe:", because it's the default)
293 293 *.gz = gzip
294 294
295 295 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
296 296 with the name of a temporary file that contains the data to be
297 297 filtered by the command. The string ``OUTFILE`` is replaced with the name
298 298 of an empty temporary file, where the filtered data must be written by
299 299 the command.
300 300
301 301 .. note:: The tempfile mechanism is recommended for Windows systems,
302 302 where the standard shell I/O redirection operators often have
303 303 strange effects and may corrupt the contents of your files.
304 304
305 305 This filter mechanism is used internally by the ``eol`` extension to
306 306 translate line ending characters between Windows (CRLF) and Unix (LF)
307 307 format. We suggest you use the ``eol`` extension for convenience.
308 308
309 309
310 310 ``defaults``
311 311 """"""""""""
312 312
313 313 (defaults are deprecated. Don't use them. Use aliases instead)
314 314
315 315 Use the ``[defaults]`` section to define command defaults, i.e. the
316 316 default options/arguments to pass to the specified commands.
317 317
318 318 The following example makes :hg:`log` run in verbose mode, and
319 319 :hg:`status` show only the modified files, by default::
320 320
321 321 [defaults]
322 322 log = -v
323 323 status = -m
324 324
325 325 The actual commands, instead of their aliases, must be used when
326 326 defining command defaults. The command defaults will also be applied
327 327 to the aliases of the commands defined.
328 328
329 329
330 330 ``diff``
331 331 """"""""
332 332
333 333 Settings used when displaying diffs. Everything except for ``unified`` is a
334 334 Boolean and defaults to False.
335 335
336 336 ``git``
337 337 Use git extended diff format.
338 338 ``nodates``
339 339 Don't include dates in diff headers.
340 340 ``showfunc``
341 341 Show which function each change is in.
342 342 ``ignorews``
343 343 Ignore white space when comparing lines.
344 344 ``ignorewsamount``
345 345 Ignore changes in the amount of white space.
346 346 ``ignoreblanklines``
347 347 Ignore changes whose lines are all blank.
348 348 ``unified``
349 349 Number of lines of context to show.
350 350
351 351 ``email``
352 352 """""""""
353 353 Settings for extensions that send email messages.
354 354
355 355 ``from``
356 356 Optional. Email address to use in "From" header and SMTP envelope
357 357 of outgoing messages.
358 358 ``to``
359 359 Optional. Comma-separated list of recipients' email addresses.
360 360 ``cc``
361 361 Optional. Comma-separated list of carbon copy recipients'
362 362 email addresses.
363 363 ``bcc``
364 364 Optional. Comma-separated list of blind carbon copy recipients'
365 365 email addresses.
366 366 ``method``
367 367 Optional. Method to use to send email messages. If value is ``smtp``
368 368 (default), use SMTP (see the SMTP_ section for configuration).
369 369 Otherwise, use as name of program to run that acts like sendmail
370 370 (takes ``-f`` option for sender, list of recipients on command line,
371 371 message on stdin). Normally, setting this to ``sendmail`` or
372 372 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
373 373 ``charsets``
374 374 Optional. Comma-separated list of character sets considered
375 375 convenient for recipients. Addresses, headers, and parts not
376 376 containing patches of outgoing messages will be encoded in the
377 377 first character set to which conversion from local encoding
378 378 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
379 379 conversion fails, the text in question is sent as is. Defaults to
380 380 empty (explicit) list.
381 381
382 382 Order of outgoing email character sets:
383 383
384 384 1. ``us-ascii``: always first, regardless of settings
385 385 2. ``email.charsets``: in order given by user
386 386 3. ``ui.fallbackencoding``: if not in email.charsets
387 387 4. ``$HGENCODING``: if not in email.charsets
388 388 5. ``utf-8``: always last, regardless of settings
389 389
390 390 Email example::
391 391
392 392 [email]
393 393 from = Joseph User <joe.user@example.com>
394 394 method = /usr/sbin/sendmail
395 395 # charsets for western Europeans
396 396 # us-ascii, utf-8 omitted, as they are tried first and last
397 397 charsets = iso-8859-1, iso-8859-15, windows-1252
398 398
399 399
400 400 ``extensions``
401 401 """"""""""""""
402 402
403 403 Mercurial has an extension mechanism for adding new features. To
404 404 enable an extension, create an entry for it in this section.
405 405
406 406 If you know that the extension is already in Python's search path,
407 407 you can give the name of the module, followed by ``=``, with nothing
408 408 after the ``=``.
409 409
410 410 Otherwise, give a name that you choose, followed by ``=``, followed by
411 411 the path to the ``.py`` file (including the file name extension) that
412 412 defines the extension.
413 413
414 414 To explicitly disable an extension that is enabled in an hgrc of
415 415 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
416 416 or ``foo = !`` when path is not supplied.
417 417
418 418 Example for ``~/.hgrc``::
419 419
420 420 [extensions]
421 421 # (the mq extension will get loaded from Mercurial's path)
422 422 mq =
423 423 # (this extension will get loaded from the file specified)
424 424 myfeature = ~/.hgext/myfeature.py
425 425
426 426
427 427 ``hostfingerprints``
428 428 """"""""""""""""""""
429 429
430 430 Fingerprints of the certificates of known HTTPS servers.
431 431 A HTTPS connection to a server with a fingerprint configured here will
432 432 only succeed if the servers certificate matches the fingerprint.
433 433 This is very similar to how ssh known hosts works.
434 434 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
435 435 The CA chain and web.cacerts is not used for servers with a fingerprint.
436 436
437 437 For example::
438 438
439 439 [hostfingerprints]
440 440 hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc
441 441
442 442 This feature is only supported when using Python 2.6 or later.
443 443
444 444
445 445 ``format``
446 446 """"""""""
447 447
448 448 ``usestore``
449 449 Enable or disable the "store" repository format which improves
450 450 compatibility with systems that fold case or otherwise mangle
451 451 filenames. Enabled by default. Disabling this option will allow
452 452 you to store longer filenames in some situations at the expense of
453 453 compatibility and ensures that the on-disk format of newly created
454 454 repositories will be compatible with Mercurial before version 0.9.4.
455 455
456 456 ``usefncache``
457 457 Enable or disable the "fncache" repository format which enhances
458 458 the "store" repository format (which has to be enabled to use
459 459 fncache) to allow longer filenames and avoids using Windows
460 460 reserved names, e.g. "nul". Enabled by default. Disabling this
461 461 option ensures that the on-disk format of newly created
462 462 repositories will be compatible with Mercurial before version 1.1.
463 463
464 464 ``dotencode``
465 465 Enable or disable the "dotencode" repository format which enhances
466 466 the "fncache" repository format (which has to be enabled to use
467 467 dotencode) to avoid issues with filenames starting with ._ on
468 468 Mac OS X and spaces on Windows. Enabled by default. Disabling this
469 469 option ensures that the on-disk format of newly created
470 470 repositories will be compatible with Mercurial before version 1.7.
471 471
472 472 ``merge-patterns``
473 473 """"""""""""""""""
474 474
475 475 This section specifies merge tools to associate with particular file
476 476 patterns. Tools matched here will take precedence over the default
477 477 merge tool. Patterns are globs by default, rooted at the repository
478 478 root.
479 479
480 480 Example::
481 481
482 482 [merge-patterns]
483 483 **.c = kdiff3
484 484 **.jpg = myimgmerge
485 485
486 486 ``merge-tools``
487 487 """""""""""""""
488 488
489 489 This section configures external merge tools to use for file-level
490 490 merges.
491 491
492 492 Example ``~/.hgrc``::
493 493
494 494 [merge-tools]
495 495 # Override stock tool location
496 496 kdiff3.executable = ~/bin/kdiff3
497 497 # Specify command line
498 498 kdiff3.args = $base $local $other -o $output
499 499 # Give higher priority
500 500 kdiff3.priority = 1
501 501
502 502 # Define new tool
503 503 myHtmlTool.args = -m $local $other $base $output
504 504 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
505 505 myHtmlTool.priority = 1
506 506
507 507 Supported arguments:
508 508
509 509 ``priority``
510 510 The priority in which to evaluate this tool.
511 511 Default: 0.
512 512 ``executable``
513 513 Either just the name of the executable or its pathname. On Windows,
514 514 the path can use environment variables with ${ProgramFiles} syntax.
515 515 Default: the tool name.
516 516 ``args``
517 517 The arguments to pass to the tool executable. You can refer to the
518 518 files being merged as well as the output file through these
519 519 variables: ``$base``, ``$local``, ``$other``, ``$output``.
520 520 Default: ``$local $base $other``
521 521 ``premerge``
522 522 Attempt to run internal non-interactive 3-way merge tool before
523 523 launching external tool. Options are ``true``, ``false``, or ``keep``
524 524 to leave markers in the file if the premerge fails.
525 525 Default: True
526 526 ``binary``
527 527 This tool can merge binary files. Defaults to False, unless tool
528 528 was selected by file pattern match.
529 529 ``symlink``
530 530 This tool can merge symlinks. Defaults to False, even if tool was
531 531 selected by file pattern match.
532 532 ``check``
533 533 A list of merge success-checking options:
534 534
535 535 ``changed``
536 536 Ask whether merge was successful when the merged file shows no changes.
537 537 ``conflicts``
538 538 Check whether there are conflicts even though the tool reported success.
539 539 ``prompt``
540 540 Always prompt for merge success, regardless of success reported by tool.
541 541
542 542 ``checkchanged``
543 543 True is equivalent to ``check = changed``.
544 544 Default: False
545 545 ``checkconflicts``
546 546 True is equivalent to ``check = conflicts``.
547 547 Default: False
548 548 ``fixeol``
549 549 Attempt to fix up EOL changes caused by the merge tool.
550 550 Default: False
551 551 ``gui``
552 552 This tool requires a graphical interface to run. Default: False
553 553 ``regkey``
554 554 Windows registry key which describes install location of this
555 555 tool. Mercurial will search for this key first under
556 556 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
557 557 Default: None
558 558 ``regkeyalt``
559 559 An alternate Windows registry key to try if the first key is not
560 560 found. The alternate key uses the same ``regname`` and ``regappend``
561 561 semantics of the primary key. The most common use for this key
562 562 is to search for 32bit applications on 64bit operating systems.
563 563 Default: None
564 564 ``regname``
565 565 Name of value to read from specified registry key. Defaults to the
566 566 unnamed (default) value.
567 567 ``regappend``
568 568 String to append to the value read from the registry, typically
569 569 the executable name of the tool.
570 570 Default: None
571 571
572 572
573 573 ``hooks``
574 574 """""""""
575 575 Commands or Python functions that get automatically executed by
576 576 various actions such as starting or finishing a commit. Multiple
577 577 hooks can be run for the same action by appending a suffix to the
578 578 action. Overriding a site-wide hook can be done by changing its
579 579 value or setting it to an empty string.
580 580
581 581 Example ``.hg/hgrc``::
582 582
583 583 [hooks]
584 584 # update working directory after adding changesets
585 585 changegroup.update = hg update
586 586 # do not use the site-wide hook
587 587 incoming =
588 588 incoming.email = /my/email/hook
589 589 incoming.autobuild = /my/build/hook
590 590
591 591 Most hooks are run with environment variables set that give useful
592 592 additional information. For each hook below, the environment
593 593 variables it is passed are listed with names of the form ``$HG_foo``.
594 594
595 595 ``changegroup``
596 596 Run after a changegroup has been added via push, pull or unbundle.
597 597 ID of the first new changeset is in ``$HG_NODE``. URL from which
598 598 changes came is in ``$HG_URL``.
599 599 ``commit``
600 600 Run after a changeset has been created in the local repository. ID
601 601 of the newly created changeset is in ``$HG_NODE``. Parent changeset
602 602 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
603 603 ``incoming``
604 604 Run after a changeset has been pulled, pushed, or unbundled into
605 605 the local repository. The ID of the newly arrived changeset is in
606 606 ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
607 607 ``outgoing``
608 608 Run after sending changes from local repository to another. ID of
609 609 first changeset sent is in ``$HG_NODE``. Source of operation is in
610 610 ``$HG_SOURCE``; see "preoutgoing" hook for description.
611 611 ``post-<command>``
612 612 Run after successful invocations of the associated command. The
613 613 contents of the command line are passed as ``$HG_ARGS`` and the result
614 614 code in ``$HG_RESULT``. Parsed command line arguments are passed as
615 615 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
616 616 the python data internally passed to <command>. ``$HG_OPTS`` is a
617 617 dictionary of options (with unspecified options set to their defaults).
618 618 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
619 619 ``pre-<command>``
620 620 Run before executing the associated command. The contents of the
621 621 command line are passed as ``$HG_ARGS``. Parsed command line arguments
622 622 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
623 623 representations of the data internally passed to <command>. ``$HG_OPTS``
624 624 is a dictionary of options (with unspecified options set to their
625 625 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
626 626 failure, the command doesn't execute and Mercurial returns the failure
627 627 code.
628 628 ``prechangegroup``
629 629 Run before a changegroup is added via push, pull or unbundle. Exit
630 630 status 0 allows the changegroup to proceed. Non-zero status will
631 631 cause the push, pull or unbundle to fail. URL from which changes
632 632 will come is in ``$HG_URL``.
633 633 ``precommit``
634 634 Run before starting a local commit. Exit status 0 allows the
635 635 commit to proceed. Non-zero status will cause the commit to fail.
636 636 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
637 637 ``preoutgoing``
638 638 Run before collecting changes to send from the local repository to
639 639 another. Non-zero status will cause failure. This lets you prevent
640 640 pull over HTTP or SSH. Also prevents against local pull, push
641 641 (outbound) or bundle commands, but not effective, since you can
642 642 just copy files instead then. Source of operation is in
643 643 ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
644 644 SSH or HTTP repository. If "push", "pull" or "bundle", operation
645 645 is happening on behalf of repository on same system.
646 646 ``pretag``
647 647 Run before creating a tag. Exit status 0 allows the tag to be
648 648 created. Non-zero status will cause the tag to fail. ID of
649 649 changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
650 650 local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
651 651 ``pretxnchangegroup``
652 652 Run after a changegroup has been added via push, pull or unbundle,
653 653 but before the transaction has been committed. Changegroup is
654 654 visible to hook program. This lets you validate incoming changes
655 655 before accepting them. Passed the ID of the first new changeset in
656 656 ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero
657 657 status will cause the transaction to be rolled back and the push,
658 658 pull or unbundle will fail. URL that was source of changes is in
659 659 ``$HG_URL``.
660 660 ``pretxncommit``
661 661 Run after a changeset has been created but the transaction not yet
662 662 committed. Changeset is visible to hook program. This lets you
663 663 validate commit message and changes. Exit status 0 allows the
664 664 commit to proceed. Non-zero status will cause the transaction to
665 665 be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
666 666 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
667 667 ``preupdate``
668 668 Run before updating the working directory. Exit status 0 allows
669 669 the update to proceed. Non-zero status will prevent the update.
670 670 Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
671 671 of second new parent is in ``$HG_PARENT2``.
672 672 ``tag``
673 673 Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
674 674 Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
675 675 repository if ``$HG_LOCAL=0``.
676 676 ``update``
677 677 Run after updating the working directory. Changeset ID of first
678 678 new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
679 679 in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
680 680 update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
681 681
682 682 .. note:: It is generally better to use standard hooks rather than the
683 683 generic pre- and post- command hooks as they are guaranteed to be
684 684 called in the appropriate contexts for influencing transactions.
685 685 Also, hooks like "commit" will be called in all contexts that
686 686 generate a commit (e.g. tag) and not just the commit command.
687 687
688 688 .. note:: Environment variables with empty values may not be passed to
689 689 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
690 690 will have an empty value under Unix-like platforms for non-merge
691 691 changesets, while it will not be available at all under Windows.
692 692
693 693 The syntax for Python hooks is as follows::
694 694
695 695 hookname = python:modulename.submodule.callable
696 696 hookname = python:/path/to/python/module.py:callable
697 697
698 698 Python hooks are run within the Mercurial process. Each hook is
699 699 called with at least three keyword arguments: a ui object (keyword
700 700 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
701 701 keyword that tells what kind of hook is used. Arguments listed as
702 702 environment variables above are passed as keyword arguments, with no
703 703 ``HG_`` prefix, and names in lower case.
704 704
705 705 If a Python hook returns a "true" value or raises an exception, this
706 706 is treated as a failure.
707 707
708 708
709 709 ``http_proxy``
710 710 """"""""""""""
711 711 Used to access web-based Mercurial repositories through a HTTP
712 712 proxy.
713 713
714 714 ``host``
715 715 Host name and (optional) port of the proxy server, for example
716 716 "myproxy:8000".
717 717 ``no``
718 718 Optional. Comma-separated list of host names that should bypass
719 719 the proxy.
720 720 ``passwd``
721 721 Optional. Password to authenticate with at the proxy server.
722 722 ``user``
723 723 Optional. User name to authenticate with at the proxy server.
724 724 ``always``
725 725 Optional. Always use the proxy, even for localhost and any entries
726 726 in ``http_proxy.no``. True or False. Default: False.
727 727
728 728 ``smtp``
729 729 """"""""
730 730 Configuration for extensions that need to send email messages.
731 731
732 732 ``host``
733 733 Host name of mail server, e.g. "mail.example.com".
734 734 ``port``
735 735 Optional. Port to connect to on mail server. Default: 25.
736 736 ``tls``
737 737 Optional. Method to enable TLS when connecting to mail server: starttls,
738 738 smtps or none. Default: none.
739 739 ``username``
740 740 Optional. User name for authenticating with the SMTP server.
741 741 Default: none.
742 742 ``password``
743 743 Optional. Password for authenticating with the SMTP server. If not
744 744 specified, interactive sessions will prompt the user for a
745 745 password; non-interactive sessions will fail. Default: none.
746 746 ``local_hostname``
747 747 Optional. It's the hostname that the sender can use to identify
748 748 itself to the MTA.
749 749
750 750
751 751 ``patch``
752 752 """""""""
753 753 Settings used when applying patches, for instance through the 'import'
754 754 command or with Mercurial Queues extension.
755 755
756 756 ``eol``
757 757 When set to 'strict' patch content and patched files end of lines
758 758 are preserved. When set to ``lf`` or ``crlf``, both files end of
759 759 lines are ignored when patching and the result line endings are
760 760 normalized to either LF (Unix) or CRLF (Windows). When set to
761 761 ``auto``, end of lines are again ignored while patching but line
762 762 endings in patched files are normalized to their original setting
763 763 on a per-file basis. If target file does not exist or has no end
764 764 of line, patch line endings are preserved.
765 765 Default: strict.
766 766
767 767
768 768 ``paths``
769 769 """""""""
770 770 Assigns symbolic names to repositories. The left side is the
771 771 symbolic name, and the right gives the directory or URL that is the
772 772 location of the repository. Default paths can be declared by setting
773 773 the following entries.
774 774
775 775 ``default``
776 776 Directory or URL to use when pulling if no source is specified.
777 777 Default is set to repository from which the current repository was
778 778 cloned.
779 779 ``default-push``
780 780 Optional. Directory or URL to use when pushing if no destination
781 781 is specified.
782 782
783 783
784 784 ``profiling``
785 785 """""""""""""
786 786 Specifies profiling format and file output. In this section
787 787 description, 'profiling data' stands for the raw data collected
788 788 during profiling, while 'profiling report' stands for a statistical
789 789 text report generated from the profiling data. The profiling is done
790 790 using lsprof.
791 791
792 792 ``format``
793 793 Profiling format.
794 794 Default: text.
795 795
796 796 ``text``
797 797 Generate a profiling report. When saving to a file, it should be
798 798 noted that only the report is saved, and the profiling data is
799 799 not kept.
800 800 ``kcachegrind``
801 801 Format profiling data for kcachegrind use: when saving to a
802 802 file, the generated file can directly be loaded into
803 803 kcachegrind.
804 804 ``output``
805 805 File path where profiling data or report should be saved. If the
806 806 file exists, it is replaced. Default: None, data is printed on
807 807 stderr
808 808
809 809 ``server``
810 810 """"""""""
811 811 Controls generic server settings.
812 812
813 813 ``uncompressed``
814 814 Whether to allow clients to clone a repository using the
815 815 uncompressed streaming protocol. This transfers about 40% more
816 816 data than a regular clone, but uses less memory and CPU on both
817 817 server and client. Over a LAN (100 Mbps or better) or a very fast
818 818 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
819 819 regular clone. Over most WAN connections (anything slower than
820 820 about 6 Mbps), uncompressed streaming is slower, because of the
821 821 extra data transfer overhead. This mode will also temporarily hold
822 822 the write lock while determining what data to transfer.
823 823 Default is True.
824 824
825 825 ``validate``
826 826 Whether to validate the completeness of pushed changesets by
827 827 checking that all new file revisions specified in manifests are
828 828 present. Default is False.
829 829
830 830 ``subpaths``
831 831 """"""""""""
832 832 Defines subrepositories source locations rewriting rules of the form::
833 833
834 834 <pattern> = <replacement>
835 835
836 836 Where ``pattern`` is a regular expression matching the source and
837 837 ``replacement`` is the replacement string used to rewrite it. Groups
838 838 can be matched in ``pattern`` and referenced in ``replacements``. For
839 839 instance::
840 840
841 841 http://server/(.*)-hg/ = http://hg.server/\1/
842 842
843 843 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
844 844
845 845 All patterns are applied in definition order.
846 846
847 847 ``trusted``
848 848 """""""""""
849 849
850 850 Mercurial will not use the settings in the
851 851 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
852 852 user or to a trusted group, as various hgrc features allow arbitrary
853 853 commands to be run. This issue is often encountered when configuring
854 854 hooks or extensions for shared repositories or servers. However,
855 855 the web interface will use some safe settings from the ``[web]``
856 856 section.
857 857
858 858 This section specifies what users and groups are trusted. The
859 859 current user is always trusted. To trust everybody, list a user or a
860 860 group with name ``*``. These settings must be placed in an
861 861 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
862 862 user or service running Mercurial.
863 863
864 864 ``users``
865 865 Comma-separated list of trusted users.
866 866 ``groups``
867 867 Comma-separated list of trusted groups.
868 868
869 869
870 870 ``ui``
871 871 """"""
872 872
873 873 User interface controls.
874 874
875 875 ``archivemeta``
876 876 Whether to include the .hg_archival.txt file containing meta data
877 877 (hashes for the repository base and for tip) in archives created
878 878 by the :hg:`archive` command or downloaded via hgweb.
879 879 Default is True.
880 880 ``askusername``
881 881 Whether to prompt for a username when committing. If True, and
882 882 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
883 883 be prompted to enter a username. If no username is entered, the
884 884 default ``USER@HOST`` is used instead.
885 885 Default is False.
886 886 ``commitsubrepos``
887 887 Whether to commit modified subrepositories when committing the
888 888 parent repository. If False and one subrepository has uncommitted
889 889 changes, abort the commit.
890 890 Default is True.
891 891 ``debug``
892 892 Print debugging information. True or False. Default is False.
893 893 ``editor``
894 894 The editor to use during a commit. Default is ``$EDITOR`` or ``vi``.
895 895 ``fallbackencoding``
896 896 Encoding to try if it's not possible to decode the changelog using
897 897 UTF-8. Default is ISO-8859-1.
898 898 ``ignore``
899 899 A file to read per-user ignore patterns from. This file should be
900 900 in the same format as a repository-wide .hgignore file. This
901 901 option supports hook syntax, so if you want to specify multiple
902 902 ignore files, you can do so by setting something like
903 903 ``ignore.other = ~/.hgignore2``. For details of the ignore file
904 904 format, see the |hgignore(5)|_ man page.
905 905 ``interactive``
906 906 Allow to prompt the user. True or False. Default is True.
907 907 ``logtemplate``
908 908 Template string for commands that print changesets.
909 909 ``merge``
910 910 The conflict resolution program to use during a manual merge.
911 911 For more information on merge tools see :hg:`help merge-tools`.
912 912 For configuring merge tools see the merge-tools_ section.
913 913 ``portablefilenames``
914 914 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
915 915 Default is ``warn``.
916 916 If set to ``warn`` (or ``true``), a warning message is printed on POSIX
917 917 platforms, if a file with a non-portable filename is added (e.g. a file
918 918 with a name that can't be created on Windows because it contains reserved
919 919 parts like ``AUX`` or reserved characters like ``:``).
920 920 If set to ``ignore`` (or ``false``), no warning is printed.
921 921 If set to ``abort``, the command is aborted.
922 922 On Windows, this configuration option is ignored and the command aborted.
923 923 ``quiet``
924 924 Reduce the amount of output printed. True or False. Default is False.
925 925 ``remotecmd``
926 926 remote command to use for clone/push/pull operations. Default is ``hg``.
927 927 ``report_untrusted``
928 928 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
929 929 trusted user or group. True or False. Default is True.
930 930 ``slash``
931 931 Display paths using a slash (``/``) as the path separator. This
932 932 only makes a difference on systems where the default path
933 933 separator is not the slash character (e.g. Windows uses the
934 934 backslash character (``\``)).
935 935 Default is False.
936 936 ``ssh``
937 937 command to use for SSH connections. Default is ``ssh``.
938 938 ``strict``
939 939 Require exact command names, instead of allowing unambiguous
940 940 abbreviations. True or False. Default is False.
941 941 ``style``
942 942 Name of style to use for command output.
943 943 ``timeout``
944 944 The timeout used when a lock is held (in seconds), a negative value
945 945 means no timeout. Default is 600.
946 946 ``traceback``
947 947 Mercurial always prints a traceback when an unknown exception
948 948 occurs. Setting this to True will make Mercurial print a traceback
949 949 on all exceptions, even those recognized by Mercurial (such as
950 950 IOError or MemoryError). Default is False.
951 951 ``username``
952 952 The committer of a changeset created when running "commit".
953 953 Typically a person's name and email address, e.g. ``Fred Widget
954 954 <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. If
955 955 the username in hgrc is empty, it has to be specified manually or
956 956 in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set
957 957 ``username =`` in the system hgrc). Environment variables in the
958 958 username are expanded.
959 959 ``verbose``
960 960 Increase the amount of output printed. True or False. Default is False.
961 961
962 962
963 963 ``web``
964 964 """""""
965 965
966 966 Web interface configuration. The settings in this section apply to
967 967 both the builtin webserver (started by :hg:`serve`) and the script you
968 968 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
969 969 and WSGI).
970 970
971 971 The Mercurial webserver does no authentication (it does not prompt for
972 972 usernames and passwords to validate *who* users are), but it does do
973 973 authorization (it grants or denies access for *authenticated users*
974 974 based on settings in this section). You must either configure your
975 975 webserver to do authentication for you, or disable the authorization
976 976 checks.
977 977
978 978 For a quick setup in a trusted environment, e.g., a private LAN, where
979 979 you want it to accept pushes from anybody, you can use the following
980 980 command line::
981 981
982 982 $ hg --config web.allow_push=* --config web.push_ssl=False serve
983 983
984 984 Note that this will allow anybody to push anything to the server and
985 985 that this should not be used for public servers.
986 986
987 987 The full set of options is:
988 988
989 989 ``accesslog``
990 990 Where to output the access log. Default is stdout.
991 991 ``address``
992 992 Interface address to bind to. Default is all.
993 993 ``allow_archive``
994 994 List of archive format (bz2, gz, zip) allowed for downloading.
995 995 Default is empty.
996 996 ``allowbz2``
997 997 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
998 998 revisions.
999 999 Default is False.
1000 1000 ``allowgz``
1001 1001 (DEPRECATED) Whether to allow .tar.gz downloading of repository
1002 1002 revisions.
1003 1003 Default is False.
1004 1004 ``allowpull``
1005 1005 Whether to allow pulling from the repository. Default is True.
1006 1006 ``allow_push``
1007 1007 Whether to allow pushing to the repository. If empty or not set,
1008 1008 push is not allowed. If the special value ``*``, any remote user can
1009 1009 push, including unauthenticated users. Otherwise, the remote user
1010 1010 must have been authenticated, and the authenticated user name must
1011 1011 be present in this list. The contents of the allow_push list are
1012 1012 examined after the deny_push list.
1013 1013 ``allow_read``
1014 1014 If the user has not already been denied repository access due to
1015 1015 the contents of deny_read, this list determines whether to grant
1016 1016 repository access to the user. If this list is not empty, and the
1017 1017 user is unauthenticated or not present in the list, then access is
1018 1018 denied for the user. If the list is empty or not set, then access
1019 1019 is permitted to all users by default. Setting allow_read to the
1020 1020 special value ``*`` is equivalent to it not being set (i.e. access
1021 1021 is permitted to all users). The contents of the allow_read list are
1022 1022 examined after the deny_read list.
1023 1023 ``allowzip``
1024 1024 (DEPRECATED) Whether to allow .zip downloading of repository
1025 1025 revisions. Default is False. This feature creates temporary files.
1026 1026 ``baseurl``
1027 1027 Base URL to use when publishing URLs in other locations, so
1028 1028 third-party tools like email notification hooks can construct
1029 1029 URLs. Example: ``http://hgserver/repos/``.
1030 1030 ``cacerts``
1031 1031 Path to file containing a list of PEM encoded certificate
1032 1032 authority certificates. Environment variables and ``~user``
1033 1033 constructs are expanded in the filename. If specified on the
1034 1034 client, then it will verify the identity of remote HTTPS servers
1035 1035 with these certificates. The form must be as follows::
1036 1036
1037 1037 -----BEGIN CERTIFICATE-----
1038 1038 ... (certificate in base64 PEM encoding) ...
1039 1039 -----END CERTIFICATE-----
1040 1040 -----BEGIN CERTIFICATE-----
1041 1041 ... (certificate in base64 PEM encoding) ...
1042 1042 -----END CERTIFICATE-----
1043 1043
1044 1044 This feature is only supported when using Python 2.6 or later. If you wish
1045 1045 to use it with earlier versions of Python, install the backported
1046 1046 version of the ssl library that is available from
1047 1047 ``http://pypi.python.org``.
1048 1048
1049 1049 You can use OpenSSL's CA certificate file if your platform has one.
1050 1050 On most Linux systems this will be ``/etc/ssl/certs/ca-certificates.crt``.
1051 1051 Otherwise you will have to generate this file manually.
1052 1052
1053 1053 To disable SSL verification temporarily, specify ``--insecure`` from
1054 1054 command line.
1055 1055 ``contact``
1056 1056 Name or email address of the person in charge of the repository.
1057 1057 Defaults to ui.username or ``$EMAIL`` or "unknown" if unset or empty.
1058 1058 ``deny_push``
1059 1059 Whether to deny pushing to the repository. If empty or not set,
1060 1060 push is not denied. If the special value ``*``, all remote users are
1061 1061 denied push. Otherwise, unauthenticated users are all denied, and
1062 1062 any authenticated user name present in this list is also denied. The
1063 1063 contents of the deny_push list are examined before the allow_push list.
1064 1064 ``deny_read``
1065 1065 Whether to deny reading/viewing of the repository. If this list is
1066 1066 not empty, unauthenticated users are all denied, and any
1067 1067 authenticated user name present in this list is also denied access to
1068 1068 the repository. If set to the special value ``*``, all remote users
1069 1069 are denied access (rarely needed ;). If deny_read is empty or not set,
1070 1070 the determination of repository access depends on the presence and
1071 1071 content of the allow_read list (see description). If both
1072 1072 deny_read and allow_read are empty or not set, then access is
1073 1073 permitted to all users by default. If the repository is being
1074 1074 served via hgwebdir, denied users will not be able to see it in
1075 1075 the list of repositories. The contents of the deny_read list have
1076 1076 priority over (are examined before) the contents of the allow_read
1077 1077 list.
1078 1078 ``descend``
1079 1079 hgwebdir indexes will not descend into subdirectories. Only repositories
1080 1080 directly in the current path will be shown (other repositories are still
1081 1081 available from the index corresponding to their containing path).
1082 1082 ``description``
1083 1083 Textual description of the repository's purpose or contents.
1084 1084 Default is "unknown".
1085 1085 ``encoding``
1086 1086 Character encoding name. Default is the current locale charset.
1087 1087 Example: "UTF-8"
1088 1088 ``errorlog``
1089 1089 Where to output the error log. Default is stderr.
1090 1090 ``hidden``
1091 1091 Whether to hide the repository in the hgwebdir index.
1092 1092 Default is False.
1093 1093 ``ipv6``
1094 1094 Whether to use IPv6. Default is False.
1095 ``logourl``
1096 Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``
1097 will be used.
1095 1098 ``name``
1096 1099 Repository name to use in the web interface. Default is current
1097 1100 working directory.
1098 1101 ``maxchanges``
1099 1102 Maximum number of changes to list on the changelog. Default is 10.
1100 1103 ``maxfiles``
1101 1104 Maximum number of files to list per changeset. Default is 10.
1102 1105 ``port``
1103 1106 Port to listen on. Default is 8000.
1104 1107 ``prefix``
1105 1108 Prefix path to serve from. Default is '' (server root).
1106 1109 ``push_ssl``
1107 1110 Whether to require that inbound pushes be transported over SSL to
1108 1111 prevent password sniffing. Default is True.
1109 1112 ``staticurl``
1110 1113 Base URL to use for static files. If unset, static files (e.g. the
1111 1114 hgicon.png favicon) will be served by the CGI script itself. Use
1112 1115 this setting to serve them directly with the HTTP server.
1113 1116 Example: ``http://hgserver/static/``.
1114 1117 ``stripes``
1115 1118 How many lines a "zebra stripe" should span in multiline output.
1116 1119 Default is 1; set to 0 to disable.
1117 1120 ``style``
1118 1121 Which template map style to use.
1119 1122 ``templates``
1120 1123 Where to find the HTML templates. Default is install path.
1121 1124
1122 1125
1123 1126 Author
1124 1127 ------
1125 1128 Bryan O'Sullivan <bos@serpentine.com>.
1126 1129
1127 1130 Mercurial was written by Matt Mackall <mpm@selenic.com>.
1128 1131
1129 1132 See Also
1130 1133 --------
1131 1134 |hg(1)|_, |hgignore(5)|_
1132 1135
1133 1136 Copying
1134 1137 -------
1135 1138 This manual page is copyright 2005 Bryan O'Sullivan.
1136 1139 Mercurial is copyright 2005-2010 Matt Mackall.
1137 1140 Free use of this software is granted under the terms of the GNU General
1138 1141 Public License version 2 or any later version.
1139 1142
1140 1143 .. include:: common.txt
@@ -1,299 +1,301 b''
1 1 # hgweb/hgweb_mod.py - Web interface for a repository.
2 2 #
3 3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
4 4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
5 5 #
6 6 # This software may be used and distributed according to the terms of the
7 7 # GNU General Public License version 2 or any later version.
8 8
9 9 import os
10 10 from mercurial import ui, hg, hook, error, encoding, templater
11 11 from common import get_stat, ErrorResponse, permhooks, caching
12 12 from common import HTTP_OK, HTTP_NOT_MODIFIED, HTTP_BAD_REQUEST
13 13 from common import HTTP_NOT_FOUND, HTTP_SERVER_ERROR
14 14 from request import wsgirequest
15 15 import webcommands, protocol, webutil
16 16
17 17 perms = {
18 18 'changegroup': 'pull',
19 19 'changegroupsubset': 'pull',
20 20 'getbundle': 'pull',
21 21 'stream_out': 'pull',
22 22 'listkeys': 'pull',
23 23 'unbundle': 'push',
24 24 'pushkey': 'push',
25 25 }
26 26
27 27 class hgweb(object):
28 28 def __init__(self, repo, name=None, baseui=None):
29 29 if isinstance(repo, str):
30 30 if baseui:
31 31 u = baseui.copy()
32 32 else:
33 33 u = ui.ui()
34 34 self.repo = hg.repository(u, repo)
35 35 else:
36 36 self.repo = repo
37 37
38 38 self.repo.ui.setconfig('ui', 'report_untrusted', 'off')
39 39 self.repo.ui.setconfig('ui', 'interactive', 'off')
40 40 hook.redirect(True)
41 41 self.mtime = -1
42 42 self.size = -1
43 43 self.reponame = name
44 44 self.archives = 'zip', 'gz', 'bz2'
45 45 self.stripecount = 1
46 46 # a repo owner may set web.templates in .hg/hgrc to get any file
47 47 # readable by the user running the CGI script
48 48 self.templatepath = self.config('web', 'templates')
49 49
50 50 # The CGI scripts are often run by a user different from the repo owner.
51 51 # Trust the settings from the .hg/hgrc files by default.
52 52 def config(self, section, name, default=None, untrusted=True):
53 53 return self.repo.ui.config(section, name, default,
54 54 untrusted=untrusted)
55 55
56 56 def configbool(self, section, name, default=False, untrusted=True):
57 57 return self.repo.ui.configbool(section, name, default,
58 58 untrusted=untrusted)
59 59
60 60 def configlist(self, section, name, default=None, untrusted=True):
61 61 return self.repo.ui.configlist(section, name, default,
62 62 untrusted=untrusted)
63 63
64 64 def refresh(self, request=None):
65 65 if request:
66 66 self.repo.ui.environ = request.env
67 67 st = get_stat(self.repo.spath)
68 68 # compare changelog size in addition to mtime to catch
69 69 # rollbacks made less than a second ago
70 70 if st.st_mtime != self.mtime or st.st_size != self.size:
71 71 self.mtime = st.st_mtime
72 72 self.size = st.st_size
73 73 self.repo = hg.repository(self.repo.ui, self.repo.root)
74 74 self.maxchanges = int(self.config("web", "maxchanges", 10))
75 75 self.stripecount = int(self.config("web", "stripes", 1))
76 76 self.maxshortchanges = int(self.config("web", "maxshortchanges", 60))
77 77 self.maxfiles = int(self.config("web", "maxfiles", 10))
78 78 self.allowpull = self.configbool("web", "allowpull", True)
79 79 encoding.encoding = self.config("web", "encoding",
80 80 encoding.encoding)
81 81
82 82 def run(self):
83 83 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
84 84 raise RuntimeError("This function is only intended to be "
85 85 "called while running as a CGI script.")
86 86 import mercurial.hgweb.wsgicgi as wsgicgi
87 87 wsgicgi.launch(self)
88 88
89 89 def __call__(self, env, respond):
90 90 req = wsgirequest(env, respond)
91 91 return self.run_wsgi(req)
92 92
93 93 def run_wsgi(self, req):
94 94
95 95 self.refresh(req)
96 96
97 97 # work with CGI variables to create coherent structure
98 98 # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME
99 99
100 100 req.url = req.env['SCRIPT_NAME']
101 101 if not req.url.endswith('/'):
102 102 req.url += '/'
103 103 if 'REPO_NAME' in req.env:
104 104 req.url += req.env['REPO_NAME'] + '/'
105 105
106 106 if 'PATH_INFO' in req.env:
107 107 parts = req.env['PATH_INFO'].strip('/').split('/')
108 108 repo_parts = req.env.get('REPO_NAME', '').split('/')
109 109 if parts[:len(repo_parts)] == repo_parts:
110 110 parts = parts[len(repo_parts):]
111 111 query = '/'.join(parts)
112 112 else:
113 113 query = req.env['QUERY_STRING'].split('&', 1)[0]
114 114 query = query.split(';', 1)[0]
115 115
116 116 # process this if it's a protocol request
117 117 # protocol bits don't need to create any URLs
118 118 # and the clients always use the old URL structure
119 119
120 120 cmd = req.form.get('cmd', [''])[0]
121 121 if protocol.iscmd(cmd):
122 122 try:
123 123 if query:
124 124 raise ErrorResponse(HTTP_NOT_FOUND)
125 125 if cmd in perms:
126 126 self.check_perm(req, perms[cmd])
127 127 return protocol.call(self.repo, req, cmd)
128 128 except ErrorResponse, inst:
129 129 # A client that sends unbundle without 100-continue will
130 130 # break if we respond early.
131 131 if (cmd == 'unbundle' and
132 132 req.env.get('HTTP_EXPECT',
133 133 '').lower() != '100-continue'):
134 134 req.drain()
135 135 req.respond(inst, protocol.HGTYPE)
136 136 return '0\n%s\n' % inst.message
137 137
138 138 # translate user-visible url structure to internal structure
139 139
140 140 args = query.split('/', 2)
141 141 if 'cmd' not in req.form and args and args[0]:
142 142
143 143 cmd = args.pop(0)
144 144 style = cmd.rfind('-')
145 145 if style != -1:
146 146 req.form['style'] = [cmd[:style]]
147 147 cmd = cmd[style + 1:]
148 148
149 149 # avoid accepting e.g. style parameter as command
150 150 if hasattr(webcommands, cmd):
151 151 req.form['cmd'] = [cmd]
152 152 else:
153 153 cmd = ''
154 154
155 155 if cmd == 'static':
156 156 req.form['file'] = ['/'.join(args)]
157 157 else:
158 158 if args and args[0]:
159 159 node = args.pop(0)
160 160 req.form['node'] = [node]
161 161 if args:
162 162 req.form['file'] = args
163 163
164 164 ua = req.env.get('HTTP_USER_AGENT', '')
165 165 if cmd == 'rev' and 'mercurial' in ua:
166 166 req.form['style'] = ['raw']
167 167
168 168 if cmd == 'archive':
169 169 fn = req.form['node'][0]
170 170 for type_, spec in self.archive_specs.iteritems():
171 171 ext = spec[2]
172 172 if fn.endswith(ext):
173 173 req.form['node'] = [fn[:-len(ext)]]
174 174 req.form['type'] = [type_]
175 175
176 176 # process the web interface request
177 177
178 178 try:
179 179 tmpl = self.templater(req)
180 180 ctype = tmpl('mimetype', encoding=encoding.encoding)
181 181 ctype = templater.stringify(ctype)
182 182
183 183 # check read permissions non-static content
184 184 if cmd != 'static':
185 185 self.check_perm(req, None)
186 186
187 187 if cmd == '':
188 188 req.form['cmd'] = [tmpl.cache['default']]
189 189 cmd = req.form['cmd'][0]
190 190
191 191 caching(self, req) # sets ETag header or raises NOT_MODIFIED
192 192 if cmd not in webcommands.__all__:
193 193 msg = 'no such method: %s' % cmd
194 194 raise ErrorResponse(HTTP_BAD_REQUEST, msg)
195 195 elif cmd == 'file' and 'raw' in req.form.get('style', []):
196 196 self.ctype = ctype
197 197 content = webcommands.rawfile(self, req, tmpl)
198 198 else:
199 199 content = getattr(webcommands, cmd)(self, req, tmpl)
200 200 req.respond(HTTP_OK, ctype)
201 201
202 202 return content
203 203
204 204 except error.LookupError, err:
205 205 req.respond(HTTP_NOT_FOUND, ctype)
206 206 msg = str(err)
207 207 if 'manifest' not in msg:
208 208 msg = 'revision not found: %s' % err.name
209 209 return tmpl('error', error=msg)
210 210 except (error.RepoError, error.RevlogError), inst:
211 211 req.respond(HTTP_SERVER_ERROR, ctype)
212 212 return tmpl('error', error=str(inst))
213 213 except ErrorResponse, inst:
214 214 req.respond(inst, ctype)
215 215 if inst.code == HTTP_NOT_MODIFIED:
216 216 # Not allowed to return a body on a 304
217 217 return ['']
218 218 return tmpl('error', error=inst.message)
219 219
220 220 def templater(self, req):
221 221
222 222 # determine scheme, port and server name
223 223 # this is needed to create absolute urls
224 224
225 225 proto = req.env.get('wsgi.url_scheme')
226 226 if proto == 'https':
227 227 proto = 'https'
228 228 default_port = "443"
229 229 else:
230 230 proto = 'http'
231 231 default_port = "80"
232 232
233 233 port = req.env["SERVER_PORT"]
234 234 port = port != default_port and (":" + port) or ""
235 235 urlbase = '%s://%s%s' % (proto, req.env['SERVER_NAME'], port)
236 logourl = self.config("web", "logourl", "http://mercurial.selenic.com/")
236 237 staticurl = self.config("web", "staticurl") or req.url + 'static/'
237 238 if not staticurl.endswith('/'):
238 239 staticurl += '/'
239 240
240 241 # some functions for the templater
241 242
242 243 def header(**map):
243 244 yield tmpl('header', encoding=encoding.encoding, **map)
244 245
245 246 def footer(**map):
246 247 yield tmpl("footer", **map)
247 248
248 249 def motd(**map):
249 250 yield self.config("web", "motd", "")
250 251
251 252 # figure out which style to use
252 253
253 254 vars = {}
254 255 styles = (
255 256 req.form.get('style', [None])[0],
256 257 self.config('web', 'style'),
257 258 'paper',
258 259 )
259 260 style, mapfile = templater.stylemap(styles, self.templatepath)
260 261 if style == styles[0]:
261 262 vars['style'] = style
262 263
263 264 start = req.url[-1] == '?' and '&' or '?'
264 265 sessionvars = webutil.sessionvars(vars, start)
265 266
266 267 if not self.reponame:
267 268 self.reponame = (self.config("web", "name")
268 269 or req.env.get('REPO_NAME')
269 270 or req.url.strip('/') or self.repo.root)
270 271
271 272 # create the templater
272 273
273 274 tmpl = templater.templater(mapfile,
274 275 defaults={"url": req.url,
276 "logourl": logourl,
275 277 "staticurl": staticurl,
276 278 "urlbase": urlbase,
277 279 "repo": self.reponame,
278 280 "header": header,
279 281 "footer": footer,
280 282 "motd": motd,
281 283 "sessionvars": sessionvars
282 284 })
283 285 return tmpl
284 286
285 287 def archivelist(self, nodeid):
286 288 allowed = self.configlist("web", "allow_archive")
287 289 for i, spec in self.archive_specs.iteritems():
288 290 if i in allowed or self.configbool("web", "allow" + i):
289 291 yield {"type" : i, "extension" : spec[2], "node" : nodeid}
290 292
291 293 archive_specs = {
292 294 'bz2': ('application/x-bzip2', 'tbz2', '.tar.bz2', None),
293 295 'gz': ('application/x-gzip', 'tgz', '.tar.gz', None),
294 296 'zip': ('application/zip', 'zip', '.zip', None),
295 297 }
296 298
297 299 def check_perm(self, req, op):
298 300 for hook in permhooks:
299 301 hook(self, req, op)
@@ -1,369 +1,371 b''
1 1 # hgweb/hgwebdir_mod.py - Web interface for a directory of repositories.
2 2 #
3 3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
4 4 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
5 5 #
6 6 # This software may be used and distributed according to the terms of the
7 7 # GNU General Public License version 2 or any later version.
8 8
9 9 import os, re, time
10 10 from mercurial.i18n import _
11 11 from mercurial import ui, hg, util, templater
12 12 from mercurial import error, encoding, url
13 13 from common import ErrorResponse, get_mtime, staticfile, paritygen, \
14 14 get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
15 15 from hgweb_mod import hgweb
16 16 from request import wsgirequest
17 17 import webutil
18 18
19 19 def cleannames(items):
20 20 return [(util.pconvert(name).strip('/'), path) for name, path in items]
21 21
22 22 def findrepos(paths):
23 23 repos = []
24 24 for prefix, root in cleannames(paths):
25 25 roothead, roottail = os.path.split(root)
26 26 # "foo = /bar/*" makes every subrepo of /bar/ to be
27 27 # mounted as foo/subrepo
28 28 # and "foo = /bar/**" also recurses into the subdirectories,
29 29 # remember to use it without working dir.
30 30 try:
31 31 recurse = {'*': False, '**': True}[roottail]
32 32 except KeyError:
33 33 repos.append((prefix, root))
34 34 continue
35 35 roothead = os.path.normpath(os.path.abspath(roothead))
36 36 paths = util.walkrepos(roothead, followsym=True, recurse=recurse)
37 37 repos.extend(urlrepos(prefix, roothead, paths))
38 38 return repos
39 39
40 40 def urlrepos(prefix, roothead, paths):
41 41 """yield url paths and filesystem paths from a list of repo paths
42 42
43 43 >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
44 44 >>> conv(urlrepos('hg', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
45 45 [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
46 46 >>> conv(urlrepos('', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
47 47 [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
48 48 """
49 49 for path in paths:
50 50 path = os.path.normpath(path)
51 51 yield (prefix + '/' +
52 52 util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'), path
53 53
54 54 class hgwebdir(object):
55 55 refreshinterval = 20
56 56
57 57 def __init__(self, conf, baseui=None):
58 58 self.conf = conf
59 59 self.baseui = baseui
60 60 self.lastrefresh = 0
61 61 self.motd = None
62 62 self.refresh()
63 63
64 64 def refresh(self):
65 65 if self.lastrefresh + self.refreshinterval > time.time():
66 66 return
67 67
68 68 if self.baseui:
69 69 u = self.baseui.copy()
70 70 else:
71 71 u = ui.ui()
72 72 u.setconfig('ui', 'report_untrusted', 'off')
73 73 u.setconfig('ui', 'interactive', 'off')
74 74
75 75 if not isinstance(self.conf, (dict, list, tuple)):
76 76 map = {'paths': 'hgweb-paths'}
77 77 if not os.path.exists(self.conf):
78 78 raise util.Abort(_('config file %s not found!') % self.conf)
79 79 u.readconfig(self.conf, remap=map, trust=True)
80 80 paths = []
81 81 for name, ignored in u.configitems('hgweb-paths'):
82 82 for path in u.configlist('hgweb-paths', name):
83 83 paths.append((name, path))
84 84 elif isinstance(self.conf, (list, tuple)):
85 85 paths = self.conf
86 86 elif isinstance(self.conf, dict):
87 87 paths = self.conf.items()
88 88
89 89 repos = findrepos(paths)
90 90 for prefix, root in u.configitems('collections'):
91 91 prefix = util.pconvert(prefix)
92 92 for path in util.walkrepos(root, followsym=True):
93 93 repo = os.path.normpath(path)
94 94 name = util.pconvert(repo)
95 95 if name.startswith(prefix):
96 96 name = name[len(prefix):]
97 97 repos.append((name.lstrip('/'), repo))
98 98
99 99 self.repos = repos
100 100 self.ui = u
101 101 encoding.encoding = self.ui.config('web', 'encoding',
102 102 encoding.encoding)
103 103 self.style = self.ui.config('web', 'style', 'paper')
104 104 self.templatepath = self.ui.config('web', 'templates', None)
105 105 self.stripecount = self.ui.config('web', 'stripes', 1)
106 106 if self.stripecount:
107 107 self.stripecount = int(self.stripecount)
108 108 self._baseurl = self.ui.config('web', 'baseurl')
109 109 self.lastrefresh = time.time()
110 110
111 111 def run(self):
112 112 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
113 113 raise RuntimeError("This function is only intended to be "
114 114 "called while running as a CGI script.")
115 115 import mercurial.hgweb.wsgicgi as wsgicgi
116 116 wsgicgi.launch(self)
117 117
118 118 def __call__(self, env, respond):
119 119 req = wsgirequest(env, respond)
120 120 return self.run_wsgi(req)
121 121
122 122 def read_allowed(self, ui, req):
123 123 """Check allow_read and deny_read config options of a repo's ui object
124 124 to determine user permissions. By default, with neither option set (or
125 125 both empty), allow all users to read the repo. There are two ways a
126 126 user can be denied read access: (1) deny_read is not empty, and the
127 127 user is unauthenticated or deny_read contains user (or *), and (2)
128 128 allow_read is not empty and the user is not in allow_read. Return True
129 129 if user is allowed to read the repo, else return False."""
130 130
131 131 user = req.env.get('REMOTE_USER')
132 132
133 133 deny_read = ui.configlist('web', 'deny_read', untrusted=True)
134 134 if deny_read and (not user or deny_read == ['*'] or user in deny_read):
135 135 return False
136 136
137 137 allow_read = ui.configlist('web', 'allow_read', untrusted=True)
138 138 # by default, allow reading if no allow_read option has been set
139 139 if (not allow_read) or (allow_read == ['*']) or (user in allow_read):
140 140 return True
141 141
142 142 return False
143 143
144 144 def run_wsgi(self, req):
145 145 try:
146 146 try:
147 147 self.refresh()
148 148
149 149 virtual = req.env.get("PATH_INFO", "").strip('/')
150 150 tmpl = self.templater(req)
151 151 ctype = tmpl('mimetype', encoding=encoding.encoding)
152 152 ctype = templater.stringify(ctype)
153 153
154 154 # a static file
155 155 if virtual.startswith('static/') or 'static' in req.form:
156 156 if virtual.startswith('static/'):
157 157 fname = virtual[7:]
158 158 else:
159 159 fname = req.form['static'][0]
160 160 static = templater.templatepath('static')
161 161 return (staticfile(static, fname, req),)
162 162
163 163 # top-level index
164 164 elif not virtual:
165 165 req.respond(HTTP_OK, ctype)
166 166 return self.makeindex(req, tmpl)
167 167
168 168 # nested indexes and hgwebs
169 169
170 170 repos = dict(self.repos)
171 171 virtualrepo = virtual
172 172 while virtualrepo:
173 173 real = repos.get(virtualrepo)
174 174 if real:
175 175 req.env['REPO_NAME'] = virtualrepo
176 176 try:
177 177 repo = hg.repository(self.ui, real)
178 178 return hgweb(repo).run_wsgi(req)
179 179 except IOError, inst:
180 180 msg = inst.strerror
181 181 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
182 182 except error.RepoError, inst:
183 183 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
184 184
185 185 up = virtualrepo.rfind('/')
186 186 if up < 0:
187 187 break
188 188 virtualrepo = virtualrepo[:up]
189 189
190 190 # browse subdirectories
191 191 subdir = virtual + '/'
192 192 if [r for r in repos if r.startswith(subdir)]:
193 193 req.respond(HTTP_OK, ctype)
194 194 return self.makeindex(req, tmpl, subdir)
195 195
196 196 # prefixes not found
197 197 req.respond(HTTP_NOT_FOUND, ctype)
198 198 return tmpl("notfound", repo=virtual)
199 199
200 200 except ErrorResponse, err:
201 201 req.respond(err, ctype)
202 202 return tmpl('error', error=err.message or '')
203 203 finally:
204 204 tmpl = None
205 205
206 206 def makeindex(self, req, tmpl, subdir=""):
207 207
208 208 def archivelist(ui, nodeid, url):
209 209 allowed = ui.configlist("web", "allow_archive", untrusted=True)
210 210 archives = []
211 211 for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]:
212 212 if i[0] in allowed or ui.configbool("web", "allow" + i[0],
213 213 untrusted=True):
214 214 archives.append({"type" : i[0], "extension": i[1],
215 215 "node": nodeid, "url": url})
216 216 return archives
217 217
218 218 def rawentries(subdir="", **map):
219 219
220 220 descend = self.ui.configbool('web', 'descend', True)
221 221 for name, path in self.repos:
222 222
223 223 if not name.startswith(subdir):
224 224 continue
225 225 name = name[len(subdir):]
226 226 if not descend and '/' in name:
227 227 continue
228 228
229 229 u = self.ui.copy()
230 230 try:
231 231 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
232 232 except Exception, e:
233 233 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
234 234 continue
235 235 def get(section, name, default=None):
236 236 return u.config(section, name, default, untrusted=True)
237 237
238 238 if u.configbool("web", "hidden", untrusted=True):
239 239 continue
240 240
241 241 if not self.read_allowed(u, req):
242 242 continue
243 243
244 244 parts = [name]
245 245 if 'PATH_INFO' in req.env:
246 246 parts.insert(0, req.env['PATH_INFO'].rstrip('/'))
247 247 if req.env['SCRIPT_NAME']:
248 248 parts.insert(0, req.env['SCRIPT_NAME'])
249 249 url = re.sub(r'/+', '/', '/'.join(parts) + '/')
250 250
251 251 # update time with local timezone
252 252 try:
253 253 r = hg.repository(self.ui, path)
254 254 except IOError:
255 255 u.warn(_('error accessing repository at %s\n') % path)
256 256 continue
257 257 except error.RepoError:
258 258 u.warn(_('error accessing repository at %s\n') % path)
259 259 continue
260 260 try:
261 261 d = (get_mtime(r.spath), util.makedate()[1])
262 262 except OSError:
263 263 continue
264 264
265 265 contact = get_contact(get)
266 266 description = get("web", "description", "")
267 267 name = get("web", "name", name)
268 268 row = dict(contact=contact or "unknown",
269 269 contact_sort=contact.upper() or "unknown",
270 270 name=name,
271 271 name_sort=name,
272 272 url=url,
273 273 description=description or "unknown",
274 274 description_sort=description.upper() or "unknown",
275 275 lastchange=d,
276 276 lastchange_sort=d[1]-d[0],
277 277 archives=archivelist(u, "tip", url))
278 278 yield row
279 279
280 280 sortdefault = None, False
281 281 def entries(sortcolumn="", descending=False, subdir="", **map):
282 282 rows = rawentries(subdir=subdir, **map)
283 283
284 284 if sortcolumn and sortdefault != (sortcolumn, descending):
285 285 sortkey = '%s_sort' % sortcolumn
286 286 rows = sorted(rows, key=lambda x: x[sortkey],
287 287 reverse=descending)
288 288 for row, parity in zip(rows, paritygen(self.stripecount)):
289 289 row['parity'] = parity
290 290 yield row
291 291
292 292 self.refresh()
293 293 sortable = ["name", "description", "contact", "lastchange"]
294 294 sortcolumn, descending = sortdefault
295 295 if 'sort' in req.form:
296 296 sortcolumn = req.form['sort'][0]
297 297 descending = sortcolumn.startswith('-')
298 298 if descending:
299 299 sortcolumn = sortcolumn[1:]
300 300 if sortcolumn not in sortable:
301 301 sortcolumn = ""
302 302
303 303 sort = [("sort_%s" % column,
304 304 "%s%s" % ((not descending and column == sortcolumn)
305 305 and "-" or "", column))
306 306 for column in sortable]
307 307
308 308 self.refresh()
309 309 self.updatereqenv(req.env)
310 310
311 311 return tmpl("index", entries=entries, subdir=subdir,
312 312 sortcolumn=sortcolumn, descending=descending,
313 313 **dict(sort))
314 314
315 315 def templater(self, req):
316 316
317 317 def header(**map):
318 318 yield tmpl('header', encoding=encoding.encoding, **map)
319 319
320 320 def footer(**map):
321 321 yield tmpl("footer", **map)
322 322
323 323 def motd(**map):
324 324 if self.motd is not None:
325 325 yield self.motd
326 326 else:
327 327 yield config('web', 'motd', '')
328 328
329 329 def config(section, name, default=None, untrusted=True):
330 330 return self.ui.config(section, name, default, untrusted)
331 331
332 332 self.updatereqenv(req.env)
333 333
334 334 url = req.env.get('SCRIPT_NAME', '')
335 335 if not url.endswith('/'):
336 336 url += '/'
337 337
338 338 vars = {}
339 339 styles = (
340 340 req.form.get('style', [None])[0],
341 341 config('web', 'style'),
342 342 'paper'
343 343 )
344 344 style, mapfile = templater.stylemap(styles, self.templatepath)
345 345 if style == styles[0]:
346 346 vars['style'] = style
347 347
348 348 start = url[-1] == '?' and '&' or '?'
349 349 sessionvars = webutil.sessionvars(vars, start)
350 logourl = config('web', 'logourl', 'http://mercurial.selenic.com/')
350 351 staticurl = config('web', 'staticurl') or url + 'static/'
351 352 if not staticurl.endswith('/'):
352 353 staticurl += '/'
353 354
354 355 tmpl = templater.templater(mapfile,
355 356 defaults={"header": header,
356 357 "footer": footer,
357 358 "motd": motd,
358 359 "url": url,
360 "logourl": logourl,
359 361 "staticurl": staticurl,
360 362 "sessionvars": sessionvars})
361 363 return tmpl
362 364
363 365 def updatereqenv(self, env):
364 366 if self._baseurl is not None:
365 367 u = url.url(self._baseurl)
366 368 env['SERVER_NAME'] = u.host
367 369 if u.port:
368 370 env['SERVER_PORT'] = u.port
369 371 env['SCRIPT_NAME'] = '/' + u.path
@@ -1,32 +1,32 b''
1 1 {header}
2 2 <title>{repo|escape}: Bookmarks</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-bookmarks" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-bookmarks" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / bookmarks
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / bookmarks
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 bookmarks |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
23 23 <a href="{url}help{sessionvars%urlparameter}">help</a>
24 24 <br/>
25 25 </div>
26 26
27 27 <div class="title">&nbsp;</div>
28 28 <table cellspacing="0">
29 29 {entries%bookmarkentry}
30 30 </table>
31 31
32 32 {footer}
@@ -1,32 +1,32 b''
1 1 {header}
2 2 <title>{repo|escape}: Branches</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / branches
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / branches
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 branches |
22 22 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
23 23 <a href="{url}help{sessionvars%urlparameter}">help</a>
24 24 <br/>
25 25 </div>
26 26
27 27 <div class="title">&nbsp;</div>
28 28 <table cellspacing="0">
29 29 {entries%branchentry}
30 30 </table>
31 31
32 32 {footer}
@@ -1,41 +1,41 b''
1 1 {header}
2 2 <title>{repo|escape}: Changelog</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changelog
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changelog
12 12 </div>
13 13
14 14 <form action="{url}log">
15 15 {sessionvars%hiddenformentry}
16 16 <div class="search">
17 17 <input type="text" name="rev" />
18 18 </div>
19 19 </form>
20 20
21 21 <div class="page_nav">
22 22 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
23 23 <a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a> |
24 24 changelog |
25 25 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
26 26 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
27 27 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
28 28 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
29 29 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry} |
30 30 <a href="{url}help{sessionvars%urlparameter}">help</a>
31 31 <br/>
32 32 {changenav%nav}<br/>
33 33 </div>
34 34
35 35 {entries%changelogentry}
36 36
37 37 <div class="page_nav">
38 38 {changenav%nav}<br/>
39 39 </div>
40 40
41 41 {footer}
@@ -1,53 +1,53 b''
1 1 {header}
2 2 <title>{repo|escape}: changeset {rev}:{node|short}</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changeset
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changeset
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
23 23 changeset |
24 24 <a href="{url}raw-rev/{node|short}">raw</a> {archives%archiveentry} |
25 25 <a href="{url}help{sessionvars%urlparameter}">help</a>
26 26 <br/>
27 27 </div>
28 28
29 29 <div>
30 30 <a class="title" href="{url}raw-rev/{node|short}">{desc|strip|escape|firstline|nonempty} <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a>
31 31 </div>
32 32 <div class="title_text">
33 33 <table cellspacing="0">
34 34 <tr><td>author</td><td>{author|obfuscate}</td></tr>
35 35 <tr><td></td><td>{date|date} ({date|age})</td></tr>
36 36 {branch%changesetbranch}
37 37 <tr><td>changeset {rev}</td><td style="font-family:monospace">{node|short}</td></tr>
38 38 {parent%changesetparent}
39 39 {child%changesetchild}
40 40 </table></div>
41 41
42 42 <div class="page_body">
43 43 {desc|strip|escape|addbreaks|nonempty}
44 44 </div>
45 45 <div class="list_head"></div>
46 46 <div class="title_text">
47 47 <table cellspacing="0">
48 48 {files}
49 49 </table></div>
50 50
51 51 <div class="page_body">{diff}</div>
52 52
53 53 {footer}
@@ -1,33 +1,33 b''
1 1 {header}
2 2 <title>{repo|escape}: Error</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / error
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / error
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
19 19 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
20 20 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
21 21 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
22 22 <a href="{url}help{sessionvars%urlparameter}">help</a>
23 23 <br/>
24 24 </div>
25 25
26 26 <div class="page_body">
27 27 <br/>
28 28 <i>An error occurred while processing your request</i><br/>
29 29 <br/>
30 30 {error|escape}
31 31 </div>
32 32
33 33 {footer}
@@ -1,65 +1,65 b''
1 1 {header}
2 2 <title>{repo|escape}: {file|escape}@{node|short} (annotated)</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / annotate
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / annotate
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a> |
23 23 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
24 24 <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
25 25 <a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a> |
26 26 <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
27 27 annotate |
28 28 <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
29 29 <a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a> |
30 30 <a href="{url}help{sessionvars%urlparameter}">help</a>
31 31 <br/>
32 32 </div>
33 33
34 34 <div class="title">{file|escape}</div>
35 35
36 36 <div class="title_text">
37 37 <table cellspacing="0">
38 38 <tr>
39 39 <td>author</td>
40 40 <td>{author|obfuscate}</td></tr>
41 41 <tr>
42 42 <td></td>
43 43 <td>{date|date} ({date|age})</td></tr>
44 44 {branch%filerevbranch}
45 45 <tr>
46 46 <td>changeset {rev}</td>
47 47 <td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
48 48 {parent%fileannotateparent}
49 49 {child%fileannotatechild}
50 50 <tr>
51 51 <td>permissions</td>
52 52 <td style="font-family:monospace">{permissions|permissions}</td></tr>
53 53 </table>
54 54 </div>
55 55
56 56 <div class="page_path">
57 57 {desc|strip|escape|addbreaks|nonempty}
58 58 </div>
59 59 <div class="page_body">
60 60 <table>
61 61 {annotate%annotateline}
62 62 </table>
63 63 </div>
64 64
65 65 {footer}
@@ -1,50 +1,50 b''
1 1 {header}
2 2 <title>{repo|escape}: diff {file|escape}</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / diff
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / diff
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a> |
23 23 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
24 24 <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
25 25 <a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a> |
26 26 <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
27 27 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
28 28 diff |
29 29 <a href="{url}raw-diff/{node|short}/{file|urlescape}">raw</a><br/> |
30 30 <a href="{url}help{sessionvars%urlparameter}">help</a>
31 31 </div>
32 32
33 33 <div class="title">{file|escape}</div>
34 34
35 35 <table>
36 36 {branch%filerevbranch}
37 37 <tr>
38 38 <td>changeset {rev}</td>
39 39 <td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
40 40 {parent%filediffparent}
41 41 {child%filediffchild}
42 42 </table>
43 43
44 44 <div class="list_head"></div>
45 45
46 46 <div class="page_body">
47 47 {diff}
48 48 </div>
49 49
50 50 {footer}
@@ -1,42 +1,42 b''
1 1 {header}
2 2 <title>{repo|escape}: File revisions</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revisions
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revisions
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
23 23 revisions |
24 24 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
25 25 <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
26 26 <a href="{url}rss-log/tip/{file|urlescape}">rss</a> |
27 27 <a href="{url}help{sessionvars%urlparameter}">help</a>
28 28 <br/>
29 29 {nav%filenav}
30 30 </div>
31 31
32 32 <div class="title" >{file|urlescape}</div>
33 33
34 34 <table>
35 35 {entries%filelogentry}
36 36 </table>
37 37
38 38 <div class="page_nav">
39 39 {nav%filenav}
40 40 </div>
41 41
42 42 {footer}
@@ -1,64 +1,64 b''
1 1 {header}
2 2 <title>{repo|escape}: {file|escape}@{node|short}</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revision
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revision
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a> |
23 23 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
24 24 file |
25 25 <a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a> |
26 26 <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
27 27 <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
28 28 <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
29 29 <a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a> |
30 30 <a href="{url}help{sessionvars%urlparameter}">help</a>
31 31 <br/>
32 32 </div>
33 33
34 34 <div class="title">{file|escape}</div>
35 35
36 36 <div class="title_text">
37 37 <table cellspacing="0">
38 38 <tr>
39 39 <td>author</td>
40 40 <td>{author|obfuscate}</td></tr>
41 41 <tr>
42 42 <td></td>
43 43 <td>{date|date} ({date|age})</td></tr>
44 44 {branch%filerevbranch}
45 45 <tr>
46 46 <td>changeset {rev}</td>
47 47 <td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
48 48 {parent%filerevparent}
49 49 {child%filerevchild}
50 50 <tr>
51 51 <td>permissions</td>
52 52 <td style="font-family:monospace">{permissions|permissions}</td></tr>
53 53 </table>
54 54 </div>
55 55
56 56 <div class="page_path">
57 57 {desc|strip|escape|addbreaks|nonempty}
58 58 </div>
59 59
60 60 <div class="page_body">
61 61 {text%fileline}
62 62 </div>
63 63
64 64 {footer}
@@ -1,129 +1,129 b''
1 1 {header}
2 2 <title>{repo|escape}: Graph</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 <!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
8 8 </head>
9 9 <body>
10 10
11 11 <div class="page_header">
12 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / graph
12 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / graph
13 13 </div>
14 14
15 15 <form action="{url}log">
16 16 {sessionvars%hiddenformentry}
17 17 <div class="search">
18 18 <input type="text" name="rev" />
19 19 </div>
20 20 </form>
21 21 <div class="page_nav">
22 22 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
23 23 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
24 24 <a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a> |
25 25 graph |
26 26 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
27 27 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
28 28 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
29 29 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
30 30 <a href="{url}help{sessionvars%urlparameter}">help</a>
31 31 <br/>
32 32 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
33 33 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
34 34 | {changenav%navgraph}<br/>
35 35 </div>
36 36
37 37 <div class="title">&nbsp;</div>
38 38
39 39 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
40 40
41 41 <div id="wrapper">
42 42 <ul id="nodebgs"></ul>
43 43 <canvas id="graph" width="480" height="{canvasheight}"></canvas>
44 44 <ul id="graphnodes"></ul>
45 45 </div>
46 46
47 47 <script type="text/javascript" src="{staticurl}graph.js"></script>
48 48 <script>
49 49 <!-- hide script content
50 50
51 51 var data = {jsdata|json};
52 52 var graph = new Graph();
53 53 graph.scale({bg_height});
54 54
55 55 graph.edge = function(x0, y0, x1, y1, color) \{
56 56
57 57 this.setColor(color, 0.0, 0.65);
58 58 this.ctx.beginPath();
59 59 this.ctx.moveTo(x0, y0);
60 60 this.ctx.lineTo(x1, y1);
61 61 this.ctx.stroke();
62 62
63 63 }
64 64
65 65 var revlink = '<li style="_STYLE"><span class="desc">';
66 66 revlink += '<a class="list" href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID"><b>_DESC</b></a>';
67 67 revlink += '</span> _TAGS';
68 68 revlink += '<span class="info">_DATE, by _USER</span></li>';
69 69
70 70 graph.vertex = function(x, y, color, parity, cur) \{
71 71
72 72 this.ctx.beginPath();
73 73 color = this.setColor(color, 0.25, 0.75);
74 74 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
75 75 this.ctx.fill();
76 76
77 77 var bg = '<li class="bg parity' + parity + '"></li>';
78 78 var left = (this.columns + 1) * this.bg_height;
79 79 var nstyle = 'padding-left: ' + left + 'px;';
80 80 var item = revlink.replace(/_STYLE/, nstyle);
81 81 item = item.replace(/_PARITY/, 'parity' + parity);
82 82 item = item.replace(/_NODEID/, cur[0]);
83 83 item = item.replace(/_NODEID/, cur[0]);
84 84 item = item.replace(/_DESC/, cur[3]);
85 85 item = item.replace(/_USER/, cur[4]);
86 86 item = item.replace(/_DATE/, cur[5]);
87 87
88 88 var tagspan = '';
89 89 if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) \{
90 90 tagspan = '<span class="logtags">';
91 91 if (cur[6][1]) \{
92 92 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
93 93 tagspan += cur[6][0] + '</span> ';
94 94 } else if (!cur[6][1] && cur[6][0] != 'default') \{
95 95 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
96 96 tagspan += cur[6][0] + '</span> ';
97 97 }
98 98 if (cur[7].length) \{
99 99 for (var t in cur[7]) \{
100 100 var tag = cur[7][t];
101 101 tagspan += '<span class="tagtag">' + tag + '</span> ';
102 102 }
103 103 }
104 104 if (cur[8].length) \{
105 105 for (var t in cur[8]) \{
106 106 var bookmark = cur[8][t];
107 107 tagspan += '<span class="bookmarktag">' + bookmark + '</span> ';
108 108 }
109 109 }
110 110 tagspan += '</span>';
111 111 }
112 112
113 113 item = item.replace(/_TAGS/, tagspan);
114 114 return [bg, item];
115 115
116 116 }
117 117
118 118 graph.render(data);
119 119
120 120 // stop hiding script -->
121 121 </script>
122 122
123 123 <div class="page_nav">
124 124 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
125 125 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
126 126 | {changenav%navgraph}
127 127 </div>
128 128
129 129 {footer}
@@ -1,33 +1,33 b''
1 1 {header}
2 2 <title>{repo|escape}: Branches</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
23 23 help
24 24 <br/>
25 25 </div>
26 26
27 27 <div class="title">&nbsp;</div>
28 28
29 29 <pre>
30 30 {doc|escape}
31 31 </pre>
32 32
33 33 {footer}
@@ -1,39 +1,39 b''
1 1 {header}
2 2 <title>{repo|escape}: Branches</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
23 23 help
24 24 <br/>
25 25 </div>
26 26
27 27 <div class="title">&nbsp;</div>
28 28 <table cellspacing="0">
29 29 <tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
30 30 {topics % helpentry}
31 31
32 32 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
33 33 {earlycommands % helpentry}
34 34
35 35 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
36 36 {othercommands % helpentry}
37 37 </table>
38 38
39 39 {footer}
@@ -1,26 +1,26 b''
1 1 {header}
2 2 <title>Mercurial repositories index</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="page_header">
7 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a>
7 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a>
8 8 Repositories list
9 9 </div>
10 10
11 11 <table cellspacing="0">
12 12 <tr>
13 13 <td><a href="?sort={sort_name}">Name</a></td>
14 14 <td><a href="?sort={sort_description}">Description</a></td>
15 15 <td><a href="?sort={sort_contact}">Contact</a></td>
16 16 <td><a href="?sort={sort_lastchange}">Last modified</a></td>
17 17 <td>&nbsp;</td>
18 18 <td>&nbsp;</td>
19 19 </tr>
20 20 {entries%indexentry}
21 21 </table>
22 22 <div class="page_footer">
23 23 {motd}
24 24 </div>
25 25 </body>
26 26 </html>
@@ -1,41 +1,41 b''
1 1 {header}
2 2 <title>{repo|escape}: files</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / files
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / files
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 files |
23 23 <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> {archives%archiveentry} |
24 24 <a href="{url}help{sessionvars%urlparameter}">help</a>
25 25 <br/>
26 26 </div>
27 27
28 28 <div class="title">{path|escape} <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></div>
29 29 <table cellspacing="0">
30 30 <tr class="parity{upparity}">
31 31 <td style="font-family:monospace">drwxr-xr-x</td>
32 32 <td style="font-family:monospace"></td>
33 33 <td style="font-family:monospace"></td>
34 34 <td><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
35 35 <td class="link">&nbsp;</td>
36 36 </tr>
37 37 {dentries%direntry}
38 38 {fentries%fileentry}
39 39 </table>
40 40
41 41 {footer}
@@ -1,18 +1,18 b''
1 1 {header}
2 2 <title>Mercurial repository not found</title>
3 3 </head>
4 4
5 5 <body>
6 6
7 7 <div class="page_header">
8 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a> Not found: {repo|escape}
8 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a> Not found: {repo|escape}
9 9 </div>
10 10
11 11 <div class="page_body">
12 12 The specified repository "{repo|escape}" is unknown, sorry.
13 13 <br/>
14 14 <br/>
15 15 Please go back to the <a href="{url}">main repository list page</a>.
16 16 </div>
17 17
18 18 {footer}
@@ -1,39 +1,39 b''
1 1 {header}
2 2 <title>{repo|escape}: Search</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / search
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / search
12 12
13 13 <form action="{url}log">
14 14 {sessionvars%hiddenformentry}
15 15 <div class="search">
16 16 <input type="text" name="rev" value="{query|escape}" />
17 17 </div>
18 18 </form>
19 19 </div>
20 20
21 21 <div class="page_nav">
22 22 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
23 23 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
24 24 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
25 25 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
26 26 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
27 27 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
28 28 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
29 29 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry}
30 30 |
31 31 <a href="{url}help{sessionvars%urlparameter}">help</a>
32 32 <br/>
33 33 </div>
34 34
35 35 <div class="title">searching for {query|escape}</div>
36 36
37 37 {entries}
38 38
39 39 {footer}
@@ -1,42 +1,42 b''
1 1 {header}
2 2 <title>{repo|escape}: Shortlog</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / shortlog
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / shortlog
12 12 </div>
13 13
14 14 <form action="{url}log">
15 15 {sessionvars%hiddenformentry}
16 16 <div class="search">
17 17 <input type="text" name="rev" />
18 18 </div>
19 19 </form>
20 20 <div class="page_nav">
21 21 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
22 22 shortlog |
23 23 <a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a> |
24 24 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
25 25 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
26 26 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
27 27 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
28 28 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry} |
29 29 <a href="{url}help{sessionvars%urlparameter}">help</a>
30 30 <br/>{changenav%navshort}<br/>
31 31 </div>
32 32
33 33 <div class="title">&nbsp;</div>
34 34 <table cellspacing="0">
35 35 {entries%shortlogentry}
36 36 </table>
37 37
38 38 <div class="page_nav">
39 39 {changenav%navshort}
40 40 </div>
41 41
42 42 {footer}
@@ -1,66 +1,66 b''
1 1 {header}
2 2 <title>{repo|escape}: Summary</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / summary
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / summary
12 12
13 13 <form action="{url}log">
14 14 {sessionvars%hiddenformentry}
15 15 <div class="search">
16 16 <input type="text" name="rev" />
17 17 </div>
18 18 </form>
19 19 </div>
20 20
21 21 <div class="page_nav">
22 22 summary |
23 23 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
24 24 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
25 25 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
26 26 <a href="{url}tags{sessionvars%urlparameter}">tags</a> |
27 27 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
28 28 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
29 29 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry} |
30 30 <a href="{url}help{sessionvars%urlparameter}">help</a>
31 31 <br/>
32 32 </div>
33 33
34 34 <div class="title">&nbsp;</div>
35 35 <table cellspacing="0">
36 36 <tr><td>description</td><td>{desc}</td></tr>
37 37 <tr><td>owner</td><td>{owner|obfuscate}</td></tr>
38 38 <tr><td>last change</td><td>{lastchange|rfc822date}</td></tr>
39 39 </table>
40 40
41 41 <div><a class="title" href="{url}shortlog{sessionvars%urlparameter}">changes</a></div>
42 42 <table cellspacing="0">
43 43 {shortlog}
44 44 <tr class="light"><td colspan="4"><a class="list" href="{url}shortlog{sessionvars%urlparameter}">...</a></td></tr>
45 45 </table>
46 46
47 47 <div><a class="title" href="{url}tags{sessionvars%urlparameter}">tags</a></div>
48 48 <table cellspacing="0">
49 49 {tags}
50 50 <tr class="light"><td colspan="3"><a class="list" href="{url}tags{sessionvars%urlparameter}">...</a></td></tr>
51 51 </table>
52 52
53 53 <div><a class="title" href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></div>
54 54 <table cellspacing="0">
55 55 {bookmarks%bookmarkentry}
56 56 <tr class="light"><td colspan="3"><a class="list" href="{url}bookmarks{sessionvars%urlparameter}">...</a></td></tr>
57 57 </table>
58 58
59 59 <div><a class="title" href="#">branches</a></div>
60 60 <table cellspacing="0">
61 61 {branches%branchentry}
62 62 <tr class="light">
63 63 <td colspan="4"><a class="list" href="#">...</a></td>
64 64 </tr>
65 65 </table>
66 66 {footer}
@@ -1,32 +1,32 b''
1 1 {header}
2 2 <title>{repo|escape}: Tags</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
7 7 </head>
8 8 <body>
9 9
10 10 <div class="page_header">
11 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / tags
11 <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / tags
12 12 </div>
13 13
14 14 <div class="page_nav">
15 15 <a href="{url}summary{sessionvars%urlparameter}">summary</a> |
16 16 <a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
17 17 <a href="{url}log{sessionvars%urlparameter}">changelog</a> |
18 18 <a href="{url}graph{sessionvars%urlparameter}">graph</a> |
19 19 tags |
20 20 <a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
21 21 <a href="{url}branches{sessionvars%urlparameter}">branches</a> |
22 22 <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
23 23 <a href="{url}help{sessionvars%urlparameter}">help</a>
24 24 <br/>
25 25 </div>
26 26
27 27 <div class="title">&nbsp;</div>
28 28 <table cellspacing="0">
29 29 {entries%tagentry}
30 30 </table>
31 31
32 32 {footer}
@@ -1,22 +1,22 b''
1 1 <div class="page-footer">
2 2 <p>Mercurial Repository: {repo|escape}</p>
3 3 <ul class="rss-logo">
4 4 <li><a href="{url}rss-log">RSS</a></li>
5 5 <li><a href="{url}atom-log">Atom</a></li>
6 6 </ul>
7 7 {motd}
8 8 </div>
9 9
10 10 <div id="powered-by">
11 <p><a href="http://mercurial.selenic.com/" title="Mercurial"><img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a></p>
11 <p><a href="{logourl}" title="Mercurial"><img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a></p>
12 12 </div>
13 13
14 14 <div id="corner-top-left"></div>
15 15 <div id="corner-top-right"></div>
16 16 <div id="corner-bottom-left"></div>
17 17 <div id="corner-bottom-right"></div>
18 18
19 19 </div>
20 20
21 21 </body>
22 22 </html>
@@ -1,39 +1,39 b''
1 1 {header}
2 2 <title>{repo|escape}: Mercurial repositories index</title>
3 3 </head>
4 4
5 5 <body>
6 6 <div id="container">
7 7 <div class="page-header">
8 8 <h1>Mercurial Repositories</h1>
9 9 <ul class="page-nav">
10 10 </ul>
11 11 </div>
12 12
13 13 <table cellspacing="0">
14 14 <tr>
15 15 <td><a href="?sort={sort_name}">Name</a></td>
16 16 <td><a href="?sort={sort_description}">Description</a></td>
17 17 <td><a href="?sort={sort_contact}">Contact</a></td>
18 18 <td><a href="?sort={sort_lastchange}">Last modified</a></td>
19 19 <td>&nbsp;</td>
20 20 <td>&nbsp;</td>
21 21 </tr>
22 22 {entries%indexentry}
23 23 </table>
24 24 <div class="page-footer">
25 25 {motd}
26 26 </div>
27 27
28 28 <div id="powered-by">
29 <p><a href="http://mercurial.selenic.com/" title="Mercurial"><img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a></p>
29 <p><a href="{logourl}" title="Mercurial"><img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a></p>
30 30 </div>
31 31
32 32 <div id="corner-top-left"></div>
33 33 <div id="corner-top-right"></div>
34 34 <div id="corner-bottom-left"></div>
35 35 <div id="corner-bottom-right"></div>
36 36
37 37 </div>
38 38 </body>
39 39 </html>
@@ -1,49 +1,49 b''
1 1 {header}
2 2 <title>{repo|escape}: bookmarks</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-bookmarks" title="Atom feed for {repo|escape}: bookmarks" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-bookmarks" title="RSS feed for {repo|escape}: bookmarks" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="{logourl}">
14 14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 20 <li class="active">bookmarks</li>
21 21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
25 25 </ul>
26 26 </div>
27 27
28 28 <div class="main">
29 29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
30 30 <h3>bookmarks</h3>
31 31
32 32 <form class="search" action="{url}log">
33 33 {sessionvars%hiddenformentry}
34 34 <p><input name="rev" id="search1" type="text" size="30" /></p>
35 35 <div id="hint">find changesets by author, revision,
36 36 files, or words in the commit message</div>
37 37 </form>
38 38
39 39 <table class="bigtable">
40 40 <tr>
41 41 <th>bookmark</th>
42 42 <th>node</th>
43 43 </tr>
44 44 {entries%bookmarkentry}
45 45 </table>
46 46 </div>
47 47 </div>
48 48
49 49 {footer}
@@ -1,60 +1,60 b''
1 1 {header}
2 2 <title>{repo|escape}: branches</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}: branches" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}: branches" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="{logourl}">
14 14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 21 <li class="active">branches</li>
22 22 </ul>
23 23 <ul>
24 24 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
25 25 </ul>
26 26 </div>
27 27
28 28 <div class="main">
29 29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
30 30 <h3>branches</h3>
31 31
32 32 <form class="search" action="{url}log">
33 33 {sessionvars%hiddenformentry}
34 34 <p><input name="rev" id="search1" type="text" size="30" /></p>
35 35 <div id="hint">find changesets by author, revision,
36 36 files, or words in the commit message</div>
37 37 </form>
38 38
39 39 <table class="bigtable">
40 40 <tr>
41 41 <th>branch</th>
42 42 <th>node</th>
43 43 </tr>
44 44 {entries %
45 45 ' <tr class="tagEntry parity{parity}">
46 46 <td>
47 47 <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
48 48 {branch|escape}
49 49 </a>
50 50 </td>
51 51 <td class="node">
52 52 {node|short}
53 53 </td>
54 54 </tr>'
55 55 }
56 56 </table>
57 57 </div>
58 58 </div>
59 59
60 60 {footer}
@@ -1,75 +1,75 b''
1 1 {header}
2 2 <title>{repo|escape}: {node|short}</title>
3 3 </head>
4 4 <body>
5 5 <div class="container">
6 6 <div class="menu">
7 7 <div class="logo">
8 <a href="http://mercurial.selenic.com/">
8 <a href="{logourl}">
9 9 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
10 10 </div>
11 11 <ul>
12 12 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
13 13 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
14 14 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
15 15 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
16 16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 17 </ul>
18 18 <ul>
19 19 <li class="active">changeset</li>
20 20 <li><a href="{url}raw-rev/{node|short}{sessionvars%urlparameter}">raw</a></li>
21 21 <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">browse</a></li>
22 22 </ul>
23 23 <ul>
24 24 {archives%archiveentry}
25 25 </ul>
26 26 <ul>
27 27 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
28 28 </ul>
29 29 </div>
30 30
31 31 <div class="main">
32 32
33 33 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
34 34 <h3>changeset {rev}:{node|short} {changesetbranch%changelogbranchname} {changesettag} {changesetbookmark}</h3>
35 35
36 36 <form class="search" action="{url}log">
37 37 {sessionvars%hiddenformentry}
38 38 <p><input name="rev" id="search1" type="text" size="30" /></p>
39 39 <div id="hint">find changesets by author, revision,
40 40 files, or words in the commit message</div>
41 41 </form>
42 42
43 43 <div class="description">{desc|strip|escape|nonempty}</div>
44 44
45 45 <table id="changesetEntry">
46 46 <tr>
47 47 <th class="author">author</th>
48 48 <td class="author">{author|obfuscate}</td>
49 49 </tr>
50 50 <tr>
51 51 <th class="date">date</th>
52 52 <td class="date">{date|date} ({date|age})</td></tr>
53 53 <tr>
54 54 <th class="author">parents</th>
55 55 <td class="author">{parent%changesetparent}</td>
56 56 </tr>
57 57 <tr>
58 58 <th class="author">children</th>
59 59 <td class="author">{child%changesetchild}</td>
60 60 </tr>
61 61 <tr>
62 62 <th class="files">files</th>
63 63 <td class="files">{files}</td>
64 64 </tr>
65 65 </table>
66 66
67 67 <div class="overflow">
68 68 <div class="sourcefirst"> line diff</div>
69 69
70 70 {diff}
71 71 </div>
72 72
73 73 </div>
74 74 </div>
75 75 {footer}
@@ -1,45 +1,45 b''
1 1 {header}
2 2 <title>{repo|escape}: error</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="container">
7 7 <div class="menu">
8 8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="{logourl}">
10 10 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
11 11 </div>
12 12 <ul>
13 13 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
14 14 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
15 15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
17 17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
18 18 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
19 19 </ul>
20 20 </div>
21 21
22 22 <div class="main">
23 23
24 24 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
25 25 <h3>error</h3>
26 26
27 27 <form class="search" action="{url}log">
28 28 {sessionvars%hiddenformentry}
29 29 <p><input name="rev" id="search1" type="text" size="30"></p>
30 30 <div id="hint">find changesets by author, revision,
31 31 files, or words in the commit message</div>
32 32 </form>
33 33
34 34 <div class="description">
35 35 <p>
36 36 An error occurred while processing your request:
37 37 </p>
38 38 <p>
39 39 {error|escape}
40 40 </p>
41 41 </div>
42 42 </div>
43 43 </div>
44 44
45 45 {footer}
@@ -1,82 +1,82 b''
1 1 {header}
2 2 <title>{repo|escape}: {file|escape} annotate</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="container">
7 7 <div class="menu">
8 8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="{logourl}">
10 10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
11 11 </div>
12 12 <ul>
13 13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
14 14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
15 15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
17 17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
18 18 </ul>
19 19
20 20 <ul>
21 21 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
22 22 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
23 23 </ul>
24 24 <ul>
25 25 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
26 26 <li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
27 27 <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
28 28 <li class="active">annotate</li>
29 29 <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
30 30 <li><a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a></li>
31 31 </ul>
32 32 <ul>
33 33 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
34 34 </ul>
35 35 </div>
36 36
37 37 <div class="main">
38 38 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
39 39 <h3>annotate {file|escape} @ {rev}:{node|short}</h3>
40 40
41 41 <form class="search" action="{url}log">
42 42 {sessionvars%hiddenformentry}
43 43 <p><input name="rev" id="search1" type="text" size="30" /></p>
44 44 <div id="hint">find changesets by author, revision,
45 45 files, or words in the commit message</div>
46 46 </form>
47 47
48 48 <div class="description">{desc|strip|escape|nonempty}</div>
49 49
50 50 <table id="changesetEntry">
51 51 <tr>
52 52 <th class="author">author</th>
53 53 <td class="author">{author|obfuscate}</td>
54 54 </tr>
55 55 <tr>
56 56 <th class="date">date</th>
57 57 <td class="date">{date|date} ({date|age})</td>
58 58 </tr>
59 59 <tr>
60 60 <th class="author">parents</th>
61 61 <td class="author">{parent%filerevparent}</td>
62 62 </tr>
63 63 <tr>
64 64 <th class="author">children</th>
65 65 <td class="author">{child%filerevchild}</td>
66 66 </tr>
67 67 {changesettag}
68 68 </table>
69 69
70 70 <div class="overflow">
71 71 <table class="bigtable">
72 72 <tr>
73 73 <th class="annotate">rev</th>
74 74 <th class="line">&nbsp;&nbsp;line source</th>
75 75 </tr>
76 76 {annotate%annotateline}
77 77 </table>
78 78 </div>
79 79 </div>
80 80 </div>
81 81
82 82 {footer}
@@ -1,77 +1,77 b''
1 1 {header}
2 2 <title>{repo|escape}: {file|escape} diff</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="container">
7 7 <div class="menu">
8 8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="{logourl}">
10 10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
11 11 </div>
12 12 <ul>
13 13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
14 14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
15 15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
17 17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
18 18 </ul>
19 19 <ul>
20 20 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
21 21 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
25 25 <li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
26 26 <li class="active">diff</li>
27 27 <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
28 28 <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
29 29 <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
30 30 </ul>
31 31 <ul>
32 32 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
33 33 </ul>
34 34 </div>
35 35
36 36 <div class="main">
37 37 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
38 38 <h3>diff {file|escape} @ {rev}:{node|short}</h3>
39 39
40 40 <form class="search" action="{url}log">
41 41 <p>{sessionvars%hiddenformentry}</p>
42 42 <p><input name="rev" id="search1" type="text" size="30" /></p>
43 43 <div id="hint">find changesets by author, revision,
44 44 files, or words in the commit message</div>
45 45 </form>
46 46
47 47 <div class="description">{desc|strip|escape|nonempty}</div>
48 48
49 49 <table id="changesetEntry">
50 50 <tr>
51 51 <th>author</th>
52 52 <td>{author|obfuscate}</td>
53 53 </tr>
54 54 <tr>
55 55 <th>date</th>
56 56 <td>{date|date} ({date|age})</td>
57 57 </tr>
58 58 <tr>
59 59 <th>parents</th>
60 60 <td>{parent%filerevparent}</td>
61 61 </tr>
62 62 <tr>
63 63 <th>children</th>
64 64 <td>{child%filerevchild}</td>
65 65 </tr>
66 66 {changesettag}
67 67 </table>
68 68
69 69 <div class="overflow">
70 70 <div class="sourcefirst"> line diff</div>
71 71
72 72 {diff}
73 73 </div>
74 74 </div>
75 75 </div>
76 76
77 77 {footer}
@@ -1,73 +1,73 b''
1 1 {header}
2 2 <title>{repo|escape}: {file|escape} history</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="{logourl}">
14 14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
18 18 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
19 19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
25 25 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
26 26 </ul>
27 27 <ul>
28 28 <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
29 29 <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
30 30 <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
31 31 <li class="active">file log</li>
32 32 <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
33 33 </ul>
34 34 <ul>
35 35 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
36 36 </ul>
37 37 </div>
38 38
39 39 <div class="main">
40 40 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
41 41 <h3>log {file|escape}</h3>
42 42
43 43 <form class="search" action="{url}log">
44 44 {sessionvars%hiddenformentry}
45 45 <p><input name="rev" id="search1" type="text" size="30" /></p>
46 46 <div id="hint">find changesets by author, revision,
47 47 files, or words in the commit message</div>
48 48 </form>
49 49
50 50 <div class="navigate">
51 51 <a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
52 52 <a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
53 53 | {nav%filenav}</div>
54 54
55 55 <table class="bigtable">
56 56 <tr>
57 57 <th class="age">age</th>
58 58 <th class="author">author</th>
59 59 <th class="description">description</th>
60 60 </tr>
61 61 {entries%filelogentry}
62 62 </table>
63 63
64 64 <div class="navigate">
65 65 <a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
66 66 <a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
67 67 | {nav%filenav}
68 68 </div>
69 69
70 70 </div>
71 71 </div>
72 72
73 73 {footer}
@@ -1,76 +1,76 b''
1 1 {header}
2 2 <title>{repo|escape}: {node|short} {file|escape}</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="container">
7 7 <div class="menu">
8 8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="{logourl}">
10 10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
11 11 </div>
12 12 <ul>
13 13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
14 14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
15 15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 16 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
17 17 </ul>
18 18 <ul>
19 19 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
20 20 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
21 21 </ul>
22 22 <ul>
23 23 <li class="active">file</li>
24 24 <li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
25 25 <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
26 26 <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
27 27 <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
28 28 <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
29 29 </ul>
30 30 <ul>
31 31 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
32 32 </ul>
33 33 </div>
34 34
35 35 <div class="main">
36 36 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
37 37 <h3>view {file|escape} @ {rev}:{node|short}</h3>
38 38
39 39 <form class="search" action="{url}log">
40 40 {sessionvars%hiddenformentry}
41 41 <p><input name="rev" id="search1" type="text" size="30" /></p>
42 42 <div id="hint">find changesets by author, revision,
43 43 files, or words in the commit message</div>
44 44 </form>
45 45
46 46 <div class="description">{desc|strip|escape|nonempty}</div>
47 47
48 48 <table id="changesetEntry">
49 49 <tr>
50 50 <th class="author">author</th>
51 51 <td class="author">{author|obfuscate}</td>
52 52 </tr>
53 53 <tr>
54 54 <th class="date">date</th>
55 55 <td class="date">{date|date} ({date|age})</td>
56 56 </tr>
57 57 <tr>
58 58 <th class="author">parents</th>
59 59 <td class="author">{parent%filerevparent}</td>
60 60 </tr>
61 61 <tr>
62 62 <th class="author">children</th>
63 63 <td class="author">{child%filerevchild}</td>
64 64 </tr>
65 65 {changesettag}
66 66 </table>
67 67
68 68 <div class="overflow">
69 69 <div class="sourcefirst"> line source</div>
70 70 {text%fileline}
71 71 <div class="sourcelast"></div>
72 72 </div>
73 73 </div>
74 74 </div>
75 75
76 76 {footer}
@@ -1,142 +1,142 b''
1 1 {header}
2 2 <title>{repo|escape}: revision graph</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}: log" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}: log" />
7 7 <!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
8 8 </head>
9 9 <body>
10 10
11 11 <div class="container">
12 12 <div class="menu">
13 13 <div class="logo">
14 <a href="http://mercurial.selenic.com/">
14 <a href="{logourl}">
15 15 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
16 16 </div>
17 17 <ul>
18 18 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
19 19 <li class="active">graph</li>
20 20 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
21 21 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
22 22 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
23 23 </ul>
24 24 <ul>
25 25 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
26 26 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
27 27 </ul>
28 28 <ul>
29 29 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
30 30 </ul>
31 31 </div>
32 32
33 33 <div class="main">
34 34 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
35 35 <h3>graph</h3>
36 36
37 37 <form class="search" action="{url}log">
38 38 {sessionvars%hiddenformentry}
39 39 <p><input name="rev" id="search1" type="text" size="30" /></p>
40 40 <div id="hint">find changesets by author, revision,
41 41 files, or words in the commit message</div>
42 42 </form>
43 43
44 44 <div class="navigate">
45 45 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
46 46 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
47 47 | rev {rev}: {changenav%navgraph}
48 48 </div>
49 49
50 50 <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
51 51
52 52 <div id="wrapper">
53 53 <ul id="nodebgs"></ul>
54 54 <canvas id="graph" width="480" height="{canvasheight}"></canvas>
55 55 <ul id="graphnodes"></ul>
56 56 </div>
57 57
58 58 <script type="text/javascript" src="{staticurl}graph.js"></script>
59 59 <script type="text/javascript">
60 60 <!-- hide script content
61 61
62 62 var data = {jsdata|json};
63 63 var graph = new Graph();
64 64 graph.scale({bg_height});
65 65
66 66 graph.edge = function(x0, y0, x1, y1, color) \{
67 67
68 68 this.setColor(color, 0.0, 0.65);
69 69 this.ctx.beginPath();
70 70 this.ctx.moveTo(x0, y0);
71 71 this.ctx.lineTo(x1, y1);
72 72 this.ctx.stroke();
73 73
74 74 }
75 75
76 76 var revlink = '<li style="_STYLE"><span class="desc">';
77 77 revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
78 78 revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
79 79
80 80 graph.vertex = function(x, y, color, parity, cur) \{
81 81
82 82 this.ctx.beginPath();
83 83 color = this.setColor(color, 0.25, 0.75);
84 84 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
85 85 this.ctx.fill();
86 86
87 87 var bg = '<li class="bg parity' + parity + '"></li>';
88 88 var left = (this.columns + 1) * this.bg_height;
89 89 var nstyle = 'padding-left: ' + left + 'px;';
90 90 var item = revlink.replace(/_STYLE/, nstyle);
91 91 item = item.replace(/_PARITY/, 'parity' + parity);
92 92 item = item.replace(/_NODEID/, cur[0]);
93 93 item = item.replace(/_NODEID/, cur[0]);
94 94 item = item.replace(/_DESC/, cur[3]);
95 95 item = item.replace(/_USER/, cur[4]);
96 96 item = item.replace(/_DATE/, cur[5]);
97 97
98 98 var tagspan = '';
99 99 if (cur[7].length || (cur[6][0] != 'default' || cur[6][1])) \{
100 100 tagspan = '<span class="logtags">';
101 101 if (cur[6][1]) \{
102 102 tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
103 103 tagspan += cur[6][0] + '</span> ';
104 104 } else if (!cur[6][1] && cur[6][0] != 'default') \{
105 105 tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
106 106 tagspan += cur[6][0] + '</span> ';
107 107 }
108 108 if (cur[7].length) \{
109 109 for (var t in cur[7]) \{
110 110 var tag = cur[7][t];
111 111 tagspan += '<span class="tag">' + tag + '</span> ';
112 112 }
113 113 }
114 114 if (cur[8].length) \{
115 115 for (var b in cur[8]) \{
116 116 var bookmark = cur[8][b];
117 117 tagspan += '<span class="tag">' + bookmark + '</span> ';
118 118 }
119 119 }
120 120 tagspan += '</span>';
121 121 }
122 122
123 123 item = item.replace(/_TAGS/, tagspan);
124 124 return [bg, item];
125 125
126 126 }
127 127
128 128 graph.render(data);
129 129
130 130 // stop hiding script -->
131 131 </script>
132 132
133 133 <div class="navigate">
134 134 <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
135 135 <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
136 136 | rev {rev}: {changenav%navgraph}
137 137 </div>
138 138
139 139 </div>
140 140 </div>
141 141
142 142 {footer}
@@ -1,44 +1,44 b''
1 1 {header}
2 2 <title>Help: {topic}</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="{logourl}">
14 14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li class="active">help</li>
25 25 </ul>
26 26 </div>
27 27
28 28 <div class="main">
29 29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
30 30 <h3>Help: {topic}</h3>
31 31
32 32 <form class="search" action="{url}log">
33 33 {sessionvars%hiddenformentry}
34 34 <p><input name="rev" id="search1" type="text" size="30" /></p>
35 35 <div id="hint">find changesets by author, revision,
36 36 files, or words in the commit message</div>
37 37 </form>
38 38 <pre>
39 39 {doc|escape}
40 40 </pre>
41 41 </div>
42 42 </div>
43 43
44 44 {footer}
@@ -1,49 +1,49 b''
1 1 {header}
2 2 <title>Help: {title}</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="{logourl}">
14 14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li class="active">help</li>
25 25 </ul>
26 26 </div>
27 27
28 28 <div class="main">
29 29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
30 30 <form class="search" action="{url}log">
31 31 {sessionvars%hiddenformentry}
32 32 <p><input name="rev" id="search1" type="text" size="30" /></p>
33 33 <div id="hint">find changesets by author, revision,
34 34 files, or words in the commit message</div>
35 35 </form>
36 36 <table class="bigtable">
37 37 <tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
38 38 {topics % helpentry}
39 39
40 40 <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
41 41 {earlycommands % helpentry}
42 42
43 43 <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
44 44 {othercommands % helpentry}
45 45 </table>
46 46 </div>
47 47 </div>
48 48
49 49 {footer}
@@ -1,26 +1,26 b''
1 1 {header}
2 2 <title>Mercurial repositories index</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="container">
7 7 <div class="menu">
8 <a href="http://mercurial.selenic.com/">
8 <a href="{logourl}">
9 9 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
10 10 </div>
11 11 <div class="main">
12 12 <h2>Mercurial Repositories</h2>
13 13
14 14 <table class="bigtable">
15 15 <tr>
16 16 <th><a href="?sort={sort_name}">Name</a></th>
17 17 <th><a href="?sort={sort_description}">Description</a></th>
18 18 <th><a href="?sort={sort_contact}">Contact</a></th>
19 19 <th><a href="?sort={sort_lastchange}">Last modified</a></th>
20 20 <th>&nbsp;</th>
21 21 </tr>
22 22 {entries%indexentry}
23 23 </table>
24 24 </div>
25 25 </div>
26 26 {footer}
@@ -1,58 +1,58 b''
1 1 {header}
2 2 <title>{repo|escape}: {node|short} {path|escape}</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="container">
7 7 <div class="menu">
8 8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="{logourl}">
10 10 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
11 11 </div>
12 12 <ul>
13 13 <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
14 14 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
15 15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
17 17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
18 18 </ul>
19 19 <ul>
20 20 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
21 21 <li class="active">browse</li>
22 22 </ul>
23 23 <ul>
24 24 {archives%archiveentry}
25 25 </ul>
26 26 <ul>
27 27 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
28 28 </ul>
29 29 </div>
30 30
31 31 <div class="main">
32 32 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
33 33 <h3>directory {path|escape} @ {rev}:{node|short} {tags%changelogtag}</h3>
34 34
35 35 <form class="search" action="{url}log">
36 36 {sessionvars%hiddenformentry}
37 37 <p><input name="rev" id="search1" type="text" size="30" /></p>
38 38 <div id="hint">find changesets by author, revision,
39 39 files, or words in the commit message</div>
40 40 </form>
41 41
42 42 <table class="bigtable">
43 43 <tr>
44 44 <th class="name">name</th>
45 45 <th class="size">size</th>
46 46 <th class="permissions">permissions</th>
47 47 </tr>
48 48 <tr class="fileline parity{upparity}">
49 49 <td class="name"><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
50 50 <td class="size"></td>
51 51 <td class="permissions">drwxr-xr-x</td>
52 52 </tr>
53 53 {dentries%direntry}
54 54 {fentries%fileentry}
55 55 </table>
56 56 </div>
57 57 </div>
58 58 {footer}
@@ -1,55 +1,55 b''
1 1 {header}
2 2 <title>{repo|escape}: searching for {query|escape}</title>
3 3 </head>
4 4 <body>
5 5
6 6 <div class="container">
7 7 <div class="menu">
8 8 <div class="logo">
9 <a href="http://mercurial.selenic.com/">
9 <a href="{logourl}">
10 10 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
11 11 </div>
12 12 <ul>
13 13 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
14 14 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
15 15 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
16 16 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
17 17 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
18 18 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
19 19 </ul>
20 20 </div>
21 21
22 22 <div class="main">
23 23 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
24 24 <h3>searching for '{query|escape}'</h3>
25 25
26 26 <form class="search" action="{url}log">
27 27 {sessionvars%hiddenformentry}
28 28 <p><input name="rev" id="search1" type="text" size="30"></p>
29 29 <div id="hint">find changesets by author, revision,
30 30 files, or words in the commit message</div>
31 31 </form>
32 32
33 33 <div class="navigate">
34 34 <a href="{url}search/{lessvars%urlparameter}">less</a>
35 35 <a href="{url}search/{morevars%urlparameter}">more</a>
36 36 </div>
37 37
38 38 <table class="bigtable">
39 39 <tr>
40 40 <th class="age">age</th>
41 41 <th class="author">author</th>
42 42 <th class="description">description</th>
43 43 </tr>
44 44 {entries}
45 45 </table>
46 46
47 47 <div class="navigate">
48 48 <a href="{url}search/{lessvars%urlparameter}">less</a>
49 49 <a href="{url}search/{morevars%urlparameter}">more</a>
50 50 </div>
51 51
52 52 </div>
53 53 </div>
54 54
55 55 {footer}
@@ -1,70 +1,70 b''
1 1 {header}
2 2 <title>{repo|escape}: log</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-log" title="Atom feed for {repo|escape}" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-log" title="RSS feed for {repo|escape}" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="{logourl}">
14 14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li class="active">log</li>
18 18 <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
19 19 <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
20 20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
25 25 <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
26 26 </ul>
27 27 <ul>
28 28 {archives%archiveentry}
29 29 </ul>
30 30 <ul>
31 31 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
32 32 </ul>
33 33 </div>
34 34
35 35 <div class="main">
36 36 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
37 37 <h3>log</h3>
38 38
39 39 <form class="search" action="{url}log">
40 40 {sessionvars%hiddenformentry}
41 41 <p><input name="rev" id="search1" type="text" size="30" /></p>
42 42 <div id="hint">find changesets by author, revision,
43 43 files, or words in the commit message</div>
44 44 </form>
45 45
46 46 <div class="navigate">
47 47 <a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
48 48 <a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
49 49 | rev {rev}: {changenav%navshort}
50 50 </div>
51 51
52 52 <table class="bigtable">
53 53 <tr>
54 54 <th class="age">age</th>
55 55 <th class="author">author</th>
56 56 <th class="description">description</th>
57 57 </tr>
58 58 {entries%shortlogentry}
59 59 </table>
60 60
61 61 <div class="navigate">
62 62 <a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
63 63 <a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
64 64 | rev {rev}: {changenav%navshort}
65 65 </div>
66 66
67 67 </div>
68 68 </div>
69 69
70 70 {footer}
@@ -1,49 +1,49 b''
1 1 {header}
2 2 <title>{repo|escape}: tags</title>
3 3 <link rel="alternate" type="application/atom+xml"
4 4 href="{url}atom-tags" title="Atom feed for {repo|escape}: tags" />
5 5 <link rel="alternate" type="application/rss+xml"
6 6 href="{url}rss-tags" title="RSS feed for {repo|escape}: tags" />
7 7 </head>
8 8 <body>
9 9
10 10 <div class="container">
11 11 <div class="menu">
12 12 <div class="logo">
13 <a href="http://mercurial.selenic.com/">
13 <a href="{logourl}">
14 14 <img src="{staticurl}hglogo.png" alt="mercurial" /></a>
15 15 </div>
16 16 <ul>
17 17 <li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
18 18 <li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
19 19 <li class="active">tags</li>
20 20 <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
21 21 <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
22 22 </ul>
23 23 <ul>
24 24 <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
25 25 </ul>
26 26 </div>
27 27
28 28 <div class="main">
29 29 <h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
30 30 <h3>tags</h3>
31 31
32 32 <form class="search" action="{url}log">
33 33 {sessionvars%hiddenformentry}
34 34 <p><input name="rev" id="search1" type="text" size="30" /></p>
35 35 <div id="hint">find changesets by author, revision,
36 36 files, or words in the commit message</div>
37 37 </form>
38 38
39 39 <table class="bigtable">
40 40 <tr>
41 41 <th>tag</th>
42 42 <th>node</th>
43 43 </tr>
44 44 {entries%tagentry}
45 45 </table>
46 46 </div>
47 47 </div>
48 48
49 49 {footer}
@@ -1,8 +1,8 b''
1 1 {motd}
2 2 <div class="logo">
3 <a href="http://mercurial.selenic.com/">
3 <a href="{logourl}">
4 4 <img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
5 5 </div>
6 6
7 7 </body>
8 8 </html>
@@ -1,41 +1,42 b''
1 1 repo the name of the repo
2 2 rev a changeset.manifest revision
3 3 node a changeset node
4 4 changesets total number of changesets
5 5 file a filename
6 6 filerev a file revision
7 7 filerevs total number of file revisions
8 8 up the directory of the relevant file
9 9 path a path in the manifest, starting with "/"
10 10 basename a short pathname
11 11 date a date string
12 12 age age in hours, days, etc
13 13 line a line of text (escaped)
14 14 desc a description (escaped, with breaks)
15 15 shortdesc a short description (escaped)
16 16 author a name or email addressv(obfuscated)
17 17 parent a list of the parent
18 18 child a list of the children
19 19 tags a list of tag
20 20
21 21 header the global page header
22 22 footer the global page footer
23 23
24 24 files a list of file links
25 25 file_copies a list of pairs of name, source filenames
26 26 dirs a set of directory links
27 27 diff a diff of one or more files
28 28 annotate an annotated file
29 29 entries the entries relevant to the page
30 30
31 31 url base url of hgweb interface
32 logourl base url of logo
32 33 staticurl base url for static resources
33 34
34 35
35 36 Templates and commands:
36 37 changelog(rev) - a page for browsing changesets
37 38 naventry - a link for jumping to a changeset number
38 39 filenodelink - jump to file diff
39 40 fileellipses - printed after maxfiles
40 41 changelogentry - an entry in the log
41 42 manifest - browse a manifest as a directory tree
General Comments 0
You need to be logged in to leave comments. Login now