changeset 9539:c904e76e3834

help: move help topics from mercurial/help.py to help/*.txt The help topics are loaded on demand so we wont hit the disk unless we really have to.
author Martin Geisler <mg@lazybytes.net>
date Sun, 04 Oct 2009 09:59:13 +0200
parents f96ee862aba0
children cad36e496640
files Makefile help/dates.txt help/diffs.txt help/environment.txt help/extensions.txt help/multirevs.txt help/patterns.txt help/revisions.txt help/templates.txt help/urls.txt i18n/hggettext mercurial/help.py setup.py
diffstat 13 files changed, 480 insertions(+), 476 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Sat Oct 03 18:58:25 2009 +0200
+++ b/Makefile	Sun Oct 04 09:59:13 2009 +0200
@@ -79,16 +79,16 @@
 
 update-pot: i18n/hg.pot
 
-i18n/hg.pot: $(PYTHON_FILES)
+i18n/hg.pot: $(PYTHON_FILES) help/*.txt
 	$(PYTHON) i18n/hggettext mercurial/commands.py \
-	  hgext/*.py hgext/*/__init__.py > i18n/hg.pot
+	  hgext/*.py hgext/*/__init__.py help/*.txt > i18n/hg.pot
         # All strings marked for translation in Mercurial contain
         # ASCII characters only. But some files contain string
         # literals like this '\037\213'. xgettext thinks it has to
         # parse them even though they are not marked for translation.
         # Extracting with an explicit encoding of ISO-8859-1 will make
         # xgettext "parse" and ignore them.
-	echo $^ | xargs \
+	echo $(PYTHON_FILES) | xargs \
 	  xgettext --package-name "Mercurial" \
 	  --msgid-bugs-address "<mercurial-devel@selenic.com>" \
 	  --copyright-holder "Matt Mackall <mpm@selenic.com> and others" \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/dates.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,36 @@
+    Some commands allow the user to specify a date, e.g.:
+
+    - backout, commit, import, tag: Specify the commit date.
+    - log, revert, update: Select revision(s) by date.
+
+    Many date formats are valid. Here are some examples::
+
+      "Wed Dec 6 13:18:29 2006" (local timezone assumed)
+      "Dec 6 13:18 -0600" (year assumed, time offset provided)
+      "Dec 6 13:18 UTC" (UTC and GMT are aliases for +0000)
+      "Dec 6" (midnight)
+      "13:18" (today assumed)
+      "3:39" (3:39AM assumed)
+      "3:39pm" (15:39)
+      "2006-12-06 13:18:29" (ISO 8601 format)
+      "2006-12-6 13:18"
+      "2006-12-6"
+      "12-6"
+      "12/6"
+      "12/6/6" (Dec 6 2006)
+
+    Lastly, there is Mercurial's internal format::
+
+      "1165432709 0" (Wed Dec 6 13:18:29 2006 UTC)
+
+    This is the internal representation format for dates. unixtime is
+    the number of seconds since the epoch (1970-01-01 00:00 UTC).
+    offset is the offset of the local timezone, in seconds west of UTC
+    (negative if the timezone is east of UTC).
+
+    The log command also accepts date ranges::
+
+      "<{datetime}" - at or before a given date/time
+      ">{datetime}" - on or after a given date/time
+      "{datetime} to {datetime}" - a date range, inclusive
+      "-{days}" - within a given number of days of today
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/diffs.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,31 @@
+    Mercurial's default format for showing changes between two
+    versions of a file is compatible with the unified format of GNU
+    diff, which can be used by GNU patch and many other standard
+    tools.
+
+    While this standard format is often enough, it does not encode the
+    following information:
+
+    - executable status and other permission bits
+    - copy or rename information
+    - changes in binary files
+    - creation or deletion of empty files
+
+    Mercurial also supports the extended diff format from the git VCS
+    which addresses these limitations. The git diff format is not
+    produced by default because a few widespread tools still do not
+    understand this format.
+
+    This means that when generating diffs from a Mercurial repository
+    (e.g. with "hg export"), you should be careful about things like
+    file copies and renames or other things mentioned above, because
+    when applying a standard diff to a different repository, this
+    extra information is lost. Mercurial's internal operations (like
+    push and pull) are not affected by this, because they use an
+    internal binary format for communicating changes.
+
+    To make Mercurial produce the git extended diff format, use the
+    --git option available for many commands, or set 'git = True' in
+    the [diff] section of your hgrc. You do not need to set this
+    option when importing diffs in this format or using them in the mq
+    extension.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/environment.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,76 @@
+HG
+    Path to the 'hg' executable, automatically passed when running
+    hooks, extensions or external tools. If unset or empty, this is
+    the hg executable's name if it's frozen, or an executable named
+    'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on
+    Windows) is searched.
+
+HGEDITOR
+    This is the name of the editor to run when committing. See EDITOR.
+
+    (deprecated, use .hgrc)
+
+HGENCODING
+    This overrides the default locale setting detected by Mercurial.
+    This setting is used to convert data including usernames,
+    changeset descriptions, tag names, and branches. This setting can
+    be overridden with the --encoding command-line option.
+
+HGENCODINGMODE
+    This sets Mercurial's behavior for handling unknown characters
+    while transcoding user input. The default is "strict", which
+    causes Mercurial to abort if it can't map a character. Other
+    settings include "replace", which replaces unknown characters, and
+    "ignore", which drops them. This setting can be overridden with
+    the --encodingmode command-line option.
+
+HGMERGE
+    An executable to use for resolving merge conflicts. The program
+    will be executed with three arguments: local file, remote file,
+    ancestor file.
+
+    (deprecated, use .hgrc)
+
+HGRCPATH
+    A list of files or directories to search for hgrc files. Item
+    separator is ":" on Unix, ";" on Windows. If HGRCPATH is not set,
+    platform default search path is used. If empty, only the .hg/hgrc
+    from the current repository is read.
+
+    For each element in HGRCPATH:
+
+    - if it's a directory, all files ending with .rc are added
+    - otherwise, the file itself will be added
+
+HGUSER
+    This is the string used as the author of a commit. If not set,
+    available values will be considered in this order:
+
+    - HGUSER (deprecated)
+    - hgrc files from the HGRCPATH
+    - EMAIL
+    - interactive prompt
+    - LOGNAME (with '@hostname' appended)
+
+    (deprecated, use .hgrc)
+
+EMAIL
+    May be used as the author of a commit; see HGUSER.
+
+LOGNAME
+    May be used as the author of a commit; see HGUSER.
+
+VISUAL
+    This is the name of the editor to use when committing. See EDITOR.
+
+EDITOR
+    Sometimes Mercurial needs to open a text file in an editor for a
+    user to modify, for example when writing commit messages. The
+    editor it uses is determined by looking at the environment
+    variables HGEDITOR, VISUAL and EDITOR, in that order. The first
+    non-empty one is chosen. If all of them are empty, the editor
+    defaults to 'vi'.
+
+PYTHONPATH
+    This is used by Python to find imported modules and may need to be
+    set appropriately if this Mercurial is not installed system-wide.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/extensions.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,33 @@
+    Mercurial has the ability to add new features through the use of
+    extensions. Extensions may add new commands, add options to
+    existing commands, change the default behavior of commands, or
+    implement hooks.
+
+    Extensions are not loaded by default for a variety of reasons:
+    they can increase startup overhead; they may be meant for advanced
+    usage only; they may provide potentially dangerous abilities (such
+    as letting you destroy or modify history); they might not be ready
+    for prime time; or they may alter some usual behaviors of stock
+    Mercurial. It is thus up to the user to activate extensions as
+    needed.
+
+    To enable the "foo" extension, either shipped with Mercurial or in
+    the Python search path, create an entry for it in your hgrc, like
+    this::
+
+      [extensions]
+      foo =
+
+    You may also specify the full path to an extension::
+
+      [extensions]
+      myfeature = ~/.hgext/myfeature.py
+
+    To explicitly disable an extension enabled in an hgrc of broader
+    scope, prepend its path with !::
+
+      [extensions]
+      # disabling extension bar residing in /path/to/extension/bar.py
+      hgext.bar = !/path/to/extension/bar.py
+      # ditto, but no path was supplied for extension baz
+      hgext.baz = !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/multirevs.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,15 @@
+    When Mercurial accepts more than one revision, they may be
+    specified individually, or provided as a topologically continuous
+    range, separated by the ":" character.
+
+    The syntax of range notation is [BEGIN]:[END], where BEGIN and END
+    are revision identifiers. Both BEGIN and END are optional. If
+    BEGIN is not specified, it defaults to revision number 0. If END
+    is not specified, it defaults to the tip. The range ":" thus means
+    "all revisions".
+
+    If BEGIN is greater than END, revisions are treated in reverse
+    order.
+
+    A range acts as a closed interval. This means that a range of 3:5
+    gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/patterns.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,41 @@
+    Mercurial accepts several notations for identifying one or more
+    files at a time.
+
+    By default, Mercurial treats filenames as shell-style extended
+    glob patterns.
+
+    Alternate pattern notations must be specified explicitly.
+
+    To use a plain path name without any pattern matching, start it
+    with "path:". These path names must completely match starting at
+    the current repository root.
+
+    To use an extended glob, start a name with "glob:". Globs are
+    rooted at the current directory; a glob such as "``*.c``" will
+    only match files in the current directory ending with ".c".
+
+    The supported glob syntax extensions are "``**``" to match any
+    string across path separators and "{a,b}" to mean "a or b".
+
+    To use a Perl/Python regular expression, start a name with "re:".
+    Regexp pattern matching is anchored at the root of the repository.
+
+    Plain examples::
+
+      path:foo/bar   a name bar in a directory named foo in the root
+                     of the repository
+      path:path:name a file or directory named "path:name"
+
+    Glob examples::
+
+      glob:*.c       any name ending in ".c" in the current directory
+      *.c            any name ending in ".c" in the current directory
+      **.c           any name ending in ".c" in any subdirectory of the
+                     current directory including itself.
+      foo/*.c        any name ending in ".c" in the directory foo
+      foo/**.c       any name ending in ".c" in any subdirectory of foo
+                     including itself.
+
+    Regexp examples::
+
+      re:.*\.c$      any name ending in ".c", anywhere in the repository
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/revisions.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,29 @@
+    Mercurial supports several ways to specify individual revisions.
+
+    A plain integer is treated as a revision number. Negative integers
+    are treated as sequential offsets from the tip, with -1 denoting
+    the tip, -2 denoting the revision prior to the tip, and so forth.
+
+    A 40-digit hexadecimal string is treated as a unique revision
+    identifier.
+
+    A hexadecimal string less than 40 characters long is treated as a
+    unique revision identifier and is referred to as a short-form
+    identifier. A short-form identifier is only valid if it is the
+    prefix of exactly one full-length identifier.
+
+    Any other string is treated as a tag or branch name. A tag name is
+    a symbolic name associated with a revision identifier. A branch
+    name denotes the tipmost revision of that branch. Tag and branch
+    names must not contain the ":" character.
+
+    The reserved name "tip" is a special tag that always identifies
+    the most recent revision.
+
+    The reserved name "null" indicates the null revision. This is the
+    revision of an empty repository, and the parent of revision 0.
+
+    The reserved name "." indicates the working directory parent. If
+    no working directory is checked out, it is equivalent to null. If
+    an uncommitted merge is in progress, "." is the revision of the
+    first parent.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/templates.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,113 @@
+    Mercurial allows you to customize output of commands through
+    templates. You can either pass in a template from the command
+    line, via the --template option, or select an existing
+    template-style (--style).
+
+    You can customize output for any "log-like" command: log,
+    outgoing, incoming, tip, parents, heads and glog.
+
+    Three styles are packaged with Mercurial: default (the style used
+    when no explicit preference is passed), compact and changelog.
+    Usage::
+
+        $ hg log -r1 --style changelog
+
+    A template is a piece of text, with markup to invoke variable
+    expansion::
+
+        $ hg log -r1 --template "{node}\n"
+        b56ce7b07c52de7d5fd79fb89701ea538af65746
+
+    Strings in curly braces are called keywords. The availability of
+    keywords depends on the exact context of the templater. These
+    keywords are usually available for templating a log-like command:
+
+    :author:    String. The unmodified author of the changeset.
+    :branches:  String. The name of the branch on which the changeset
+                was committed. Will be empty if the branch name was
+                default.
+    :date:      Date information. The date when the changeset was
+                committed.
+    :desc:      String. The text of the changeset description.
+    :diffstat:  String. Statistics of changes with the following
+                format: "modified files: +added/-removed lines"
+    :files:     List of strings. All files modified, added, or removed
+                by this changeset.
+    :file_adds: List of strings. Files added by this changeset.
+    :file_mods: List of strings. Files modified by this changeset.
+    :file_dels: List of strings. Files removed by this changeset.
+    :node:      String. The changeset identification hash, as a
+                40-character hexadecimal string.
+    :parents:   List of strings. The parents of the changeset.
+    :rev:       Integer. The repository-local changeset revision
+                number.
+    :tags:      List of strings. Any tags associated with the
+                changeset.
+    :latesttag: String. Most recent global tag in the ancestors of this
+                changeset.
+    :latesttagdistance: Integer. Longest path to the latest tag.
+
+    The "date" keyword does not produce human-readable output. If you
+    want to use a date in your output, you can use a filter to process
+    it. Filters are functions which return a string based on the input
+    variable. You can also use a chain of filters to get the desired
+    output::
+
+       $ hg tip --template "{date|isodate}\n"
+       2008-08-21 18:22 +0000
+
+    List of filters:
+
+    :addbreaks:   Any text. Add an XHTML "<br />" tag before the end of
+                  every line except the last.
+    :age:         Date. Returns a human-readable date/time difference
+                  between the given date/time and the current
+                  date/time.
+    :basename:    Any text. Treats the text as a path, and returns the
+                  last component of the path after splitting by the
+                  path separator (ignoring trailing separators). For
+                  example, "foo/bar/baz" becomes "baz" and "foo/bar//"
+                  becomes "bar".
+    :stripdir:    Treat the text as path and strip a directory level,
+                  if possible. For example, "foo" and "foo/bar" becomes
+                  "foo".
+    :date:        Date. Returns a date in a Unix date format, including
+                  the timezone: "Mon Sep 04 15:13:13 2006 0700".
+    :domain:      Any text. Finds the first string that looks like an
+                  email address, and extracts just the domain
+                  component. Example: 'User <user@example.com>' becomes
+                  'example.com'.
+    :email:       Any text. Extracts the first string that looks like
+                  an email address. Example: 'User <user@example.com>'
+                  becomes 'user@example.com'.
+    :escape:      Any text. Replaces the special XML/XHTML characters
+                  "&", "<" and ">" with XML entities.
+    :fill68:      Any text. Wraps the text to fit in 68 columns.
+    :fill76:      Any text. Wraps the text to fit in 76 columns.
+    :firstline:   Any text. Returns the first line of text.
+    :nonempty:    Any text. Returns '(none)' if the string is empty.
+    :hgdate:      Date. Returns the date as a pair of numbers:
+                  "1157407993 25200" (Unix timestamp, timezone offset).
+    :isodate:     Date. Returns the date in ISO 8601 format:
+                  "2009-08-18 13:00 +0200".
+    :isodatesec:  Date. Returns the date in ISO 8601 format, including
+                  seconds: "2009-08-18 13:00:13 +0200". See also the
+                  rfc3339date filter.
+    :localdate:   Date. Converts a date to local date.
+    :obfuscate:   Any text. Returns the input text rendered as a
+                  sequence of XML entities.
+    :person:      Any text. Returns the text before an email address.
+    :rfc822date:  Date. Returns a date using the same format used in
+                  email headers: "Tue, 18 Aug 2009 13:00:13 +0200".
+    :rfc3339date: Date. Returns a date using the Internet date format
+                  specified in RFC 3339: "2009-08-18T13:00:13+02:00".
+    :short:       Changeset hash. Returns the short form of a changeset
+                  hash, i.e. a 12-byte hexadecimal string.
+    :shortdate:   Date. Returns a date like "2006-09-18".
+    :strip:       Any text. Strips all leading and trailing whitespace.
+    :tabindent:   Any text. Returns the text, with every line except
+                  the first starting with a tab character.
+    :urlescape:   Any text. Escapes all "special" characters. For
+                  example, "foo bar" becomes "foo%20bar".
+    :user:        Any text. Returns the user portion of an email
+                  address.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/help/urls.txt	Sun Oct 04 09:59:13 2009 +0200
@@ -0,0 +1,66 @@
+    Valid URLs are of the form::
+
+      local/filesystem/path[#revision]
+      file://local/filesystem/path[#revision]
+      http://[user[:pass]@]host[:port]/[path][#revision]
+      https://[user[:pass]@]host[:port]/[path][#revision]
+      ssh://[user[:pass]@]host[:port]/[path][#revision]
+
+    Paths in the local filesystem can either point to Mercurial
+    repositories or to bundle files (as created by 'hg bundle' or 'hg
+    incoming --bundle').
+
+    An optional identifier after # indicates a particular branch, tag,
+    or changeset to use from the remote repository. See also 'hg help
+    revisions'.
+
+    Some features, such as pushing to http:// and https:// URLs are
+    only possible if the feature is explicitly enabled on the remote
+    Mercurial server.
+
+    Some notes about using SSH with Mercurial:
+
+    - SSH requires an accessible shell account on the destination
+      machine and a copy of hg in the remote path or specified with as
+      remotecmd.
+    - path is relative to the remote user's home directory by default.
+      Use an extra slash at the start of a path to specify an absolute
+      path::
+
+        ssh://example.com//tmp/repository
+
+    - Mercurial doesn't use its own compression via SSH; the right
+      thing to do is to configure it in your ~/.ssh/config, e.g.::
+
+        Host *.mylocalnetwork.example.com
+          Compression no
+        Host *
+          Compression yes
+
+      Alternatively specify "ssh -C" as your ssh command in your hgrc
+      or with the --ssh command line option.
+
+    These URLs can all be stored in your hgrc with path aliases under
+    the [paths] section like so::
+
+      [paths]
+      alias1 = URL1
+      alias2 = URL2
+      ...
+
+    You can then use the alias for any command that uses a URL (for
+    example 'hg pull alias1' would pull from the 'alias1' path).
+
+    Two path aliases are special because they are used as defaults
+    when you do not provide the URL to a command:
+
+    default:
+      When you create a repository with hg clone, the clone command
+      saves the location of the source repository as the new
+      repository's 'default' path. This is then used when you omit
+      path from push- and pull-like commands (including incoming and
+      outgoing).
+
+    default-push:
+      The push command will look for a path named 'default-push', and
+      prefer it over 'default' if both are defined.
--- a/i18n/hggettext	Sat Oct 03 18:58:25 2009 +0200
+++ b/i18n/hggettext	Sun Oct 04 09:59:13 2009 +0200
@@ -112,6 +112,11 @@
             print poentry(path, lineno, func.__doc__)
 
 
+def rawtext(path):
+    src = open(path).read()
+    print poentry(path, 1, src)
+
+
 if __name__ == "__main__":
     # It is very important that we import the Mercurial modules from
     # the source tree where hggettext is executed. Otherwise we might
@@ -120,4 +125,7 @@
     sys.path.insert(0, os.getcwd())
     from mercurial import demandimport; demandimport.enable()
     for path in sys.argv[1:]:
-        docstrings(path)
+        if path.endswith('.txt'):
+            rawtext(path)
+        else:
+            docstrings(path)
--- a/mercurial/help.py	Sat Oct 03 18:58:25 2009 +0200
+++ b/mercurial/help.py	Sun Oct 04 09:59:13 2009 +0200
@@ -5,7 +5,8 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2, incorporated herein by reference.
 
-from i18n import _
+from i18n import gettext, _
+import sys, os
 import extensions, util
 
 
@@ -49,41 +50,7 @@
     return result
 
 def extshelp():
-    doc = _(r'''
-    Mercurial has the ability to add new features through the use of
-    extensions. Extensions may add new commands, add options to
-    existing commands, change the default behavior of commands, or
-    implement hooks.
-
-    Extensions are not loaded by default for a variety of reasons:
-    they can increase startup overhead; they may be meant for advanced
-    usage only; they may provide potentially dangerous abilities (such
-    as letting you destroy or modify history); they might not be ready
-    for prime time; or they may alter some usual behaviors of stock
-    Mercurial. It is thus up to the user to activate extensions as
-    needed.
-
-    To enable the "foo" extension, either shipped with Mercurial or in
-    the Python search path, create an entry for it in your hgrc, like
-    this::
-
-      [extensions]
-      foo =
-
-    You may also specify the full path to an extension::
-
-      [extensions]
-      myfeature = ~/.hgext/myfeature.py
-
-    To explicitly disable an extension enabled in an hgrc of broader
-    scope, prepend its path with !::
-
-      [extensions]
-      # disabling extension bar residing in /path/to/extension/bar.py
-      hgext.bar = !/path/to/extension/bar.py
-      # ditto, but no path was supplied for extension baz
-      hgext.baz = !
-    ''')
+    doc = loaddoc('extensions')()
 
     exts, maxlength = extensions.enabled()
     doc += listexts(_('enabled extensions:'), exts, maxlength)
@@ -93,444 +60,33 @@
 
     return doc
 
-helptable = (
-    (["dates"], _("Date Formats"),
-     _(r'''
-    Some commands allow the user to specify a date, e.g.:
-
-    - backout, commit, import, tag: Specify the commit date.
-    - log, revert, update: Select revision(s) by date.
-
-    Many date formats are valid. Here are some examples::
-
-      "Wed Dec 6 13:18:29 2006" (local timezone assumed)
-      "Dec 6 13:18 -0600" (year assumed, time offset provided)
-      "Dec 6 13:18 UTC" (UTC and GMT are aliases for +0000)
-      "Dec 6" (midnight)
-      "13:18" (today assumed)
-      "3:39" (3:39AM assumed)
-      "3:39pm" (15:39)
-      "2006-12-06 13:18:29" (ISO 8601 format)
-      "2006-12-6 13:18"
-      "2006-12-6"
-      "12-6"
-      "12/6"
-      "12/6/6" (Dec 6 2006)
-
-    Lastly, there is Mercurial's internal format::
-
-      "1165432709 0" (Wed Dec 6 13:18:29 2006 UTC)
-
-    This is the internal representation format for dates. unixtime is
-    the number of seconds since the epoch (1970-01-01 00:00 UTC).
-    offset is the offset of the local timezone, in seconds west of UTC
-    (negative if the timezone is east of UTC).
-
-    The log command also accepts date ranges::
-
-      "<{datetime}" - at or before a given date/time
-      ">{datetime}" - on or after a given date/time
-      "{datetime} to {datetime}" - a date range, inclusive
-      "-{days}" - within a given number of days of today
-    ''')),
-
-    (["patterns"], _("File Name Patterns"),
-     _(r'''
-    Mercurial accepts several notations for identifying one or more
-    files at a time.
-
-    By default, Mercurial treats filenames as shell-style extended
-    glob patterns.
-
-    Alternate pattern notations must be specified explicitly.
-
-    To use a plain path name without any pattern matching, start it
-    with "path:". These path names must completely match starting at
-    the current repository root.
-
-    To use an extended glob, start a name with "glob:". Globs are
-    rooted at the current directory; a glob such as "``*.c``" will
-    only match files in the current directory ending with ".c".
-
-    The supported glob syntax extensions are "``**``" to match any
-    string across path separators and "{a,b}" to mean "a or b".
-
-    To use a Perl/Python regular expression, start a name with "re:".
-    Regexp pattern matching is anchored at the root of the repository.
-
-    Plain examples::
-
-      path:foo/bar   a name bar in a directory named foo in the root
-                     of the repository
-      path:path:name a file or directory named "path:name"
-
-    Glob examples::
-
-      glob:*.c       any name ending in ".c" in the current directory
-      *.c            any name ending in ".c" in the current directory
-      **.c           any name ending in ".c" in any subdirectory of the
-                     current directory including itself.
-      foo/*.c        any name ending in ".c" in the directory foo
-      foo/**.c       any name ending in ".c" in any subdirectory of foo
-                     including itself.
-
-    Regexp examples::
-
-      re:.*\.c$      any name ending in ".c", anywhere in the repository
-
-    ''')),
-
-    (['environment', 'env'], _('Environment Variables'),
-     _(r'''
-HG
-    Path to the 'hg' executable, automatically passed when running
-    hooks, extensions or external tools. If unset or empty, this is
-    the hg executable's name if it's frozen, or an executable named
-    'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on
-    Windows) is searched.
-
-HGEDITOR
-    This is the name of the editor to run when committing. See EDITOR.
-
-    (deprecated, use .hgrc)
-
-HGENCODING
-    This overrides the default locale setting detected by Mercurial.
-    This setting is used to convert data including usernames,
-    changeset descriptions, tag names, and branches. This setting can
-    be overridden with the --encoding command-line option.
+def loaddoc(topic):
+    """Return a delayed loader for help/topic.txt."""
 
-HGENCODINGMODE
-    This sets Mercurial's behavior for handling unknown characters
-    while transcoding user input. The default is "strict", which
-    causes Mercurial to abort if it can't map a character. Other
-    settings include "replace", which replaces unknown characters, and
-    "ignore", which drops them. This setting can be overridden with
-    the --encodingmode command-line option.
-
-HGMERGE
-    An executable to use for resolving merge conflicts. The program
-    will be executed with three arguments: local file, remote file,
-    ancestor file.
-
-    (deprecated, use .hgrc)
-
-HGRCPATH
-    A list of files or directories to search for hgrc files. Item
-    separator is ":" on Unix, ";" on Windows. If HGRCPATH is not set,
-    platform default search path is used. If empty, only the .hg/hgrc
-    from the current repository is read.
-
-    For each element in HGRCPATH:
-
-    - if it's a directory, all files ending with .rc are added
-    - otherwise, the file itself will be added
-
-HGUSER
-    This is the string used as the author of a commit. If not set,
-    available values will be considered in this order:
-
-    - HGUSER (deprecated)
-    - hgrc files from the HGRCPATH
-    - EMAIL
-    - interactive prompt
-    - LOGNAME (with '@hostname' appended)
-
-    (deprecated, use .hgrc)
-
-EMAIL
-    May be used as the author of a commit; see HGUSER.
-
-LOGNAME
-    May be used as the author of a commit; see HGUSER.
-
-VISUAL
-    This is the name of the editor to use when committing. See EDITOR.
-
-EDITOR
-    Sometimes Mercurial needs to open a text file in an editor for a
-    user to modify, for example when writing commit messages. The
-    editor it uses is determined by looking at the environment
-    variables HGEDITOR, VISUAL and EDITOR, in that order. The first
-    non-empty one is chosen. If all of them are empty, the editor
-    defaults to 'vi'.
-
-PYTHONPATH
-    This is used by Python to find imported modules and may need to be
-    set appropriately if this Mercurial is not installed system-wide.
-    ''')),
-
-    (['revs', 'revisions'], _('Specifying Single Revisions'),
-     _(r'''
-    Mercurial supports several ways to specify individual revisions.
-
-    A plain integer is treated as a revision number. Negative integers
-    are treated as sequential offsets from the tip, with -1 denoting
-    the tip, -2 denoting the revision prior to the tip, and so forth.
-
-    A 40-digit hexadecimal string is treated as a unique revision
-    identifier.
-
-    A hexadecimal string less than 40 characters long is treated as a
-    unique revision identifier and is referred to as a short-form
-    identifier. A short-form identifier is only valid if it is the
-    prefix of exactly one full-length identifier.
-
-    Any other string is treated as a tag or branch name. A tag name is
-    a symbolic name associated with a revision identifier. A branch
-    name denotes the tipmost revision of that branch. Tag and branch
-    names must not contain the ":" character.
-
-    The reserved name "tip" is a special tag that always identifies
-    the most recent revision.
-
-    The reserved name "null" indicates the null revision. This is the
-    revision of an empty repository, and the parent of revision 0.
-
-    The reserved name "." indicates the working directory parent. If
-    no working directory is checked out, it is equivalent to null. If
-    an uncommitted merge is in progress, "." is the revision of the
-    first parent.
-    ''')),
-
-    (['mrevs', 'multirevs'], _('Specifying Multiple Revisions'),
-     _(r'''
-    When Mercurial accepts more than one revision, they may be
-    specified individually, or provided as a topologically continuous
-    range, separated by the ":" character.
-
-    The syntax of range notation is [BEGIN]:[END], where BEGIN and END
-    are revision identifiers. Both BEGIN and END are optional. If
-    BEGIN is not specified, it defaults to revision number 0. If END
-    is not specified, it defaults to the tip. The range ":" thus means
-    "all revisions".
-
-    If BEGIN is greater than END, revisions are treated in reverse
-    order.
-
-    A range acts as a closed interval. This means that a range of 3:5
-    gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.
-    ''')),
+    def loader():
+        if hasattr(sys, 'frozen'):
+            module = sys.executable
+        else:
+            module = __file__
+        base = os.path.dirname(module)
 
-    (['diffs'], _('Diff Formats'),
-     _(r'''
-    Mercurial's default format for showing changes between two
-    versions of a file is compatible with the unified format of GNU
-    diff, which can be used by GNU patch and many other standard
-    tools.
-
-    While this standard format is often enough, it does not encode the
-    following information:
-
-    - executable status and other permission bits
-    - copy or rename information
-    - changes in binary files
-    - creation or deletion of empty files
-
-    Mercurial also supports the extended diff format from the git VCS
-    which addresses these limitations. The git diff format is not
-    produced by default because a few widespread tools still do not
-    understand this format.
-
-    This means that when generating diffs from a Mercurial repository
-    (e.g. with "hg export"), you should be careful about things like
-    file copies and renames or other things mentioned above, because
-    when applying a standard diff to a different repository, this
-    extra information is lost. Mercurial's internal operations (like
-    push and pull) are not affected by this, because they use an
-    internal binary format for communicating changes.
-
-    To make Mercurial produce the git extended diff format, use the
-    --git option available for many commands, or set 'git = True' in
-    the [diff] section of your hgrc. You do not need to set this
-    option when importing diffs in this format or using them in the mq
-    extension.
-    ''')),
-    (['templating', 'templates'], _('Template Usage'),
-     _(r'''
-    Mercurial allows you to customize output of commands through
-    templates. You can either pass in a template from the command
-    line, via the --template option, or select an existing
-    template-style (--style).
-
-    You can customize output for any "log-like" command: log,
-    outgoing, incoming, tip, parents, heads and glog.
-
-    Three styles are packaged with Mercurial: default (the style used
-    when no explicit preference is passed), compact and changelog.
-    Usage::
+        for dir in ('.', '..'):
+            docdir = os.path.join(base, dir, 'help')
+            if os.path.isdir(docdir):
+                break
 
-        $ hg log -r1 --style changelog
-
-    A template is a piece of text, with markup to invoke variable
-    expansion::
-
-        $ hg log -r1 --template "{node}\n"
-        b56ce7b07c52de7d5fd79fb89701ea538af65746
-
-    Strings in curly braces are called keywords. The availability of
-    keywords depends on the exact context of the templater. These
-    keywords are usually available for templating a log-like command:
-
-    :author:    String. The unmodified author of the changeset.
-    :branches:  String. The name of the branch on which the changeset
-                was committed. Will be empty if the branch name was
-                default.
-    :date:      Date information. The date when the changeset was
-                committed.
-    :desc:      String. The text of the changeset description.
-    :diffstat:  String. Statistics of changes with the following
-                format: "modified files: +added/-removed lines"
-    :files:     List of strings. All files modified, added, or removed
-                by this changeset.
-    :file_adds: List of strings. Files added by this changeset.
-    :file_mods: List of strings. Files modified by this changeset.
-    :file_dels: List of strings. Files removed by this changeset.
-    :node:      String. The changeset identification hash, as a
-                40-character hexadecimal string.
-    :parents:   List of strings. The parents of the changeset.
-    :rev:       Integer. The repository-local changeset revision
-                number.
-    :tags:      List of strings. Any tags associated with the
-                changeset.
-    :latesttag: String. Most recent global tag in the ancestors of this
-                changeset.
-    :latesttagdistance: Integer. Longest path to the latest tag.
-
-    The "date" keyword does not produce human-readable output. If you
-    want to use a date in your output, you can use a filter to process
-    it. Filters are functions which return a string based on the input
-    variable. You can also use a chain of filters to get the desired
-    output::
-
-       $ hg tip --template "{date|isodate}\n"
-       2008-08-21 18:22 +0000
-
-    List of filters:
+        path = os.path.join(docdir, topic + ".txt")
+        return gettext(open(path).read())
+    return loader
 
-    :addbreaks:   Any text. Add an XHTML "<br />" tag before the end of
-                  every line except the last.
-    :age:         Date. Returns a human-readable date/time difference
-                  between the given date/time and the current
-                  date/time.
-    :basename:    Any text. Treats the text as a path, and returns the
-                  last component of the path after splitting by the
-                  path separator (ignoring trailing separators). For
-                  example, "foo/bar/baz" becomes "baz" and "foo/bar//"
-                  becomes "bar".
-    :stripdir:    Treat the text as path and strip a directory level,
-                  if possible. For example, "foo" and "foo/bar" becomes
-                  "foo".
-    :date:        Date. Returns a date in a Unix date format, including
-                  the timezone: "Mon Sep 04 15:13:13 2006 0700".
-    :domain:      Any text. Finds the first string that looks like an
-                  email address, and extracts just the domain
-                  component. Example: 'User <user@example.com>' becomes
-                  'example.com'.
-    :email:       Any text. Extracts the first string that looks like
-                  an email address. Example: 'User <user@example.com>'
-                  becomes 'user@example.com'.
-    :escape:      Any text. Replaces the special XML/XHTML characters
-                  "&", "<" and ">" with XML entities.
-    :fill68:      Any text. Wraps the text to fit in 68 columns.
-    :fill76:      Any text. Wraps the text to fit in 76 columns.
-    :firstline:   Any text. Returns the first line of text.
-    :nonempty:    Any text. Returns '(none)' if the string is empty.
-    :hgdate:      Date. Returns the date as a pair of numbers:
-                  "1157407993 25200" (Unix timestamp, timezone offset).
-    :isodate:     Date. Returns the date in ISO 8601 format:
-                  "2009-08-18 13:00 +0200".
-    :isodatesec:  Date. Returns the date in ISO 8601 format, including
-                  seconds: "2009-08-18 13:00:13 +0200". See also the
-                  rfc3339date filter.
-    :localdate:   Date. Converts a date to local date.
-    :obfuscate:   Any text. Returns the input text rendered as a
-                  sequence of XML entities.
-    :person:      Any text. Returns the text before an email address.
-    :rfc822date:  Date. Returns a date using the same format used in
-                  email headers: "Tue, 18 Aug 2009 13:00:13 +0200".
-    :rfc3339date: Date. Returns a date using the Internet date format
-                  specified in RFC 3339: "2009-08-18T13:00:13+02:00".
-    :short:       Changeset hash. Returns the short form of a changeset
-                  hash, i.e. a 12-byte hexadecimal string.
-    :shortdate:   Date. Returns a date like "2006-09-18".
-    :strip:       Any text. Strips all leading and trailing whitespace.
-    :tabindent:   Any text. Returns the text, with every line except
-                  the first starting with a tab character.
-    :urlescape:   Any text. Escapes all "special" characters. For
-                  example, "foo bar" becomes "foo%20bar".
-    :user:        Any text. Returns the user portion of an email
-                  address.
-    ''')),
-
-    (['urls'], _('URL Paths'),
-     _(r'''
-    Valid URLs are of the form::
-
-      local/filesystem/path[#revision]
-      file://local/filesystem/path[#revision]
-      http://[user[:pass]@]host[:port]/[path][#revision]
-      https://[user[:pass]@]host[:port]/[path][#revision]
-      ssh://[user[:pass]@]host[:port]/[path][#revision]
-
-    Paths in the local filesystem can either point to Mercurial
-    repositories or to bundle files (as created by 'hg bundle' or 'hg
-    incoming --bundle').
-
-    An optional identifier after # indicates a particular branch, tag,
-    or changeset to use from the remote repository. See also 'hg help
-    revisions'.
-
-    Some features, such as pushing to http:// and https:// URLs are
-    only possible if the feature is explicitly enabled on the remote
-    Mercurial server.
-
-    Some notes about using SSH with Mercurial:
-
-    - SSH requires an accessible shell account on the destination
-      machine and a copy of hg in the remote path or specified with as
-      remotecmd.
-    - path is relative to the remote user's home directory by default.
-      Use an extra slash at the start of a path to specify an absolute
-      path::
-
-        ssh://example.com//tmp/repository
-
-    - Mercurial doesn't use its own compression via SSH; the right
-      thing to do is to configure it in your ~/.ssh/config, e.g.::
-
-        Host *.mylocalnetwork.example.com
-          Compression no
-        Host *
-          Compression yes
-
-      Alternatively specify "ssh -C" as your ssh command in your hgrc
-      or with the --ssh command line option.
-
-    These URLs can all be stored in your hgrc with path aliases under
-    the [paths] section like so::
-
-      [paths]
-      alias1 = URL1
-      alias2 = URL2
-      ...
-
-    You can then use the alias for any command that uses a URL (for
-    example 'hg pull alias1' would pull from the 'alias1' path).
-
-    Two path aliases are special because they are used as defaults
-    when you do not provide the URL to a command:
-
-    default:
-      When you create a repository with hg clone, the clone command
-      saves the location of the source repository as the new
-      repository's 'default' path. This is then used when you omit
-      path from push- and pull-like commands (including incoming and
-      outgoing).
-
-    default-push:
-      The push command will look for a path named 'default-push', and
-      prefer it over 'default' if both are defined.
-    ''')),
+helptable = (
+    (["dates"], _("Date Formats"), loaddoc('dates')),
+    (["patterns"], _("File Name Patterns"), loaddoc('patterns')),
+    (['environment', 'env'], _('Environment Variables'), loaddoc('environment')),
+    (['revs', 'revisions'], _('Specifying Single Revisions'), loaddoc('revisions')),
+    (['mrevs', 'multirevs'], _('Specifying Multiple Revisions'), loaddoc('multirevs')),
+    (['diffs'], _('Diff Formats'), loaddoc('diffs')),
+    (['templating', 'templates'], _('Template Usage'), loaddoc('templates')),
+    (['urls'], _('URL Paths'), loaddoc('urls')),
     (["extensions"], _("Using additional features"), extshelp),
 )
--- a/setup.py	Sat Oct 03 18:58:25 2009 +0200
+++ b/setup.py	Sun Oct 04 09:59:13 2009 +0200
@@ -246,7 +246,7 @@
         packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
 
 datafiles = []
-for root in ('templates', 'i18n'):
+for root in ('templates', 'i18n', 'help'):
     for dir, dirs, files in os.walk(root):
         dirs[:] = [x for x in dirs if not x.startswith('.')]
         files = [x for x in files if not x.startswith('.')]