changeset 698:df78d8ccac4c

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-----
author Thomas Arendsen Hein <thomas@intevation.de>
date Thu, 14 Jul 2005 15:30:49 +0100
parents cb1be2327220
children 64046575a6f7
files mercurial/commands.py mercurial/util.py
diffstat 2 files changed, 23 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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:'