Fix delete-directory recursion behavior for trashing (Bug#5436).
* files.el (delete-directory): Handle moving to trash without first doing recursion (Bug#5436).
This commit is contained in:
parent
368d3208cf
commit
8b0e68ea3f
2 changed files with 33 additions and 14 deletions
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue