[cig-commits] commit: `hg fclone` now behaves much like `hg clone`
Mercurial
hg at geodynamics.org
Mon Nov 24 11:27:09 PST 2008
changeset: 62:5d770477eb1a
user: Simon Law <simon at akoha.org>
date: Mon Aug 27 13:40:21 2007 -0400
files: forest.py test-forest test-forest.out
description:
`hg fclone` now behaves much like `hg clone`
diff -r 45f4c6176e27 -r 5d770477eb1a forest.py
--- a/forest.py Tue Aug 28 15:27:29 2007 -0400
+++ b/forest.py Mon Aug 27 13:40:21 2007 -0400
@@ -48,6 +48,7 @@ import errno
import errno
import os
import re
+import shutil
from mercurial import cmdutil, commands, hg, node, util
from mercurial import localrepo, sshrepo, sshserver, httprepo, statichttprepo
@@ -798,32 +799,68 @@ class ForestSnapshot(object):
self.forest.write(ui, oldstyle=True)
-def clone(ui, source, dest, walkhg, **opts):
- """Clone a forest."""
- dest = os.path.normpath(dest)
-
- def doit(repo, root, path, rev, *unused):
- if root == '.':
+def qclone(ui, source, sroot, dest, rpath, opts):
+ """Helper function to clone from a remote repository.
+
+ source is the URL of the source of this repository
+ dest is the directory of the destination
+ rpath is the relative path of the destination
+ opts are a list of options to be passed into the clone
+ """
+ ui.status("[%s]\n" % rpath)
+ assert(dest is not None)
+ destpfx = os.path.normpath(os.path.dirname(dest))
+ if not os.path.exists(destpfx):
+ os.makedirs(destpfx)
+ repo = hg.repository(ui, source)
+ mqdir = None
+ assert(source is not None)
+ if hg.islocal(source):
+ Forest.Tree(repo=repo).die_on_mq(sroot)
+ url = urltopath(repo.url())
+ ui.note(_("cloning %s to %s\n") % (url, dest))
+ commands.clone(ui, url, dest, **opts)
+ repo = None
+
+
+def clone(ui, source, dest=None, **opts):
+ """make a clone of an existing forest of repositories
+
+ Create a clone of an existing forest in a new directory.
+
+ Look at the help text for the clone command for more information.
+ """
+ die_on_numeric_revs(opts['rev'])
+ source = ui.expandpath(source) or source
+ islocalsrc = hg.islocal(source)
+ if islocalsrc:
+ source = os.path.abspath(urltopath(source))
+ if dest:
+ dest = os.path.normpath(dest)
+ else:
+ dest = hg.defaultdest(source)
+ toprepo = hg.repository(ui, source)
+ forests = toprepo.forests(walkhgenabled(ui, opts['walkhg']))
+ for rpath in forests:
+ if rpath == '.':
+ rpath = ''
+ if islocalsrc:
+ srcpath = source
+ srcpath = os.path.join(source, util.localpath(rpath))
+ else:
+ srcpath = '/'.join((source, rpath))
+ if rpath:
+ destpath = os.path.join(dest, util.localpath(rpath))
+ else:
destpath = dest
- else:
- destpath = os.path.join(dest, util.localpath(root))
- destpfx = os.path.dirname(destpath)
- if not os.path.exists(destpfx):
- os.makedirs(destpfx)
- if rev:
- opts['rev'] = [rev]
- else:
- opts['rev'] = []
- url = repo.url()
- if hasattr(repo, "root"):
- url = repo.root
- commands.clone(ui, url, destpath, **opts)
-
- snapshot = ForestSnapshot()
- repo = hg.repository(ui, source)
- snapshot.update(ui, repo, hasattr(repo, "root"),
- walkhgenabled(ui, walkhg), True)
- snapshot(ui, repo, doit, mq_check=False)
+ try:
+ qclone(ui=ui,
+ source=srcpath, sroot=source,
+ dest=destpath, rpath=os.path.normpath(rpath),
+ opts=opts)
+ except util.Abort, err:
+ ui.warn(_("skipped: %s\n") % err)
+ ui.status("\n")
def pull(ui, toprepo, snapfile, pathalias, **opts):
@@ -974,10 +1011,10 @@ def uisetup(ui):
walkhgopts = ('', 'walkhg', '',
_("walk repositories under '.hg' (yes/no)"))
cmdtable = {
- "fclone" :
+ "^fclone" :
(clone,
- [walkhgopts] + cmd_options(ui, 'clone', remove=('r',)),
- _('hg fclone [OPTIONS] SOURCE DESTINATION')),
+ [walkhgopts] + cmd_options(ui, 'clone'),
+ _('hg fclone [OPTION]... SOURCE [DEST]')),
"fpull" :
(pull,
cmd_options(ui, 'pull', remove=('f', 'r')),
diff -r 45f4c6176e27 -r 5d770477eb1a test-forest
--- a/test-forest Tue Aug 28 15:27:29 2007 -0400
+++ b/test-forest Mon Aug 27 13:40:21 2007 -0400
@@ -1,4 +1,6 @@
#! /bin/sh
+
+#alias hg='hg --traceback'
HGRCPATH=$HGTMP/.hgrc
export HGRCPATH
@@ -117,6 +119,13 @@ hg add --cwd topcopy/t z
hg add --cwd topcopy/t z
hg qrefresh --cwd topcopy/t
+# create a versioned mq patch in topcopy/t
+hg qinit -c --cwd topcopy/t/t
+hg qnew --cwd topcopy/t/t mq-patch
+echo "zzz" > topcopy/t/t/z
+hg add --cwd topcopy/t/t z
+hg qrefresh --cwd topcopy/t/t
+
echo "# fstatus + mq"
hg fstatus --cwd topcopy
diff -r 45f4c6176e27 -r 5d770477eb1a test-forest.out
--- a/test-forest.out Tue Aug 28 15:27:29 2007 -0400
+++ b/test-forest.out Mon Aug 27 13:40:21 2007 -0400
@@ -338,9 +338,32 @@ no changes found
*mq*
[t/t]
+*mq*
+
+[t/t/.hg/patches]
+A .hgignore
+A mq-patch
+A series
# fclone + mq
-abort: 't' has mq patches applied
+[.]
+3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+[d/d/t]
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+[e/d]
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+[t]
+skipped: 't' has mq patches applied
+
+[t/t]
+skipped: 't/t' has mq patches applied
+
+[t/t/.hg/patches]
+0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
# fsnap + mq
abort: 't' has mq patches applied
# fpull + mq
@@ -363,9 +386,7 @@ skipped, mq patches applied
skipped, mq patches applied
[t/t]
-pulling from HGTMP/test-forest/toplevel/t/t
-searching for changes
-no changes found
+skipped, mq patches applied
# fpush + mq
[.]
@@ -387,9 +408,7 @@ skipped, mq patches applied
skipped, mq patches applied
[t/t]
-pushing to HGTMP/test-forest/toplevel/t/t
-searching for changes
-no changes found
+skipped, mq patches applied
# walk **/.hg
.
More information about the CIG-COMMITS
mailing list