changeset 106991:4b75ffbc9b2f

Fix delete-directory recursion behavior for trashing (Bug#5436). * files.el (delete-directory): Handle moving to trash without first doing recursion (Bug#5436).
author Chong Yidong <cyd@stupidchicken.com>
date Tue, 26 Jan 2010 22:17:23 -0500
parents 40a4dcd1833e
children 405563a1dc5c
files lisp/ChangeLog lisp/files.el
diffstat 2 files changed, 33 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Mon Jan 25 23:22:25 2010 -0800
+++ b/lisp/ChangeLog	Tue Jan 26 22:17:23 2010 -0500
@@ -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.
--- a/lisp/files.el	Mon Jan 25 23:22:25 2010 -0800
+++ b/lisp/files.el	Tue Jan 26 22:17:23 2010 -0500
@@ -4665,21 +4665,35 @@
   ;; 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.