summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1993-11-12 22:31:12 +0000
committerRichard M. Stallman <rms@gnu.org>1993-11-12 22:31:12 +0000
commitd52f0de91eba27581cccf8521546e0368494a0ce (patch)
tree96a4a66bbcc51b669082f26fdeb317ee44cea3fd
parentae06ea79c817b855e68347eb43f8b84b61458150 (diff)
downloademacs-d52f0de91eba27581cccf8521546e0368494a0ce.tar.gz
(vc-rename-file): Don't overwrite an existing file.
Fix test for unsaved files. Calculate name of new master file properly.
-rw-r--r--lisp/vc.el35
1 files changed, 27 insertions, 8 deletions
diff --git a/lisp/vc.el b/lisp/vc.el
index 5adf1ca8147..145be72c7c5 100644
--- a/lisp/vc.el
+++ b/lisp/vc.el
@@ -1137,19 +1137,38 @@ A prefix argument means do not revert the buffer afterwards."
"Rename file OLD to NEW, and rename its master file likewise."
(interactive "fVC rename file: \nFRename to: ")
(let ((oldbuf (get-file-buffer old)))
- (if (buffer-modified-p oldbuf)
+ (if (and oldbuf (buffer-modified-p oldbuf))
(error "Please save files before moving them"))
(if (get-file-buffer new)
(error "Already editing new file name"))
+ (if (file-exists-p new)
+ (error "New file already exists"))
(let ((oldmaster (vc-name old)))
(if oldmaster
- (if (vc-locking-user old)
- (error "Please check in files before moving them"))
- (if (or (file-symlink-p oldmaster)
- ;; This had FILE, I changed it to OLD. -- rms.
- (file-symlink-p (vc-backend-subdirectory-name old)))
- (error "This is not a safe thing to do in the presence of symbolic links"))
- (rename-file oldmaster (vc-name new)))
+ (progn
+ (if (vc-locking-user old)
+ (error "Please check in files before moving them"))
+ (if (or (file-symlink-p oldmaster)
+ ;; This had FILE, I changed it to OLD. -- rms.
+ (file-symlink-p (vc-backend-subdirectory-name old)))
+ (error "This is not a safe thing to do in the presence of symbolic links"))
+ (rename-file
+ oldmaster
+ (let ((backend (vc-backend-deduce old))
+ (newdir (or (file-name-directory new) ""))
+ (newbase (file-name-nondirectory new)))
+ (catch 'found
+ (mapcar
+ (function
+ (lambda (s)
+ (if (eq backend (cdr s))
+ (let* ((newmaster (format (car s) newdir newbase))
+ (newmasterdir (file-name-directory newmaster)))
+ (if (or (not newmasterdir)
+ (file-directory-p newmasterdir))
+ (throw 'found newmaster))))))
+ vc-master-templates)
+ (error "New file lacks a version control directory"))))))
(if (or (not oldmaster) (file-exists-p old))
(rename-file old new)))
; ?? Renaming a file might change its contents due to keyword expansion.