X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/fb34883fdfb24a7fedff2d61db18e876cc601ff7..bf3323c57c0e5964c4ecb4e48a9a96cb055eeb0c:/lisp/vc.el diff --git a/lisp/vc.el b/lisp/vc.el index 3f56290528..a0b6ffa0ad 100644 --- a/lisp/vc.el +++ b/lisp/vc.el @@ -1,7 +1,7 @@ ;;; vc.el --- drive a version-control system from within Emacs -;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, -;; 2000, 2001, 2003, 2004 Free Software Foundation, Inc. +;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2000, +;; 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ;; Author: FSF (see below for full credits) ;; Maintainer: Andre Spiegel @@ -23,8 +23,8 @@ ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +;; Boston, MA 02110-1301, USA. ;;; Credits: @@ -46,7 +46,8 @@ ;; This mode is fully documented in the Emacs user's manual. ;; -;; Supported version-control systems presently include SCCS, RCS, and CVS. +;; Supported version-control systems presently include CVS, RCS, GNU Arch, +;; Subversion, Meta-CVS, and SCCS (or its free replacement, CSSC). ;; ;; Some features will not work with old RCS versions. Where ;; appropriate, VC finds out which version you have, and allows or @@ -68,7 +69,7 @@ ;; ;; The vc code maintains some internal state in order to reduce expensive ;; version-control operations to a minimum. Some names are only computed -;; once. If you perform version control operations with RCS/SCCS/CVS while +;; once. If you perform version control operations with the backend while ;; vc's back is turned, or move/rename master files while vc is running, ;; vc may get seriously confused. Don't do these things! ;; @@ -152,7 +153,7 @@ ;; have such a brief-comparison feature, the default implementation of ;; this function can be used, which delegates to a full ;; vc-BACKEND-diff. (Note that vc-BACKEND-diff must not run -;; asynchronously in this case.) +;; asynchronously in this case, see variable `vc-disable-async-diff'.) ;; ;; - mode-line-string (file) ;; @@ -321,11 +322,13 @@ ;; vc-BACKEND-diff. The default implementation does an explicit tree ;; walk, calling vc-BACKEND-diff for each individual file. ;; -;; - annotate-command (file buf rev) +;; - annotate-command (file buf &optional rev) ;; -;; If this function is provided, it should produce an annotated version -;; of FILE in BUF, relative to version REV. This is currently only -;; implemented for CVS, using the `cvs annotate' command. +;; If this function is provided, it should produce an annotated display +;; of FILE in BUF, relative to version REV. Annotation means each line +;; of FILE displayed is prefixed with version information associated with +;; its addition (deleted lines leave no history) and that the text of the +;; file is fontified according to age. ;; ;; - annotate-time () ;; @@ -564,6 +567,15 @@ specific to any particular backend." :group 'vc :version "21.1") +(defcustom vc-allow-async-revert nil + "*Specifies whether the diff during \\[vc-revert-buffer] may be asynchronous. +Enabling this option means that you can confirm a revert operation even +if the local changes in the file have not been found and displayed yet." + :type '(choice (const :tag "No" nil) + (const :tag "Yes" t)) + :group 'vc + :version "22.1") + ;;;###autoload (defcustom vc-checkout-hook nil "*Normal hook (list of functions) run after checking out a file. @@ -605,23 +617,23 @@ version control backend imposes itself." ;; Annotate customization (defcustom vc-annotate-color-map - '(( 20. . "#FF0000") - ( 40. . "#FF3800") - ( 60. . "#FF7000") - ( 80. . "#FFA800") - (100. . "#FFE000") - (120. . "#E7FF00") - (140. . "#AFFF00") - (160. . "#77FF00") - (180. . "#3FFF00") - (200. . "#07FF00") - (220. . "#00FF31") - (240. . "#00FF69") - (260. . "#00FFA1") - (280. . "#00FFD9") - (300. . "#00EEFF") - (320. . "#00B6FF") - (340. . "#007EFF")) + '(( 20. . "#FFCC00") + ( 40. . "#FF6666") + ( 60. . "#FF6600") + ( 80. . "#FF3300") + (100. . "#FF00FF") + (120. . "#FF0000") + (140. . "#CCCC00") + (160. . "#CC00CC") + (180. . "#BC8F8F") + (200. . "#99CC00") + (220. . "#999900") + (240. . "#7AC5CD") + (260. . "#66CC00") + (280. . "#33CC33") + (300. . "#00CCFF") + (320. . "#00CC99") + (340. . "#0099FF")) "*Association list of age versus color, for \\[vc-annotate]. Ages are given in units of fractional days. Default is eighteen steps using a twenty day increment." @@ -645,7 +657,6 @@ List of factors, used to expand/compress the time scale. See `vc-annotate'." :type '(repeat number) :group 'vc) -;; vc-annotate functionality (CVS only). (defvar vc-annotate-mode-map (let ((m (make-sparse-keymap))) (define-key m [menu-bar] (make-sparse-keymap "VC-Annotate")) @@ -713,6 +724,11 @@ The keys are \(BUFFER . BACKEND\). See also `vc-annotate-get-backend'.") (defvar vc-parent-buffer-name nil) (put 'vc-parent-buffer-name 'permanent-local t) +(defvar vc-disable-async-diff nil + "VC sets this to t locally to disable some async diff operations. +Backends that offer asynchronous diffs should respect this variable +in their implementation of vc-BACKEND-diff.") + (defvar vc-log-file) (defvar vc-log-version) @@ -722,6 +738,7 @@ The keys are \(BUFFER . BACKEND\). See also `vc-annotate-get-backend'.") ;; functions that operate on RCS revision numbers. This code should ;; also be moved into the backends. It stays for now, however, since ;; it is used in code below. +;;;###autoload (defun vc-trunk-p (rev) "Return t if REV is a revision on the trunk." (not (eq nil (string-match "\\`[0-9]+\\.[0-9]+\\'" rev)))) @@ -943,9 +960,14 @@ that is inserted into the command line before the filename." (mapconcat 'identity vc-path path-separator)) process-environment)) (w32-quote-process-args t)) + (if (and (eq okstatus 'async) (file-remote-p default-directory)) + ;; start-process does not support remote execution + (setq okstatus nil)) (if (eq okstatus 'async) - (let ((proc (apply 'start-process command (current-buffer) command - squeezed))) + (let ((proc + (let ((process-connection-type nil)) + (apply 'start-process command (current-buffer) command + squeezed)))) (unless (active-minibuffer-window) (message "Running %s in the background..." command)) ;;(set-process-sentinel proc (lambda (p msg) (delete-process p))) @@ -953,7 +975,7 @@ that is inserted into the command line before the filename." (vc-exec-after `(unless (active-minibuffer-window) (message "Running %s in the background... done" ',command)))) - (setq status (apply 'call-process command nil t nil squeezed)) + (setq status (apply 'process-file command nil t nil squeezed)) (when (or (not (integerp status)) (and okstatus (< okstatus status))) (pop-to-buffer (current-buffer)) (goto-char (point-min)) @@ -1115,12 +1137,6 @@ This default implementation always returns non-nil, which means that editing non-current versions is not supported by default." t) -(defun vc-recompute-state (file) - "Force a recomputation of the version control state of FILE. -The state is computed using the exact, and possibly expensive -function `vc-BACKEND-state', not the heuristic." - (vc-file-setprop file 'vc-state (vc-call state file))) - (defun vc-next-action-on-file (file verbose &optional comment) "Do The Right Thing for a given FILE under version control. If COMMENT is specified, it will be used as an admin or checkin comment. @@ -1818,7 +1834,7 @@ actually call the backend, but performs a local diff." ;; Old def for compatibility with Emacs-21.[123]. (defmacro vc-diff-switches-list (backend) `(vc-switches ',backend 'diff)) -(make-obsolete 'vc-diff-switches-list 'vc-switches "21.4") +(make-obsolete 'vc-diff-switches-list 'vc-switches "22.1") (defun vc-default-diff-tree (backend dir rev1 rev2) "List differences for all registered files at and below DIR. @@ -2440,11 +2456,13 @@ changes found in the master file; use \\[universal-argument] \\[vc-next-action] (unless (yes-or-no-p "File seems up-to-date. Revert anyway? ") (error "Revert canceled"))) (unless (vc-workfile-unchanged-p file) + (message "Finding changes...") ;; vc-diff selects the new window, which is not what we want: ;; if the new window is on another frame, that'd require the user ;; moving her mouse to answer the yes-or-no-p question. - (let ((win (save-selected-window - (setq status (vc-diff nil t)) (selected-window)))) + (let* ((vc-disable-async-diff (not vc-allow-async-revert)) + (win (save-selected-window + (setq status (vc-diff nil t)) (selected-window)))) (vc-exec-after `(message nil)) (when status (unwind-protect @@ -2841,7 +2859,7 @@ Uses `rcs2log' which only works for RCS and CVS." (pop-to-buffer (set-buffer (get-buffer-create "*vc*"))) (erase-buffer) - (insert-file tempfile) + (insert-file-contents tempfile) "failed")) (setq default-directory (file-name-directory changelog)) (delete-file tempfile))))) @@ -2896,9 +2914,9 @@ if present. The current time is used as the offset." (defun vc-annotate-display-autoscale (&optional full) "Highlight the output of \\[vc-annotate] using an autoscaled color map. Autoscaling means that the map is scaled from the current time to the -oldest annotation in the buffer, or, with argument FULL non-nil, to +oldest annotation in the buffer, or, with prefix argument FULL, to cover the range from the oldest annotation to the newest." - (interactive) + (interactive "P") (let ((newest 0.0) (oldest 999999.) ;Any CVS users at the founding of Rome? (current (vc-annotate-convert-time (current-time))) @@ -2907,7 +2925,9 @@ cover the range from the oldest annotation to the newest." ;; Run through this file and find the oldest and newest dates annotated. (save-excursion (goto-char (point-min)) - (while (setq date (vc-call-backend vc-annotate-backend 'annotate-time)) + (while (setq date (prog1 (vc-call-backend vc-annotate-backend + 'annotate-time) + (forward-line 1))) (if (> date newest) (setq newest date)) (if (< date oldest) @@ -3001,7 +3021,7 @@ use; you may override this using the second optional arg MODE." (when buffer (set-buffer buffer) (display-buffer buffer)) - (if (not vc-annotate-parent-ref) + (if (not vc-annotate-parent-rev) (vc-annotate-mode)) (cond ((null vc-annotate-display-mode) (vc-annotate-display-default vc-annotate-ratio)) @@ -3023,12 +3043,12 @@ use; you may override this using the second optional arg MODE." ;;;###autoload (defun vc-annotate (prefix &optional revision display-mode) - "Display the edit history of the current file using colours. + "Display the edit history of the current file using colors. This command creates a buffer that shows, for each line of the current -file, when it was last edited and by whom. Additionally, colours are +file, when it was last edited and by whom. Additionally, colors are used to show the age of each line--blue means oldest, red means -youngest, and intermediate colours indicate intermediate ages. By +youngest, and intermediate colors indicate intermediate ages. By default, the time scale stretches back one year into the past; everything that is older than that is shown in blue.