# HG changeset patch
# User jcoomes
# Date 1384479210 28800
# Node ID db626e5b34556ef85aadcba0fbedf9172f476b3a
# Parent 3ea6f45e78c48f50a49fc9045610e01b941cbe87
clone: use listkeys when no subtrees are explicitly listed
diff -r 3ea6f45e78c4 -r db626e5b3455 tests/test-trees-remote-x.t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-trees-remote-x.t Thu Nov 14 17:33:30 2013 -0800
@@ -0,0 +1,140 @@
+Pushkey support is required to run this test.
+
+ $ hg init x
+ $ hg debugpushkey x Non-Existent-Namespace || exit 80
+
+Skip the test unless TREES_REMOTE_URL is set.
+
+ $ [ -n "$TREES_REMOTE_URL" ] || exit 80
+
+If TREES_REMOTE_URL is set, a trees-enabled mercurial server should be
+accessible at that url that serves the six repos that would be created by the
+following commands:
+
+r=tree-1
+hg init $r; touch $r/x; hg -R $r commit -d '0 0' -Am $r
+r=tree-1/sub-1
+hg init $r; touch $r/x; hg -R $r commit -d '0 0' -Am $r
+r=tree-1/sub-2
+hg init $r; touch $r/x; hg -R $r commit -d '0 0' -Am $r
+
+hg -R tree-1 tconfig --set sub-1 sub-2
+
+r=tree-2
+hg init $r; touch $r/x; hg -R $r commit -d '0 0' -Am $r
+r=tree-2/sub-2
+hg init $r; touch $r/x; hg -R $r commit -d '0 0' -Am $r
+r=tree-2/sub-3
+hg init $r; touch $r/x; hg -R $r commit -d '0 0' -Am $r
+
+hg -R tree-2 tconfig --set sub-2 sub-3
+
+Sample hgweb.config for the above repos (replace
with your local path):
+
+[paths]
+/tree-1 = /tree-1
+/tree-1/sub-1 = /tree-1/sub-1
+/tree-1/sub-2 = /tree-1/sub-2
+/tree-2 = /tree-2
+/tree-2/sub-2 = /tree-2/sub-2
+/tree-2/sub-3 = /tree-2/sub-3
+
+Enable the extension; the path to it should be in $EXTENSION_PY.
+
+ $ { echo '[extensions]'; echo "trees=$EXTENSION_PY"; } >> $HGRCPATH
+
+Clone repos.
+
+ $ hg tclone -U "$TREES_REMOTE_URL/tree-1"
+ cloning */tree-1 (glob)
+ destination directory: tree-1
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/tree-1
+
+ cloning */tree-1/sub-1 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/tree-1/sub-1
+
+ cloning */tree-1/sub-2 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/tree-1/sub-2
+
+ $ hg tclone -U "$TREES_REMOTE_URL/tree-1" t1 sub-1 \
+ > "$TREES_REMOTE_URL/tree-2"
+ cloning */tree-1 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t1
+
+ cloning */tree-1/sub-1 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t1/sub-1
+
+ cloning */tree-2/sub-2 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t1/sub-2
+
+ cloning */tree-2/sub-3 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t1/sub-3
+
+ $ hg tclone -U "$TREES_REMOTE_URL/tree-1" t2 \
+ > "$TREES_REMOTE_URL/tree-2" sub-3
+ cloning */tree-1 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t2
+
+ cloning */tree-1/sub-1 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t2/sub-1
+
+ cloning */tree-1/sub-2 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t2/sub-2
+
+ cloning */tree-2/sub-3 (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ created $TESTTMP/t2/sub-3
diff -r 3ea6f45e78c4 -r db626e5b3455 trees.py
--- a/trees.py Fri Nov 08 18:27:24 2013 -0800
+++ b/trees.py Thu Nov 14 17:33:30 2013 -0800
@@ -200,29 +200,32 @@
return hg.repository(ui, url)
return hg.peer(ui, opts, url)
+def _subtreegen_listkeys(ui, repo, opts, namespace):
+ keys = repo.listkeys(namespace)
+ for i in range(len(keys)):
+ subtree = keys[("%d" % i)]
+ yield repo, subtree
+
def _subtreegen(ui, repo, opts):
"""yields (repo, subtree) tuples"""
l = _subtreelist(ui, repo, opts)
+ namespace = _ns(ui, opts)
+ yielded = False
if l:
for subtree in l:
# Look for file://..., http://..., ssh://..., etc.
if subtree.split(':', 2)[0] in hg.schemes:
+ if not yielded:
+ for r, st in _subtreegen_listkeys(ui, repo, opts, namespace):
+ yield r, st
repo = hg_repo(ui, subtree, opts)
+ yielded = False
else:
+ yielded = True
yield repo, subtree
- return
- else:
- s = repo.listkeys('trees')
- i = 0
- n = len(s)
- while i < n:
- subtree = s[("%d" % i)]
- # Look for file://..., http://..., ssh://..., etc.
- if subtree.split(':', 2)[0] in hg.schemes:
- repo = hg_repo(ui, subtree, opts)
- else:
- yield repo, subtree
- i += 1
+ if not yielded:
+ for r, st in _subtreegen_listkeys(ui, repo, opts, namespace):
+ yield r, st
def _docmd1(cmd, ui, repo, *args, **opts):
"""Call cmd for repo and each configured/specified subtree.