diff options
author | Chong Yidong <cyd@gnu.org> | 2013-01-06 10:58:57 +0800 |
---|---|---|
committer | Chong Yidong <cyd@gnu.org> | 2013-01-06 10:58:57 +0800 |
commit | 58ba7b1b558e4803100905bd5fff0004e4ddd261 (patch) | |
tree | 4178391df8457041a8c8a89ea8c20a9a45005799 /lisp/vc | |
parent | 56ed110a17fc377f1d0a39eb3f01e4fd03a65709 (diff) | |
download | emacs-58ba7b1b558e4803100905bd5fff0004e4ddd261.tar.gz |
Try to handle buffer/file modifications which conflict with VCS locking.
* vc/vc-hooks.el (vc-after-save): DTRT for locking VCSes.
* vc/vc.el (vc-next-action): Detect buffer modifications
conflicting with locking VCS operation.
Fixes: debbugs:11490
Diffstat (limited to 'lisp/vc')
-rw-r--r-- | lisp/vc/vc-hooks.el | 28 | ||||
-rw-r--r-- | lisp/vc/vc.el | 15 |
2 files changed, 30 insertions, 13 deletions
diff --git a/lisp/vc/vc-hooks.el b/lisp/vc/vc-hooks.el index 5a2b47bb34f..99436303fa2 100644 --- a/lisp/vc/vc-hooks.el +++ b/lisp/vc/vc-hooks.el @@ -703,19 +703,21 @@ Before doing that, check if there are any old backups and get rid of them." ;; the state to 'edited and redisplay the mode line. (let* ((file buffer-file-name) (backend (vc-backend file))) - (and backend - (or (and (equal (vc-file-getprop file 'vc-checkout-time) - (nth 5 (file-attributes file))) - ;; File has been saved in the same second in which - ;; it was checked out. Clear the checkout-time - ;; to avoid confusion. - (vc-file-setprop file 'vc-checkout-time nil)) - t) - (eq (vc-checkout-model backend (list file)) 'implicit) - (vc-state-refresh file backend) - (vc-mode-line file backend)) - ;; Try to avoid unnecessary work, a *vc-dir* buffer is - ;; present if this is true. + (cond + ((null backend)) + ((eq (vc-checkout-model backend (list file)) 'implicit) + ;; If the file was saved in the same second in which it was + ;; checked out, clear the checkout-time to avoid confusion. + (if (equal (vc-file-getprop file 'vc-checkout-time) + (nth 5 (file-attributes file))) + (vc-file-setprop file 'vc-checkout-time nil)) + (if (vc-state-refresh file backend) + (vc-mode-line file backend))) + ;; If we saved an unlocked file on a locking based VCS, that + ;; file is not longer up-to-date. + ((eq (vc-file-getprop file 'vc-state) 'up-to-date) + (vc-file-setprop file 'vc-state nil))) + ;; Resynch *vc-dir* buffers, if any are present. (when vc-dir-buffers (vc-dir-resynch-file file)))) diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index fe259806267..9b8b94916c4 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -659,6 +659,10 @@ (eval-when-compile (require 'dired)) +(declare-function dired-get-filename "dired" (&optional localp noerror)) +(declare-function dired-move-to-filename "dired" (&optional err eol)) +(declare-function dired-marker-regexp "dired" ()) + (unless (assoc 'vc-parent-buffer minor-mode-alist) (setq minor-mode-alist (cons '(vc-parent-buffer vc-parent-buffer-name) @@ -1072,6 +1076,17 @@ For old-style locking-based version control systems, like RCS: ;; among all the `files'. (model (nth 4 vc-fileset))) + ;; If a buffer has unsaved changes, a checkout would discard those + ;; changes, so treat the buffer as having unlocked changes. + (when (and (not (eq model 'implicit)) (eq state 'up-to-date)) + (let ((files files)) + (while files + (let ((buffer (get-file-buffer (car files)))) + (and buffer + (buffer-modified-p buffer) + (setq state 'unlocked-changes + files nil)))))) + ;; Do the right thing (cond ((eq state 'missing) |