]> code.delx.au - gnu-emacs/commitdiff
Fix delete-directory recursion behavior for trashing (Bug#5436).
authorChong Yidong <cyd@stupidchicken.com>
Wed, 27 Jan 2010 03:17:23 +0000 (22:17 -0500)
committerChong Yidong <cyd@stupidchicken.com>
Wed, 27 Jan 2010 03:17:23 +0000 (22:17 -0500)
* files.el (delete-directory): Handle moving to trash without first doing recursion (Bug#5436).

lisp/ChangeLog
lisp/files.el

index 5097af5c1ed7acf1defa391858825057e5908ed7..5aa791342f28962914f444f663f411e1f0866e51 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-27  David De La Harpe Golden  <david@harpegolden.net>
+
+       * files.el (delete-directory): Handle moving to trash without
+       first doing recursion (Bug#5436).
+
 2010-01-26  Dan Nicolaescu  <dann@ics.uci.edu>
 
        * vc-hooks.el (vc-path): Mark as obsolete.
index 99e818643d0a2cc9463453b7c891e0c74ab831ea..bcaba300ae603d7bf031903009bfba54f07082f4 100644 (file)
@@ -4665,21 +4665,35 @@ If RECURSIVE is non-nil, all files in DIRECTORY are deleted as well."
   ;; delete-directory handler.
   (setq directory (directory-file-name (expand-file-name directory)))
   (let ((handler (find-file-name-handler directory 'delete-directory)))
-    (if handler
-       (funcall handler 'delete-directory directory recursive)
+    (cond
+     (handler
+      (funcall handler 'delete-directory directory recursive))
+     (delete-by-moving-to-trash
+      ;; Only move non-empty dir to trash if recursive deletion was
+      ;; requested.  This mimics the non-`delete-by-moving-to-trash'
+      ;; case, where the operation fails in delete-directory-internal.
+      ;; As `move-file-to-trash' trashes directories (empty or
+      ;; otherwise) as a unit, we do not need to recurse here.
+      (if (and (not recursive)
+              ;; Check if directory is empty apart from "." and "..".
+              (directory-files
+               directory 'full directory-files-no-dot-files-regexp))
+         (error "Directory is not empty, not moving to trash")
+       (move-file-to-trash directory)))
+     ;; Otherwise, call outselves recursively if needed.
+     (t
       (if (and recursive (not (file-symlink-p directory)))
-         (mapc
-          (lambda (file)
-            ;; This test is equivalent to
-            ;; (and (file-directory-p fn) (not (file-symlink-p fn)))
-            ;; but more efficient
-            (if (eq t (car (file-attributes file)))
-                (delete-directory file recursive)
-              (delete-file file)))
-          ;; We do not want to delete "." and "..".
-          (directory-files
-           directory 'full directory-files-no-dot-files-regexp)))
-      (delete-directory-internal directory))))
+         (mapc (lambda (file)
+                 ;; This test is equivalent to
+                 ;; (and (file-directory-p fn) (not (file-symlink-p fn)))
+                 ;; but more efficient
+                 (if (eq t (car (file-attributes file)))
+                     (delete-directory file recursive)
+                   (delete-file file)))
+               ;; We do not want to delete "." and "..".
+               (directory-files
+                directory 'full directory-files-no-dot-files-regexp))
+       (delete-directory-internal directory))))))
 
 (defun copy-directory (directory newname &optional keep-time parents)
   "Copy DIRECTORY to NEWNAME.  Both args must be strings.