# HG changeset patch # User Thomas Arendsen Hein # Date 1121351449 -3600 # Node ID df78d8ccac4cfc11bf644393500425d6267c9f27 # Parent cb1be2327220ab315e9661376fdcc28b60ff12ac Use python function instead of external 'cp' command when cloning repos. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Use python function instead of external 'cp' command when cloning repos. Inspired by a patch from Stephen Darnell. manifest hash: b525b0bf40f349b362db7c46d62be41572ef65cf -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFC1ncZW7P1GVgWeRoRAiJmAJ9GaCPaG6yOKb72I+SpDDdcdXTISACePD0H GR/F+qqzi2imdgIV77ziLcQ= =YVd2 -----END PGP SIGNATURE----- diff -r cb1be2327220 -r df78d8ccac4c mercurial/commands.py --- a/mercurial/commands.py Thu Jul 14 10:42:28 2005 +0100 +++ b/mercurial/commands.py Thu Jul 14 15:30:49 2005 +0100 @@ -6,7 +6,7 @@ # of the GNU General Public License, incorporated herein by reference. from demandload import demandload -demandload(globals(), "os re sys signal") +demandload(globals(), "os re sys signal shutil") demandload(globals(), "fancyopts ui hg util") demandload(globals(), "fnmatch hgweb mdiff random signal time traceback") demandload(globals(), "errno socket version struct") @@ -373,7 +373,7 @@ fp = sys.stdout fp.write(r.read(n)) -def clone(ui, source, dest = None, **opts): +def clone(ui, source, dest=None, **opts): """make a copy of an existing repository""" if dest is None: dest = os.path.basename(os.path.normpath(source)) @@ -384,7 +384,6 @@ class Dircleanup: def __init__(self, dir_): - import shutil self.rmtree = shutil.rmtree self.dir_ = dir_ os.mkdir(dir_) @@ -401,10 +400,12 @@ if other.dev() != -1: abspath = os.path.abspath(source) - - if other.dev() != -1 and os.stat(dest).st_dev == other.dev(): - ui.note("cloning by hardlink\n") - util.system("cp -al '%s'/.hg '%s'/.hg" % (source, dest)) + copyfile = (os.stat(dest).st_dev == other.dev() + and getattr(os, 'link', None) or shutil.copy2) + if copyfile is not shutil.copy2: + ui.note("cloning by hardlink\n") + util.copytree(os.path.join(source, ".hg"), os.path.join(dest, ".hg"), + copyfile) try: os.unlink(os.path.join(dest, ".hg", "dirstate")) except IOError: diff -r cb1be2327220 -r df78d8ccac4c mercurial/util.py --- a/mercurial/util.py Thu Jul 14 10:42:28 2005 +0100 +++ b/mercurial/util.py Thu Jul 14 15:30:49 2005 +0100 @@ -46,6 +46,21 @@ os.unlink(dst) os.rename(src, dst) +def copytree(src, dst, copyfile): + """Copy a directory tree, files are copied using 'copyfile'.""" + names = os.listdir(src) + os.mkdir(dst) + + for name in names: + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + if os.path.isdir(srcname): + copytree(srcname, dstname, copyfile) + elif os.path.isfile(srcname): + copyfile(srcname, dstname) + else: + raise IOError("Not a regular file: %r" % srcname) + # Platfor specific varients if os.name == 'nt': nulldev = 'NUL:'