]> granicus.if.org Git - python/commitdiff
Patch #448038: Add move(). Report errors from copytree as in shutil.Error.
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 7 Oct 2002 13:23:24 +0000 (13:23 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 7 Oct 2002 13:23:24 +0000 (13:23 +0000)
Doc/lib/libshutil.tex
Lib/shutil.py
Misc/NEWS

index f41d4eb6800d72d64916bfa8e777384c2b53e81b..434804b808504263324d58c6953bd39384574ebf 100644 (file)
@@ -93,6 +93,22 @@ file type and creator codes will not be correct.
   not be caught.
 \end{funcdesc}
 
+\begin{funcdesc}{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.
+
+\versionadded{2.3}
+\end{funcdesc}
+
+\begin{excdesc}{Error}
+This exception collects exceptions that raised during a mult-file
+operation. For \function{copytree}, the exception argument is a
+list of 3-tuples (\var{srcname}, \var{dstname}, \var{exception}).
+
+\versionadded{2.3}
+\end{excdesc}
 
 \subsection{Example \label{shutil-example}}
 
index 0e60870957cc6f1bce8c4abaa644cbdae5d6bc99..e94e7d9e0cabbf9fd923d4149222ee71419fed90 100644 (file)
@@ -7,9 +7,13 @@ XXX The functions here don't copy the resource fork or other metadata on Mac.
 import os
 import sys
 import stat
+import exceptions
 
 __all__ = ["copyfileobj","copyfile","copymode","copystat","copy","copy2",
-           "copytree","rmtree"]
+           "copytree","rmtree","Error"]
+
+class Error(exceptions.EnvironmentError):
+    pass
 
 def copyfileobj(fsrc, fdst, length=16*1024):
     """copy data from file-like object fsrc to file-like object fdst"""
@@ -95,6 +99,7 @@ def copytree(src, dst, symlinks=0):
     """
     names = os.listdir(src)
     os.mkdir(dst)
+    errors = []
     for name in names:
         srcname = os.path.join(src, name)
         dstname = os.path.join(dst, name)
@@ -108,7 +113,9 @@ def copytree(src, dst, symlinks=0):
                 copy2(srcname, dstname)
             # XXX What about devices, sockets etc.?
         except (IOError, os.error), why:
-            print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why))
+            errors.append((srcname, dstname, why))
+    if errors:
+        raise Error, errors
 
 def rmtree(path, ignore_errors=0, onerror=None):
     """Recursively delete a directory tree.
@@ -141,3 +148,24 @@ def _build_cmdtuple(path, cmdtuples):
         else:
             cmdtuples.append((os.remove, real_f))
     cmdtuples.append((os.rmdir, path))
+
+
+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):
+            copytree(src, dst, symlinks=1)
+            rmtree(src)
+        else:
+            copy2(src,dst)
+            os.unlink(src)
index dbd718b8bd47162fadbf36d363d8d95293859d55..bc990e3b870e078124c6c91c026d056b29b9bccb 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -342,6 +342,9 @@ Extension modules
 Library
 -------
 
+- shutil.move was added. shutil.copytree now reports errors as an
+  exception at the end, instead of printing error messages.
+
 - Encoding name normalization was generalized to not only
   replace hyphens with underscores, but also all other non-alphanumeric
   characters (with the exception of the dot which is used for Python