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-----
--- 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:
--- 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:'