Mercurial > emacs
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.