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 | 8b0e68ea3fd559cbdfd0c532d789d0bad73890df (patch) | |
tree | 790933f833dc45654a0b192ad1f730dbe2703db9 /lisp/files.el | |
parent | 368d3208cfceb42b5ee07c61b4aa5b7d09c9f2bf (diff) | |
download | emacs-8b0e68ea3fd559cbdfd0c532d789d0bad73890df.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).
Diffstat (limited to 'lisp/files.el')
-rw-r--r-- | lisp/files.el | 42 |
1 files changed, 28 insertions, 14 deletions
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. |