From: Chong Yidong Date: Wed, 27 Jan 2010 03:17:23 +0000 (-0500) Subject: Fix delete-directory recursion behavior for trashing (Bug#5436). X-Git-Tag: emacs-pretest-23.1.92~28^2~4 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=8b0e68ea3fd559cbdfd0c532d789d0bad73890df;p=emacs.git Fix delete-directory recursion behavior for trashing (Bug#5436). * files.el (delete-directory): Handle moving to trash without first doing recursion (Bug#5436). --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 5097af5c1ed..5aa791342f2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 --git a/lisp/files.el b/lisp/files.el index 99e818643d0..bcaba300ae6 100644 --- a/lisp/files.el +++ b/lisp/files.el @@ -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.