mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-17 10:27:41 +00:00
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
This commit is contained in:
parent
56ed110a17
commit
58ba7b1b55
3 changed files with 37 additions and 13 deletions
|
|
@ -1,3 +1,10 @@
|
|||
2013-01-06 Chong Yidong <cyd@gnu.org>
|
||||
|
||||
* vc/vc.el (vc-next-action): Detect buffer modifications
|
||||
conflicting with locking VCS operation (Bug#11490).
|
||||
|
||||
* vc/vc-hooks.el (vc-after-save): DTRT for locking VCSes.
|
||||
|
||||
2013-01-05 Michael Albinus <michael.albinus@gmx.de>
|
||||
|
||||
* net/tramp-adb.el (tramp-do-parse-file-attributes-with-ls):
|
||||
|
|
|
|||
|
|
@ -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))))
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue