1.5 / 2.[012] compatiblity: shutil.move() function.
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 23 Sep 2008 05:40:19 +0000 (05:40 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Tue, 23 Sep 2008 05:40:19 +0000 (05:40 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@3459 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/engine/SCons/compat/__init__.py

index 59fdc3e3c84952c4b978616182d72db013b4832b..9a58dc674c5debdaedfde73c0f0ad282543a914c 100644 (file)
@@ -168,6 +168,46 @@ except AttributeError:
     del shlex
     import_as('_scons_shlex', 'shlex')
 
+
+import shutil
+try:
+    shutil.move
+except AttributeError:
+    # Pre-2.3 Python has no shutil.move() function.
+    #
+    # Cribbed from Python 2.5.
+    import os
+
+    def move(src, dst):
+        """Recursively move a file or directory to another location.
+
+        If the destination is on our current filesystem, then simply use
+        rename.  Otherwise, copy src to the dst and then remove src.
+        A lot more could be done here...  A look at a mv.c shows a lot of
+        the issues this implementation glosses over.
+
+        """
+        try:
+            os.rename(src, dst)
+        except OSError:
+            if os.path.isdir(src):
+                if shutil.destinsrc(src, dst):
+                    raise Error, "Cannot move a directory '%s' into itself '%s'." % (src, dst)
+                shutil.copytree(src, dst, symlinks=True)
+                shutil.rmtree(src)
+            else:
+                shutil.copy2(src,dst)
+                os.unlink(src)
+    shutil.move = move
+    del move
+
+    def destinsrc(src, dst):
+        src = os.path.abspath(src)
+        return os.path.abspath(dst)[:len(src)] == src
+    shutil.destinsrc = destinsrc
+    del destinsrc
+
+
 try:
     import subprocess
 except ImportError: