changeset 15:db626e5b3455

clone: use listkeys when no subtrees are explicitly listed
author jcoomes
date Thu, 14 Nov 2013 17:33:30 -0800
parents 3ea6f45e78c4
children a6ed24673925
files tests/test-trees-remote-x.t trees.py
diffstat 2 files changed, 156 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- /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 <dir> with your local path):
+
+[paths]
+/tree-1 = <dir>/tree-1
+/tree-1/sub-1 = <dir>/tree-1/sub-1
+/tree-1/sub-2 = <dir>/tree-1/sub-2
+/tree-2 = <dir>/tree-2
+/tree-2/sub-2 = <dir>/tree-2/sub-2
+/tree-2/sub-3 = <dir>/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
--- 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.