<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>