# HG changeset patch # User Chong Yidong # Date 1264562243 18000 # Node ID 4b75ffbc9b2f5dca5ee711076c7a6bba0756a9bf # Parent 40a4dcd1833e0825764d2bc0604cae949624f1c6 Fix delete-directory recursion behavior for trashing (Bug#5436). * files.el (delete-directory): Handle moving to trash without first doing recursion (Bug#5436). diff -r 40a4dcd1833e -r 4b75ffbc9b2f lisp/ChangeLog --- 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 + + * files.el (delete-directory): Handle moving to trash without + first doing recursion (Bug#5436). + 2010-01-26 Dan Nicolaescu * vc-hooks.el (vc-path): Mark as obsolete. diff -r 40a4dcd1833e -r 4b75ffbc9b2f lisp/files.el --- 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.