diff options
author | Chong Yidong <cyd@stupidchicken.com> | 2010-01-26 22:17:23 -0500 |
---|---|---|
committer | Chong Yidong <cyd@stupidchicken.com> | 2010-01-26 22:17:23 -0500 |
commit | 136ecb6ed628efc344b2d7cb7461e93421bc1ecf (patch) | |
tree | b6f139e88ab9e410a1d02a062d9785ccc27ea43a | |
parent | 002f9741128da177d227bb18870542f62e613376 (diff) | |
download | emacs-136ecb6ed628efc344b2d7cb7461e93421bc1ecf.tar.gz |
Fix delete-directory recursion behavior for trashing (Bug#5436).
* files.el (delete-directory): Handle moving to trash without first doing recursion (Bug#5436).
-rw-r--r-- | lisp/ChangeLog | 5 | ||||
-rw-r--r-- | lisp/files.el | 42 |
2 files changed, 33 insertions, 14 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9b3fb944f94..a03d95c0185 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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. 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. |