# HG changeset patch # User Brendan Cully # Date 1249537955 25200 # Node ID 19d07553d1b29f554b8478437a30b85a20312c5f # Parent 81900431589f363a922086048be7ede2c206960b# Parent f6683a7011e9c856e4b6f1fc0483ee104ce8f351 Merge backout of 26fa0e31011d diff -r f6683a7011e9 -r 19d07553d1b2 Makefile --- a/Makefile Wed Aug 05 22:51:30 2009 -0700 +++ b/Makefile Wed Aug 05 22:52:35 2009 -0700 @@ -89,7 +89,7 @@ # Extracting with an explicit encoding of ISO-8859-1 will make # xgettext "parse" and ignore them. echo $^ | xargs \ - xgettext --width 82 --package-name "Mercurial" \ + xgettext --package-name "Mercurial" \ --msgid-bugs-address "" \ --copyright-holder "Matt Mackall and others" \ --from-code ISO-8859-1 --join --sort-by-file \ diff -r f6683a7011e9 -r 19d07553d1b2 contrib/win32/mercurial.ini --- a/contrib/win32/mercurial.ini Wed Aug 05 22:51:30 2009 -0700 +++ b/contrib/win32/mercurial.ini Wed Aug 05 22:52:35 2009 -0700 @@ -1,30 +1,71 @@ -; System-wide Mercurial config file. To override these settings on a -; per-user basis, please edit the following file instead, where -; USERNAME is your Windows user name: -; C:\Documents and Settings\USERNAME\Mercurial.ini +; System-wide Mercurial config file. +; +; !!! Do Not Edit This File !!! +; +; This file will be replaced by the installer on every upgrade. +; Editing this file can cause strange side effects on Vista. +; +; http://bitbucket.org/tortoisehg/stable/issue/135 +; +; To change settings you see in this file, override (or enable) them in +; your user Mercurial.ini file, where USERNAME is your Windows user name: +; +; XP or older - C:\Documents and Settings\USERNAME\Mercurial.ini +; Vista or later - C:\Users\USERNAME\Mercurial.ini + [ui] +; editor used to enter commit logs, etc. Most text editors will work. editor = notepad ; show changed files and be a bit more verbose if True ; verbose = True - + ; username data to appear in commits ; it usually takes the form: Joe User ; username = Joe User - -; By default, we try to encode and decode all files that do not -; contain ASCII NUL characters. What this means is that we try to set -; line endings to Windows style on update, and to Unix style on -; commit. This lets us cooperate with Linux and Unix users, so -; everybody sees files with their native line endings. +; In order to push/pull over ssh you must specify an ssh tool +;ssh = "C:\Progra~1\TortoiseSVN\bin\TortoisePlink.exe" -ssh -2 +;ssh = C:\cygwin\bin\ssh +; +; For more information about mercurial extensions, start here +; http://www.selenic.com/mercurial/wiki/index.cgi/UsingExtensions +; +; Extensions shipped with Mercurial +; [extensions] -; The win32text extension is available and installed by default. It -; provides built-in Python hooks to perform line ending conversions. -; This is normally much faster than running an external program. -hgext.win32text = +;acl = +;alias = +;bookmarks = +;bugzilla = +;children = +;churn = +;color = +;convert = +;extdiff = +;fetch = +;gpg = +;graphlog = +;hgcia = +;hgk = +;highlight = +;interhg = +;keyword = +;mq = +;notify = +;pager = +;parentrevspec = +;patchbomb = +;purge = +;rebase = +;record = +;transplant = +;win32mbcs = +;win32text = +;zeroconf = +; To use cleverencode/cleverdecode, you must enable win32text extension [encode] ; Encode files that don't contain NUL characters. @@ -44,10 +85,40 @@ ; Alternatively, you can explicitly specify each file extension that ; you want decoded (any you omit will be left untouched), like this: + ; **.txt = dumbdecode: + +[patch] +; If you enable win32text filtering, you will want to enable this +; line as well to allow patching to work correctly. + +; eol = crlf + + +; +; Define external diff commands +; +[extdiff] +;cmd.bc3diff = C:\Program Files\Beyond Compare 3\BCompare.exe +;cmd.vdiff = C:\Progra~1\TortoiseSVN\bin\TortoiseMerge.exe +;cmd.vimdiff = gvim.exe +;opts.vimdiff = -f '+next' '+execute "DirDiff ".argv(0)." ".argv(1)' + + [hgk] ; Replace the following with your path to hgk, uncomment it and -; install ActiveTcl (or another win32 port) +; install ActiveTcl (or another win32 port like tclkit) ; path="C:\Program Files\Mercurial\Contrib\hgk.tcl" +; vdiff=vdiff + +; +; The git extended diff format can represent binary files, file +; permission changes, and rename information that the normal patch format +; cannot describe. However it is also not compatible with tools which +; expect normal patches. so enable git patches at your own risk. +; +[diff] +;git = false +;nodates = false diff -r f6683a7011e9 -r 19d07553d1b2 doc/gendoc.py --- a/doc/gendoc.py Wed Aug 05 22:51:30 2009 -0700 +++ b/doc/gendoc.py Wed Aug 05 22:52:35 2009 -0700 @@ -5,7 +5,7 @@ sys.path.append(os.path.join('..', 'mercurial', 'pure')) from mercurial import demandimport; demandimport.enable() from mercurial.commands import table, globalopts -from mercurial.i18n import gettext, _ +from mercurial.i18n import _ from mercurial.help import helptable def get_desc(docstr): @@ -54,18 +54,18 @@ return d def show_doc(ui): - def bold(s, text=""): - ui.write("%s\n%s\n%s\n" % (s, "="*len(s), text)) - def underlined(s, text=""): - ui.write("%s\n%s\n%s\n" % (s, "-"*len(s), text)) + def section(s): + ui.write("%s\n%s\n\n" % (s, "-" * len(s))) + def subsection(s): + ui.write("%s\n%s\n\n" % (s, '"' * len(s))) # print options - underlined(_("OPTIONS")) + section(_("OPTIONS")) for optstr, desc in get_opts(globalopts): ui.write("%s\n %s\n\n" % (optstr, desc)) # print cmds - underlined(_("COMMANDS")) + section(_("COMMANDS")) h = {} for c, attr in table.items(): f = c.split("|")[0] @@ -101,12 +101,13 @@ ui.write(_(" aliases: %s\n\n") % " ".join(d['aliases'])) # print topics - for names, section, doc in helptable: - underlined(gettext(section).upper()) + for names, sec, doc in helptable: + for name in names: + ui.write(".. _%s:\n" % name) + ui.write("\n") + section(sec.upper()) if callable(doc): doc = doc() - else: - doc = gettext(doc) ui.write(doc) ui.write("\n") diff -r f6683a7011e9 -r 19d07553d1b2 hgext/acl.py --- a/hgext/acl.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/acl.py Wed Aug 05 22:52:35 2009 -0700 @@ -8,18 +8,19 @@ '''hooks for controlling repository access -This hook makes it possible to allow or deny write access to portions of a -repository when receiving incoming changesets. +This hook makes it possible to allow or deny write access to portions +of a repository when receiving incoming changesets. + +The authorization is matched based on the local user name on the +system where the hook runs, and not the committer of the original +changeset (since the latter is merely informative). -The authorization is matched based on the local user name on the system where -the hook runs, and not the committer of the original changeset (since the -latter is merely informative). - -The acl hook is best used along with a restricted shell like hgsh, preventing -authenticating users from doing anything other than pushing or pulling. The -hook is not safe to use if users have interactive shell access, as they can -then disable the hook. Nor is it safe if remote users share an account, -because then there is no way to distinguish them. +The acl hook is best used along with a restricted shell like hgsh, +preventing authenticating users from doing anything other than +pushing or pulling. The hook is not safe to use if users have +interactive shell access, as they can then disable the hook. +Nor is it safe if remote users share an account, because then there +is no way to distinguish them. To use this hook, configure the acl extension in your hgrc like this:: @@ -34,9 +35,10 @@ # ("serve" == ssh or http, "push", "pull", "bundle") sources = serve -The allow and deny sections take a subtree pattern as key (with a glob syntax -by default), and a comma separated list of users as the corresponding value. -The deny list is checked before the allow list is. :: +The allow and deny sections take a subtree pattern as key (with a glob +syntax by default), and a comma separated list of users as the +corresponding value. The deny list is checked before the allow list +is. :: [acl.allow] # If acl.allow is not present, all users are allowed by default. diff -r f6683a7011e9 -r 19d07553d1b2 hgext/bookmarks.py --- a/hgext/bookmarks.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/bookmarks.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,22 +7,25 @@ '''track a line of development with movable markers -Bookmarks are local movable markers to changesets. Every bookmark points to a -changeset identified by its hash. If you commit a changeset that is based on a -changeset that has a bookmark on it, the bookmark shifts to the new changeset. +Bookmarks are local movable markers to changesets. Every bookmark +points to a changeset identified by its hash. If you commit a +changeset that is based on a changeset that has a bookmark on it, the +bookmark shifts to the new changeset. -It is possible to use bookmark names in every revision lookup (e.g. hg merge, -hg update). +It is possible to use bookmark names in every revision lookup (e.g. hg +merge, hg update). -By default, when several bookmarks point to the same changeset, they will all -move forward together. It is possible to obtain a more git-like experience by -adding the following configuration option to your .hgrc:: +By default, when several bookmarks point to the same changeset, they +will all move forward together. It is possible to obtain a more +git-like experience by adding the following configuration option to +your .hgrc:: [bookmarks] track.current = True -This will cause Mercurial to track the bookmark that you are currently using, -and only update it. This is similar to git's approach to branching. +This will cause Mercurial to track the bookmark that you are currently +using, and only update it. This is similar to git's approach to +branching. ''' from mercurial.i18n import _ @@ -121,15 +124,15 @@ def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False, rename=None): '''track a line of development with movable markers - Bookmarks are pointers to certain commits that move when committing. - Bookmarks are local. They can be renamed, copied and deleted. It is - possible to use bookmark names in 'hg merge' and 'hg update' to merge and - update respectively to a given bookmark. + Bookmarks are pointers to certain commits that move when + committing. Bookmarks are local. They can be renamed, copied and + deleted. It is possible to use bookmark names in 'hg merge' and + 'hg update' to merge and update respectively to a given bookmark. You can use 'hg bookmark NAME' to set a bookmark on the working - directory's parent revision with the given name. If you specify a revision - using -r REV (where REV may be an existing bookmark), the bookmark is - assigned to that revision. + directory's parent revision with the given name. If you specify + a revision using -r REV (where REV may be an existing bookmark), + the bookmark is assigned to that revision. ''' hexfn = ui.debugflag and hex or short marks = parse(repo) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/bugzilla.py --- a/hgext/bugzilla.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/bugzilla.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,21 +7,22 @@ '''hooks for integrating with the Bugzilla bug tracker -This hook extension adds comments on bugs in Bugzilla when changesets that -refer to bugs by Bugzilla ID are seen. The hook does not change bug status. +This hook extension adds comments on bugs in Bugzilla when changesets +that refer to bugs by Bugzilla ID are seen. The hook does not change +bug status. -The hook updates the Bugzilla database directly. Only Bugzilla installations -using MySQL are supported. +The hook updates the Bugzilla database directly. Only Bugzilla +installations using MySQL are supported. -The hook relies on a Bugzilla script to send bug change notification emails. -That script changes between Bugzilla versions; the 'processmail' script used -prior to 2.18 is replaced in 2.18 and subsequent versions by -'config/sendbugmail.pl'. Note that these will be run by Mercurial as the user -pushing the change; you will need to ensure the Bugzilla install file -permissions are set appropriately. +The hook relies on a Bugzilla script to send bug change notification +emails. That script changes between Bugzilla versions; the +'processmail' script used prior to 2.18 is replaced in 2.18 and +subsequent versions by 'config/sendbugmail.pl'. Note that these will +be run by Mercurial as the user pushing the change; you will need to +ensure the Bugzilla install file permissions are set appropriately. -The extension is configured through three different configuration sections. -These keys are recognized in the [bugzilla] section: +The extension is configured through three different configuration +sections. These keys are recognized in the [bugzilla] section: host Hostname of the MySQL server holding the Bugzilla database. @@ -39,35 +40,38 @@ Database connection timeout (seconds). Default 5. version - Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later, '2.18' - for Bugzilla versions from 2.18 and '2.16' for versions prior to 2.18. + Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later, + '2.18' for Bugzilla versions from 2.18 and '2.16' for versions prior + to 2.18. bzuser - Fallback Bugzilla user name to record comments with, if changeset committer - cannot be found as a Bugzilla user. + Fallback Bugzilla user name to record comments with, if changeset + committer cannot be found as a Bugzilla user. bzdir Bugzilla install directory. Used by default notify. Default '/var/www/html/bugzilla'. notify - The command to run to get Bugzilla to send bug change notification emails. - Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id) and 'user' - (committer bugzilla email). Default depends on version; from 2.18 it is "cd - %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s". + The command to run to get Bugzilla to send bug change notification + emails. Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id) + and 'user' (committer bugzilla email). Default depends on version; + from 2.18 it is "cd %(bzdir)s && perl -T contrib/sendbugmail.pl + %(id)s %(user)s". regexp - Regular expression to match bug IDs in changeset commit message. Must - contain one "()" group. The default expression matches 'Bug 1234', 'Bug no. - 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug 1234 and 5678' and - variations thereof. Matching is case insensitive. + Regular expression to match bug IDs in changeset commit message. + Must contain one "()" group. The default expression matches 'Bug + 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug + 1234 and 5678' and variations thereof. Matching is case insensitive. style The style file to use when formatting comments. template - Template to use when formatting comments. Overrides style if specified. In - addition to the usual Mercurial keywords, the extension specifies:: + Template to use when formatting comments. Overrides style if + specified. In addition to the usual Mercurial keywords, the + extension specifies:: {bug} The Bugzilla bug ID. {root} The full pathname of the Mercurial repository. @@ -82,18 +86,19 @@ {webroot}. Default 0. usermap - Path of file containing Mercurial committer ID to Bugzilla user ID mappings. - If specified, the file should contain one mapping per line, - "committer"="Bugzilla user". See also the [usermap] section. + Path of file containing Mercurial committer ID to Bugzilla user ID + mappings. If specified, the file should contain one mapping per + line, "committer"="Bugzilla user". See also the [usermap] section. -The [usermap] section is used to specify mappings of Mercurial committer ID to -Bugzilla user ID. See also [bugzilla].usermap. "committer"="Bugzilla user" +The [usermap] section is used to specify mappings of Mercurial +committer ID to Bugzilla user ID. See also [bugzilla].usermap. +"committer"="Bugzilla user" Finally, the [web] section supports one entry: baseurl - Base URL for browsing Mercurial repositories. Reference from templates as - {hgweb}. + Base URL for browsing Mercurial repositories. Reference from + templates as {hgweb}. Activating the extension:: @@ -106,9 +111,9 @@ Example configuration: -This example configuration is for a collection of Mercurial repositories in -/var/local/hg/repos/ used with a local Bugzilla 3.2 installation in -/opt/bugzilla-3.2. :: +This example configuration is for a collection of Mercurial +repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2 +installation in /opt/bugzilla-3.2. :: [bugzilla] host=localhost diff -r f6683a7011e9 -r 19d07553d1b2 hgext/children.py --- a/hgext/children.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/children.py Wed Aug 05 22:52:35 2009 -0700 @@ -18,11 +18,11 @@ def children(ui, repo, file_=None, **opts): """show the children of the given or working directory revision - Print the children of the working directory's revisions. If a revision is - given via -r/--rev, the children of that revision will be printed. If a - file argument is given, revision in which the file was last changed (after - the working directory revision or the argument to --rev if given) is - printed. + Print the children of the working directory's revisions. If a + revision is given via -r/--rev, the children of that revision will + be printed. If a file argument is given, revision in which the + file was last changed (after the working directory revision or the + argument to --rev if given) is printed. """ rev = opts.get('rev') if file_: diff -r f6683a7011e9 -r 19d07553d1b2 hgext/churn.py --- a/hgext/churn.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/churn.py Wed Aug 05 22:52:35 2009 -0700 @@ -24,7 +24,7 @@ def changedlines(ui, repo, ctx1, ctx2, fns): lines = 0 - fmatch = cmdutil.match(repo, pats=fns) + fmatch = cmdutil.matchfiles(repo, fns) diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node(), fmatch)) for l in diff.split('\n'): if (l.startswith("+") and not l.startswith("+++ ") or @@ -94,13 +94,15 @@ def churn(ui, repo, *pats, **opts): '''histogram of changes to the repository - This command will display a histogram representing the number of changed - lines or revisions, grouped according to the given template. The default - template will group changes by author. The --dateformat option may be used - to group the results by date instead. + This command will display a histogram representing the number + of changed lines or revisions, grouped according to the given + template. The default template will group changes by author. + The --dateformat option may be used to group the results by + date instead. - Statistics are based on the number of changed lines, or alternatively the - number of matching revisions if the --changesets option is specified. + Statistics are based on the number of changed lines, or + alternatively the number of matching revisions if the + --changesets option is specified. Examples:: @@ -116,13 +118,13 @@ # display count of lines changed in every year hg churn -f '%Y' -s - It is possible to map alternate email addresses to a main address by - providing a file using the following format:: + It is possible to map alternate email addresses to a main address + by providing a file using the following format:: - Such a file may be specified with the --aliases option, otherwise a - .hgchurn file will be looked for in the working directory root. + Such a file may be specified with the --aliases option, otherwise + a .hgchurn file will be looked for in the working directory root. ''' def pad(s, l): return (s + " " * l)[:l] diff -r f6683a7011e9 -r 19d07553d1b2 hgext/color.py --- a/hgext/color.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/color.py Wed Aug 05 22:52:35 2009 -0700 @@ -18,15 +18,16 @@ '''colorize output from some commands -This extension modifies the status command to add color to its output to -reflect file status, the qseries command to add color to reflect patch status -(applied, unapplied, missing), and to diff-related commands to highlight -additions, removals, diff headers, and trailing whitespace. +This extension modifies the status command to add color to its output +to reflect file status, the qseries command to add color to reflect +patch status (applied, unapplied, missing), and to diff-related +commands to highlight additions, removals, diff headers, and trailing +whitespace. -Other effects in addition to color, like bold and underlined text, are also -available. Effects are rendered with the ECMA-48 SGR control function (aka -ANSI escape codes). This module also provides the render_text function, which -can be used to add effects to any text. +Other effects in addition to color, like bold and underlined text, are +also available. Effects are rendered with the ECMA-48 SGR control +function (aka ANSI escape codes). This module also provides the +render_text function, which can be used to add effects to any text. Default effects may be overridden from the .hgrc file:: @@ -58,6 +59,7 @@ ''' import os, sys +import itertools from mercurial import cmdutil, commands, extensions, error from mercurial.i18n import _ @@ -141,14 +143,10 @@ '''run the qseries command with colored output''' ui.pushbuffer() retval = orig(ui, repo, **opts) - patches = ui.popbuffer().splitlines() - for patch in patches: - patchname = patch - if opts['summary']: - patchname = patchname.split(': ', 1)[0] - if ui.verbose: - patchname = patchname.lstrip().split(' ', 2)[-1] + patchlines = ui.popbuffer().splitlines() + patchnames = repo.mq.series + for patch, patchname in itertools.izip(patchlines, patchnames): if opts['missing']: effects = _patch_effects['missing'] # Determine if patch is applied. diff -r f6683a7011e9 -r 19d07553d1b2 hgext/convert/__init__.py --- a/hgext/convert/__init__.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/convert/__init__.py Wed Aug 05 22:52:35 2009 -0700 @@ -35,48 +35,50 @@ - Mercurial [hg] - Subversion [svn] (history on branches is not preserved) - If no revision is given, all revisions will be converted. Otherwise, - convert will only import up to the named revision (given in a format - understood by the source). + If no revision is given, all revisions will be converted. + Otherwise, convert will only import up to the named revision + (given in a format understood by the source). - If no destination directory name is specified, it defaults to the basename - of the source with '-hg' appended. If the destination repository doesn't - exist, it will be created. + If no destination directory name is specified, it defaults to the + basename of the source with '-hg' appended. If the destination + repository doesn't exist, it will be created. - By default, all sources except Mercurial will use --branchsort. Mercurial - uses --sourcesort to preserve original revision numbers order. Sort modes - have the following effects: + By default, all sources except Mercurial will use --branchsort. + Mercurial uses --sourcesort to preserve original revision numbers + order. Sort modes have the following effects: - --branchsort convert from parent to child revision when possible, which - means branches are usually converted one after the other. It - generates more compact repositories. + --branchsort convert from parent to child revision when possible, + which means branches are usually converted one after + the other. It generates more compact repositories. --datesort sort revisions by date. Converted repositories have - good-looking changelogs but are often an order of magnitude - larger than the same ones generated by --branchsort. + good-looking changelogs but are often an order of + magnitude larger than the same ones generated by + --branchsort. - --sourcesort try to preserve source revisions order, only supported by - Mercurial sources. + --sourcesort try to preserve source revisions order, only + supported by Mercurial sources. If isn't given, it will be put in a default location - (/.hg/shamap by default). The is a simple text file that - maps each source commit ID to the destination ID for that revision, like - so:: + (/.hg/shamap by default). The is a simple text file + that maps each source commit ID to the destination ID for that + revision, like so:: - If the file doesn't exist, it's automatically created. It's updated on - each commit copied, so convert-repo can be interrupted and can be run - repeatedly to copy new commits. + If the file doesn't exist, it's automatically created. It's + updated on each commit copied, so convert-repo can be interrupted + and can be run repeatedly to copy new commits. - The [username mapping] file is a simple text file that maps each source - commit author to a destination commit author. It is handy for source SCMs - that use unix logins to identify authors (eg: CVS). One line per author - mapping and the line format is: srcauthor=whatever string you want + The [username mapping] file is a simple text file that maps each + source commit author to a destination commit author. It is handy + for source SCMs that use unix logins to identify authors (eg: + CVS). One line per author mapping and the line format is: + srcauthor=whatever string you want - The filemap is a file that allows filtering and remapping of files and - directories. Comment lines start with '#'. Each line can contain one of - the following directives:: + The filemap is a file that allows filtering and remapping of files + and directories. Comment lines start with '#'. Each line can + contain one of the following directives:: include path/to/file @@ -84,32 +86,35 @@ rename from/file to/file - The 'include' directive causes a file, or all files under a directory, to - be included in the destination repository, and the exclusion of all other - files and directories not explicitly included. The 'exclude' directive - causes files or directories to be omitted. The 'rename' directive renames - a file or directory. To rename from a subdirectory into the root of the - repository, use '.' as the path to rename to. + The 'include' directive causes a file, or all files under a + directory, to be included in the destination repository, and the + exclusion of all other files and directories not explicitly + included. The 'exclude' directive causes files or directories to + be omitted. The 'rename' directive renames a file or directory. To + rename from a subdirectory into the root of the repository, use + '.' as the path to rename to. - The splicemap is a file that allows insertion of synthetic history, - letting you specify the parents of a revision. This is useful if you want - to e.g. give a Subversion merge two parents, or graft two disconnected - series of history together. Each entry contains a key, followed by a - space, followed by one or two comma-separated values. The key is the - revision ID in the source revision control system whose parents should be - modified (same format as a key in .hg/shamap). The values are the revision - IDs (in either the source or destination revision control system) that + The splicemap is a file that allows insertion of synthetic + history, letting you specify the parents of a revision. This is + useful if you want to e.g. give a Subversion merge two parents, or + graft two disconnected series of history together. Each entry + contains a key, followed by a space, followed by one or two + comma-separated values. The key is the revision ID in the source + revision control system whose parents should be modified (same + format as a key in .hg/shamap). The values are the revision IDs + (in either the source or destination revision control system) that should be used as the new parents for that node. The branchmap is a file that allows you to rename a branch when it is being brought in from whatever external repository. When used in - conjunction with a splicemap, it allows for a powerful combination to help - fix even the most badly mismanaged repositories and turn them into nicely - structured Mercurial repositories. The branchmap contains lines of the - form "original_branch_name new_branch_name". "original_branch_name" is the - name of the branch in the source repository, and "new_branch_name" is the - name of the branch is the destination repository. This can be used to (for - instance) move code in one repository from "default" to a named branch. + conjunction with a splicemap, it allows for a powerful combination + to help fix even the most badly mismanaged repositories and turn them + into nicely structured Mercurial repositories. The branchmap contains + lines of the form "original_branch_name new_branch_name". + "original_branch_name" is the name of the branch in the source + repository, and "new_branch_name" is the name of the branch is the + destination repository. This can be used to (for instance) move code + in one repository from "default" to a named branch. Mercurial Source ---------------- @@ -119,26 +124,28 @@ repositories with missing revlogs, by converting from and to Mercurial. --config convert.hg.saverev=False (boolean) - store original revision ID in changeset (forces target IDs to change) + store original revision ID in changeset (forces target IDs to + change) --config convert.hg.startrev=0 (hg revision identifier) convert start revision and its descendants CVS Source ---------- - CVS source will use a sandbox (i.e. a checked-out copy) from CVS to - indicate the starting point of what will be converted. Direct access to - the repository files is not needed, unless of course the repository is - :local:. The conversion uses the top level directory in the sandbox to - find the CVS repository, and then uses CVS rlog commands to find files to - convert. This means that unless a filemap is given, all files under the - starting directory will be converted, and that any directory - reorganization in the CVS sandbox is ignored. + CVS source will use a sandbox (i.e. a checked-out copy) from CVS + to indicate the starting point of what will be converted. Direct + access to the repository files is not needed, unless of course the + repository is :local:. The conversion uses the top level directory + in the sandbox to find the CVS repository, and then uses CVS rlog + commands to find files to convert. This means that unless a + filemap is given, all files under the starting directory will be + converted, and that any directory reorganization in the CVS + sandbox is ignored. Because CVS does not have changesets, it is necessary to collect - individual commits to CVS and merge them into changesets. CVS source uses - its internal changeset merging code by default but can be configured to - call the external 'cvsps' program by setting:: + individual commits to CVS and merge them into changesets. CVS + source uses its internal changeset merging code by default but can + be configured to call the external 'cvsps' program by setting:: --config convert.cvsps='cvsps -A -u --cvs-direct -q' @@ -153,40 +160,41 @@ and has a few more configurable options: --config convert.cvsps.cache=True (boolean) - Set to False to disable remote log caching, for testing and debugging - purposes. + Set to False to disable remote log caching, for testing and + debugging purposes. --config convert.cvsps.fuzz=60 (integer) - Specify the maximum time (in seconds) that is allowed between commits - with identical user and log message in a single changeset. When very - large files were checked in as part of a changeset then the default - may not be long enough. + Specify the maximum time (in seconds) that is allowed between + commits with identical user and log message in a single + changeset. When very large files were checked in as part of a + changeset then the default may not be long enough. --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}' - Specify a regular expression to which commit log messages are matched. - If a match occurs, then the conversion process will insert a dummy - revision merging the branch on which this log message occurs to the - branch indicated in the regex. + Specify a regular expression to which commit log messages are + matched. If a match occurs, then the conversion process will + insert a dummy revision merging the branch on which this log + message occurs to the branch indicated in the regex. --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}' - Specify a regular expression to which commit log messages are matched. - If a match occurs, then the conversion process will add the most - recent revision on the branch indicated in the regex as the second - parent of the changeset. + Specify a regular expression to which commit log messages are + matched. If a match occurs, then the conversion process will + add the most recent revision on the branch indicated in the + regex as the second parent of the changeset. - The hgext/convert/cvsps wrapper script allows the builtin changeset - merging code to be run without doing a conversion. Its parameters and - output are similar to that of cvsps 2.1. + The hgext/convert/cvsps wrapper script allows the builtin + changeset merging code to be run without doing a conversion. Its + parameters and output are similar to that of cvsps 2.1. Subversion Source ----------------- - Subversion source detects classical trunk/branches/tags layouts. By - default, the supplied "svn://repo/path/" source URL is converted as a - single branch. If "svn://repo/path/trunk" exists it replaces the default - branch. If "svn://repo/path/branches" exists, its subdirectories are - listed as possible branches. If "svn://repo/path/tags" exists, it is - looked for tags referencing converted branches. Default "trunk", - "branches" and "tags" values can be overridden with following options. Set - them to paths relative to the source URL, or leave them blank to disable - auto detection. + Subversion source detects classical trunk/branches/tags layouts. + By default, the supplied "svn://repo/path/" source URL is + converted as a single branch. If "svn://repo/path/trunk" exists it + replaces the default branch. If "svn://repo/path/branches" exists, + its subdirectories are listed as possible branches. If + "svn://repo/path/tags" exists, it is looked for tags referencing + converted branches. Default "trunk", "branches" and "tags" values + can be overridden with following options. Set them to paths + relative to the source URL, or leave them blank to disable auto + detection. --config convert.svn.branches=branches (directory name) specify the directory containing branches @@ -195,9 +203,9 @@ --config convert.svn.trunk=trunk (directory name) specify the name of the trunk branch - Source history can be retrieved starting at a specific revision, instead - of being integrally converted. Only single branch conversions are - supported. + Source history can be retrieved starting at a specific revision, + instead of being integrally converted. Only single branch + conversions are supported. --config convert.svn.startrev=0 (svn revision number) specify start Subversion revision. @@ -205,14 +213,15 @@ Perforce Source --------------- - The Perforce (P4) importer can be given a p4 depot path or a client - specification as source. It will convert all files in the source to a flat - Mercurial repository, ignoring labels, branches and integrations. Note - that when a depot path is given you then usually should specify a target - directory, because otherwise the target may be named ...-hg. + The Perforce (P4) importer can be given a p4 depot path or a + client specification as source. It will convert all files in the + source to a flat Mercurial repository, ignoring labels, branches + and integrations. Note that when a depot path is given you then + usually should specify a target directory, because otherwise the + target may be named ...-hg. - It is possible to limit the amount of source history to be converted by - specifying an initial Perforce revision. + It is possible to limit the amount of source history to be + converted by specifying an initial Perforce revision. --config convert.p4.startrev=0 (perforce changelist number) specify initial Perforce revision. @@ -236,13 +245,14 @@ def debugcvsps(ui, *args, **opts): '''create changeset information from CVS - This command is intended as a debugging tool for the CVS to Mercurial - converter, and can be used as a direct replacement for cvsps. + This command is intended as a debugging tool for the CVS to + Mercurial converter, and can be used as a direct replacement for + cvsps. - Hg debugcvsps reads the CVS rlog for current directory (or any named - directory) in the CVS repository, and converts the log to a series of - changesets based on matching commit log entries and dates. - ''' + Hg debugcvsps reads the CVS rlog for current directory (or any + named directory) in the CVS repository, and converts the log to a + series of changesets based on matching commit log entries and + dates.''' return cvsps.debugcvsps(ui, *args, **opts) commands.norepo += " convert debugsvnlog debugcvsps" diff -r f6683a7011e9 -r 19d07553d1b2 hgext/convert/darcs.py --- a/hgext/convert/darcs.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/convert/darcs.py Wed Aug 05 22:52:35 2009 -0700 @@ -36,6 +36,10 @@ raise NoRepo("%s does not look like a darcs repo" % path) checktool('darcs') + version = self.run0('--version').splitlines()[0].strip() + if version < '2.1': + raise util.Abort(_('darcs version 2.1 or newer needed (found %r)') % + version) if ElementTree is None: raise util.Abort(_("Python ElementTree module is not available")) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/convert/subversion.py --- a/hgext/convert/subversion.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/convert/subversion.py Wed Aug 05 22:52:35 2009 -0700 @@ -311,7 +311,7 @@ self.module += '/' + trunk self.head = self.latest(self.module, self.last_changed) if not self.head: - raise util.Abort(_('no revision found in module %s') + raise util.Abort(_('no revision found in module %s') % self.module) # First head in the list is the module's head @@ -454,8 +454,8 @@ # Here/tags/tag.1 discarded as well as its children. # It happens with tools like cvs2svn. Such tags cannot # be represented in mercurial. - addeds = dict((p, e.copyfrom_path) for p, e - in origpaths.iteritems() + addeds = dict((p, e.copyfrom_path) for p, e + in origpaths.iteritems() if e.action == 'A' and e.copyfrom_path) badroots = set() for destroot in addeds: diff -r f6683a7011e9 -r 19d07553d1b2 hgext/extdiff.py --- a/hgext/extdiff.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/extdiff.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,13 +7,14 @@ '''command to allow external programs to compare revisions -The `extdiff' Mercurial extension allows you to use external programs to -compare revisions, or revision with working directory. The external diff -programs are called with a configurable set of options and two non-option -arguments: paths to directories containing snapshots of files to compare. +The extdiff Mercurial extension allows you to use external programs +to compare revisions, or revision with working directory. The external +diff programs are called with a configurable set of options and two +non-option arguments: paths to directories containing snapshots of +files to compare. -The `extdiff' extension also allows to configure new diff commands, so you do -not need to type "hg extdiff -p kdiff3" always. :: +The extdiff extension also allows to configure new diff commands, so +you do not need to type "hg extdiff -p kdiff3" always. :: [extdiff] # add new command that runs GNU diff(1) in 'context diff' mode @@ -28,15 +29,16 @@ # add new command called meld, runs meld (no need to name twice) meld = - # add new command called vimdiff, runs gvimdiff with DirDiff plugin (see - # http://www.vim.org/scripts/script.php?script_id=102) Non English user, be - # sure to put "let g:DirDiffDynamicDiffText = 1" in your .vimrc + # add new command called vimdiff, runs gvimdiff with DirDiff plugin + # (see http://www.vim.org/scripts/script.php?script_id=102) Non + # English user, be sure to put "let g:DirDiffDynamicDiffText = 1" in + # your .vimrc vimdiff = gvim -f '+next' '+execute "DirDiff" argv(0) argv(1)' -You can use -I/-X and list of file or directory names like normal "hg diff" -command. The `extdiff' extension makes snapshots of only needed files, so -running the external diff program will actually be pretty fast (at least -faster than having to compare the entire tree). +You can use -I/-X and list of file or directory names like normal "hg +diff" command. The extdiff extension makes snapshots of only needed +files, so running the external diff program will actually be pretty +fast (at least faster than having to compare the entire tree). ''' from mercurial.i18n import _ @@ -157,20 +159,20 @@ def extdiff(ui, repo, *pats, **opts): '''use external program to diff repository (or selected files) - Show differences between revisions for the specified files, using an - external program. The default program used is diff, with default options - "-Npru". + Show differences between revisions for the specified files, using + an external program. The default program used is diff, with + default options "-Npru". - To select a different program, use the -p/--program option. The program - will be passed the names of two directories to compare. To pass additional - options to the program, use -o/--option. These will be passed before the - names of the directories to compare. + To select a different program, use the -p/--program option. The + program will be passed the names of two directories to compare. To + pass additional options to the program, use -o/--option. These + will be passed before the names of the directories to compare. - When two revision arguments are given, then changes are shown between - those revisions. If only one revision is specified then that revision is - compared to the working directory, and, when no revisions are specified, - the working directory files are compared to its parent. - ''' + When two revision arguments are given, then changes are shown + between those revisions. If only one revision is specified then + that revision is compared to the working directory, and, when no + revisions are specified, the working directory files are compared + to its parent.''' program = opts['program'] or 'diff' if opts['program']: option = opts['option'] diff -r f6683a7011e9 -r 19d07553d1b2 hgext/fetch.py --- a/hgext/fetch.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/fetch.py Wed Aug 05 22:52:35 2009 -0700 @@ -15,17 +15,18 @@ def fetch(ui, repo, source='default', **opts): '''pull changes from a remote repository, merge new changes if needed. - This finds all changes from the repository at the specified path or URL - and adds them to the local repository. + This finds all changes from the repository at the specified path + or URL and adds them to the local repository. - If the pulled changes add a new branch head, the head is automatically - merged, and the result of the merge is committed. Otherwise, the working - directory is updated to include the new changes. + If the pulled changes add a new branch head, the head is + automatically merged, and the result of the merge is committed. + Otherwise, the working directory is updated to include the new + changes. When a merge occurs, the newly pulled changes are assumed to be - "authoritative". The head of the new changes is used as the first parent, - with local changes as the second. To switch the merge order, use - --switch-parent. + "authoritative". The head of the new changes is used as the first + parent, with local changes as the second. To switch the merge + order, use --switch-parent. See 'hg help dates' for a list of formats valid for -d/--date. ''' diff -r f6683a7011e9 -r 19d07553d1b2 hgext/graphlog.py --- a/hgext/graphlog.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/graphlog.py Wed Aug 05 22:52:35 2009 -0700 @@ -8,8 +8,8 @@ '''command to view revision graphs from a shell This extension adds a --graph option to the incoming, outgoing and log -commands. When this options is given, an ASCII representation of the revision -graph is also shown. +commands. When this options is given, an ASCII representation of the +revision graph is also shown. ''' import os, sys @@ -238,10 +238,11 @@ def graphlog(ui, repo, path=None, **opts): """show revision history alongside an ASCII revision graph - Print a revision history alongside a revision graph drawn with ASCII - characters. + Print a revision history alongside a revision graph drawn with + ASCII characters. - Nodes printed as an @ character are parents of the working directory. + Nodes printed as an @ character are parents of the working + directory. """ check_unsupported_flags(opts) @@ -299,10 +300,11 @@ def gincoming(ui, repo, source="default", **opts): """show the incoming changesets alongside an ASCII revision graph - Print the incoming changesets alongside a revision graph drawn with ASCII - characters. + Print the incoming changesets alongside a revision graph drawn with + ASCII characters. - Nodes printed as an @ character are parents of the working directory. + Nodes printed as an @ character are parents of the working + directory. """ check_unsupported_flags(opts) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/hgcia.py --- a/hgext/hgcia.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/hgcia.py Wed Aug 05 22:52:35 2009 -0700 @@ -3,8 +3,8 @@ """hooks for integrating with the CIA.vc notification service -This is meant to be run as a changegroup or incoming hook. To configure it, -set the following options in your hgrc:: +This is meant to be run as a changegroup or incoming hook. To +configure it, set the following options in your hgrc:: [cia] # your registered CIA user name diff -r f6683a7011e9 -r 19d07553d1b2 hgext/hgk.py --- a/hgext/hgk.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/hgk.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,30 +7,31 @@ '''browse the repository in a graphical way -The hgk extension allows browsing the history of a repository in a graphical -way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not distributed with -Mercurial.) +The hgk extension allows browsing the history of a repository in a +graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not +distributed with Mercurial.) -hgk consists of two parts: a Tcl script that does the displaying and querying -of information, and an extension to Mercurial named hgk.py, which provides -hooks for hgk to get information. hgk can be found in the contrib directory, -and the extension is shipped in the hgext repository, and needs to be enabled. +hgk consists of two parts: a Tcl script that does the displaying and +querying of information, and an extension to Mercurial named hgk.py, +which provides hooks for hgk to get information. hgk can be found in +the contrib directory, and the extension is shipped in the hgext +repository, and needs to be enabled. -The hg view command will launch the hgk Tcl script. For this command to work, -hgk must be in your search path. Alternately, you can specify the path to hgk -in your .hgrc file:: +The hg view command will launch the hgk Tcl script. For this command +to work, hgk must be in your search path. Alternately, you can specify +the path to hgk in your .hgrc file:: [hgk] path=/location/of/hgk -hgk can make use of the extdiff extension to visualize revisions. Assuming you -had already configured extdiff vdiff command, just add:: +hgk can make use of the extdiff extension to visualize revisions. +Assuming you had already configured extdiff vdiff command, just add:: [hgk] vdiff=vdiff -Revisions context menu will now display additional entries to fire vdiff on -hovered and selected revisions. +Revisions context menu will now display additional entries to fire +vdiff on hovered and selected revisions. ''' import os diff -r f6683a7011e9 -r 19d07553d1b2 hgext/highlight/__init__.py --- a/hgext/highlight/__init__.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/highlight/__init__.py Wed Aug 05 22:52:35 2009 -0700 @@ -10,7 +10,8 @@ """syntax highlighting for hgweb (requires Pygments) -It depends on the Pygments syntax highlighting library: http://pygments.org/ +It depends on the Pygments syntax highlighting library: +http://pygments.org/ There is a single configuration option:: diff -r f6683a7011e9 -r 19d07553d1b2 hgext/interhg.py --- a/hgext/interhg.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/interhg.py Wed Aug 05 22:52:35 2009 -0700 @@ -10,12 +10,12 @@ '''expand expressions into changelog and summaries -This extension allows the use of a special syntax in summaries, which will be -automatically expanded into links or any other arbitrary expression, much like -InterWiki does. +This extension allows the use of a special syntax in summaries, which +will be automatically expanded into links or any other arbitrary +expression, much like InterWiki does. -A few example patterns (link to bug tracking, etc.) that may be used in your -hgrc:: +A few example patterns (link to bug tracking, etc.) that may be used +in your hgrc:: [interhg] issues = s!issue(\\d+)!issue\\1! diff -r f6683a7011e9 -r 19d07553d1b2 hgext/keyword.py --- a/hgext/keyword.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/keyword.py Wed Aug 05 22:52:35 2009 -0700 @@ -1,6 +1,6 @@ # keyword.py - $Keyword$ expansion for Mercurial # -# Copyright 2007, 2008 Christian Ebert +# Copyright 2007-2009 Christian Ebert # # This software may be used and distributed according to the terms of the # GNU General Public License version 2, incorporated herein by reference. @@ -28,15 +28,15 @@ '''expand keywords in tracked files -This extension expands RCS/CVS-like or self-customized $Keywords$ in tracked -text files selected by your configuration. +This extension expands RCS/CVS-like or self-customized $Keywords$ in +tracked text files selected by your configuration. -Keywords are only expanded in local repositories and not stored in the change -history. The mechanism can be regarded as a convenience for the current user -or for archive distribution. +Keywords are only expanded in local repositories and not stored in the +change history. The mechanism can be regarded as a convenience for the +current user or for archive distribution. -Configuration is done in the [keyword] and [keywordmaps] sections of hgrc -files. +Configuration is done in the [keyword] and [keywordmaps] sections of +hgrc files. Example:: @@ -45,32 +45,35 @@ **.py = x* = ignore -NOTE: the more specific you are in your filename patterns the less you lose -speed in huge repositories. +NOTE: the more specific you are in your filename patterns the less you +lose speed in huge repositories. -For [keywordmaps] template mapping and expansion demonstration and control run -"hg kwdemo". +For [keywordmaps] template mapping and expansion demonstration and +control run "hg kwdemo". See "hg help templates" for a list of +available templates and filters. -An additional date template filter {date|utcdate} is provided. +An additional date template filter {date|utcdate} is provided. It +returns a date like "2006/09/18 15:13:13". -The default template mappings (view with "hg kwdemo -d") can be replaced with -customized keywords and templates. Again, run "hg kwdemo" to control the -results of your config changes. +The default template mappings (view with "hg kwdemo -d") can be +replaced with customized keywords and templates. Again, run "hg +kwdemo" to control the results of your config changes. -Before changing/disabling active keywords, run "hg kwshrink" to avoid the risk -of inadvertently storing expanded keywords in the change history. +Before changing/disabling active keywords, run "hg kwshrink" to avoid +the risk of inadvertently storing expanded keywords in the change +history. -To force expansion after enabling it, or a configuration change, run "hg -kwexpand". +To force expansion after enabling it, or a configuration change, run +"hg kwexpand". -Also, when committing with the record extension or using mq's qrecord, be -aware that keywords cannot be updated. Again, run "hg kwexpand" on the files -in question to update keyword expansions after all changes have been checked -in. +Also, when committing with the record extension or using mq's qrecord, +be aware that keywords cannot be updated. Again, run "hg kwexpand" on +the files in question to update keyword expansions after all changes +have been checked in. -Expansions spanning more than one line and incremental expansions, like CVS' -$Log$, are not supported. A keyword template map "Log = {desc}" expands to the -first line of the changeset description. +Expansions spanning more than one line and incremental expansions, +like CVS' $Log$, are not supported. A keyword template map "Log = +{desc}" expands to the first line of the changeset description. ''' from mercurial import commands, cmdutil, dispatch, filelog, revlog, extensions @@ -79,7 +82,7 @@ from mercurial.lock import release from mercurial.node import nullid from mercurial.i18n import _ -import re, shutil, tempfile, time +import re, shutil, tempfile commands.optionalrepo += ' kwdemo' @@ -92,9 +95,8 @@ # not when reading filelog, and unexpand when reading from working dir restricted = 'merge record resolve qfold qimport qnew qpush qrefresh qrecord' -def utcdate(date): - '''Returns hgdate in cvs-like UTC format.''' - return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0])) +# provide cvs-like UTC date filter +utcdate = lambda x: util.datestr(x, '%Y/%m/%d %H:%M:%S') # make keyword tools accessible kwtools = {'templater': None, 'hgcmd': '', 'inc': [], 'exc': ['.hg*']} @@ -275,10 +277,12 @@ Show current, custom, or default keyword template maps and their expansions. - Extend current configuration by specifying maps as arguments and - optionally by reading from an additional hgrc file. + Extend the current configuration by specifying maps as arguments + and using -f/--rcfile to source an external hgrc file. - Override current keyword template maps with "default" option. + Use -d/--default to disable current configuration. + + See "hg help templates" for information on templates and filters. ''' def demoitems(section, items): ui.write('[%s]\n' % section) @@ -286,40 +290,47 @@ ui.write('%s = %s\n' % (k, v)) msg = 'hg keyword config and expansion example' - kwstatus = 'current' fn = 'demo.txt' branchname = 'demobranch' tmpdir = tempfile.mkdtemp('', 'kwdemo.') ui.note(_('creating temporary repository at %s\n') % tmpdir) repo = localrepo.localrepository(ui, tmpdir, True) ui.setconfig('keyword', fn, '') + + uikwmaps = ui.configitems('keywordmaps') if args or opts.get('rcfile'): - kwstatus = 'custom' - if opts.get('rcfile'): - ui.readconfig(opts.get('rcfile')) - if opts.get('default'): - kwstatus = 'default' + ui.status(_('\n\tconfiguration using custom keyword template maps\n')) + if uikwmaps: + ui.status(_('\textending current template maps\n')) + if opts.get('default') or not uikwmaps: + ui.status(_('\toverriding default template maps\n')) + if opts.get('rcfile'): + ui.readconfig(opts.get('rcfile')) + if args: + # simulate hgrc parsing + rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args] + fp = repo.opener('hgrc', 'w') + fp.writelines(rcmaps) + fp.close() + ui.readconfig(repo.join('hgrc')) + kwmaps = dict(ui.configitems('keywordmaps')) + elif opts.get('default'): + ui.status(_('\n\tconfiguration using default keyword template maps\n')) kwmaps = kwtemplater.templates - if ui.configitems('keywordmaps'): - # override maps from optional rcfile + if uikwmaps: + ui.status(_('\tdisabling current template maps\n')) for k, v in kwmaps.iteritems(): ui.setconfig('keywordmaps', k, v) - elif args: - # simulate hgrc parsing - rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args] - fp = repo.opener('hgrc', 'w') - fp.writelines(rcmaps) - fp.close() - ui.readconfig(repo.join('hgrc')) - if not opts.get('default'): - kwmaps = dict(ui.configitems('keywordmaps')) or kwtemplater.templates + else: + ui.status(_('\n\tconfiguration using current keyword template maps\n')) + kwmaps = dict(uikwmaps) or kwtemplater.templates + uisetup(ui) reposetup(ui, repo) for k, v in ui.configitems('extensions'): if k.endswith('keyword'): extension = '%s = %s' % (k, v) break - ui.status(_('\n\tconfig using %s keyword template maps\n') % kwstatus) ui.write('[extensions]\n%s\n' % extension) demoitems('keyword', ui.configitems('keyword')) demoitems('keywordmaps', kwmaps.iteritems()) @@ -327,7 +338,7 @@ repo.wopener(fn, 'w').write(keywords) repo.add([fn]) path = repo.wjoin(fn) - ui.note(_('\n%s keywords written to %s:\n') % (kwstatus, path)) + ui.note(_('\nkeywords written to %s:\n') % path) ui.note(keywords) ui.note('\nhg -R "%s" branch "%s"\n' % (tmpdir, branchname)) # silence branch command if not verbose @@ -341,8 +352,7 @@ ui.note(_('unhooked all commit hooks\n')) ui.note('hg -R "%s" ci -m "%s"\n' % (tmpdir, msg)) repo.commit(text=msg) - fmt = ui.verbose and ' in %s' % path or '' - ui.status(_('\n\t%s keywords expanded%s\n') % (kwstatus, fmt)) + ui.status(_('\n\tkeywords expanded\n')) ui.write(repo.wread(fn)) ui.debug(_('\nremoving temporary repository %s\n') % tmpdir) shutil.rmtree(tmpdir, ignore_errors=True) @@ -360,19 +370,20 @@ def files(ui, repo, *pats, **opts): '''show files configured for keyword expansion - List which files in the working directory are matched by the [keyword] - configuration patterns. + List which files in the working directory are matched by the + [keyword] configuration patterns. - Useful to prevent inadvertent keyword expansion and to speed up execution - by including only files that are actual candidates for expansion. + Useful to prevent inadvertent keyword expansion and to speed up + execution by including only files that are actual candidates for + expansion. - See "hg help keyword" on how to construct patterns both for inclusion and - exclusion of files. + See "hg help keyword" on how to construct patterns both for + inclusion and exclusion of files. Use -u/--untracked to list untracked files as well. - With -a/--all and -v/--verbose the codes used to show the status of files - are:: + With -a/--all and -v/--verbose the codes used to show the status + of files are:: K = keyword expansion candidate k = keyword expansion candidate (untracked) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/mq.py --- a/hgext/mq.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/mq.py Wed Aug 05 22:52:35 2009 -0700 @@ -8,11 +8,11 @@ '''manage a stack of patches This extension lets you work with a stack of patches in a Mercurial -repository. It manages two stacks of patches - all known patches, and applied -patches (subset of known patches). +repository. It manages two stacks of patches - all known patches, and +applied patches (subset of known patches). -Known patches are represented as patch files in the .hg/patches directory. -Applied patches are both patch files and changesets. +Known patches are represented as patch files in the .hg/patches +directory. Applied patches are both patch files and changesets. Common tasks (use "hg help command" for more details):: @@ -105,6 +105,7 @@ message.append(line) format = None elif line == '# HG changeset patch': + message = [] format = "hgpatch" elif (format != "tagdone" and (line.startswith("Subject: ") or line.startswith("subject: "))): @@ -1683,26 +1684,29 @@ def qimport(ui, repo, *filename, **opts): """import a patch - The patch is inserted into the series after the last applied patch. If no - patches have been applied, qimport prepends the patch to the series. + The patch is inserted into the series after the last applied + patch. If no patches have been applied, qimport prepends the patch + to the series. - The patch will have the same name as its source file unless you give it a - new one with -n/--name. + The patch will have the same name as its source file unless you + give it a new one with -n/--name. - You can register an existing patch inside the patch directory with the - -e/--existing flag. + You can register an existing patch inside the patch directory with + the -e/--existing flag. - With -f/--force, an existing patch of the same name will be overwritten. + With -f/--force, an existing patch of the same name will be + overwritten. - An existing changeset may be placed under mq control with -r/--rev (e.g. - qimport --rev tip -n patch will place tip under mq control). With - -g/--git, patches imported with --rev will use the git diff format. See - the diffs help topic for information on why this is important for - preserving rename/copy information and permission changes. + An existing changeset may be placed under mq control with -r/--rev + (e.g. qimport --rev tip -n patch will place tip under mq control). + With -g/--git, patches imported with --rev will use the git diff + format. See the diffs help topic for information on why this is + important for preserving rename/copy information and permission + changes. - To import a patch from standard input, pass - as the patch file. When - importing from standard input, a patch name must be specified using the - --name flag. + To import a patch from standard input, pass - as the patch file. + When importing from standard input, a patch name must be specified + using the --name flag. """ q = repo.mq q.qimport(repo, filename, patchname=opts['name'], @@ -1717,12 +1721,11 @@ def init(ui, repo, **opts): """init a new queue repository - The queue repository is unversioned by default. If -c/--create-repo is - specified, qinit will create a separate nested repository for patches - (qinit -c may also be run later to convert an unversioned patch repository - into a versioned one). You can use qcommit to commit changes to this queue - repository. - """ + The queue repository is unversioned by default. If + -c/--create-repo is specified, qinit will create a separate nested + repository for patches (qinit -c may also be run later to convert + an unversioned patch repository into a versioned one). You can use + qcommit to commit changes to this queue repository.""" q = repo.mq r = q.init(repo, create=opts['create_repo']) q.save_dirty() @@ -1744,16 +1747,17 @@ def clone(ui, source, dest=None, **opts): '''clone main and patch repository at same time - If source is local, destination will have no patches applied. If source is - remote, this command can not check if patches are applied in source, so - cannot guarantee that patches are not applied in destination. If you clone - remote repository, be sure before that it has no patches applied. + If source is local, destination will have no patches applied. If + source is remote, this command can not check if patches are + applied in source, so cannot guarantee that patches are not + applied in destination. If you clone remote repository, be sure + before that it has no patches applied. - Source patch repository is looked for in /.hg/patches by default. Use - -p to change. + Source patch repository is looked for in /.hg/patches by + default. Use -p to change. - The patch directory must be a nested Mercurial repository, as would be - created by qinit -c. + The patch directory must be a nested Mercurial repository, as + would be created by qinit -c. ''' def patchdir(repo): url = repo.url() @@ -1859,24 +1863,26 @@ def new(ui, repo, patch, *args, **opts): """create a new patch - qnew creates a new patch on top of the currently-applied patch (if any). - It will refuse to run if there are any outstanding changes unless - -f/--force is specified, in which case the patch will be initialized with - them. You may also use -I/--include, -X/--exclude, and/or a list of files - after the patch name to add only changes to matching files to the new - patch, leaving the rest as uncommitted modifications. + qnew creates a new patch on top of the currently-applied patch (if + any). It will refuse to run if there are any outstanding changes + unless -f/--force is specified, in which case the patch will be + initialized with them. You may also use -I/--include, + -X/--exclude, and/or a list of files after the patch name to add + only changes to matching files to the new patch, leaving the rest + as uncommitted modifications. - -u/--user and -d/--date can be used to set the (given) user and date, - respectively. -U/--currentuser and -D/--currentdate set user to current - user and date to current date. + -u/--user and -d/--date can be used to set the (given) user and + date, respectively. -U/--currentuser and -D/--currentdate set user + to current user and date to current date. - -e/--edit, -m/--message or -l/--logfile set the patch header as well as - the commit message. If none is specified, the header is empty and the - commit message is '[mq]: PATCH'. + -e/--edit, -m/--message or -l/--logfile set the patch header as + well as the commit message. If none is specified, the header is + empty and the commit message is '[mq]: PATCH'. - Use the -g/--git option to keep the patch in the git extended diff format. - Read the diffs help topic for more information on why this is important - for preserving permission changes and copy/rename information. + Use the -g/--git option to keep the patch in the git extended diff + format. Read the diffs help topic for more information on why this + is important for preserving permission changes and copy/rename + information. """ msg = cmdutil.logmessage(opts) def getmsg(): return ui.edit(msg, ui.username()) @@ -1894,16 +1900,17 @@ def refresh(ui, repo, *pats, **opts): """update the current patch - If any file patterns are provided, the refreshed patch will contain only - the modifications that match those patterns; the remaining modifications - will remain in the working directory. + If any file patterns are provided, the refreshed patch will + contain only the modifications that match those patterns; the + remaining modifications will remain in the working directory. - If -s/--short is specified, files currently included in the patch will be - refreshed just like matched files and remain in the patch. + If -s/--short is specified, files currently included in the patch + will be refreshed just like matched files and remain in the patch. - hg add/remove/copy/rename work as usual, though you might want to use - git-style patches (-g/--git or [diff] git=1) to track copies and renames. - See the diffs help topic for more information on the git diff format. + hg add/remove/copy/rename work as usual, though you might want to + use git-style patches (-g/--git or [diff] git=1) to track copies + and renames. See the diffs help topic for more information on the + git diff format. """ q = repo.mq message = cmdutil.logmessage(opts) @@ -1924,13 +1931,15 @@ def diff(ui, repo, *pats, **opts): """diff of the current patch and subsequent modifications - Shows a diff which includes the current patch as well as any changes which - have been made in the working directory since the last refresh (thus - showing what the current patch would become after a qrefresh). + Shows a diff which includes the current patch as well as any + changes which have been made in the working directory since the + last refresh (thus showing what the current patch would become + after a qrefresh). - Use 'hg diff' if you only want to see the changes made since the last - qrefresh, or 'hg export qtip' if you want to see changes made by the - current patch without including changes made since the qrefresh. + Use 'hg diff' if you only want to see the changes made since the + last qrefresh, or 'hg export qtip' if you want to see changes made + by the current patch without including changes made since the + qrefresh. """ repo.mq.diff(repo, pats, opts) return 0 @@ -1938,15 +1947,15 @@ def fold(ui, repo, *files, **opts): """fold the named patches into the current patch - Patches must not yet be applied. Each patch will be successively applied - to the current patch in the order given. If all the patches apply - successfully, the current patch will be refreshed with the new cumulative - patch, and the folded patches will be deleted. With -k/--keep, the folded - patch files will not be removed afterwards. + Patches must not yet be applied. Each patch will be successively + applied to the current patch in the order given. If all the + patches apply successfully, the current patch will be refreshed + with the new cumulative patch, and the folded patches will be + deleted. With -k/--keep, the folded patch files will not be + removed afterwards. - The header for each folded patch will be concatenated with the current - patch header, separated by a line of '* * *'. - """ + The header for each folded patch will be concatenated with the + current patch header, separated by a line of '* * *'.""" q = repo.mq @@ -2012,13 +2021,14 @@ def guard(ui, repo, *args, **opts): '''set or print guards for a patch - Guards control whether a patch can be pushed. A patch with no guards is - always pushed. A patch with a positive guard ("+foo") is pushed only if - the qselect command has activated it. A patch with a negative guard - ("-foo") is never pushed if the qselect command has activated it. + Guards control whether a patch can be pushed. A patch with no + guards is always pushed. A patch with a positive guard ("+foo") is + pushed only if the qselect command has activated it. A patch with + a negative guard ("-foo") is never pushed if the qselect command + has activated it. - With no arguments, print the currently active guards. With arguments, set - guards for the named patch. + With no arguments, print the currently active guards. + With arguments, set guards for the named patch. NOTE: Specifying negative guards now requires '--'. To set guards on another patch: @@ -2095,8 +2105,8 @@ def push(ui, repo, patch=None, **opts): """push the next patch onto the stack - When -f/--force is applied, all local changes in patched files will be - lost. + When -f/--force is applied, all local changes in patched files + will be lost. """ q = repo.mq mergeq = None @@ -2118,9 +2128,9 @@ def pop(ui, repo, patch=None, **opts): """pop the current patch off the stack - By default, pops off the top of the patch stack. If given a patch name, - keeps popping off patches until the named patch is at the top of the - stack. + By default, pops off the top of the patch stack. If given a patch + name, keeps popping off patches until the named patch is at the + top of the stack. """ localupdate = True if opts['name']: @@ -2237,7 +2247,8 @@ """strip a revision and all its descendants from the repository If one of the working directory's parent revisions is stripped, the - working directory will be updated to the parent of the stripped revision. + working directory will be updated to the parent of the stripped + revision. """ backup = 'all' if opts['backup']: @@ -2262,33 +2273,35 @@ def select(ui, repo, *args, **opts): '''set or print guarded patches to push - Use the qguard command to set or print guards on patch, then use qselect - to tell mq which guards to use. A patch will be pushed if it has no guards - or any positive guards match the currently selected guard, but will not be - pushed if any negative guards match the current guard. For example: + Use the qguard command to set or print guards on patch, then use + qselect to tell mq which guards to use. A patch will be pushed if + it has no guards or any positive guards match the currently + selected guard, but will not be pushed if any negative guards + match the current guard. For example: qguard foo.patch -stable (negative guard) qguard bar.patch +stable (positive guard) qselect stable - This activates the "stable" guard. mq will skip foo.patch (because it has - a negative match) but push bar.patch (because it has a positive match). + This activates the "stable" guard. mq will skip foo.patch (because + it has a negative match) but push bar.patch (because it has a + positive match). - With no arguments, prints the currently active guards. With one argument, - sets the active guard. + With no arguments, prints the currently active guards. + With one argument, sets the active guard. - Use -n/--none to deactivate guards (no other arguments needed). When no - guards are active, patches with positive guards are skipped and patches - with negative guards are pushed. + Use -n/--none to deactivate guards (no other arguments needed). + When no guards are active, patches with positive guards are + skipped and patches with negative guards are pushed. - qselect can change the guards on applied patches. It does not pop guarded - patches by default. Use --pop to pop back to the last applied patch that - is not guarded. Use --reapply (which implies --pop) to push back to the - current patch afterwards, but skip guarded patches. + qselect can change the guards on applied patches. It does not pop + guarded patches by default. Use --pop to pop back to the last + applied patch that is not guarded. Use --reapply (which implies + --pop) to push back to the current patch afterwards, but skip + guarded patches. - Use -s/--series to print a list of all guards in the series file (no other - arguments needed). Use -v for more information. - ''' + Use -s/--series to print a list of all guards in the series file + (no other arguments needed). Use -v for more information.''' q = repo.mq guards = q.active() @@ -2363,16 +2376,18 @@ def finish(ui, repo, *revrange, **opts): """move applied patches into repository history - Finishes the specified revisions (corresponding to applied patches) by - moving them out of mq control into regular repository history. + Finishes the specified revisions (corresponding to applied + patches) by moving them out of mq control into regular repository + history. - Accepts a revision range or the -a/--applied option. If --applied is - specified, all applied mq revisions are removed from mq control. - Otherwise, the given revisions must be at the base of the stack of applied - patches. + Accepts a revision range or the -a/--applied option. If --applied + is specified, all applied mq revisions are removed from mq + control. Otherwise, the given revisions must be at the base of the + stack of applied patches. - This can be especially useful if your changes have been applied to an - upstream repository, or if you are about to push your changes to upstream. + This can be especially useful if your changes have been applied to + an upstream repository, or if you are about to push your changes + to upstream. """ if not opts['applied'] and not revrange: raise util.Abort(_('no revisions specified')) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/notify.py --- a/hgext/notify.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/notify.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,10 +7,11 @@ '''hooks for sending email notifications at commit/push time -Subscriptions can be managed through a hgrc file. Default mode is to print -messages to stdout, for testing and configuring. +Subscriptions can be managed through a hgrc file. Default mode is to +print messages to stdout, for testing and configuring. -To use, configure the notify extension and enable it in hgrc like this:: +To use, configure the notify extension and enable it in hgrc like +this:: [extensions] hgext.notify = @@ -47,8 +48,9 @@ [web] baseurl = http://hgserver/... # root of hg web site for browsing commits -The notify config file has same format as a regular hgrc file. It has two -sections so you can express subscriptions in whatever way is handier for you. +The notify config file has same format as a regular hgrc file. It has +two sections so you can express subscriptions in whatever way is +handier for you. :: @@ -62,13 +64,13 @@ Glob patterns are matched against path to repository root. -If you like, you can put notify config file in repository that users can push -changes to, they can manage their own subscriptions. +If you like, you can put notify config file in repository that users +can push changes to, they can manage their own subscriptions. ''' from mercurial.i18n import _ from mercurial import patch, cmdutil, templater, util, mail -import email.Parser, fnmatch, socket, time +import email.Parser, email.Errors, fnmatch, socket, time # template for single changeset can include email headers. single_template = ''' @@ -178,20 +180,25 @@ '''send message.''' p = email.Parser.Parser() - msg = p.parsestr(data) + try: + msg = p.parsestr(data) + except email.Errors.MessageParseError, inst: + raise util.Abort(inst) # store sender and subject sender, subject = msg['From'], msg['Subject'] del msg['From'], msg['Subject'] - # store remaining headers - headers = msg.items() - # create fresh mime message from msg body - text = msg.get_payload() - # for notification prefer readability over data precision - msg = mail.mimeencode(self.ui, text, self.charsets, self.test) - # reinstate custom headers - for k, v in headers: - msg[k] = v + + if not msg.is_multipart(): + # create fresh mime message from scratch + # (multipart templates must take care of this themselves) + headers = msg.items() + payload = msg.get_payload() + # for notification prefer readability over data precision + msg = mail.mimeencode(self.ui, payload, self.charsets, self.test) + # reinstate custom headers + for k, v in headers: + msg[k] = v msg['Date'] = util.datestr(format="%a, %d %b %Y %H:%M:%S %1%2") diff -r f6683a7011e9 -r 19d07553d1b2 hgext/pager.py --- a/hgext/pager.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/pager.py Wed Aug 05 22:52:35 2009 -0700 @@ -19,10 +19,11 @@ [pager] pager = LESS='FSRX' less -If no pager is set, the pager extensions uses the environment variable $PAGER. -If neither pager.pager, nor $PAGER is set, no pager is used. +If no pager is set, the pager extensions uses the environment variable +$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used. -If you notice "BROKEN PIPE" error messages, you can disable them by setting:: +If you notice "BROKEN PIPE" error messages, you can disable them by +setting:: [pager] quiet = True @@ -33,15 +34,16 @@ [pager] ignore = version, help, update -You can also enable the pager only for certain commands using pager.attend:: +You can also enable the pager only for certain commands using +pager.attend:: [pager] attend = log If pager.attend is present, pager.ignore will be ignored. -To ignore global commands like "hg version" or "hg help", you have to specify -them in the global .hgrc +To ignore global commands like "hg version" or "hg help", you have to +specify them in the global .hgrc ''' import sys, os, signal diff -r f6683a7011e9 -r 19d07553d1b2 hgext/parentrevspec.py --- a/hgext/parentrevspec.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/parentrevspec.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,8 +7,8 @@ '''interpret suffixes to refer to ancestor revisions -This extension allows you to use git-style suffixes to refer to the ancestors -of a specific revision. +This extension allows you to use git-style suffixes to refer to the +ancestors of a specific revision. For example, if you can refer to a revision as "foo", then:: diff -r f6683a7011e9 -r 19d07553d1b2 hgext/patchbomb.py --- a/hgext/patchbomb.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/patchbomb.py Wed Aug 05 22:52:35 2009 -0700 @@ -10,25 +10,24 @@ The series is started off with a "[PATCH 0 of N]" introduction, which describes the series as a whole. -Each patch email has a Subject line of "[PATCH M of N] ...", using the first -line of the changeset description as the subject text. The message contains -two or three body parts: +Each patch email has a Subject line of "[PATCH M of N] ...", using the +first line of the changeset description as the subject text. The +message contains two or three body parts: - The changeset description. - - [Optional] The result of running diffstat on the patch. - - The patch itself, as generated by "hg export". +- The changeset description. +- [Optional] The result of running diffstat on the patch. +- The patch itself, as generated by "hg export". -Each message refers to the first in the series using the In-Reply-To and -References headers, so they will show up as a sequence in threaded mail and -news readers, and in mail archives. +Each message refers to the first in the series using the In-Reply-To +and References headers, so they will show up as a sequence in threaded +mail and news readers, and in mail archives. -With the -d/--diffstat option, you will be prompted for each changeset with a -diffstat summary and the changeset summary, so you can be sure you are sending -the right changes. +With the -d/--diffstat option, you will be prompted for each changeset +with a diffstat summary and the changeset summary, so you can be sure +you are sending the right changes. -To configure other defaults, add a section like this to your hgrc file:: +To configure other defaults, add a section like this to your hgrc +file:: [email] from = My Name @@ -36,35 +35,38 @@ cc = cc1, cc2, ... bcc = bcc1, bcc2, ... -Then you can use the "hg email" command to mail a series of changesets as a -patchbomb. +Then you can use the "hg email" command to mail a series of changesets +as a patchbomb. -To avoid sending patches prematurely, it is a good idea to first run the -"email" command with the "-n" option (test only). You will be prompted for an -email recipient address, a subject and an introductory message describing the -patches of your patchbomb. Then when all is done, patchbomb messages are -displayed. If the PAGER environment variable is set, your pager will be fired -up once for each patchbomb message, so you can verify everything is alright. +To avoid sending patches prematurely, it is a good idea to first run +the "email" command with the "-n" option (test only). You will be +prompted for an email recipient address, a subject and an introductory +message describing the patches of your patchbomb. Then when all is +done, patchbomb messages are displayed. If the PAGER environment +variable is set, your pager will be fired up once for each patchbomb +message, so you can verify everything is alright. -The -m/--mbox option is also very useful. Instead of previewing each patchbomb -message in a pager or sending the messages directly, it will create a UNIX -mailbox file with the patch emails. This mailbox file can be previewed with -any mail user agent which supports UNIX mbox files, e.g. with mutt:: +The -m/--mbox option is also very useful. Instead of previewing each +patchbomb message in a pager or sending the messages directly, it will +create a UNIX mailbox file with the patch emails. This mailbox file +can be previewed with any mail user agent which supports UNIX mbox +files, e.g. with mutt:: % mutt -R -f mbox -When you are previewing the patchbomb messages, you can use `formail' (a -utility that is commonly installed as part of the procmail package), to send -each message out:: +When you are previewing the patchbomb messages, you can use ``formail`` +(a utility that is commonly installed as part of the procmail +package), to send each message out:: % formail -s sendmail -bm -t < mbox That should be all. Now your patchbomb is on its way out. -You can also either configure the method option in the email section to be a -sendmail compatible mailer or fill out the [smtp] section so that the -patchbomb extension can automatically send patchbombs directly from the -commandline. See the [email] and [smtp] sections in hgrc(5) for details. +You can also either configure the method option in the email section +to be a sendmail compatible mailer or fill out the [smtp] section so +that the patchbomb extension can automatically send patchbombs +directly from the commandline. See the [email] and [smtp] sections in +hgrc(5) for details. ''' import os, errno, socket, tempfile, cStringIO, time @@ -173,47 +175,50 @@ def patchbomb(ui, repo, *revs, **opts): '''send changesets by email - By default, diffs are sent in the format generated by hg export, one per - message. The series starts with a "[PATCH 0 of N]" introduction, which - describes the series as a whole. + By default, diffs are sent in the format generated by hg export, + one per message. The series starts with a "[PATCH 0 of N]" + introduction, which describes the series as a whole. - Each patch email has a Subject line of "[PATCH M of N] ...", using the - first line of the changeset description as the subject text. The message - contains two or three parts. First, the changeset description. Next, - (optionally) if the diffstat program is installed and -d/--diffstat is - used, the result of running diffstat on the patch. Finally, the patch - itself, as generated by "hg export". + Each patch email has a Subject line of "[PATCH M of N] ...", using + the first line of the changeset description as the subject text. + The message contains two or three parts. First, the changeset + description. Next, (optionally) if the diffstat program is + installed and -d/--diffstat is used, the result of running + diffstat on the patch. Finally, the patch itself, as generated by + "hg export". - By default the patch is included as text in the email body for easy - reviewing. Using the -a/--attach option will instead create an attachment - for the patch. With -i/--inline an inline attachment will be created. + By default the patch is included as text in the email body for + easy reviewing. Using the -a/--attach option will instead create + an attachment for the patch. With -i/--inline an inline attachment + will be created. - With -o/--outgoing, emails will be generated for patches not found in the - destination repository (or only those which are ancestors of the specified - revisions if any are provided) + With -o/--outgoing, emails will be generated for patches not found + in the destination repository (or only those which are ancestors + of the specified revisions if any are provided) - With -b/--bundle, changesets are selected as for --outgoing, but a single - email containing a binary Mercurial bundle as an attachment will be sent. - - Examples: + With -b/--bundle, changesets are selected as for --outgoing, but a + single email containing a binary Mercurial bundle as an attachment + will be sent. - hg email -r 3000 # send patch 3000 only - hg email -r 3000 -r 3001 # send patches 3000 and 3001 - hg email -r 3000:3005 # send patches 3000 through 3005 - hg email 3000 # send patch 3000 (deprecated) + Examples:: + + hg email -r 3000 # send patch 3000 only + hg email -r 3000 -r 3001 # send patches 3000 and 3001 + hg email -r 3000:3005 # send patches 3000 through 3005 + hg email 3000 # send patch 3000 (deprecated) - hg email -o # send all patches not in default - hg email -o DEST # send all patches not in DEST - hg email -o -r 3000 # send all ancestors of 3000 not in default - hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST + hg email -o # send all patches not in default + hg email -o DEST # send all patches not in DEST + hg email -o -r 3000 # send all ancestors of 3000 not in default + hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST - hg email -b # send bundle of all patches not in default - hg email -b DEST # send bundle of all patches not in DEST - hg email -b -r 3000 # bundle of all ancestors of 3000 not in default - hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST + hg email -b # send bundle of all patches not in default + hg email -b DEST # send bundle of all patches not in DEST + hg email -b -r 3000 # bundle of all ancestors of 3000 not in default + hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST - Before using this command, you will need to enable email in your hgrc. See - the [email] section in hgrc(5) for details. + Before using this command, you will need to enable email in your + hgrc. See the [email] section in hgrc(5) for details. ''' _charsets = mail._charsets(ui) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/purge.py --- a/hgext/purge.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/purge.py Wed Aug 05 22:52:35 2009 -0700 @@ -3,8 +3,8 @@ # This is a small extension for Mercurial (http://mercurial.selenic.com/) # that removes files not known to mercurial # -# This program was inspired by the "cvspurge" script contained in CVS utilities -# (http://www.red-bean.com/cvsutils/). +# This program was inspired by the "cvspurge" script contained in CVS +# utilities (http://www.red-bean.com/cvsutils/). # # For help on the usage of "hg purge" use: # hg help purge @@ -32,14 +32,14 @@ def purge(ui, repo, *dirs, **opts): '''removes files not tracked by Mercurial - Delete files not known to Mercurial. This is useful to test local and - uncommitted changes in an otherwise-clean source tree. + Delete files not known to Mercurial. This is useful to test local + and uncommitted changes in an otherwise-clean source tree. This means that purge will delete: - Unknown files: files marked with "?" by "hg status" - - Empty directories: in fact Mercurial ignores directories unless they - contain files under source control management + - Empty directories: in fact Mercurial ignores directories unless + they contain files under source control management But it will leave untouched: @@ -50,9 +50,10 @@ If directories are given on the command line, only files in these directories are considered. - Be careful with purge, as you could irreversibly delete some files you - forgot to add to the repository. If you only want to print the list of - files that this program would delete, use the --print option. + Be careful with purge, as you could irreversibly delete some files + you forgot to add to the repository. If you only want to print the + list of files that this program would delete, use the --print + option. ''' act = not opts['print'] eol = '\n' diff -r f6683a7011e9 -r 19d07553d1b2 hgext/rebase.py --- a/hgext/rebase.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/rebase.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,10 +7,11 @@ '''command to move sets of revisions to a different ancestor -This extension lets you rebase changesets in an existing Mercurial repository. +This extension lets you rebase changesets in an existing Mercurial +repository. For more information: -http://mercurial.selenic.com/wiki/RebaseProject +http://mercurial.selenic.com/wiki/RebaseExtension ''' from mercurial import util, repair, merge, cmdutil, commands, error @@ -41,9 +42,9 @@ def rebase(ui, repo, **opts): """move changeset (and descendants) to a different branch - Rebase uses repeated merging to graft changesets from one part of history - onto another. This can be useful for linearizing local changes relative to - a master development tree. + Rebase uses repeated merging to graft changesets from one part of + history onto another. This can be useful for linearizing local + changes relative to a master development tree. If a rebase is interrupted to manually resolve a merge, it can be continued with --continue/-c or aborted with --abort/-a. diff -r f6683a7011e9 -r 19d07553d1b2 hgext/record.py --- a/hgext/record.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/record.py Wed Aug 05 22:52:35 2009 -0700 @@ -357,14 +357,15 @@ def record(ui, repo, *pats, **opts): '''interactively select changes to commit - If a list of files is omitted, all changes reported by "hg status" will be - candidates for recording. + If a list of files is omitted, all changes reported by "hg status" + will be candidates for recording. See 'hg help dates' for a list of formats valid for -d/--date. - You will be prompted for whether to record changes to each modified file, - and for files with multiple changes, for each change to use. For each - query, the following responses are possible:: + You will be prompted for whether to record changes to each + modified file, and for files with multiple changes, for each + change to use. For each query, the following responses are + possible:: y - record this change n - skip this change @@ -387,7 +388,8 @@ def qrecord(ui, repo, patch, *pats, **opts): '''interactively record a new patch - See 'hg help qnew' & 'hg help record' for more information and usage. + See 'hg help qnew' & 'hg help record' for more information and + usage. ''' try: diff -r f6683a7011e9 -r 19d07553d1b2 hgext/share.py --- a/hgext/share.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/share.py Wed Aug 05 22:52:35 2009 -0700 @@ -11,11 +11,11 @@ def share(ui, source, dest=None, noupdate=False): """create a new shared repository (experimental) - Initialize a new repository and working directory that shares its history - with another repository. + Initialize a new repository and working directory that shares its + history with another repository. - NOTE: actions that change history such as rollback or moving the source - may confuse sharers. + NOTE: actions that change history such as rollback or moving the + source may confuse sharers. """ return hg.share(ui, source, dest, not noupdate) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/transplant.py --- a/hgext/transplant.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/transplant.py Wed Aug 05 22:52:35 2009 -0700 @@ -9,8 +9,8 @@ This extension allows you to transplant patches from another branch. -Transplanted patches are recorded in .hg/transplant/transplants, as a map from -a changeset hash to its hash in the source repository. +Transplanted patches are recorded in .hg/transplant/transplants, as a +map from a changeset hash to its hash in the source repository. ''' from mercurial.i18n import _ @@ -438,34 +438,37 @@ '''transplant changesets from another branch Selected changesets will be applied on top of the current working - directory with the log of the original changeset. If --log is specified, - log messages will have a comment appended of the form:: + directory with the log of the original changeset. If --log is + specified, log messages will have a comment appended of the form:: (transplanted from CHANGESETHASH) - You can rewrite the changelog message with the --filter option. Its - argument will be invoked with the current changelog message as $1 and the - patch as $2. + You can rewrite the changelog message with the --filter option. + Its argument will be invoked with the current changelog message as + $1 and the patch as $2. - If --source/-s is specified, selects changesets from the named repository. - If --branch/-b is specified, selects changesets from the branch holding - the named revision, up to that revision. If --all/-a is specified, all - changesets on the branch will be transplanted, otherwise you will be - prompted to select the changesets you want. + If --source/-s is specified, selects changesets from the named + repository. If --branch/-b is specified, selects changesets from + the branch holding the named revision, up to that revision. If + --all/-a is specified, all changesets on the branch will be + transplanted, otherwise you will be prompted to select the + changesets you want. - hg transplant --branch REVISION --all will rebase the selected branch (up - to the named revision) onto your current working directory. + hg transplant --branch REVISION --all will rebase the selected + branch (up to the named revision) onto your current working + directory. You can optionally mark selected transplanted changesets as merge - changesets. You will not be prompted to transplant any ancestors of a - merged transplant, and you can merge descendants of them normally instead - of transplanting them. + changesets. You will not be prompted to transplant any ancestors + of a merged transplant, and you can merge descendants of them + normally instead of transplanting them. - If no merges or revisions are provided, hg transplant will start an - interactive changeset browser. + If no merges or revisions are provided, hg transplant will start + an interactive changeset browser. - If a changeset application fails, you can fix the merge by hand and then - resume where you left off by calling hg transplant --continue/-c. + If a changeset application fails, you can fix the merge by hand + and then resume where you left off by calling hg transplant + --continue/-c. ''' def getremotechanges(repo, url): sourcerepo = ui.expandpath(url) diff -r f6683a7011e9 -r 19d07553d1b2 hgext/win32mbcs.py --- a/hgext/win32mbcs.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/win32mbcs.py Wed Aug 05 22:52:35 2009 -0700 @@ -11,11 +11,12 @@ '''allow the use of MBCS paths with problematic encodings -Some MBCS encodings are not good for some path operations (i.e. splitting -path, case conversion, etc.) with its encoded bytes. We call such a encoding -(i.e. shift_jis and big5) as "problematic encoding". This extension can be -used to fix the issue with those encodings by wrapping some functions to -convert to Unicode string before path operation. +Some MBCS encodings are not good for some path operations (i.e. +splitting path, case conversion, etc.) with its encoded bytes. We call +such a encoding (i.e. shift_jis and big5) as "problematic encoding". +This extension can be used to fix the issue with those encodings by +wrapping some functions to convert to Unicode string before path +operation. This extension is useful for: @@ -32,10 +33,12 @@ Note that there are some limitations on using this extension: - You should use single encoding in one repository. -- You should set same encoding for the repository by locale or HGENCODING. +- You should set same encoding for the repository by locale or + HGENCODING. -Path encoding conversion are done between Unicode and encoding.encoding which -is decided by Mercurial from current locale setting or HGENCODING. +Path encoding conversion are done between Unicode and +encoding.encoding which is decided by Mercurial from current locale +setting or HGENCODING. ''' import os, sys diff -r f6683a7011e9 -r 19d07553d1b2 hgext/zeroconf/__init__.py --- a/hgext/zeroconf/__init__.py Wed Aug 05 22:51:30 2009 -0700 +++ b/hgext/zeroconf/__init__.py Wed Aug 05 22:52:35 2009 -0700 @@ -7,12 +7,12 @@ '''discover and advertise repositories on the local network -Zeroconf enabled repositories will be announced in a network without the need -to configure a server or a service. They can be discovered without knowing -their actual IP address. +Zeroconf enabled repositories will be announced in a network without +the need to configure a server or a service. They can be discovered +without knowing their actual IP address. -To allow other people to discover your repository using run "hg serve" in your -repository:: +To allow other people to discover your repository using run "hg serve" +in your repository:: $ cd test $ hg serve diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/commands.py --- a/mercurial/commands.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/commands.py Wed Aug 05 22:52:35 2009 -0700 @@ -21,10 +21,11 @@ def add(ui, repo, *pats, **opts): """add the specified files on the next commit - Schedule files to be version controlled and added to the repository. - - The files will be added to the repository at the next commit. To undo an - add before that, see hg forget. + Schedule files to be version controlled and added to the + repository. + + The files will be added to the repository at the next commit. To + undo an add before that, see hg forget. If no names are given, add all files to the repository. """ @@ -49,16 +50,19 @@ def addremove(ui, repo, *pats, **opts): """add all new files, delete all missing files - Add all new files and remove all missing files from the repository. - - New files are ignored if they match any of the patterns in .hgignore. As - with add, these changes take effect at the next commit. - - Use the -s/--similarity option to detect renamed files. With a parameter - greater than 0, this compares every removed file with every added file and - records those similar enough as renames. This option takes a percentage - between 0 (disabled) and 100 (files must be identical) as its parameter. - Detecting renamed files this way can be expensive. + Add all new files and remove all missing files from the + repository. + + New files are ignored if they match any of the patterns in + .hgignore. As with add, these changes take effect at the next + commit. + + Use the -s/--similarity option to detect renamed files. With a + parameter greater than 0, this compares every removed file with + every added file and records those similar enough as renames. This + option takes a percentage between 0 (disabled) and 100 (files must + be identical) as its parameter. Detecting renamed files this way + can be expensive. """ try: sim = float(opts.get('similarity') or 0) @@ -71,13 +75,16 @@ def annotate(ui, repo, *pats, **opts): """show changeset information by line for each file - List changes in files, showing the revision id responsible for each line - - This command is useful for discovering when a change was made and by whom. - - Without the -a/--text option, annotate will avoid processing files it - detects as binary. With -a, annotate will annotate the file anyway, - although the results will probably be neither useful nor desirable. + List changes in files, showing the revision id responsible for + each line + + This command is useful for discovering when a change was made and + by whom. + + Without the -a/--text option, annotate will avoid processing files + it detects as binary. With -a, annotate will annotate the file + anyway, although the results will probably be neither useful + nor desirable. """ datefunc = ui.quiet and util.shortdate or util.datestr getdate = util.cachefunc(lambda x: datefunc(x[0].date())) @@ -131,10 +138,11 @@ def archive(ui, repo, dest, **opts): '''create an unversioned archive of a repository revision - By default, the revision used is the parent of the working directory; use - -r/--rev to specify a different revision. - - To specify the type of archive to create, use -t/--type. Valid types are:: + By default, the revision used is the parent of the working + directory; use -r/--rev to specify a different revision. + + To specify the type of archive to create, use -t/--type. Valid + types are:: "files" (default): a directory full of files "tar": tar archive, uncompressed @@ -143,12 +151,13 @@ "uzip": zip archive, uncompressed "zip": zip archive, compressed using deflate - The exact name of the destination archive or directory is given using a - format string; see 'hg help export' for details. - - Each member added to an archive file has a directory prefix prepended. Use - -p/--prefix to specify a format string for the prefix. The default is the - basename of the archive, with suffixes removed. + The exact name of the destination archive or directory is given + using a format string; see 'hg help export' for details. + + Each member added to an archive file has a directory prefix + prepended. Use -p/--prefix to specify a format string for the + prefix. The default is the basename of the archive, with suffixes + removed. ''' ctx = repo[opts.get('rev')] @@ -173,17 +182,17 @@ def backout(ui, repo, node=None, rev=None, **opts): '''reverse effect of earlier changeset - Commit the backed out changes as a new changeset. The new changeset is a - child of the backed out changeset. - - If you backout a changeset other than the tip, a new head is created. This - head will be the new tip and you should merge this backout changeset with - another head. - - The --merge option remembers the parent of the working directory before - starting the backout, then merges the new head with that changeset - afterwards. This saves you from doing the merge by hand. The result of - this merge is not committed, as with a normal merge. + Commit the backed out changes as a new changeset. The new + changeset is a child of the backed out changeset. + + If you backout a changeset other than the tip, a new head is + created. This head will be the new tip and you should merge this + backout changeset with another head. + + The --merge option remembers the parent of the working directory + before starting the backout, then merges the new head with that + changeset afterwards. This saves you from doing the merge by hand. + The result of this merge is not committed, as with a normal merge. See 'hg help dates' for a list of formats valid for -d/--date. ''' @@ -261,22 +270,23 @@ reset=None, good=None, bad=None, skip=None, noupdate=None): """subdivision search of changesets - This command helps to find changesets which introduce problems. To use, - mark the earliest changeset you know exhibits the problem as bad, then - mark the latest changeset which is free from the problem as good. Bisect - will update your working directory to a revision for testing (unless the - -U/--noupdate option is specified). Once you have performed tests, mark - the working directory as good or bad, and bisect will either update to - another candidate changeset or announce that it has found the bad - revision. - - As a shortcut, you can also use the revision argument to mark a revision - as good or bad without checking it out first. - - If you supply a command, it will be used for automatic bisection. Its exit - status will be used to mark revisions as good or bad: status 0 means good, - 125 means to skip the revision, 127 (command not found) will abort the - bisection, and any other non-zero exit status means the revision is bad. + This command helps to find changesets which introduce problems. To + use, mark the earliest changeset you know exhibits the problem as + bad, then mark the latest changeset which is free from the problem + as good. Bisect will update your working directory to a revision + for testing (unless the -U/--noupdate option is specified). Once + you have performed tests, mark the working directory as good or + bad, and bisect will either update to another candidate changeset + or announce that it has found the bad revision. + + As a shortcut, you can also use the revision argument to mark a + revision as good or bad without checking it out first. + + If you supply a command, it will be used for automatic bisection. + Its exit status will be used to mark revisions as good or bad: + status 0 means good, 125 means to skip the revision, 127 + (command not found) will abort the bisection, and any other + non-zero exit status means the revision is bad. """ def print_result(nodes, good): displayer = cmdutil.show_changeset(ui, repo, {}) @@ -398,19 +408,21 @@ def branch(ui, repo, label=None, **opts): """set or show the current branch name - With no argument, show the current branch name. With one argument, set the - working directory branch name (the branch will not exist in the repository - until the next commit). Standard practice recommends that primary - development take place on the 'default' branch. - - Unless -f/--force is specified, branch will not let you set a branch name - that already exists, even if it's inactive. - - Use -C/--clean to reset the working directory branch to that of the parent - of the working directory, negating a previous branch change. - - Use the command 'hg update' to switch to an existing branch. Use 'hg - commit --close-branch' to mark this branch as closed. + With no argument, show the current branch name. With one argument, + set the working directory branch name (the branch will not exist + in the repository until the next commit). Standard practice + recommends that primary development take place on the 'default' + branch. + + Unless -f/--force is specified, branch will not let you set a + branch name that already exists, even if it's inactive. + + Use -C/--clean to reset the working directory branch to that of + the parent of the working directory, negating a previous branch + change. + + Use the command 'hg update' to switch to an existing branch. Use + 'hg commit --close-branch' to mark this branch as closed. """ if opts.get('clean'): @@ -430,12 +442,12 @@ def branches(ui, repo, active=False, closed=False): """list repository named branches - List the repository's named branches, indicating which ones are inactive. - If -c/--closed is specified, also list branches which have been marked - closed (see hg commit --close-branch). - - If -a/--active is specified, only show active branches. A branch is - considered active if it contains repository heads. + List the repository's named branches, indicating which ones are + inactive. If -c/--closed is specified, also list branches which have + been marked closed (see hg commit --close-branch). + + If -a/--active is specified, only show active branches. A branch + is considered active if it contains repository heads. Use the command 'hg update' to switch to an existing branch. """ @@ -472,24 +484,25 @@ def bundle(ui, repo, fname, dest=None, **opts): """create a changegroup file - Generate a compressed changegroup file collecting changesets not known to - be in another repository. - - If no destination repository is specified the destination is assumed to - have all the nodes specified by one or more --base parameters. To create a - bundle containing all changesets, use -a/--all (or --base null). - - You can change compression method with the -t/--type option. The available - compression methods are: none, bzip2, and gzip (by default, bundles are - compressed using bzip2). - - The bundle file can then be transferred using conventional means and - applied to another repository with the unbundle or pull command. This is - useful when direct push and pull are not available or when exporting an - entire repository is undesirable. - - Applying bundles preserves all changeset contents including permissions, - copy/rename information, and revision history. + Generate a compressed changegroup file collecting changesets not + known to be in another repository. + + If no destination repository is specified the destination is + assumed to have all the nodes specified by one or more --base + parameters. To create a bundle containing all changesets, use + -a/--all (or --base null). + + You can change compression method with the -t/--type option. + The available compression methods are: none, bzip2, and + gzip (by default, bundles are compressed using bzip2). + + The bundle file can then be transferred using conventional means + and applied to another repository with the unbundle or pull + command. This is useful when direct push and pull are not + available or when exporting an entire repository is undesirable. + + Applying bundles preserves all changeset contents including + permissions, copy/rename information, and revision history. """ revs = opts.get('rev') or None if revs: @@ -546,13 +559,13 @@ def cat(ui, repo, file1, *pats, **opts): """output the current or given revision of files - Print the specified files as they were at the given revision. If no - revision is given, the parent of the working directory is used, or tip if - no revision is checked out. - - Output may be to a file, in which case the name of the file is given using - a format string. The formatting rules are the same as for the export - command, with the following additions:: + Print the specified files as they were at the given revision. If + no revision is given, the parent of the working directory is used, + or tip if no revision is checked out. + + Output may be to a file, in which case the name of the file is + given using a format string. The formatting rules are the same as + for the export command, with the following additions:: %s basename of file being printed %d dirname of file being printed, or '.' if in repository root @@ -575,42 +588,46 @@ Create a copy of an existing repository in a new directory. - If no destination directory name is specified, it defaults to the basename - of the source. - - The location of the source is added to the new repository's .hg/hgrc file, - as the default to be used for future pulls. - - If you use the -r/--rev option to clone up to a specific revision, no - subsequent revisions (including subsequent tags) will be present in the - cloned repository. This option implies --pull, even on local repositories. - - By default, clone will check out the head of the 'default' branch. If the - -U/--noupdate option is used, the new clone will contain only a repository - (.hg) and no working copy (the working copy parent is the null revision). + If no destination directory name is specified, it defaults to the + basename of the source. + + The location of the source is added to the new repository's + .hg/hgrc file, as the default to be used for future pulls. + + If you use the -r/--rev option to clone up to a specific revision, + no subsequent revisions (including subsequent tags) will be + present in the cloned repository. This option implies --pull, even + on local repositories. + + By default, clone will check out the head of the 'default' branch. + If the -U/--noupdate option is used, the new clone will contain + only a repository (.hg) and no working copy (the working copy + parent is the null revision). See 'hg help urls' for valid source format details. It is possible to specify an ssh:// URL as the destination, but no - .hg/hgrc and working directory will be created on the remote side. Please - see 'hg help urls' for important details about ssh:// URLs. - - For efficiency, hardlinks are used for cloning whenever the source and - destination are on the same filesystem (note this applies only to the - repository data, not to the checked out files). Some filesystems, such as - AFS, implement hardlinking incorrectly, but do not report errors. In these - cases, use the --pull option to avoid hardlinking. - - In some cases, you can clone repositories and checked out files using full - hardlinks with :: + .hg/hgrc and working directory will be created on the remote side. + Please see 'hg help urls' for important details about ssh:// URLs. + + For efficiency, hardlinks are used for cloning whenever the source + and destination are on the same filesystem (note this applies only + to the repository data, not to the checked out files). Some + filesystems, such as AFS, implement hardlinking incorrectly, but + do not report errors. In these cases, use the --pull option to + avoid hardlinking. + + In some cases, you can clone repositories and checked out files + using full hardlinks with :: $ cp -al REPO REPOCLONE - This is the fastest way to clone, but it is not always safe. The operation - is not atomic (making sure REPO is not modified during the operation is up - to you) and you have to make sure your editor breaks hardlinks (Emacs and - most Linux Kernel tools do so). Also, this is not compatible with certain - extensions that place their metadata under the .hg directory, such as mq. + This is the fastest way to clone, but it is not always safe. The + operation is not atomic (making sure REPO is not modified during + the operation is up to you) and you have to make sure your editor + breaks hardlinks (Emacs and most Linux Kernel tools do so). Also, + this is not compatible with certain extensions that place their + metadata under the .hg directory, such as mq. """ hg.clone(cmdutil.remoteui(ui, opts), source, dest, pull=opts.get('pull'), @@ -622,17 +639,17 @@ """commit the specified files or all outstanding changes Commit changes to the given files into the repository. Unlike a - centralized RCS, this operation is a local operation. See hg push for a - way to actively distribute your changes. - - If a list of files is omitted, all changes reported by "hg status" will be - committed. - - If you are committing the result of a merge, do not provide any filenames - or -I/-X filters. - - If no commit message is specified, the configured editor is started to - prompt you for a message. + centralized RCS, this operation is a local operation. See hg push + for a way to actively distribute your changes. + + If a list of files is omitted, all changes reported by "hg status" + will be committed. + + If you are committing the result of a merge, do not provide any + filenames or -I/-X filters. + + If no commit message is specified, the configured editor is + started to prompt you for a message. See 'hg help dates' for a list of formats valid for -d/--date. """ @@ -670,16 +687,16 @@ def copy(ui, repo, *pats, **opts): """mark files as copied for the next commit - Mark dest as having copies of source files. If dest is a directory, copies - are put in that directory. If dest is a file, the source must be a single - file. - - By default, this command copies the contents of files as they exist in the - working directory. If invoked with -A/--after, the operation is recorded, - but no copying is performed. - - This command takes effect with the next commit. To undo a copy before - that, see hg revert. + Mark dest as having copies of source files. If dest is a + directory, copies are put in that directory. If dest is a file, + the source must be a single file. + + By default, this command copies the contents of files as they + exist in the working directory. If invoked with -A/--after, the + operation is recorded, but no copying is performed. + + This command takes effect with the next commit. To undo a copy + before that, see hg revert. """ wlock = repo.wlock(False) try: @@ -782,14 +799,14 @@ With no arguments, print names and values of all config items. - With one argument of the form section.name, print just the value of that - config item. - - With multiple arguments, print names and values of all config items with - matching section names. - - With --debug, the source (filename and line number) is printed for each - config item. + With one argument of the form section.name, print just the value + of that config item. + + With multiple arguments, print names and values of all config + items with matching section names. + + With --debug, the source (filename and line number) is printed + for each config item. """ untrusted = bool(opts.get('untrusted')) @@ -816,8 +833,8 @@ def debugsetparents(ui, repo, rev1, rev2=None): """manually set the parents of the current working directory - This is useful for writing repository conversion tools, but should be used - with care. + This is useful for writing repository conversion tools, but should + be used with care. """ if not rev2: @@ -1051,21 +1068,22 @@ Differences between files are shown using the unified diff format. - NOTE: diff may generate unexpected results for merges, as it will default - to comparing against the working directory's first parent changeset if no - revisions are specified. - - When two revision arguments are given, then changes are shown between - those revisions. If only one revision is specified then that revision is - compared to the working directory, and, when no revisions are specified, - the working directory files are compared to its parent. - - Without the -a/--text option, diff will avoid generating diffs of files it - detects as binary. With -a, diff will generate a diff anyway, probably - with undesirable results. - - Use the -g/--git option to generate diffs in the git extended diff format. - For more information, read 'hg help diffs'. + NOTE: diff may generate unexpected results for merges, as it will + default to comparing against the working directory's first parent + changeset if no revisions are specified. + + When two revision arguments are given, then changes are shown + between those revisions. If only one revision is specified then + that revision is compared to the working directory, and, when no + revisions are specified, the working directory files are compared + to its parent. + + Without the -a/--text option, diff will avoid generating diffs of + files it detects as binary. With -a, diff will generate a diff + anyway, probably with undesirable results. + + Use the -g/--git option to generate diffs in the git extended diff + format. For more information, read 'hg help diffs'. """ revs = opts.get('rev') @@ -1090,14 +1108,15 @@ Print the changeset header and diffs for one or more revisions. - The information shown in the changeset header is: author, changeset hash, - parent(s) and commit comment. - - NOTE: export may generate unexpected diff output for merge changesets, as - it will compare the merge changeset against its first parent only. - - Output may be to a file, in which case the name of the file is given using - a format string. The formatting rules are as follows:: + The information shown in the changeset header is: author, + changeset hash, parent(s) and commit comment. + + NOTE: export may generate unexpected diff output for merge + changesets, as it will compare the merge changeset against its + first parent only. + + Output may be to a file, in which case the name of the file is + given using a format string. The formatting rules are as follows:: %% literal "%" character %H changeset hash (40 bytes of hexadecimal) @@ -1108,15 +1127,15 @@ %n zero-padded sequence number, starting at 1 %r zero-padded changeset revision number - Without the -a/--text option, export will avoid generating diffs of files - it detects as binary. With -a, export will generate a diff anyway, - probably with undesirable results. - - Use the -g/--git option to generate diffs in the git extended diff format. - See 'hg help diffs' for more information. - - With the --switch-parent option, the diff will be against the second - parent. It can be useful to review a merge. + Without the -a/--text option, export will avoid generating diffs + of files it detects as binary. With -a, export will generate a + diff anyway, probably with undesirable results. + + Use the -g/--git option to generate diffs in the git extended diff + format. See 'hg help diffs' for more information. + + With the --switch-parent option, the diff will be against the + second parent. It can be useful to review a merge. """ if not changesets: raise util.Abort(_("export requires at least one changeset")) @@ -1132,11 +1151,12 @@ def forget(ui, repo, *pats, **opts): """forget the specified files on the next commit - Mark the specified files so they will no longer be tracked after the next - commit. - - This only removes files from the current branch, not from the entire - project history, and it does not delete them from the working directory. + Mark the specified files so they will no longer be tracked + after the next commit. + + This only removes files from the current branch, not from the + entire project history, and it does not delete them from the + working directory. To undo a forget before the next commit, see hg add. """ @@ -1165,13 +1185,15 @@ Search revisions of files for a regular expression. This command behaves differently than Unix grep. It only accepts - Python/Perl regexps. It searches repository history, not the working - directory. It always prints the revision number in which a match appears. - - By default, grep only prints output for the first revision of a file in - which it finds a match. To get it to print every revision that contains a - change in match status ("-" for a match that becomes a non-match, or "+" - for a non-match that becomes a match), use the --all flag. + Python/Perl regexps. It searches repository history, not the + working directory. It always prints the revision number in which a + match appears. + + By default, grep only prints output for the first revision of a + file in which it finds a match. To get it to print every revision + that contains a change in match status ("-" for a match that + becomes a non-match, or "+" for a non-match that becomes a match), + use the --all flag. """ reflags = 0 if opts.get('ignore_case'): @@ -1334,23 +1356,23 @@ With no arguments, show all repository head changesets. - Repository "heads" are changesets that don't have child changesets. They - are where development generally takes place and are the usual targets for - update and merge operations. - - If one or more REV is given, the "branch heads" will be shown for the - named branch associated with that revision. The name of the branch is - called the revision's branch tag. - - Branch heads are revisions on a given named branch that do not have any - descendants on the same branch. A branch head could be a true head or it - could be the last changeset on a branch before a new branch was created. - If none of the branch heads are true heads, the branch is considered - inactive. If -c/--closed is specified, also show branch heads marked - closed (see hg commit --close-branch). - - If STARTREV is specified only those heads (or branch heads) that are - descendants of STARTREV will be displayed. + Repository "heads" are changesets that don't have child + changesets. They are where development generally takes place and + are the usual targets for update and merge operations. + + If one or more REV is given, the "branch heads" will be shown for + the named branch associated with that revision. The name of the + branch is called the revision's branch tag. + + Branch heads are revisions on a given named branch that do not have + any descendants on the same branch. A branch head could be a true head + or it could be the last changeset on a branch before a new branch + was created. If none of the branch heads are true heads, the branch + is considered inactive. If -c/--closed is specified, also show branch + heads marked closed (see hg commit --close-branch). + + If STARTREV is specified only those heads (or branch heads) that + are descendants of STARTREV will be displayed. """ if opts.get('rev'): start = repo.lookup(opts['rev']) @@ -1398,8 +1420,8 @@ With no arguments, print a list of commands with short help messages. - Given a topic, extension, or command name, print help for that topic. - """ + Given a topic, extension, or command name, print help for that + topic.""" option_lists = [] textwidth = util.termwidth() - 2 @@ -1533,7 +1555,10 @@ raise error.UnknownCommand(name) doc = gettext(mod.__doc__) or _('no help text available') - head, tail = doc.split('\n', 1) + if '\n' not in doc: + head, tail = doc, "" + else: + head, tail = doc.split('\n', 1) ui.write(_('%s extension - %s\n\n') % (name.split('.')[-1], head)) if tail: ui.write(minirst.format(tail, textwidth)) @@ -1612,15 +1637,16 @@ rev=None, num=None, id=None, branch=None, tags=None): """identify the working copy or specified revision - With no revision, print a summary of the current state of the repository. - - Specifying a path to a repository root or Mercurial bundle will cause - lookup to operate on that repository/bundle. - - This summary identifies the repository state using one or two parent hash - identifiers, followed by a "+" if there are uncommitted changes in the - working directory, a list of tags for this revision and a branch name for - non-default branches. + With no revision, print a summary of the current state of the + repository. + + Specifying a path to a repository root or Mercurial bundle will + cause lookup to operate on that repository/bundle. + + This summary identifies the repository state using one or two + parent hash identifiers, followed by a "+" if there are + uncommitted changes in the working directory, a list of tags for + this revision and a branch name for non-default branches. """ if not repo and not source: @@ -1687,31 +1713,33 @@ Import a list of patches and commit them individually. - If there are outstanding changes in the working directory, import will - abort unless given the -f/--force flag. - - You can import a patch straight from a mail message. Even patches as - attachments work (to use the body part, it must have type text/plain or - text/x-patch). From and Subject headers of email message are used as - default committer and commit message. All text/plain body parts before - first diff are added to commit message. - - If the imported patch was generated by hg export, user and description - from patch override values from message headers and body. Values given on - command line with -m/--message and -u/--user override these. - - If --exact is specified, import will set the working directory to the - parent of each patch before applying it, and will abort if the resulting - changeset has a different ID than the one recorded in the patch. This may - happen due to character set problems or other deficiencies in the text - patch format. - - With -s/--similarity, hg will attempt to discover renames and copies in - the patch in the same way as 'addremove'. - - To read a patch from standard input, use "-" as the patch name. If a URL - is specified, the patch will be downloaded from it. See 'hg help dates' - for a list of formats valid for -d/--date. + If there are outstanding changes in the working directory, import + will abort unless given the -f/--force flag. + + You can import a patch straight from a mail message. Even patches + as attachments work (to use the body part, it must have type + text/plain or text/x-patch). From and Subject headers of email + message are used as default committer and commit message. All + text/plain body parts before first diff are added to commit + message. + + If the imported patch was generated by hg export, user and + description from patch override values from message headers and + body. Values given on command line with -m/--message and -u/--user + override these. + + If --exact is specified, import will set the working directory to + the parent of each patch before applying it, and will abort if the + resulting changeset has a different ID than the one recorded in + the patch. This may happen due to character set problems or other + deficiencies in the text patch format. + + With -s/--similarity, hg will attempt to discover renames and + copies in the patch in the same way as 'addremove'. + + To read a patch from standard input, use "-" as the patch name. If + a URL is specified, the patch will be downloaded from it. + See 'hg help dates' for a list of formats valid for -d/--date. """ patches = (patch1,) + patches @@ -1811,12 +1839,12 @@ def incoming(ui, repo, source="default", **opts): """show new changesets found in source - Show new changesets found in the specified path/URL or the default pull - location. These are the changesets that would have been pulled if a pull - at the time you issued this command. - - For remote repository, using --bundle avoids downloading the changesets - twice if the incoming is followed by a pull. + Show new changesets found in the specified path/URL or the default + pull location. These are the changesets that would have been pulled + if a pull at the time you issued this command. + + For remote repository, using --bundle avoids downloading the + changesets twice if the incoming is followed by a pull. See pull for valid source format details. """ @@ -1880,33 +1908,33 @@ def init(ui, dest=".", **opts): """create a new repository in the given directory - Initialize a new repository in the given directory. If the given directory - does not exist, it will be created. + Initialize a new repository in the given directory. If the given + directory does not exist, it will be created. If no directory is given, the current directory is used. - It is possible to specify an ssh:// URL as the destination. See 'hg help - urls' for more information. + It is possible to specify an ssh:// URL as the destination. + See 'hg help urls' for more information. """ hg.repository(cmdutil.remoteui(ui, opts), dest, create=1) def locate(ui, repo, *pats, **opts): """locate files matching specific patterns - Print files under Mercurial control in the working directory whose names - match the given patterns. + Print files under Mercurial control in the working directory whose + names match the given patterns. By default, this command searches all directories in the working - directory. To search just the current directory and its subdirectories, - use "--include .". - - If no patterns are given to match, this command prints the names of all - files under Mercurial control in the working directory. - - If you want to feed the output of this command into the "xargs" command, - use the -0 option to both this command and "xargs". This will avoid the - problem of "xargs" treating single filenames that contain whitespace as - multiple filenames. + directory. To search just the current directory and its + subdirectories, use "--include .". + + If no patterns are given to match, this command prints the names + of all files under Mercurial control in the working directory. + + If you want to feed the output of this command into the "xargs" + command, use the -0 option to both this command and "xargs". This + will avoid the problem of "xargs" treating single filenames that + contain whitespace as multiple filenames. """ end = opts.get('print0') and '\0' or '\n' rev = opts.get('rev') or None @@ -1928,29 +1956,30 @@ def log(ui, repo, *pats, **opts): """show revision history of entire repository or files - Print the revision history of the specified files or the entire project. - - File history is shown without following rename or copy history of files. - Use -f/--follow with a filename to follow history across renames and - copies. --follow without a filename will only show ancestors or - descendants of the starting revision. --follow-first only follows the - first parent of merge revisions. - - If no revision range is specified, the default is tip:0 unless --follow is - set, in which case the working directory parent is used as the starting - revision. + Print the revision history of the specified files or the entire + project. + + File history is shown without following rename or copy history of + files. Use -f/--follow with a filename to follow history across + renames and copies. --follow without a filename will only show + ancestors or descendants of the starting revision. --follow-first + only follows the first parent of merge revisions. + + If no revision range is specified, the default is tip:0 unless + --follow is set, in which case the working directory parent is + used as the starting revision. See 'hg help dates' for a list of formats valid for -d/--date. - By default this command prints revision number and changeset id, tags, - non-trivial parents, user, date and time, and a summary for each commit. - When the -v/--verbose switch is used, the list of changed files and full - commit message are shown. + By default this command prints revision number and changeset id, + tags, non-trivial parents, user, date and time, and a summary for + each commit. When the -v/--verbose switch is used, the list of + changed files and full commit message are shown. NOTE: log -p/--patch may generate unexpected diff output for merge - changesets, as it will only compare the merge changeset against its first - parent. Also, only files different from BOTH parents will appear in - files:. + changesets, as it will only compare the merge changeset against + its first parent. Also, only files different from BOTH parents + will appear in files:. """ get = util.cachefunc(lambda r: repo[r].changeset()) @@ -2053,9 +2082,9 @@ def manifest(ui, repo, node=None, rev=None): """output the current or given revision of the project manifest - Print a list of version controlled files for the given revision. If no - revision is given, the first parent of the working directory is used, or - the null revision if no revision is checked out. + Print a list of version controlled files for the given revision. + If no revision is given, the first parent of the working directory + is used, or the null revision if no revision is checked out. With -v, print file permissions, symlink and executable bits. With --debug, print file revision hashes. @@ -2079,17 +2108,18 @@ def merge(ui, repo, node=None, **opts): """merge working directory with another revision - The current working directory is updated with all changes made in the - requested revision since the last common predecessor revision. - - Files that changed between either parent are marked as changed for the - next commit and a commit must be performed before any further updates to - the repository are allowed. The next commit will have two parents. - - If no revision is specified, the working directory's parent is a head - revision, and the current branch contains exactly one other head, the - other head is merged with by default. Otherwise, an explicit revision with - which to merge with must be provided. + The current working directory is updated with all changes made in + the requested revision since the last common predecessor revision. + + Files that changed between either parent are marked as changed for + the next commit and a commit must be performed before any further + updates to the repository are allowed. The next commit will have + two parents. + + If no revision is specified, the working directory's parent is a + head revision, and the current branch contains exactly one other + head, the other head is merged with by default. Otherwise, an + explicit revision with which to merge with must be provided. """ if opts.get('rev') and node: @@ -2136,9 +2166,9 @@ def outgoing(ui, repo, dest=None, **opts): """show changesets not found in destination - Show changesets not found in the specified destination repository or the - default push location. These are the changesets that would be pushed if a - push was requested. + Show changesets not found in the specified destination repository + or the default push location. These are the changesets that would + be pushed if a push was requested. See pull for valid destination format details. """ @@ -2171,10 +2201,11 @@ def parents(ui, repo, file_=None, **opts): """show the parents of the working directory or revision - Print the working directory's parent revisions. If a revision is given via - -r/--rev, the parent of that revision will be printed. If a file argument - is given, the revision in which the file was last changed (before the - working directory revision or the argument to --rev if given) is printed. + Print the working directory's parent revisions. If a revision is + given via -r/--rev, the parent of that revision will be printed. + If a file argument is given, the revision in which the file was + last changed (before the working directory revision or the + argument to --rev if given) is printed. """ rev = opts.get('rev') if rev: @@ -2210,11 +2241,11 @@ def paths(ui, repo, search=None): """show aliases for remote repositories - Show definition of symbolic path name NAME. If no name is given, show - definition of all available names. - - Path names are defined in the [paths] section of /etc/mercurial/hgrc and - $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too. + Show definition of symbolic path name NAME. If no name is given, + show definition of all available names. + + Path names are defined in the [paths] section of /etc/mercurial/hgrc + and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too. See 'hg help urls' for more information. """ @@ -2247,18 +2278,18 @@ Pull changes from a remote repository to a local one. - This finds all changes from the repository at the specified path or URL - and adds them to a local repository (the current one unless -R is - specified). By default, this does not update the copy of the project in - the working directory. - - Use hg incoming if you want to see what would have been added by a pull at - the time you issued this command. If you then decide to added those - changes to the repository, you should use pull -r X where X is the last - changeset listed by hg incoming. - - If SOURCE is omitted, the 'default' path will be used. See 'hg help urls' - for more information. + This finds all changes from the repository at the specified path + or URL and adds them to a local repository (the current one unless + -R is specified). By default, this does not update the copy of the + project in the working directory. + + Use hg incoming if you want to see what would have been added by a + pull at the time you issued this command. If you then decide to + added those changes to the repository, you should use pull -r X + where X is the last changeset listed by hg incoming. + + If SOURCE is omitted, the 'default' path will be used. + See 'hg help urls' for more information. """ source, revs, checkout = hg.parseurl(ui.expandpath(source), opts.get('rev')) other = hg.repository(cmdutil.remoteui(repo, opts), source) @@ -2279,19 +2310,20 @@ Push changes from the local repository to the given destination. - This is the symmetrical operation for pull. It moves changes from the - current repository to a different one. If the destination is local this is - identical to a pull in that directory from the current one. + This is the symmetrical operation for pull. It moves changes from + the current repository to a different one. If the destination is + local this is identical to a pull in that directory from the + current one. By default, push will refuse to run if it detects the result would - increase the number of remote heads. This generally indicates the user - forgot to pull and merge before pushing. - - If -r/--rev is used, the named revision and all its ancestors will be - pushed to the remote repository. - - Please see 'hg help urls' for important details about ssh:// URLs. If - DESTINATION is omitted, a default path will be used. + increase the number of remote heads. This generally indicates the + user forgot to pull and merge before pushing. + + If -r/--rev is used, the named revision and all its ancestors will + be pushed to the remote repository. + + Please see 'hg help urls' for important details about ssh:// + URLs. If DESTINATION is omitted, a default path will be used. """ dest, revs, checkout = hg.parseurl( ui.expandpath(dest or 'default-push', dest or 'default'), opts.get('rev')) @@ -2314,8 +2346,9 @@ Recover from an interrupted commit or pull. - This command tries to fix the repository status after an interrupted - operation. It should only be necessary when Mercurial suggests it. + This command tries to fix the repository status after an + interrupted operation. It should only be necessary when Mercurial + suggests it. """ if repo.recover(): return hg.verify(repo) @@ -2326,16 +2359,17 @@ Schedule the indicated files for removal from the repository. - This only removes files from the current branch, not from the entire - project history. -A/--after can be used to remove only files that have - already been deleted, -f/--force can be used to force deletion, and -Af - can be used to remove files from the next revision without deleting them - from the working directory. - - The following table details the behavior of remove for different file - states (columns) and option combinations (rows). The file states are Added - [A], Clean [C], Modified [M] and Missing [!] (as reported by hg status). - The actions are Warn, Remove (from branch) and Delete (from disk):: + This only removes files from the current branch, not from the + entire project history. -A/--after can be used to remove only + files that have already been deleted, -f/--force can be used to + force deletion, and -Af can be used to remove files from the next + revision without deleting them from the working directory. + + The following table details the behavior of remove for different + file states (columns) and option combinations (rows). The file + states are Added [A], Clean [C], Modified [M] and Missing [!] (as + reported by hg status). The actions are Warn, Remove (from branch) + and Delete (from disk):: A C M ! none W RD W R @@ -2343,8 +2377,8 @@ -A W W W R -Af R R R R - This command schedules the files to be removed at the next commit. To undo - a remove before that, see hg revert. + This command schedules the files to be removed at the next commit. + To undo a remove before that, see hg revert. """ after, force = opts.get('after'), opts.get('force') @@ -2384,16 +2418,16 @@ def rename(ui, repo, *pats, **opts): """rename files; equivalent of copy + remove - Mark dest as copies of sources; mark sources for deletion. If dest is a - directory, copies are put in that directory. If dest is a file, there can - only be one source. - - By default, this command copies the contents of files as they exist in the - working directory. If invoked with -A/--after, the operation is recorded, - but no copying is performed. - - This command takes effect at the next commit. To undo a rename before - that, see hg revert. + Mark dest as copies of sources; mark sources for deletion. If dest + is a directory, copies are put in that directory. If dest is a + file, there can only be one source. + + By default, this command copies the contents of files as they + exist in the working directory. If invoked with -A/--after, the + operation is recorded, but no copying is performed. + + This command takes effect at the next commit. To undo a rename + before that, see hg revert. """ wlock = repo.wlock(False) try: @@ -2405,16 +2439,16 @@ """retry file merges from a merge or update This command will cleanly retry unresolved file merges using file - revisions preserved from the last update or merge. To attempt to resolve - all unresolved files, use the -a/--all switch. - - If a conflict is resolved manually, please note that the changes will be - overwritten if the merge is retried with resolve. The -m/--mark switch - should be used to mark the file as resolved. - - This command also allows listing resolved files and manually indicating - whether or not files are resolved. All files must be marked as resolved - before a commit is permitted. + revisions preserved from the last update or merge. To attempt to + resolve all unresolved files, use the -a/--all switch. + + If a conflict is resolved manually, please note that the changes + will be overwritten if the merge is retried with resolve. The + -m/--mark switch should be used to mark the file as resolved. + + This command also allows listing resolved files and manually + indicating whether or not files are resolved. All files must be + marked as resolved before a commit is permitted. The codes used to show the status of files are:: @@ -2460,33 +2494,35 @@ def revert(ui, repo, *pats, **opts): """restore individual files or directories to an earlier state - (Use update -r to check out earlier revisions, revert does not change the - working directory parents.) - - With no revision specified, revert the named files or directories to the - contents they had in the parent of the working directory. This restores - the contents of the affected files to an unmodified state and unschedules - adds, removes, copies, and renames. If the working directory has two - parents, you must explicitly specify the revision to revert to. - - Using the -r/--rev option, revert the given files or directories to their - contents as of a specific revision. This can be helpful to "roll back" - some or all of an earlier change. See 'hg help dates' for a list of - formats valid for -d/--date. - - Revert modifies the working directory. It does not commit any changes, or - change the parent of the working directory. If you revert to a revision - other than the parent of the working directory, the reverted files will - thus appear modified afterwards. - - If a file has been deleted, it is restored. If the executable mode of a - file was changed, it is reset. - - If names are given, all files matching the names are reverted. If no - arguments are given, no files are reverted. - - Modified files are saved with a .orig suffix before reverting. To disable - these backups, use --no-backup. + (Use update -r to check out earlier revisions, revert does not + change the working directory parents.) + + With no revision specified, revert the named files or directories + to the contents they had in the parent of the working directory. + This restores the contents of the affected files to an unmodified + state and unschedules adds, removes, copies, and renames. If the + working directory has two parents, you must explicitly specify the + revision to revert to. + + Using the -r/--rev option, revert the given files or directories + to their contents as of a specific revision. This can be helpful + to "roll back" some or all of an earlier change. See 'hg help + dates' for a list of formats valid for -d/--date. + + Revert modifies the working directory. It does not commit any + changes, or change the parent of the working directory. If you + revert to a revision other than the parent of the working + directory, the reverted files will thus appear modified + afterwards. + + If a file has been deleted, it is restored. If the executable mode + of a file was changed, it is reset. + + If names are given, all files matching the names are reverted. + If no arguments are given, no files are reverted. + + Modified files are saved with a .orig suffix before reverting. + To disable these backups, use --no-backup. """ if opts["date"]: @@ -2675,14 +2711,15 @@ """roll back the last transaction This command should be used with care. There is only one level of - rollback, and there is no way to undo a rollback. It will also restore the - dirstate at the time of the last transaction, losing any dirstate changes - since that time. This command does not alter the working directory. - - Transactions are used to encapsulate the effects of all commands that - create new changesets or propagate existing changesets into a repository. - For example, the following commands are transactional, and their effects - can be rolled back:: + rollback, and there is no way to undo a rollback. It will also + restore the dirstate at the time of the last transaction, losing + any dirstate changes since that time. This command does not alter + the working directory. + + Transactions are used to encapsulate the effects of all commands + that create new changesets or propagate existing changesets into a + repository. For example, the following commands are transactional, + and their effects can be rolled back:: commit import @@ -2690,12 +2727,12 @@ push (with this repository as destination) unbundle - This command is not intended for use on public repositories. Once changes - are visible for pull by other users, rolling a transaction back locally is - ineffective (someone else may already have pulled the changes). - Furthermore, a race is possible with readers of the repository; for - example an in-progress pull from the repository may fail if a rollback is - performed. + This command is not intended for use on public repositories. Once + changes are visible for pull by other users, rolling a transaction + back locally is ineffective (someone else may already have pulled + the changes). Furthermore, a race is possible with readers of the + repository; for example an in-progress pull from the repository + may fail if a rollback is performed. """ repo.rollback() @@ -2711,8 +2748,9 @@ Start a local HTTP repository browser and pull server. - By default, the server logs accesses to stdout and errors to stderr. Use - the -A/--accesslog and -E/--errorlog options to log to files. + By default, the server logs accesses to stdout and errors to + stderr. Use the -A/--accesslog and -E/--errorlog options to log to + files. """ if opts["stdio"]: @@ -2773,22 +2811,24 @@ def status(ui, repo, *pats, **opts): """show changed files in the working directory - Show status of files in the repository. If names are given, only files - that match are shown. Files that are clean or ignored or the source of a - copy/move operation, are not listed unless -c/--clean, -i/--ignored, - -C/--copies or -A/--all are given. Unless options described with "show - only ..." are given, the options -mardu are used. - - Option -q/--quiet hides untracked (unknown and ignored) files unless - explicitly requested with -u/--unknown or -i/--ignored. - - NOTE: status may appear to disagree with diff if permissions have changed - or a merge has occurred. The standard diff format does not report - permission changes and diff only reports changes relative to one merge - parent. - - If one revision is given, it is used as the base revision. If two - revisions are given, the differences between them are shown. + Show status of files in the repository. If names are given, only + files that match are shown. Files that are clean or ignored or + the source of a copy/move operation, are not listed unless + -c/--clean, -i/--ignored, -C/--copies or -A/--all are given. + Unless options described with "show only ..." are given, the + options -mardu are used. + + Option -q/--quiet hides untracked (unknown and ignored) files + unless explicitly requested with -u/--unknown or -i/--ignored. + + NOTE: status may appear to disagree with diff if permissions have + changed or a merge has occurred. The standard diff format does not + report permission changes and diff only reports changes relative + to one merge parent. + + If one revision is given, it is used as the base revision. + If two revisions are given, the differences between them are + shown. The codes used to show the status of files are:: @@ -2847,17 +2887,18 @@ Name a particular revision using . - Tags are used to name particular revisions of the repository and are very - useful to compare different revisions, to go back to significant earlier - versions or to mark branch points as releases, etc. - - If no revision is given, the parent of the working directory is used, or - tip if no revision is checked out. - - To facilitate version control, distribution, and merging of tags, they are - stored as a file named ".hgtags" which is managed similarly to other - project files and can be hand-edited if necessary. The file - '.hg/localtags' is used for local tags (not shared among repositories). + Tags are used to name particular revisions of the repository and are + very useful to compare different revisions, to go back to significant + earlier versions or to mark branch points as releases, etc. + + If no revision is given, the parent of the working directory is + used, or tip if no revision is checked out. + + To facilitate version control, distribution, and merging of tags, + they are stored as a file named ".hgtags" which is managed + similarly to other project files and can be hand-edited if + necessary. The file '.hg/localtags' is used for local tags (not + shared among repositories). See 'hg help dates' for a list of formats valid for -d/--date. """ @@ -2912,8 +2953,8 @@ def tags(ui, repo): """list repository tags - This lists both regular and local tags. When the -v/--verbose switch is - used, a third column "local" is printed for local tags. + This lists both regular and local tags. When the -v/--verbose + switch is used, a third column "local" is printed for local tags. """ hexfunc = ui.debugflag and hex or short @@ -2941,22 +2982,22 @@ def tip(ui, repo, **opts): """show the tip revision - The tip revision (usually just called the tip) is the changeset most - recently added to the repository (and therefore the most recently changed - head). - - If you have just made a commit, that commit will be the tip. If you have - just pulled changes from another repository, the tip of that repository - becomes the current tip. The "tip" tag is special and cannot be renamed or - assigned to a different changeset. + The tip revision (usually just called the tip) is the changeset + most recently added to the repository (and therefore the most + recently changed head). + + If you have just made a commit, that commit will be the tip. If + you have just pulled changes from another repository, the tip of + that repository becomes the current tip. The "tip" tag is special + and cannot be renamed or assigned to a different changeset. """ cmdutil.show_changeset(ui, repo, opts).show(repo[len(repo) - 1]) def unbundle(ui, repo, fname1, *fnames, **opts): """apply one or more changegroup files - Apply one or more compressed changegroup files generated by the bundle - command. + Apply one or more compressed changegroup files generated by the + bundle command. """ fnames = (fname1,) + fnames @@ -2974,27 +3015,31 @@ def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False): """update working directory - Update the repository's working directory to the specified revision, or - the tip of the current branch if none is specified. Use null as the - revision to remove the working copy (like 'hg clone -U'). - - When the working directory contains no uncommitted changes, it will be - replaced by the state of the requested revision from the repository. When - the requested revision is on a different branch, the working directory - will additionally be switched to that branch. - - When there are uncommitted changes, use option -C/--clean to discard them, - forcibly replacing the state of the working directory with the requested - revision. Alternately, use -c/--check to abort. - - When there are uncommitted changes and option -C/--clean is not used, and - the parent revision and requested revision are on the same branch, and one - of them is an ancestor of the other, then the new working directory will - contain the requested revision merged with the uncommitted changes. - Otherwise, the update will fail with a suggestion to use 'merge' or - 'update -C' instead. - - If you want to update just one file to an older revision, use revert. + Update the repository's working directory to the specified + revision, or the tip of the current branch if none is specified. + Use null as the revision to remove the working copy (like 'hg + clone -U'). + + When the working directory contains no uncommitted changes, it + will be replaced by the state of the requested revision from the + repository. When the requested revision is on a different branch, + the working directory will additionally be switched to that + branch. + + When there are uncommitted changes, use option -C/--clean to + discard them, forcibly replacing the state of the working + directory with the requested revision. Alternately, use -c/--check + to abort. + + When there are uncommitted changes and option -C/--clean is not + used, and the parent revision and requested revision are on the + same branch, and one of them is an ancestor of the other, then the + new working directory will contain the requested revision merged + with the uncommitted changes. Otherwise, the update will fail with + a suggestion to use 'merge' or 'update -C' instead. + + If you want to update just one file to an older revision, use + revert. See 'hg help dates' for a list of formats valid for -d/--date. """ @@ -3025,10 +3070,10 @@ Verify the integrity of the current repository. - This will perform an extensive check of the repository's integrity, - validating the hashes and checksums of each entry in the changelog, - manifest, and tracked files, as well as the integrity of their crosslinks - and indices. + This will perform an extensive check of the repository's + integrity, validating the hashes and checksums of each entry in + the changelog, manifest, and tracked files, as well as the + integrity of their crosslinks and indices. """ return hg.verify(repo) diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/demandimport.py --- a/mercurial/demandimport.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/demandimport.py Wed Aug 05 22:52:35 2009 -0700 @@ -81,7 +81,10 @@ def _demandimport(name, globals=None, locals=None, fromlist=None, level=None): if not locals or name in ignore or fromlist == ('*',): # these cases we can't really delay - return _origimport(name, globals, locals, fromlist) + if level is None: + return _origimport(name, globals, locals, fromlist) + else: + return _origimport(name, globals, locals, fromlist, level) elif not fromlist: # import a [as b] if '.' in name: # a.b diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/help.py --- a/mercurial/help.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/help.py Wed Aug 05 22:52:35 2009 -0700 @@ -43,28 +43,29 @@ '''return a text listing of the given extensions''' if not exts: return '' - # TODO: literal block is wrong, should be a field list or a simple table. - result = '\n%s\n\n ::\n\n' % header + result = '\n%s\n\n' % header for name, desc in sorted(exts.iteritems()): - desc = util.wrap(desc, maxlength + 5) - result += ' %s %s\n' % (name.ljust(maxlength), desc) + result += ' %-*s %s\n' % (maxlength + 2, ':%s:' % name, desc) 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. 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. + 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:: + 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 = @@ -74,8 +75,8 @@ [extensions] myfeature = ~/.hgext/myfeature.py - To explicitly disable an extension enabled in an hgrc of broader scope, - prepend its path with !:: + 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 @@ -116,14 +117,14 @@ "12/6" "12/6/6" (Dec 6 2006) - Lastly, there is Mercurial's internal format: + Lastly, there is Mercurial's internal format:: - "1165432709 0" (Wed Dec 6 13:18:29 2006 UTC) + "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). + 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:: @@ -135,32 +136,32 @@ (["patterns"], _("File Name Patterns"), _(r''' - Mercurial accepts several notations for identifying one or more files at a - time. + Mercurial accepts several notations for identifying one or more + files at a time. - By default, Mercurial treats filenames as shell-style extended glob - patterns. + 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 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". + 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". + 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. + 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: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:: @@ -182,11 +183,11 @@ (['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. + 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. @@ -194,29 +195,31 @@ (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. + 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. + 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. + 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. + 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: @@ -224,8 +227,8 @@ - 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: + 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 @@ -245,190 +248,210 @@ 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'. + 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. + 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 topological offsets from the tip, with -1 denoting the tip. As - such, negative numbers are only useful if you've memorized your local tree - numbers and want to save typing a single digit. This editor suggests copy - and paste. + 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 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 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. + 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 name, which is a symbolic name - associated with a revision identifier. Tag names may not contain the ":" - character. + 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 "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 "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. + 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. + 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". + 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. + 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. + 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. ''')), (['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. + 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 + - 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. + 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. - 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). - 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'], _('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. - 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: + 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: + 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: + 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. + :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. - 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: + 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 "
" 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 - ' becomes 'example.com'. - - email: Any text. Extracts the first string that looks like an email - address. Example: 'User ' 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. - - 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. - - 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. + :addbreaks: Any text. Add an XHTML "
" 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 ' becomes + 'example.com'. + :email: Any text. Extracts the first string that looks like + an email address. Example: 'User ' + 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. + :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. + :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'), @@ -441,59 +464,64 @@ 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'). + 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'. + 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 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 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.:: + - 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. + 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:: + 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). + 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: + 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). + 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. + The push command will look for a path named 'default-push', and + prefer it over 'default' if both are defined. ''')), (["extensions"], _("Using additional features"), extshelp), ) diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/hg.py --- a/mercurial/hg.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/hg.py Wed Aug 05 22:52:35 2009 -0700 @@ -138,7 +138,7 @@ try: uprev = r.lookup(test) break - except: + except LookupError: continue _update(r, uprev) diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/i18n.py --- a/mercurial/i18n.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/i18n.py Wed Aug 05 22:52:35 2009 -0700 @@ -36,12 +36,16 @@ if message is None: return message - # We cannot just run the text through encoding.tolocal since that - # leads to infinite recursion when encoding._encoding is invalid. + u = t.ugettext(message) try: - u = t.ugettext(message) + # encoding.tolocal cannot be used since it will first try to + # decode the Unicode string. Calling u.decode(enc) really + # means u.encode(sys.getdefaultencoding()).decode(enc). Since + # the Python encoding defaults to 'ascii', this fails if the + # translated string use non-ASCII characters. return u.encode(encoding.encoding, "replace") except LookupError: + # An unknown encoding results in a LookupError. return message _ = gettext diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/localrepo.py --- a/mercurial/localrepo.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/localrepo.py Wed Aug 05 22:52:35 2009 -0700 @@ -651,6 +651,9 @@ return l def lock(self, wait=True): + '''Lock the repository store (.hg/store) and return a weak reference + to the lock. Use this before modifying the store (e.g. committing or + stripping). If you are opening a transaction, get a lock as well.)''' l = self._lockref and self._lockref() if l is not None and l.held: l.lock() @@ -662,6 +665,9 @@ return l def wlock(self, wait=True): + '''Lock the non-store parts of the repository (everything under + .hg except .hg/store) and return a weak reference to the lock. + Use this before modifying files in .hg.''' l = self._wlockref and self._wlockref() if l is not None and l.held: l.lock() diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/lock.py --- a/mercurial/lock.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/lock.py Wed Aug 05 22:52:35 2009 -0700 @@ -1,4 +1,4 @@ -# lock.py - simple locking scheme for mercurial +# lock.py - simple advisory locking scheme for mercurial # # Copyright 2005, 2006 Matt Mackall # @@ -10,6 +10,15 @@ import warnings class lock(object): + '''An advisory lock held by one process to control access to a set + of files. Non-cooperating processes or incorrectly written scripts + can ignore Mercurial's locking scheme and stomp all over the + repository, so don't do that. + + Typically used via localrepository.lock() to lock the repository + store (.hg/store/) or localrepository.wlock() to lock everything + else under .hg/.''' + # lock is symlink on platforms that support it, file on others. # symlink is used because create of directory entry and contents diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/lsprof.py --- a/mercurial/lsprof.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/lsprof.py Wed Aug 05 22:52:35 2009 -0700 @@ -85,7 +85,7 @@ try: mname = _fn2mod[code.co_filename] except KeyError: - for k, v in sys.modules.iteritems(): + for k, v in list(sys.modules.iteritems()): if v is None: continue if not hasattr(v, '__file__'): diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/mail.py --- a/mercurial/mail.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/mail.py Wed Aug 05 22:52:35 2009 -0700 @@ -36,7 +36,10 @@ if username and password: ui.note(_('(authenticating to mail server as %s)\n') % (username)) - s.login(username, password) + try: + s.login(username, password) + except smtplib.SMTPException, inst: + raise util.Abort(inst) def send(sender, recipients, msg): try: diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/minirst.py --- a/mercurial/minirst.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/minirst.py Wed Aug 05 22:52:35 2009 -0700 @@ -22,6 +22,8 @@ - lists (items must start with '-') +- field lists (colons cannot be escaped) + - literal blocks - option lists (supports only long options without arguments) @@ -145,7 +147,7 @@ for line in blocks[i]['lines']: if line.startswith('- '): items.append(dict(type='bullet', lines=[], - indent=blocks[i]['indent'] + 2)) + indent=blocks[i]['indent'])) line = line[2:] items[-1]['lines'].append(line) blocks[i:i+1] = items @@ -188,6 +190,43 @@ return blocks +_fieldre = re.compile(r':(?![: ])([^:]*)(?. The cache is ordered from tip to oldest (which # is part of why is there: a quick visual check is all # that's required to ensure correct order). - # + # # This information is enough to let us avoid the most expensive part # of finding global tags, which is looking up in the # manifest for each head. @@ -243,9 +243,8 @@ return (None, None, tags, False) if cachefile: cachefile.close() # ignore rest of file - + repoheads = repo.heads() - # Case 2 (uncommon): empty repo; get out quickly and don't bother # writing an empty cache. if repoheads == [nullid]: diff -r f6683a7011e9 -r 19d07553d1b2 mercurial/ui.py --- a/mercurial/ui.py Wed Aug 05 22:51:30 2009 -0700 +++ b/mercurial/ui.py Wed Aug 05 22:52:35 2009 -0700 @@ -288,7 +288,7 @@ """Prompt user with msg, read response, and ensure it matches one of the provided choices. The index of the choice is returned. choices is a sequence of acceptable responses with the format: - ('&None', 'E&xec', 'Sym&link') Responses are case insensitive. + ('&None', 'E&xec', 'Sym&link') Responses are case insensitive. If ui is not interactive, the default is returned. """ resps = [s[s.index('&')+1].lower() for s in choices] diff -r f6683a7011e9 -r 19d07553d1b2 templates/paper/notfound.tmpl --- a/templates/paper/notfound.tmpl Wed Aug 05 22:51:30 2009 -0700 +++ b/templates/paper/notfound.tmpl Wed Aug 05 22:52:35 2009 -0700 @@ -7,6 +7,6 @@ The specified repository "{repo|escape}" is unknown, sorry. -Please go back to the main repository list page. +Please go back to the main repository list page. {footer} diff -r f6683a7011e9 -r 19d07553d1b2 templates/spartan/notfound.tmpl --- a/templates/spartan/notfound.tmpl Wed Aug 05 22:51:30 2009 -0700 +++ b/templates/spartan/notfound.tmpl Wed Aug 05 22:52:35 2009 -0700 @@ -7,6 +7,6 @@ The specified repository "{repo|escape}" is unknown, sorry. -Please go back to the main repository list page. +Please go back to the main repository list page. {footer} diff -r f6683a7011e9 -r 19d07553d1b2 tests/hghave --- a/tests/hghave Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/hghave Wed Aug 05 22:52:35 2009 -0700 @@ -39,7 +39,7 @@ try: import bzrlib return (bzrlib.__doc__ != None - and bzrlib.version_info[:2] == (1, 14)) + and bzrlib.version_info[:2] >= (1, 14)) except ImportError: return False diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-churn --- a/tests/test-churn Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-churn Wed Aug 05 22:52:35 2009 -0700 @@ -28,11 +28,13 @@ hg ci -Am "add d/g/f2.txt" -u user1 -d 13:00 d/g/f2.txt echo % churn separate directories -hg churn d/e +cd d +hg churn e echo % churn all hg churn echo % churn up to rev 2 hg churn -r :2 +cd .. echo % churn with aliases cat > ../aliases < + If the file doesn't exist, it's automatically created. It's updated on each commit copied, so convert-repo can be interrupted and can be run @@ -60,11 +60,11 @@ directories. Comment lines start with '#'. Each line can contain one of the following directives: - include path/to/file + include path/to/file - exclude path/to/file + exclude path/to/file - rename from/file to/file + rename from/file to/file The 'include' directive causes a file, or all files under a directory, to be included in the destination repository, and the exclusion of all other @@ -122,7 +122,7 @@ its internal changeset merging code by default but can be configured to call the external 'cvsps' program by setting: - --config convert.cvsps='cvsps -A -u --cvs-direct -q' + --config convert.cvsps='cvsps -A -u --cvs-direct -q' This option is deprecated and will be removed in Mercurial 1.4. @@ -130,7 +130,7 @@ Internal cvsps is selected by setting - --config convert.cvsps=builtin + --config convert.cvsps=builtin and has a few more configurable options: diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-dispatch.out --- a/tests/test-dispatch.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-dispatch.out Wed Aug 05 22:52:35 2009 -0700 @@ -13,9 +13,9 @@ a format string. The formatting rules are the same as for the export command, with the following additions: - %s basename of file being printed - %d dirname of file being printed, or '.' if in repository root - %p root-relative path name of file being printed + %s basename of file being printed + %d dirname of file being printed, or '.' if in repository root + %p root-relative path name of file being printed options: diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-extension.out diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-help.out --- a/tests/test-help.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-help.out Wed Aug 05 22:52:35 2009 -0700 @@ -268,14 +268,14 @@ The codes used to show the status of files are: - M = modified - A = added - R = removed - C = clean - ! = missing (deleted by non-hg command, but still tracked) - ? = not tracked - I = ignored - = origin of the previous file listed as A (added) + M = modified + A = added + R = removed + C = clean + ! = missing (deleted by non-hg command, but still tracked) + ? = not tracked + I = ignored + = origin of the previous file listed as A (added) options: diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-keyword --- a/tests/test-keyword Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-keyword Wed Aug 05 22:52:35 2009 -0700 @@ -13,9 +13,6 @@ commit.test=cp a hooktest EOF -echo % help -hg help keyword - echo % hg kwdemo hg --quiet kwdemo --default \ | sed -e 's![^ ][^ ]*demo.txt,v!/TMP/demo.txt,v!' \ diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-keyword.out --- a/tests/test-keyword.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-keyword.out Wed Aug 05 22:52:35 2009 -0700 @@ -1,64 +1,3 @@ -% help -keyword extension - expand keywords in tracked files - -This extension expands RCS/CVS-like or self-customized $Keywords$ in tracked -text files selected by your configuration. - -Keywords are only expanded in local repositories and not stored in the change -history. The mechanism can be regarded as a convenience for the current user -or for archive distribution. - -Configuration is done in the [keyword] and [keywordmaps] sections of hgrc -files. - -Example: - -[keyword] -# expand keywords in every python file except those matching "x*" -**.py = -x* = ignore - -NOTE: the more specific you are in your filename patterns the less you lose -speed in huge repositories. - -For [keywordmaps] template mapping and expansion demonstration and control run -"hg kwdemo". - -An additional date template filter {date|utcdate} is provided. - -The default template mappings (view with "hg kwdemo -d") can be replaced with -customized keywords and templates. Again, run "hg kwdemo" to control the -results of your config changes. - -Before changing/disabling active keywords, run "hg kwshrink" to avoid the risk -of inadvertently storing expanded keywords in the change history. - -To force expansion after enabling it, or a configuration change, run "hg -kwexpand". - -Also, when committing with the record extension or using mq's qrecord, be -aware that keywords cannot be updated. Again, run "hg kwexpand" on the files -in question to update keyword expansions after all changes have been checked -in. - -Expansions spanning more than one line and incremental expansions, like CVS' -$Log$, are not supported. A keyword template map "Log = {desc}" expands to the -first line of the changeset description. - -list of commands: - - kwdemo print [keywordmaps] configuration and an expansion example - kwexpand expand keywords in the working directory - kwfiles show files configured for keyword expansion - kwshrink revert expanded keywords in the working directory - -enabled extensions: - - keyword expand keywords in tracked files - mq manage a stack of patches - notify hooks for sending email notifications at commit/push time - -use "hg -v help keyword" to show aliases and global options % hg kwdemo [extensions] hgext.keyword = diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-minirst.py --- a/tests/test-minirst.py Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-minirst.py Wed Aug 05 22:52:35 2009 -0700 @@ -106,7 +106,8 @@ :: - Literal block with no indentation. + Literal block with no indentation (apart from + the two spaces added to all literal blocks). """ debugformat('lists', lists, 60) @@ -136,3 +137,17 @@ debugformat('options', options, 60) debugformat('options', options, 30) + + +fields = """ +Field lists give a simple two-column layout: + +:key: The whitespace following the key is + significant for the wrapping of this text. +:another key: More text. + The indentation on the following + lines is not significant. +""" + +debugformat('fields', fields, 60) +debugformat('fields', fields, 30) diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-minirst.py.out --- a/tests/test-minirst.py.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-minirst.py.out Wed Aug 05 22:52:35 2009 -0700 @@ -66,20 +66,20 @@ ---------------------------------------------------------------------- The fully minimized form is the most convenient form: -Hello - literal - world + Hello + literal + world In the partially minimized form a paragraph simply ends with space-double-colon. -//////////////////////////////////////// -long un-wrapped line in a literal block -\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + //////////////////////////////////////// + long un-wrapped line in a literal block + \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -This literal block is started with '::', - the so-called expanded form. The paragraph - with '::' disappears in the final output. + This literal block is started with '::', + the so-called expanded form. The paragraph + with '::' disappears in the final output. ---------------------------------------------------------------------- literals formatted to fit within 30 characters: @@ -87,21 +87,21 @@ The fully minimized form is the most convenient form: -Hello - literal - world + Hello + literal + world In the partially minimized form a paragraph simply ends with space-double-colon. -//////////////////////////////////////// -long un-wrapped line in a literal block -\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ + //////////////////////////////////////// + long un-wrapped line in a literal block + \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ -This literal block is started with '::', - the so-called expanded form. The paragraph - with '::' disappears in the final output. + This literal block is started with '::', + the so-called expanded form. The paragraph + with '::' disappears in the final output. ---------------------------------------------------------------------- lists formatted to fit within 60 characters: @@ -118,12 +118,13 @@ - This is an indented list item - Another indented list item: - - A literal block in the middle - of an indented list. + - A literal block in the middle + of an indented list. - (The above is not a list item since we are in the literal block.) + (The above is not a list item since we are in the literal block.) -Literal block with no indentation. + Literal block with no indentation (apart from + the two spaces added to all literal blocks). ---------------------------------------------------------------------- lists formatted to fit within 30 characters: @@ -145,12 +146,13 @@ - Another indented list item: - - A literal block in the middle - of an indented list. + - A literal block in the middle + of an indented list. - (The above is not a list item since we are in the literal block.) + (The above is not a list item since we are in the literal block.) -Literal block with no indentation. + Literal block with no indentation (apart from + the two spaces added to all literal blocks). ---------------------------------------------------------------------- options formatted to fit within 60 characters: @@ -207,3 +209,31 @@ --foo bar baz ---------------------------------------------------------------------- +fields formatted to fit within 60 characters: +---------------------------------------------------------------------- +Field lists give a simple two-column layout: + +key The whitespace following the key is + significant for the wrapping of this text. +another key More text. The indentation on the following + lines is not significant. +---------------------------------------------------------------------- + +fields formatted to fit within 30 characters: +---------------------------------------------------------------------- +Field lists give a simple two- +column layout: + +key The whitespace + following the + key is + significant for + the wrapping of + this text. +another key More text. The + indentation on + the following + lines is not + significant. +---------------------------------------------------------------------- + diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-mq-qimport --- a/tests/test-mq-qimport Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-mq-qimport Wed Aug 05 22:52:35 2009 -0700 @@ -27,6 +27,38 @@ echo % qimport non-existing-file hg qimport non-existing-file +echo % import email +hg qimport --push -n email - < +Subject: [PATCH] Message in email +Date: Fri, 02 Jan 1970 00:00:00 +0000 + +Text before patch. + +# HG changeset patch +# User Username in patch +# Date 0 0 +# Node ID 1a706973a7d84cb549823634a821d9bdf21c6220 +# Parent 0000000000000000000000000000000000000000 +First line of commit message. + +More text in commit message. + +diff --git a/x b/x +new file mode 100644 +--- /dev/null ++++ b/x +@@ -0,0 +1,1 @@ ++new file +Text after patch. + +EOF + +echo % hg tip -v +hg tip -v +hg qpop +hg qdelete email + echo % import URL echo foo >> foo hg add foo diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-mq-qimport.out --- a/tests/test-mq-qimport.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-mq-qimport.out Wed Aug 05 22:52:35 2009 -0700 @@ -1,5 +1,26 @@ % qimport non-existing-file abort: unable to read non-existing-file +% import email +adding email to series file +applying email +now at: email +% hg tip -v +changeset: 0:1a706973a7d8 +tag: qtip +tag: tip +tag: email +tag: qbase +user: Username in patch +date: Thu Jan 01 00:00:00 1970 +0000 +files: x +description: +First line of commit message. + +More text in commit message. + + +popping email +patch queue now empty % import URL adding url.diff to series file url.diff diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-mq.out --- a/tests/test-mq.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-mq.out Wed Aug 05 22:52:35 2009 -0700 @@ -10,17 +10,17 @@ Common tasks (use "hg help command" for more details): -prepare repository to work with patches qinit -create new patch qnew -import existing patch qimport + prepare repository to work with patches qinit + create new patch qnew + import existing patch qimport -print patch series qseries -print applied patches qapplied -print name of top applied patch qtop + print patch series qseries + print applied patches qapplied + print name of top applied patch qtop -add known patch to applied stack qpush -remove patch from applied stack qpop -refresh contents of top applied patch qrefresh + add known patch to applied stack qpush + remove patch from applied stack qpop + refresh contents of top applied patch qrefresh list of commands: diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-notify.out --- a/tests/test-notify.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-notify.out Wed Aug 05 22:52:35 2009 -0700 @@ -5,51 +5,51 @@ To use, configure the notify extension and enable it in hgrc like this: -[extensions] -hgext.notify = + [extensions] + hgext.notify = -[hooks] -# one email for each incoming changeset -incoming.notify = python:hgext.notify.hook -# batch emails when many changesets incoming at one time -changegroup.notify = python:hgext.notify.hook + [hooks] + # one email for each incoming changeset + incoming.notify = python:hgext.notify.hook + # batch emails when many changesets incoming at one time + changegroup.notify = python:hgext.notify.hook -[notify] -# config items go here + [notify] + # config items go here Required configuration items: -config = /path/to/file # file containing subscriptions + config = /path/to/file # file containing subscriptions Optional configuration items: -test = True # print messages to stdout for testing -strip = 3 # number of slashes to strip for url paths -domain = example.com # domain to use if committer missing domain -style = ... # style file to use when formatting email -template = ... # template to use when formatting email -incoming = ... # template to use when run as incoming hook -changegroup = ... # template when run as changegroup hook -maxdiff = 300 # max lines of diffs to include (0=none, -1=all) -maxsubject = 67 # truncate subject line longer than this -diffstat = True # add a diffstat before the diff content -sources = serve # notify if source of incoming changes in this list - # (serve == ssh or http, push, pull, bundle) -[email] -from = user@host.com # email address to send as if none given -[web] -baseurl = http://hgserver/... # root of hg web site for browsing commits + test = True # print messages to stdout for testing + strip = 3 # number of slashes to strip for url paths + domain = example.com # domain to use if committer missing domain + style = ... # style file to use when formatting email + template = ... # template to use when formatting email + incoming = ... # template to use when run as incoming hook + changegroup = ... # template when run as changegroup hook + maxdiff = 300 # max lines of diffs to include (0=none, -1=all) + maxsubject = 67 # truncate subject line longer than this + diffstat = True # add a diffstat before the diff content + sources = serve # notify if source of incoming changes in this list + # (serve == ssh or http, push, pull, bundle) + [email] + from = user@host.com # email address to send as if none given + [web] + baseurl = http://hgserver/... # root of hg web site for browsing commits The notify config file has same format as a regular hgrc file. It has two sections so you can express subscriptions in whatever way is handier for you. -[usersubs] -# key is subscriber email, value is ","-separated list of glob patterns -user@host = pattern + [usersubs] + # key is subscriber email, value is ","-separated list of glob patterns + user@host = pattern -[reposubs] -# key is glob pattern, value is ","-separated list of subscriber emails -pattern = user@host + [reposubs] + # key is glob pattern, value is ","-separated list of subscriber emails + pattern = user@host Glob patterns are matched against path to repository root. diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-record.out --- a/tests/test-record.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-record.out Wed Aug 05 22:52:35 2009 -0700 @@ -12,17 +12,17 @@ and for files with multiple changes, for each change to use. For each query, the following responses are possible: - y - record this change - n - skip this change + y - record this change + n - skip this change - s - skip remaining changes to this file - f - record remaining changes to this file + s - skip remaining changes to this file + f - record remaining changes to this file - d - done, skip remaining changes and files - a - record all changes to all remaining files - q - quit, recording no changes + d - done, skip remaining changes and files + a - record all changes to all remaining files + q - quit, recording no changes - ? - display help + ? - display help options: diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-repair-strip --- a/tests/test-repair-strip Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-repair-strip Wed Aug 05 22:52:35 2009 -0700 @@ -13,7 +13,11 @@ chmod +$3 $4 hg verify echo % journal contents - cat .hg/store/journal | sed 's/\.i[^\n]*/\.i/' + if [ -f .hg/store/journal ]; then + sed -e 's/\.i[^\n]*/\.i/' .hg/store/journal + else + echo "(no journal)" + fi ls .hg/store/journal >/dev/null 2>&1 && hg recover ls .hg/strip-backup/* >/dev/null 2>&1 && hg unbundle -q .hg/strip-backup/* rm -rf .hg/strip-backup diff -r f6683a7011e9 -r 19d07553d1b2 tests/test-repair-strip.out --- a/tests/test-repair-strip.out Wed Aug 05 22:51:30 2009 -0700 +++ b/tests/test-repair-strip.out Wed Aug 05 22:52:35 2009 -0700 @@ -46,7 +46,7 @@ checking files 3 files, 4 changesets, 4 total revisions % journal contents -cat: .hg/store/journal: No such file or directory +(no journal) % before update 0, strip 2 changeset: 0:cb9a9f314b8b user: test