<pre style='margin:0'>
Sean Farley (seanfarley) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/8a588d68fb06a716eec26c48cf3baee01ee1193b">https://github.com/macports/macports-ports/commit/8a588d68fb06a716eec26c48cf3baee01ee1193b</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 8a588d68fb06a716eec26c48cf3baee01ee1193b
</span>Author: Sean Farley <sean@macports.org>
AuthorDate: Fri Feb 23 11:18:51 2018 -0800

<span style='display:block; white-space:pre;color:#404040;'>    hg-forest: remove old extension that hasn't worked for years
</span>---
 devel/hg-forest/Portfile        |   39 -
 devel/hg-forest/files/forest.py | 1519 ---------------------------------------
 2 files changed, 1558 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/hg-forest/Portfile b/devel/hg-forest/Portfile
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 586654b..0000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/hg-forest/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,39 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-PortSystem          1.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-PortGroup           python 1.0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-name                hg-forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-version             20111009
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-categories          devel
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-license             GPL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-maintainers         nomaintainer
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-description         Mercurial extension for nested repositories
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-long_description \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   Operations on trees with nested Mercurial repositories. \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   This extension provides commands that apply to a composite tree called \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   a forest. Some commands simply wrap standard Mercurial commands, such \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   as 'clone' or 'status', and others involve a snapshot file.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-platforms           darwin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-supported_archs     noarch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-homepage            http://mercurial.selenic.com/wiki/ForestExtension
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-python.default_version 27
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-depends_lib         port:mercurial
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-distfiles
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-use_configure       no
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-build               {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-destroot {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   xinstall -m 755 -d ${destroot}${python.pkgd}/hgext
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   xinstall -m 644 -W ${filespath} forest.py ${destroot}${python.pkgd}/hgext
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-notes "To setup forest to run, edit your .hgrc to add:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   \[extensions\]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   hgext.forest=
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-See ${homepage} for more explanation
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-livecheck.type      none
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/hg-forest/files/forest.py b/devel/hg-forest/files/forest.py
</span>deleted file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 420d44c..0000000
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/hg-forest/files/forest.py
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,1519 +0,0 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Forest, an extension to work on a set of nested Mercurial trees.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Copyright (C) 2006 by Robin Farine <robin.farine@terminus.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# This software may be used and distributed according to the terms
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# of the GNU General Public License, incorporated herein by reference.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Repository path representation
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Repository paths stored in the filesystem representation are stored
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# in variables named 'rpath'. Repository roots in the mercurial
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# representation, stored in variables named 'root', are used in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# snapshot files and in command output.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-"""Operations on trees with nested Mercurial repositories.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-This extension provides commands that apply to a composite tree called
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-a forest. Some commands simply wrap standard Mercurial commands, such
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-as 'clone' or 'status', and others involve a snapshot file.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-A snapshot file represents the state of a forest at a given time. It
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-has the format of a ConfigParser file and lists the trees in a forest,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-each tree with the following attributes:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  root          path relative to the top-level tree
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  revision      the revision the working directory is based on
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  paths         a list of (alias, location) pairs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-The 'fsnap' command generates or updates such a file based on a forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-in the file system. Other commands use this information to populate a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-forest or to pull/push changes.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Configuration
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-This extension recognizes the following item in the forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-configuration section:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-walkhg = (0|no|false|1|yes|true)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  Whether repositories directly under a .hg directory should be
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  skipped (0|no|false) or not (1|yes|true). The default value is true.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  Some commands accept the --walkhg command-line option to override
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  the behavior selected by this item.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-partial = (0|no|false|1|yes|true)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-  Whether fpull should default to partial. The default value is 0.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-"""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-import errno
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-import os
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-import re
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-import shutil
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-from mercurial import cmdutil, commands, error, hg, hgweb, node, util
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-from mercurial import localrepo, sshrepo, sshserver, httprepo, statichttprepo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-from mercurial.i18n import gettext as _
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# For backwards compatibility, we need the following function definition.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# If we didn't want that, we'd have just written:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#     from mercurial.commands import 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def findcmd(ui, cmd, table, strict=True):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Find and execute mercurial.*.findcmd([ui,] cmd[, table, strict])."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return findcmd.findcmd(cmd=cmd, table=table, strict=strict)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    except TypeError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return findcmd.findcmd(ui=ui, cmd=cmd, table=table)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except TypeError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return findcmd.findcmd(ui, cmd)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    findcmd.findcmd = cmdutil.findcmd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    findcmd.__doc__ = cmdutil.findcmd.__doc__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-except AttributeError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    findcmd.findcmd = commands.findcmd
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    findcmd.__doc__ = commands.findcmd.__doc__
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-for m in (error, cmdutil, commands):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if hasattr(m, "UnknownCommand"):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        UnknownCommand = m.UnknownCommand
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        break
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Assign the exceptions explicitely to avoid demandload issues
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import mercurial.repo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import mercurial.cmdutil
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    RepoError = mercurial.repo.RepoError
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ParseError = mercurial.dispatch.ParseError
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-except AttributeError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import mercurial.error
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    RepoError = mercurial.error.RepoError
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ParseError = mercurial.error.ParseError
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# For backwards compatibility, find the parseurl() function that splits
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# urls and revisions.  Mercurial 0.9.3 doesn't have this, so we need
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# to provide a stub.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    parseurl = cmdutil.parseurl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-except:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        _parseurl = hg.parseurl
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def parseurl(url, branches=None):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            url, revs = _parseurl(url, branches)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if isinstance(revs, tuple):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # hg >= 1.6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return url, revs[1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return url, revs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    except:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def parseurl(url, revs):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """Mercurial <= 0.9.3 doesn't have this feature."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return url, (revs or None)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# For backwards compatibility, find the HTTP protocol.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-if not hasattr(hgweb, 'protocol'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    hgweb.protocol = hgweb.hgweb_mod.hgweb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# There are no issues with backward compatibility and ConfigParser.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# But since it was replaced in mercurial >= 1.3, the module is not
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# longer shipped by Windows binary packages. In this case, use
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# mercurial.config instead.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    from mercurial import config
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ConfigError = error.ConfigError
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def readconfig(path):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        cfg = config.config()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            cfg.read(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return cfg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except IOError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-except (ImportError, AttributeError):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import ConfigParser
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ConfigError = ConfigParser.Error    
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def readconfig(path):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        cfg = ConfigParser.RawConfigParser()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not cfg.read([path]):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return cfg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-class SnapshotError(ConfigError):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def cmd_options(ui, cmd, remove=None, table=commands.table):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    aliases, spec = findcmd(ui, cmd, table)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    res = list(spec[1])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if remove is not None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        res = [opt for opt in res
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               if opt[0] not in remove and opt[1] not in remove]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return res
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def walkhgenabled(ui, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if not walkhg:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        walkhg = ui.config('forest', 'walkhg', 'true')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        res = { '0' : False, 'false' : False, 'no' : False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                '1' : True, 'true' : True, 'yes' : True }[walkhg.lower()]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    except KeyError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        raise util.Abort(_("invalid value for 'walkhg': %s" % walkhg))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return res
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def partialenabled(ui, partial):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if partial:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return partial
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        partial = ui.config('forest', 'partial', 'false')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        res = { '0' : False, 'false' : False, 'no' : False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                '1' : True, 'true' : True, 'yes' : True }[partial.lower()]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    except KeyError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        raise util.Abort(_("invalid value for 'partial': %s" % partial))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return res
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _localrepo_forests(self, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Shim this function into mercurial.localrepo.localrepository so
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    that it gives you the list of subforests.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Return a list of roots in filesystem representation relative to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    the self repository.  This list is lexigraphically sorted.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def errhandler(err):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if err.filename == self.root:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            raise err
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def normpath(path):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if path:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return util.normpath(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return '.'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    res = {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    paths = [self.root]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    while paths:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        path = paths.pop()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if os.path.realpath(path) in res:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            continue
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for root, dirs, files in os.walk(path, onerror=errhandler):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            hgdirs = dirs[:]  # Shallow-copy to protect d from dirs.remove() 
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            for d in hgdirs:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if d == '.hg':
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    res[os.path.realpath(root)] = root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if not walkhg:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        dirs.remove(d)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    p = os.path.join(root, d)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if os.path.islink(p) and os.path.abspath(p) not in res:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        paths.append(p)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    res = res.values()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    res.sort()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Turn things into relative paths
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    pfx = len(self.root) + 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return [normpath(r[pfx:]) for r in res]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-localrepo.localrepository.forests = _localrepo_forests
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def repocall(repo, *args, **kwargs):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if hasattr(repo, '_call'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # hg >= 1.7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        callfn = repo._call
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        callfn = repo.do_read
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return callfn(*args, **kwargs)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _sshrepo_forests(self, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Shim this function into mercurial.sshrepo.sshrepository so
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    that it gives you the list of subforests.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Return a list of roots as ssh:// URLs.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if 'forests' not in self.capabilities:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        raise util.Abort(_("Remote forests cannot be cloned because the "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           "other repository doesn't support the forest "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           "extension."))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    data = repocall(self, "forests", walkhg=("", "True")[walkhg])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return data.splitlines()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-sshrepo.sshrepository.forests = _sshrepo_forests
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _sshserver_do_hello(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    '''the hello command returns a set of lines describing various
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    interesting things about the server, in an RFC822-like format.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Currently the only one defined is "capabilities", which
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    consists of a line in the form:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    capabilities: space separated list of tokens
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    '''
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    caps = ['unbundle', 'lookup', 'changegroupsubset', 'forests']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if self.ui.configbool('server', 'uncompressed'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if hasattr(self.repo, "revlogversion"):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            version = self.repo.revlogversion
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            version = self.repo.changelog.version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        caps.append('stream=%d' % version)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    self.respond("capabilities: %s\n" % (' '.join(caps),))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-sshserver.sshserver.do_hello = _sshserver_do_hello
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    from mercurial import wireproto
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Force the lazy importer to trigger
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    wireproto.capabilities
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-except ImportError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # hg >= 1.7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    _old_caps = wireproto.capabilities
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def _forest_caps(*args, **kwargs):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        caps = _old_caps(*args, **kwargs)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        caps += ' forests'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return caps
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    wireproto.capabilities = _forest_caps
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def do_forests(repo, proto, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        forests = repo.forests(bool(walkhg))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return "\n".join(forests)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    wireproto.commands['forests'] = (do_forests, 'walkhg')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _sshserver_do_forests(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Shim this function into the sshserver so that it responds to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    the forests command.  It gives a list of roots relative to the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    self.repo repository, sorted lexigraphically.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # hg < 1.7
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    key, walkhg = self.getarg()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forests = self.repo.forests(bool(walkhg))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    self.respond("\n".join(forests))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-sshserver.sshserver.do_forests = _sshserver_do_forests
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _httprepo_forests(self, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Shim this function into mercurial.httprepo.httprepository so
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    that it gives you the list of subforests.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Return a list of roots as http:// URLs.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if 'forests' not in self.capabilities:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        raise util.Abort(_("Remote forests cannot be cloned because the "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           "other repository doesn't support the forest "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                           "extension."))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    data = repocall(self, "forests", walkhg=("", "True")[walkhg])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return data.splitlines()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-httprepo.httprepository.forests = _httprepo_forests
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _httpserver_do_capabilities(self, req):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    caps = ['lookup', 'changegroupsubset', 'forests']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if self.configbool('server', 'uncompressed'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if hasattr(self.repo, "revlogversion"):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            version = self.repo.revlogversion
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            version = self.repo.changelog.version
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        caps.append('stream=%d' % version)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # XXX: make configurable and/or share code with do_unbundle:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    unbundleversions = ['HG10GZ', 'HG10BZ', 'HG10UN']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if unbundleversions:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        caps.append('unbundle=%s' % ','.join(unbundleversions))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    resp = ' '.join(caps)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    req.httphdr("application/mercurial-0.1", length=len(resp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    req.write(resp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-hgweb.protocol.do_capabilities = _httpserver_do_capabilities
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _httpserver_do_forests(self, req):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Shim this function into the httpserver so that it responds to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    the forests command.  It gives a list of roots relative to the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    self.repo repository, sorted lexigraphically.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    resp = ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if req.form.has_key('walkhg'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        forests = self.repo.forests(bool(req.form['walkhg'][0]))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        resp = "\n".join(forests)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    req.httphdr("application/mercurial-0.1", length=len(resp))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    req.write(resp)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-hgweb.protocol.do_forests = _httpserver_do_forests
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def _statichttprepo_forests(self, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Shim this function into
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    mercurial.statichttprepo.statichttprepository so that it gives you
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    the list of subforests.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    It depends on the fact that most directory indices have directory
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    names followed by a slash.  There is no reliable way of telling
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    whether a link leads into a subdirectory.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Return a list of roots in filesystem representation relative to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    the self repository.  This list is lexigraphically sorted.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import HTMLParser
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import string
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import urllib
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import urllib2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    import urlparse
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    class HtmlIndexParser(HTMLParser.HTMLParser):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def __init__(self, ui, paths, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._paths = paths
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._ui = ui
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._walkhg = walkhg
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self.current = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def handle_starttag(self, tag, attrs):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if string.lower(tag) == "a":
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                for attr in attrs:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if (string.lower(attr[0]) == "href" and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        attr[1].endswith('/')):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        link = urlparse.urlsplit(attr[1])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if (not self._walkhg and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            link[2].rstrip('/').split('/')[-1] == '.hg'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            break
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if not link[0] and not link[2].startswith('/'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            self._ui.debug(_("matched on '%s'") % attr[1])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            self._paths.append(urlparse.urljoin(self.current,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                                                attr[1]))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if self._url.endswith('/'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        url = self._url
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        url = self._url + '/'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    res = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    paths = [url]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    seen = {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    parser = HtmlIndexParser(self.ui, paths, walkhg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    while paths:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        path = paths.pop()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not seen.has_key(path):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            seen[path] = True
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            parser.current = path
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            index = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.ui.debug(_("retrieving '%s'\n") % path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                index = urllib2.urlopen(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                parser.reset()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                parser.feed(index.read())
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                parser.close()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                hg_path = urlparse.urljoin(path, '.hg')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.ui.debug(_("retrieving '%s'\n") % hg_path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                hg = urllib2.urlopen(hg_path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                res.append(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            except urllib2.HTTPError, inst:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                #raise IOError(None, inst)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            except urllib2.URLError, inst:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                #raise IOError(None, inst.reason[1])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    res.sort()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Turn things into relative paths
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return [root[len(url):].rstrip('/') or "." for root in res]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-statichttprepo.statichttprepository.forests = _statichttprepo_forests
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def die_on_numeric_revs(revs):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Check to ensure that the revs passed in are not numeric.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Numeric revisions make no sense when searching a forest.  You want
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    only named branches and tags.  The only special exception is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    revision -1, which occurs before the first checkin.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if revs is None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if not hasattr(revs, '__iter__'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        revs = [revs]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    for strrev in revs:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            intrev = int(strrev)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            continue                    # String-based revision
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if intrev == 0 and strrev.startswith("00"):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            continue                    # Revision -1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        raise util.Abort(_("numeric revision '%s'") % strrev)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def relpath(root, pathname):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Returns the relative path of a local pathname from a local root."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    root = os.path.abspath(root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    pathname = os.path.abspath(pathname)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if root == pathname or pathname.startswith(root + os.sep):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        pathname = os.path.normpath(pathname[len(root)+1:])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return pathname
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def urltopath(url):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if url and hg.islocal(url):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if url.startswith("file://"):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            url = url[7:]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        elif url.startswith("file:"):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            url = url[5:]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return url
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-class Forest(object):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Describes the state of the forest within the current repository.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    This data structure describes the Forest contained within the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    current repository.  It contains a list of Trees that describe
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    each sub-repository.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """    
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    class Tree(object):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Describe a local sub-repository within a forest."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        class Skip(Warning):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """Exception that signals this tree should be skipped."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        __slots__ = ('_repo', '_root', 'revs', 'paths')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def __init__(self, repo=None, root=None, revs=[], paths={}):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """Create a Tree object.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            repo may be any mercurial.localrepo object
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            root is the absolute path of this repo object
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rev is the desired revision for this repository, None meaning the tip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            paths is a dictionary of path aliases to real paths
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._repo = repo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self.revs = revs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if repo:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.paths = {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.setrepo(repo)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.paths.update(paths)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.setroot(root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.paths = paths
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def die_on_mq(self, rootpath=None):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """Raises a util.Abort exception if self has mq patches applied."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if self.mq_applied():
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                rpath = self.root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if rootpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if not isinstance(rootpath, str):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rootpath = rootpath.root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    rpath = relpath(rootpath, rpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                raise util.Abort(_("'%s' has mq patches applied") % rpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def mq_applied(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rpath = urltopath(self.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if not hg.islocal(rpath):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                raise util.Abort(_("'%s' is not a local repository") % rpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rpath = util.localpath(rpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rpath = os.path.join(rpath, ".hg")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if not os.path.isdir(rpath):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return False
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            for entry in os.listdir(rpath):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                path = os.path.join(rpath, entry)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if (os.path.isdir(path) and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    os.path.isfile(os.path.join(path, 'series'))):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        s = os.stat(os.path.join(path, "status"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if s.st_size > 0:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            return path
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    except OSError, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if err.errno != errno.ENOENT:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            raise
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return False
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def getpath(self, paths):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            assert(type(paths) != str)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if paths is None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            for path in paths:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if not hg.islocal(path):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return path
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                result = urltopath(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if os.path.isdir(result):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return result
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                result = urltopath(self.paths.get(path, None))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if result is not None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return result
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def getrepo(self, ui=False):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if not self._repo and self._root:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if ui is False:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    raise AttributeError("getrepo() requires 'ui' parameter")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self._repo = hg.repository(ui, self._root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return self._repo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def setrepo(self, repo):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._root = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._repo = repo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if repo.ui:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                self.paths.update(dict(repo.ui.configitems('paths')))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def getroot(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if self._repo:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return self._repo.root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return self._root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def setroot(self, root):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._repo = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._root = root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        @staticmethod
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def skip(function):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """Decorator that turns any exception into a Forest.Tree.Skip"""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            def skipme(*args, **keywords):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    function(*args, **keywords)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    raise Forest.Tree.Skip(err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return skipme
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        @staticmethod
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def warn(function):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """Decorator that turns any exception into a Warning"""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            def warnme(*args, **keywords):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    function(*args, **keywords)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    raise Warning(err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return warnme
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def working_revs(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            """Returns the revision of the working copy."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ctx = self.repo[None]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            except TypeError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ctx = self.repo.workingctx()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            parents = ctx.parents()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return [node.hex(parents[0].node())]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def rollback(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if self._repo:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    self._repo.transaction('forest').__del__()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                except TypeError, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    # Wrong number of arguments for hg < 1.6
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if '2 given' not in str(err):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        raise
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    self._repo.transaction().__del__()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def __repr__(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return ("<forest.Tree object "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "- repo: %s "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "- revs: %s "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "- root: %s "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "- paths: %s>") % (self.repo, self.revs,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                       self.root, self.paths)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        repo = property(getrepo, setrepo, None, None)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        root = property(getroot, setroot, None, None)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    __slots__ = ('trees', 'snapfile')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def __init__(self, error=None, top=None, snapfile=None, walkhg=True):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Create a Forest object.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        top is the mercurial.localrepo object at the top of the forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        snapfile is the filename of the snapshot file.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        walkhg controls if we descend into .hg directories.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        If you provide no snapfile, the top repo will be searched for
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sub-repositories.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        If you do provide a snapfile, then the snapfile will be read
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for sub-repositories and no searching of the filesystem will
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        be done.  The top repository is queried for the root of all
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        relative paths, but if it's missing, then the current
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        directory will be assumed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if error:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            raise AttributeError("__init__() takes only named arguments")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        self.trees = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        self.snapfile = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if snapfile:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self.snapfile = snapfile
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if top is None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                toppath = ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                toppath = top.root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self.read(snapfile, toppath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        elif top:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self.trees.append(Forest.Tree(repo=top))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if top.ui:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                top.ui.note(_("searching for repos in %s\n") % top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self.scan(walkhg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def collate_files(self, pats):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Returns a dictionary of absolute file paths, keyed Tree.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        This lets us iterate over repositories with only the files
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        that belong to them.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        result = {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        files = [os.path.abspath(path) for path in list(pats)]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if files:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            files.sort(reverse=True)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            trees = self.trees[:]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            trees.sort(reverse=True, key=(lambda tree: tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            for tree in trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                paths = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                for path in files[:]:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if not os.path.exists(path):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        raise util.Abort(_("%s not under root") % path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if path.startswith(tree.root):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        paths.append(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        files.remove(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if paths:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    result[tree] = paths
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return result
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def apply(self, ui, function, paths, opts, prehooks=[]):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Apply function(repo, targetpath, opts) to the entire forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        path is a path provided on the command line.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        function is a function that should be called for every repository.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        opts is a list of options provided to the function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        prehooks is a list of hook(tree) that are run before function()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        Useful for the vast majority of commands that scan a local
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        forest and perform some command on each sub-repository.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        Skips a sub-repository skipping it isn't actually a repository
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        or if it has mq patches applied.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        In function(), targetpath will be /-separated.  You may have
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        to util.localpath() it.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        opts['force'] = None                # Acting on unrelated repos is BAD
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if paths:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Extract revisions from # syntax in path.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            paths[0], revs = parseurl(paths[0], opts['rev'])[0:2]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        elif 'rev' in opts:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            revs = opts['rev']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            revs = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        die_on_numeric_revs(revs)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for tree in self.trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rpath = relpath(self.top().root, tree.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.status("[%s]\n" % rpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                for hook in prehooks:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        hook(tree)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    except Forest.Tree.Skip:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        raise
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    except Warning, message:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        ui.warn(_("warning: %s\n") % message)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            except Forest.Tree.Skip, message:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui.warn(_("skipped: %s\n") % message)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui.status("\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                continue
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            except util.Abort:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                raise
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if revs:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                opts['rev'] = revs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                opts['rev'] = tree.revs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            targetpath = paths or None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if paths:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                targetpath = tree.getpath(paths)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if targetpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if targetpath == paths[0] and rpath != os.curdir:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        targetpath = '/'.join((targetpath, util.pconvert(rpath)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            function(tree, targetpath, opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.status("\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def read(self, snapfile, toppath="."):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Loads the information in snapfile into this forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        snapfile is the filename of a snapshot file
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        toppath is the path of the top of this forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not toppath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            toppath = "."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        cfg = readconfig(snapfile)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not cfg:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            raise util.Abort("%s: %s" % (snapfile, os.strerror(errno.ENOENT)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        seen_root = False
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sections = {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for section in cfg.sections():
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if section.endswith('.paths'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # Compatibility with old Forest snapshot files
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                paths = dict(cfg.items(section))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                section = section[:-6]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if section in sections:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sections[section].paths.update(paths)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sections[section] = Forest.Tree(paths=paths)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                root = cfg.get(section, 'root')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if root == '.':
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    seen_root = True
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    root = toppath
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    root = os.path.join(toppath, util.localpath(root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                root = os.path.normpath(root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                rev = cfg.get(section, 'revision')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if not rev:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    rev = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                paths = dict([(k[5:], v)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                              for k, v in cfg.items(section)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                              if k.startswith('path')])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if section in sections:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sections[section].root = root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sections[section].revs = [rev]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sections[section].paths.update(paths)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sections[section] = Forest.Tree(root=root,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                                    revs=[rev],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                                    paths=paths)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not seen_root:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            raise SnapshotError("Could not find 'root = .' in '%s'" %
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                snapfile)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        self.trees = sections.values()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        self.trees.sort(key=(lambda tree: tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def scan(self, walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Scans for sub-repositories within this forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        This method modifies this forest in-place.  It searches within the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        forest's directories and enumerates all the repositories it finds.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        trees = []
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        top = self.top()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui = top.repo.ui
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for relpath in top.repo.forests(walkhg):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if relpath != '.':
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                abspath = os.path.join(top.root, util.localpath(relpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                trees.append(Forest.Tree(hg.repository(ui, abspath)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        trees.sort(key=(lambda tree: tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        trees.insert(0, Forest.Tree(hg.repository(ui, top.root)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        self.trees = trees
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def top(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Returns the top Forest.Tree in this forest."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if len(self.trees):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return self.trees[0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def update(self, ui=None):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Gets the most recent information about repos."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if not ui:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui = self.top().repo.ui
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for tree in self.trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                repo = hg.repository(ui, tree.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            except RepoError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                repo = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            tree.repo = repo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def write(self, fd, oldstyle=False):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """Writes a snapshot file to a file descriptor."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        counter = 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for tree in self.trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fd.write("[tree%s]\n" % counter)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            root = relpath(self.top().root, tree.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if root == os.curdir:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                root = '.'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            root = util.normpath(root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fd.write("root = %s\n" % root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if tree.revs:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                fd.write("revision = %s\n" % tree.revs[0])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                fd.write("revision = None\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if not oldstyle:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                for name, path in tree.paths.items():
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    fd.write("path.%s = %s\n" % (name, path))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                fd.write("\n[tree%s.paths]\n" % counter)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                for name, path in tree.paths.items():
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    fd.write("%s = %s\n" % (name, path))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fd.write("\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            counter += 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def __repr__(self):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return ("<forest.Forest object - trees: %s> ") % self.trees
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def qclone(ui, source, sroot, dest, rpath, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """Helper function to clone from a remote repository.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    source is the URL of the source of this repository
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dest is the directory of the destination
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    rpath is the relative path of the destination
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    opts are a list of options to be passed into the clone
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ui.status("[%s]\n" % rpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    assert(dest is not None)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    destpfx = os.path.normpath(os.path.dirname(dest))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if not os.path.exists(destpfx):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        os.makedirs(destpfx)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    repo = hg.repository(ui, source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    mqdir = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    assert(source is not None)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if hg.islocal(source):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        Forest.Tree(repo=repo).die_on_mq(sroot)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    url = urltopath(repo.url())
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ui.note(_("cloning %s to %s\n") % (url, dest))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    commands.clone(ui, url, dest, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    repo = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def clone(ui, source, dest=None, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """make a clone of an existing forest of repositories
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Create a clone of an existing forest in a new directory.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the clone command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    die_on_numeric_revs(opts['rev'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    source = ui.expandpath(source) or source
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    islocalsrc = hg.islocal(source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if islocalsrc:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        source = os.path.abspath(urltopath(source))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if dest:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if hg.islocal(dest):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            dest = os.path.normpath(dest)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dest = hg.defaultdest(source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    toprepo = hg.repository(ui, source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forests = toprepo.forests(walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    for rpath in forests:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if rpath == '.':
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rpath = ''
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if islocalsrc:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            srcpath = source
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            srcpath = os.path.join(source, util.localpath(rpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            srcpath = '/'.join((source, rpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if rpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            destpath = os.path.join(dest, util.localpath(rpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            destpath = dest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            qclone(ui=ui,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   source=srcpath, sroot=source,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   dest=destpath, rpath=os.path.normpath(rpath),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   opts=opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except util.Abort, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui.status("\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def fetch(ui, top, source="default", **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """pull changes from a remote forest, merge new changes if needed.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    This finds all changes from the forest at the specified path or
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    URL and adds them to the local forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the fetch command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    snapfile = opts['snapfile']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=snapfile,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    source = [source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        import hgext.fetch as fetch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Force the lazy importer to trigger
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        fetch.cmdtable
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    except ImportError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        raise util.Abort(_("could not import fetch module\n"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, srcpath, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not srcpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            srcpath = forest.top().getpath(source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if srcpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                rpath = util.pconvert(relpath(forest.top().root, tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                srcpath = '/'.join((srcpath, rpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui.warn(_("skipped: %s\n") %
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        _("repository %s not found") % source[0])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fetch.fetch(ui, tree.getrepo(ui), srcpath, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            tree.rollback()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.skip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, source, opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def incoming(ui, top, source="default", **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """show new changesets found in source forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Show new changesets found in the specified path/URL or the default
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    pull location for each repository in the source forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the incoming command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    die_on_numeric_revs(opts['rev'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=opts['snapfile'],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    source = [source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    opts["bundle"] = ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, srcpath, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not srcpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            srcpath = forest.top().getpath(source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if srcpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                rpath = util.pconvert(relpath(forest.top().root, tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                srcpath = '/'.join((srcpath, rpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui.warn(_("skipped: %s\n") %
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        _("repository %s not found") % source[0])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            commands.incoming(ui, tree.repo, srcpath, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.warn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, source, opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def outgoing(ui, top, dest=None, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """show changesets not found in destination forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Show changesets not found in the specified destination forest or
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    the default push location.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the outgoing command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    die_on_numeric_revs(opts['rev'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=opts['snapfile'],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if dest == None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dest = ["default-push", "default"]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dest = [dest]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, destpath, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not destpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            destpath = forest.top().getpath(dest)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if destpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                rpath = util.pconvert(relpath(forest.top().root, tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                destpath = '/'.join((destpath, rpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui.warn(_("skipped: %s\n") %
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        _("repository %s not found") % dest[0])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            commands.outgoing(ui, tree.repo, destpath, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.warn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, dest, opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def pull(ui, top, source="default", pathalias=None, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """pull changes from the specified forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Pull changes from a remote forest to a local one.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    You may specify a snapshot file, which is generated by the fsnap
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    command.  For each tree in this file, pull the specified revision
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    from the specified source path.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    By default, pull new remote repositories that it discovers.  If
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    you use the -p option, pull only the repositories available locally.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the pull command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    die_on_numeric_revs(opts['rev'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if pathalias:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Compatibility with old 'hg fpull SNAPFILE PATH-ALIAS' syntax
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        snapfile = source
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        source = pathalias
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        snapfile = opts['snapfile']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    source = [source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    walkhg = walkhgenabled(ui, opts['walkhg'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=snapfile, walkhg=walkhg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    toproot = forest.top().root
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if not snapfile:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Look for new remote paths from source
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        srcpath = forest.top().getpath(source) or ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        srcrepo = hg.repository(ui, srcpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        srcforests = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            srcforests = srcrepo.forests(walkhg)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except util.Abort, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.note(_("skipped new forests: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if srcforests:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.note(_("looking for new forests\n"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            newrepos = [util.localpath(root) for root in srcforests]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            for tree in forest.trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    newrepos.remove(relpath(toproot, tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    pass
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.note(_("found new forests: %s\n") % newrepos)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            forest.trees.extend([Forest.Tree(root=os.path.join(toproot, new))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                 for new in newrepos])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            forest.trees.sort(key=(lambda tree: tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    opts['pull'] = True
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    opts['uncompressed'] = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    opts['noupdate'] = not opts['update']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    partial = partialenabled(ui, opts['partial'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, srcpath, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if snapfile:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            opts['rev'] = tree.revs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            destpath = relpath(os.path.abspath(os.curdir), tree.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rpath = util.pconvert(relpath(toproot, tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if not srcpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                srcpath = forest.top().getpath(source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if srcpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    srcpath = '/'.join((srcpath, rpath))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ui.warn(_("warning: %s\n") %
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            _("repository %s not found") % source[0])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                tree.getrepo(ui)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            except RepoError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if partial:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ui.warn(_("skipped: new remote repository\n"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    # Need to clone
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    quiet = ui.quiet
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        ui.quiet = True # Hack to shut up qclone's ui.status()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        qclone(ui=ui,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                               source=srcpath, sroot=source,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                               dest=destpath, rpath=rpath,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                               opts=opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    except util.Abort, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ui.quiet = quiet
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            commands.pull(ui, tree.getrepo(ui), srcpath, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            tree.rollback()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.skip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, source, opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def push(ui, top, dest=None, pathalias=None, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """push changes to the specified forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Push changes from the local forest to the given destination.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    You may specify a snapshot file, which is generated by the fsnap
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    command.  For each tree in this file, push the specified revision
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    to the specified destination path.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the push command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if pathalias:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Compatibility with old 'hg fpush SNAPFILE PATH-ALIAS' syntax
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        snapfile = dest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dest = [pathalias]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        opts['rev'] = ['tip']           # Force a push from tip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        snapfile = opts['snapfile']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if dest:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            dest = [dest]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            dest = ["default-push", "default"]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=snapfile,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, destpath, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            commands.push(ui, tree.getrepo(ui), destpath, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            tree.rollback()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.skip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, dest, opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def seed(ui, snapshot=None, source='default', **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """populate a forest according to a snapshot file.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Populate an empty local forest according to a snapshot file.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Given a snapshot file, clone any non-existant directory from the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    provided path-alias.  This defaults to cloning from the 'default'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    path.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Unless the --tip option is set, this command will clone the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    revision specified in the snapshot file.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the clone command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    snapfile = snapshot or opts['snapfile']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if not snapfile:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        raise ParseError("fseed", _("invalid arguments"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(snapfile=snapfile)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    tip = opts['tip']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dest = opts['root']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if not dest:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dest = os.curdir
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        forest.trees.remove(forest.top())
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dest = os.path.normpath(dest)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    for tree in forest.trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        srcpath = tree.getpath([source])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not srcpath:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.status("[%s]\n" % util.pconvert(tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: path alias %s not defined\n") % source)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.status("\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            continue
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        srcpath = urltopath(srcpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if tree.root == ".":
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            destpath = dest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            destpath = os.path.join(dest, tree.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        opts['rev'] = tree.revs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            qclone(ui=ui,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   source=srcpath, sroot=None,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   dest=destpath, rpath=util.pconvert(tree.root),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                   opts=opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except util.Abort, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui.status("\n")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def snap(ui, top, snapshot=None, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """take a snapshot of the forest and show it
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Shows the current state of the forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    You can use the output of this command as with the --snapfile
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    option of other forest commands.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    When you provide a snapshot file, only the trees mentioned in that
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    file will be shown.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    snapfile = snapshot or opts['snapfile']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    tip = opts['tip']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=snapfile,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if snapfile:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        forest.update(ui)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    for tree in forest.trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if not tip:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            tree.revs = tree.working_revs()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.write(ui, opts['compatible'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def status(ui, top, *pats, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """show changed files in the working forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Show status of files in this forest's repositories.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the status command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    die_on_numeric_revs(opts['rev'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Figure out which paths are relative to which roots
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    files = forest.collate_files(pats)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if files:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Trim which trees we're going to look at
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        forest.trees = files.keys()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    class munge_ui(object):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        """This wrapper class allows us to munge the mercurial.ui.write() """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def __init__(self, transform, ui):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._transform = transform
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._ui = ui
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def write(self, *args, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            args = [self._transform(a) for a in args]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            self._ui.write(*args, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        def __getattr__(self, attrname):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return getattr(self._ui, attrname)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, path, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        path = util.localpath(path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if files:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            pats = files[tree]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            pats = ()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if path == top.root:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                path = ''
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                path = relpath(top.root, path)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            def prefix(output):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                """This function shims the root in before the filename."""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if opts['no_status']:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return os.path.join(path, output)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    prefix, filename = output.split(' ', 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    return ' '.join((prefix, os.path.join(path, filename)))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            localui = munge_ui(prefix, ui)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            commands.status(localui, tree.repo, *pats, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except RepoError, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.warn
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, [top.root], opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def tag(ui, top, name, revision=None, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """add a tag for the current or given revision in the working forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Name a particular revision using <name>.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Tags are used to name particular revisions of the repository and are
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    very useful to compare different revision, to go back to significant
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    earlier versions or to mark branch points as releases, etc.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    If no revision is given, the parent of the working directory is used,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    or tip if no revision is checked out.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    To facilitate version control, distribution, and merging of tags,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    they are stored as a file named ".hgtags" which is managed
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    similarly to other project files and can be hand-edited if
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    necessary.  The file '.hg/localtags' is used for local tags (not
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    shared among repositories).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if revision is not None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui.warn(_("use of 'hg ftag NAME [REV]' is deprecated, "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                  "please use 'hg ftag [-r REV] NAME' instead\n"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if opts['rev']:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            raise util.Abort(_("use only one form to specify the revision"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        opts['rev'] = revision
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=None,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, ignore, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            commands.tag(ui, tree.getrepo(ui), name, rev_=None, **opts)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            tree.rollback()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.skip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, None, opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def trees(ui, top, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """show the roots of the repositories
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Show the roots of the trees in the forest.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    By default, show the absolute path of each repository.  With
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    --convert, show the portable Mercurial path.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    convert = opts['convert']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    for tree in forest.trees:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if convert:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.write("%s\n" % relpath(top.root, tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.write("%s\n" % util.localpath(tree.root))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def update(ui, top, revision=None, **opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """update working forest
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Update the working forest to the specified revision, or the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    tip of the current branch if none is specified.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    You may specify a snapshot file, which is generated by the fsnap
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    command.  For each tree in this file, update to the revision
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    recorded for that tree.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    Look at the help text for the update command for more information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    """
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    snapfile = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if revision:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if readconfig(revision):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # Compatibility with old 'hg fupdate SNAPFILE' syntax
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                snapfile = revision
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except ConfigError, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("warning: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if snapfile is None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        snapfile = opts['snapfile']
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        opts['rev'] = revision
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest = Forest(top=top, snapfile=snapfile,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    walkhg=walkhgenabled(ui, opts['walkhg']))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def function(tree, ignore, opts):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if 'rev' in opts:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rev = opts['rev'] or None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rev = None
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if hasattr(rev, '__iter__'):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            rev = rev[-1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if rev is not None:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                commands.update(ui, tree.getrepo(ui),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                rev=rev, clean=opts['clean'], date=opts['date'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                commands.update(ui, tree.getrepo(ui),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                clean=opts['clean'], date=opts['date'])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        except Exception, err:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui.warn(_("skipped: %s\n") % err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            tree.rollback()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    @Forest.Tree.skip
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    def check_mq(tree):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        tree.die_on_mq(top.root)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    forest.apply(ui, function, None, opts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                 prehooks=[lambda tree: check_mq(tree)])
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-cmdtable = {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-def uisetup(ui):
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global cmdtable
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    walkhgopts = ('', 'walkhg', '',
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                  _("walk repositories under '.hg' (yes/no)"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    snapfileopts = ('', 'snapfile', '',
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    _("snapshot file generated by fsnap"))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    cmdtable = {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "^fclone" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (clone,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [walkhgopts] + cmd_options(ui, 'clone'),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fclone [OPTION]... SOURCE [DEST]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "fincoming|fin" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (incoming,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [walkhgopts, snapfileopts]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             + cmd_options(ui, 'incoming', remove=('f', 'bundle')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fincoming [OPTION]... [SOURCE]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "foutgoing|fout" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (outgoing,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [walkhgopts, snapfileopts]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             + cmd_options(ui, 'outgoing', remove=('f',)),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg foutgoing [OPTION]... [DEST]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "^fpull" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (pull,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [('p', 'partial', False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               _("do not pull new remote repositories")),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              walkhgopts, snapfileopts] + cmd_options(ui, 'pull', remove=('f',)),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fpull [OPTION]... [SOURCE]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "^fpush" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (push,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [walkhgopts, snapfileopts] + cmd_options(ui, 'push', remove=('f',)),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fpush [OPTION]... [DEST]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "fseed" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (seed,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [('', 'root', '',
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               _("create root as well as children under <root>")),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              snapfileopts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              ('t', 'tip', False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               _("use tip instead of revisions stored in the snapshot file"))]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             + cmd_options(ui, 'clone', remove=('r',)),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fseed [OPTION]... SNAPSHOT-FILE [PATH-ALIAS]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "fsnap" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (snap,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [('', 'compatible', False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               _("write snapshot file compatible with older forest versions")),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              snapfileopts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              ('t', 'tip', False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               _("record tip instead of actual child revisions")),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              walkhgopts],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fsnap [OPTION]... [SNAPSHOT-FILE]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "^fstatus|fst" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (status,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [walkhgopts] + cmd_options(ui, 'status'),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fstatus [OPTION]... [FILE]...')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "ftag":
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (tag,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [walkhgopts] + cmd_options(ui, 'tag'),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg ftag [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "ftrees" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (trees,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [('c', 'convert', False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               _("convert paths to mercurial representation")),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              walkhgopts],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg ftrees [OPTIONS]')),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "^fupdate|fup|fcheckout|fco" :
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            (update,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             [snapfileopts,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              ('', 'tip', False,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-               _("use tip instead of revisions stored in the snapshot file")),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              walkhgopts]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             + cmd_options(ui, 'update'),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-             _('hg fupdate [OPTION]...'))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        import hgext.fetch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Force the lazy importer to trigger
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        hgext.fetch.cmdtable
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    except ImportError:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    try:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        cmdtable.update({"ffetch": (fetch,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    [walkhgopts, snapfileopts]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    + cmd_options(ui, 'fetch',
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                                  remove=('bundle',),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                                  table=hgext.fetch.cmdtable),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    _('hg ffetch [OPTION]... [SOURCE]'))})
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    except UnknownCommand:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-commands.norepo += " fclone fseed"
</span></pre><pre style='margin:0'>

</pre>