changeset 93776:7b39fa7db791

(dired-dnd-handle-local-file): Obey dired-backup-overwrite.
author Chong Yidong <cyd@stupidchicken.com>
date Sun, 06 Apr 2008 20:11:47 +0000
parents 2172dd8304ae
children 093881510254
files lisp/dired.el
diffstat 1 files changed, 39 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/dired.el	Sun Apr 06 20:11:37 2008 +0000
+++ b/lisp/dired.el	Sun Apr 06 20:11:47 2008 +0000
@@ -3284,34 +3284,48 @@
 	 (to (if from (concat (dired-current-directory)
 			   (file-name-nondirectory from))
 	       nil)))
-    (if from
-	(cond ((or (eq action 'copy)
-		   (eq action 'private))	; Treat private as copy.
-
-	       ;; If copying a directory and dired-recursive-copies is nil,
-	       ;; dired-copy-file silently fails.  Pop up a notice.
-	       (if (and (file-directory-p from)
-			(not dired-recursive-copies))
-		   (dired-dnd-popup-notice)
-		 (progn
-		   (dired-copy-file from to 1)
-		   (dired-relist-entry to)
-		   action)))
+    (when from
+      (cond ((or (eq action 'copy)
+		 (eq action 'private))	; Treat private as copy.
+	     ;; If copying a directory and dired-recursive-copies is nil,
+	     ;; dired-copy-file silently fails.  Pop up a notice.
+	     (cond ((and (file-directory-p from)
+			 (not dired-recursive-copies))
+		    (dired-dnd-popup-notice))
+		   ((file-exists-p to)
+		    (let ((overwrite
+			   (y-or-n-p (format "Overwrite existing file `%s'? " to)))
+			  ;; We avoid dired-handle-overwrite and use
+			  ;;  y-or-n-p, which pops a graphical menu.
+			  dired-overwrite-confirmed backup-file)
+		      (when (and overwrite
+				 dired-backup-overwrite
+				 (setq backup-file
+				       (car (find-backup-file-name to)))
+				 (or (eq dired-backup-overwrite 'always)
+				     (y-or-n-p
+				      (format
+				       "Make backup for existing file `%s'? " to))))
+			(rename-file to backup-file 0)
+			(dired-relist-entry backup-file))
+		      (dired-copy-file from to overwrite)))
+		   (t (dired-copy-file from to nil)))
+	     (dired-relist-entry to)
+	     action)
+	    ((eq action 'move)
+	     (dired-rename-file from to 1)
+	     (dired-relist-entry to)
+	     action)
 
-	       ((eq action 'move)
-		(dired-rename-file from to 1)
-		(dired-relist-entry to)
-		action)
+	    ((eq action 'link)
+	     (make-symbolic-link from to 1)
+	     (dired-relist-entry to)
+	     action)
 
-	       ((eq action 'link)
-		(make-symbolic-link from to 1)
-		(dired-relist-entry to)
-		action)
+	    ((eq action 'ask)
+	     (dired-dnd-do-ask-action uri))
 
-	       ((eq action 'ask)
-		(dired-dnd-do-ask-action uri))
-
-	       (t nil)))))
+	    (t nil)))))
 
 (defun dired-dnd-handle-file (uri action)
   "Copy, move or link a file to the dired directory if it is a local file.