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