comparison lisp/files.el @ 108851:cb093dac3d58

Merge from mainline.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Fri, 28 May 2010 00:48:45 +0000
parents 511da81b16c5
children b29291853540
comparison
equal deleted inserted replaced
108850:7cd8ffa6f7db 108851:cb093dac3d58
4673 4673
4674 (defconst directory-files-no-dot-files-regexp 4674 (defconst directory-files-no-dot-files-regexp
4675 "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*" 4675 "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*"
4676 "Regexp of file names excluging \".\" an \"..\".") 4676 "Regexp of file names excluging \".\" an \"..\".")
4677 4677
4678 (defun delete-directory (directory &optional recursive) 4678 (defun delete-directory (directory &optional recursive trash)
4679 "Delete the directory named DIRECTORY. Does not follow symlinks. 4679 "Delete the directory named DIRECTORY. Does not follow symlinks.
4680 If RECURSIVE is non-nil, all files in DIRECTORY are deleted as well." 4680 If RECURSIVE is non-nil, all files in DIRECTORY are deleted as well.
4681 TRASH non-nil means to trash the directory instead, provided
4682 `delete-by-moving-to-trash' is non-nil.
4683
4684 When called interactively, TRASH is t if no prefix argument is
4685 given. With a prefix argument, TRASH is nil."
4681 (interactive 4686 (interactive
4682 (let ((dir (expand-file-name 4687 (let* ((trashing (and delete-by-moving-to-trash
4683 (read-file-name 4688 (null current-prefix-arg)))
4684 "Delete directory: " 4689 (dir (expand-file-name
4685 default-directory default-directory nil nil)))) 4690 (read-file-name
4691 (if trashing
4692 "Move directory to trash: "
4693 "Delete directory: ")
4694 default-directory default-directory nil nil))))
4686 (list dir 4695 (list dir
4687 (if (directory-files dir nil directory-files-no-dot-files-regexp) 4696 (if (directory-files dir nil directory-files-no-dot-files-regexp)
4688 (y-or-n-p 4697 (y-or-n-p
4689 (format "Directory `%s' is not empty, really delete? " dir)) 4698 (format "Directory `%s' is not empty, really %s? "
4690 nil)))) 4699 dir (if trashing "trash" "delete")))
4700 nil)
4701 (null current-prefix-arg))))
4691 ;; If default-directory is a remote directory, make sure we find its 4702 ;; If default-directory is a remote directory, make sure we find its
4692 ;; delete-directory handler. 4703 ;; delete-directory handler.
4693 (setq directory (directory-file-name (expand-file-name directory))) 4704 (setq directory (directory-file-name (expand-file-name directory)))
4694 (let ((handler (find-file-name-handler directory 'delete-directory))) 4705 (let ((handler (find-file-name-handler directory 'delete-directory)))
4695 (cond 4706 (cond
4696 (handler 4707 (handler
4697 (funcall handler 'delete-directory directory recursive)) 4708 (funcall handler 'delete-directory directory recursive))
4698 (delete-by-moving-to-trash 4709 ((and delete-by-moving-to-trash trash)
4699 ;; Only move non-empty dir to trash if recursive deletion was 4710 ;; Only move non-empty dir to trash if recursive deletion was
4700 ;; requested. This mimics the non-`delete-by-moving-to-trash' 4711 ;; requested. This mimics the non-`delete-by-moving-to-trash'
4701 ;; case, where the operation fails in delete-directory-internal. 4712 ;; case, where the operation fails in delete-directory-internal.
4702 ;; As `move-file-to-trash' trashes directories (empty or 4713 ;; As `move-file-to-trash' trashes directories (empty or
4703 ;; otherwise) as a unit, we do not need to recurse here. 4714 ;; otherwise) as a unit, we do not need to recurse here.
4713 (mapc (lambda (file) 4724 (mapc (lambda (file)
4714 ;; This test is equivalent to 4725 ;; This test is equivalent to
4715 ;; (and (file-directory-p fn) (not (file-symlink-p fn))) 4726 ;; (and (file-directory-p fn) (not (file-symlink-p fn)))
4716 ;; but more efficient 4727 ;; but more efficient
4717 (if (eq t (car (file-attributes file))) 4728 (if (eq t (car (file-attributes file)))
4718 (delete-directory file recursive) 4729 (delete-directory file recursive nil)
4719 (delete-file file))) 4730 (delete-file file nil)))
4720 ;; We do not want to delete "." and "..". 4731 ;; We do not want to delete "." and "..".
4721 (directory-files 4732 (directory-files
4722 directory 'full directory-files-no-dot-files-regexp))) 4733 directory 'full directory-files-no-dot-files-regexp)))
4723 (delete-directory-internal directory))))) 4734 (delete-directory-internal directory)))))
4724 4735