Commit ffda0460 authored by André Spiegel's avatar André Spiegel
Browse files

(vc-revert-buffer): Handle empty diff properly.

(vc-version-backup-file): New function.
(vc-checkout): Create a version backup if necessary.
(vc-checkin): If a version backup file exists, delete it.
(vc-version-diff): Diff locally using version backups, if available.
(vc-revert-file): If there's a version backup, revert locally.
(vc-transfer-file): Use version backup for base version, if
available.  If not, ask for confirmation whether to get it from the
server.  Update mode line before check-in.
parent ebd4825d
......@@ -5,7 +5,7 @@
;; Author: FSF (see below for full credits)
;; Maintainer: Andre Spiegel <>
;; $Id: vc.el,v 1.275 2000/10/03 11:22:13 spiegel Exp $
;; $Id: vc.el,v 1.276 2000/10/03 12:24:15 spiegel Exp $
;; This file is part of GNU Emacs.
......@@ -138,6 +138,8 @@
;; * print-log (file)
;; Insert the revision log of FILE into the current buffer.
;; - show-log-entry (version)
;; - wash-log (file)
;; Remove all non-comment information from the output of print-log
;; - comment-history (file)
;; - update-changelog (files)
;; Find changelog entries for FILES, or for all files at or below
......@@ -1206,6 +1208,12 @@ for vc-log-operation-hook."
"Retrieve a copy of the revision REV of FILE.
If WRITABLE is non-nil, make sure the retrieved file is writable.
REV defaults to the latest revision."
(and writable
(not rev)
(vc-call make-version-backups file)
(vc-up-to-date-p file)
(copy-file file (vc-version-backup-file-name file)
'ok-if-already-exists 'keep-date))
(condition-case err
......@@ -1280,7 +1288,9 @@ Runs the normal hook `vc-checkin-hook'."
;; Change buffers to get local value of vc-checkin-switches.
(with-current-buffer (or (get-file-buffer file) (current-buffer))
(vc-call checkin file rev comment))
(let ((backup-file (vc-version-backup-file file)))
(vc-call checkin file rev comment)
(if backup-file (delete-file backup-file))))
`((vc-state up-to-date)
(vc-checkout-time ,(nth 5 (file-attributes file)))
(vc-workfile-version nil)))
......@@ -1493,11 +1503,12 @@ files in or below it."
rel2-default ") ")
"Newer version (default: current source): ")
nil nil rel2-default))))
(if (string-equal rel1 "") (setq rel1 nil))
(if (string-equal rel2 "") (setq rel2 nil))
(vc-setup-buffer "*vc-diff*")
(if (file-directory-p file)
;; recursive directory diff
(let ((inhibit-read-only t))
(if (string-equal rel1 "") (setq rel1 nil))
(if (string-equal rel2 "") (setq rel2 nil))
(insert "Diffs between "
(or rel1 "last version checked in")
" and "
......@@ -1514,9 +1525,19 @@ files in or below it."
(vc-call-backend ',(vc-backend file) 'diff ',f ',rel1 ',rel2)))))
(vc-exec-after `(let ((inhibit-read-only t))
(insert "\nEnd of diffs.\n"))))
(cd (file-name-directory file))
(vc-call diff file rel1 rel2))
;; single file diff
(if (or (not rel1) (string-equal rel1 ""))
(setq rel1 (vc-workfile-version file)))
(if (string-equal rel2 "")
(setq rel2 nil))
(let ((file-rel1 (vc-version-backup-file file rel1))
(file-rel2 (if (not rel2)
(vc-version-backup-file file rel2))))
(if (and file-rel1 file-rel2)
(vc-do-command t 1 "diff" nil diff-switches file-rel1 file-rel2)
(cd (file-name-directory file))
(vc-call diff file rel1 rel2))))
(if (and (zerop (buffer-size))
(not (get-buffer-process (current-buffer))))
......@@ -2156,30 +2177,43 @@ changes found in the master file; use \\[universal-argument] \\[vc-next-action]
(let ((file buffer-file-name)
;; This operation should always ask for confirmation.
(vc-suppress-confirm nil)
(obuf (current-buffer)))
(obuf (current-buffer))
(unless (vc-workfile-unchanged-p file)
(vc-diff nil t)
(setq status (vc-diff nil t))
(vc-exec-after `(message nil))
(if (not (yes-or-no-p "Discard changes? "))
(error "Revert canceled"))
(if (and (window-dedicated-p (selected-window))
(one-window-p t))
(when status
(if (not (yes-or-no-p "Discard changes? "))
(error "Revert canceled"))
(if (and (window-dedicated-p (selected-window))
(one-window-p t))
(set-buffer obuf)
;; Do the reverting
(message "Reverting %s..." file)
(vc-revert-file file)
(message "Reverting %s...done" file)))
(defun vc-version-backup-file (file &optional rev)
"If version backups should be used for FILE, and there exists
such a backup for REV or the current workfile version of file,
return the name of it; otherwise return nil."
(when (vc-call make-version-backups file)
(let ((backup-file (vc-version-backup-file-name file rev)))
(and (file-exists-p backup-file)
(defun vc-revert-file (file)
"Revert FILE back to the version it was based on."
;; TODO: With local version caching, this function will get the
;; base version locally and not from the server.
(vc-call revert file)
(let ((backup-file (vc-version-backup-file file)))
(if (not backup-file)
(vc-call revert file)
(copy-file backup-file file 'ok-if-already-exists 'keep-date)
(delete-file backup-file)))
`((vc-state up-to-date)
(vc-checkout-time ,(nth 5 (file-attributes file)))))
(vc-resynch-buffer file t t))
......@@ -2288,7 +2322,7 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
(and registered ; Never move if not registered in new-backend yet.
;; move if new-backend comes later in vc-handled-backends
(or (memq new-backend (memq old-backend vc-handled-backends))
(y-or-n-p "Final transfer ? "))))
(y-or-n-p "Final transfer? "))))
(comment nil))
(if (eq old-backend new-backend)
(error "%s is the current backend of %s" new-backend file))
......@@ -2296,20 +2330,28 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
(set-file-modes file (logior (file-modes file) 128))
;; `registered' might have switched under us.
(vc-switch-backend file old-backend)
(let ((copy (and edited (make-temp-name file)))
(rev (vc-workfile-version file)))
(let* ((rev (vc-workfile-version file))
(modified-file (and edited (make-temp-name file)))
(unmodified-file (and modified-file (vc-version-backup-file file))))
;; Go back to the base unmodified file.
(when copy (copy-file file copy)) ; (vc-revert-file file))
; TODO: uncomment when we
; have local version caching
(when modified-file
(copy-file file modified-file)
;; If we have a local copy of the unmodified file, handle that
;; here and not in vc-revert-file because we don't want to
;; delete that copy -- it is still useful for OLD-BACKEND.
(if unmodified-file
(copy-file unmodified-file file 'ok-if-already-exists)
(if (y-or-n-p "Get base version from master? ")
(vc-revert-file file))))
(vc-call-backend new-backend 'receive-file file rev))
(when copy
(when modified-file
(vc-switch-backend file new-backend)
(unless (eq (vc-checkout-model file) 'implicit)
(vc-checkout file t nil))
(rename-file copy file 'ok-if-already-exists)))))
(rename-file modified-file file 'ok-if-already-exists)
(vc-file-setprop file 'vc-checkout-time nil)))))
(when move
(vc-switch-backend file old-backend)
(setq comment (vc-call comment-history file))
......@@ -2317,6 +2359,7 @@ backend to NEW-BACKEND, and unregister FILE from the current backend.
(vc-switch-backend file new-backend)
(when (or move edited)
(vc-file-setprop file 'vc-state 'edited)
(vc-mode-line file)
(vc-checkin file nil comment (stringp comment)))))
(defun vc-default-unregister (backend file)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment