summaryrefslogtreecommitdiff
path: root/lisp/files.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/files.el')
-rw-r--r--lisp/files.el25
1 files changed, 19 insertions, 6 deletions
diff --git a/lisp/files.el b/lisp/files.el
index 1a15792c92c..07c2d2c301e 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -787,11 +787,16 @@ the modes of the new file to agree with the old modes."
(let ((attr (file-attributes real-file-name)))
(or (nth 9 attr)
(/= (nth 2 attr) (user-uid))))))
- (copy-file real-file-name backupname t t)
-; rename-file should delete old backup.
-; (condition-case ()
-; (delete-file backupname)
-; (file-error nil))
+ (condition-case ()
+ (copy-file real-file-name backupname t t)
+ (file-error
+ ;; If copying fails because file BACKUPNAME
+ ;; is not writable, delete that file and try again.
+ (if (and (file-exists-p backupname)
+ (not (file-writable-p backupname)))
+ (delete-file backupname))
+ (copy-file real-file-name backupname t t)))
+ ;; rename-file should delete old backup.
(rename-file real-file-name backupname t)
(setq setmodes (file-modes backupname)))
(file-error
@@ -799,7 +804,15 @@ the modes of the new file to agree with the old modes."
(setq backupname (expand-file-name "~/%backup%~"))
(message "Cannot write backup file; backing up in ~/%%backup%%~")
(sleep-for 1)
- (copy-file real-file-name backupname t t)))
+ (condition-case ()
+ (copy-file real-file-name backupname t t)
+ (file-error
+ ;; If copying fails because file BACKUPNAME
+ ;; is not writable, delete that file and try again.
+ (if (and (file-exists-p backupname)
+ (not (file-writable-p backupname)))
+ (delete-file backupname))
+ (copy-file real-file-name backupname t t)))))
(setq buffer-backed-up t)
;; Now delete the old versions, if desired.
(if delete-old-versions