diff options
| author | Stefan Monnier | 2001-07-11 22:55:25 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2001-07-11 22:55:25 +0000 |
| commit | ec402ad4328f5bb8bdfcbbad6c1c4a34f2ef5a8d (patch) | |
| tree | fbed509562771f725268476e25fb3bf235e7661a | |
| parent | 14fef9dea4427b637a9593fe510a689c721732bf (diff) | |
| download | emacs-ec402ad4328f5bb8bdfcbbad6c1c4a34f2ef5a8d.tar.gz emacs-ec402ad4328f5bb8bdfcbbad6c1c4a34f2ef5a8d.zip | |
(vc-prefix-map): Moved back to vc-hooks.el.
(vc-dired-mode-map): Fix the madness.
| -rw-r--r-- | lisp/ChangeLog | 8 | ||||
| -rw-r--r-- | lisp/vc.el | 738 |
2 files changed, 367 insertions, 379 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 277313b2fab..4dd4ea79a9f 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,11 @@ | |||
| 1 | 2001-07-11 Stefan Monnier <monnier@cs.yale.edu> | ||
| 2 | |||
| 3 | * vc.el (vc-prefix-map): Moved back to vc-hooks.el. | ||
| 4 | (vc-dired-mode-map): Fix the madness. | ||
| 5 | |||
| 6 | * vc-hooks.el (vc-mode): Dummy function for doc purposes. | ||
| 7 | (vc-prefix-map): Moved back from vc.el. | ||
| 8 | |||
| 1 | 2001-07-11 Gerd Moellmann <gerd@gnu.org> | 9 | 2001-07-11 Gerd Moellmann <gerd@gnu.org> |
| 2 | 10 | ||
| 3 | * mail/mail-extr.el (mail-extr-all-top-level-domains): Increase | 11 | * mail/mail-extr.el (mail-extr-all-top-level-domains): Increase |
diff --git a/lisp/vc.el b/lisp/vc.el index 2d879b32884..844eca88c68 100644 --- a/lisp/vc.el +++ b/lisp/vc.el | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | ;; Author: FSF (see below for full credits) | 5 | ;; Author: FSF (see below for full credits) |
| 6 | ;; Maintainer: Andre Spiegel <spiegel@gnu.org> | 6 | ;; Maintainer: Andre Spiegel <spiegel@gnu.org> |
| 7 | 7 | ||
| 8 | ;; $Id: vc.el,v 1.298 2001/03/10 10:44:35 spiegel Exp $ | 8 | ;; $Id: vc.el,v 1.299 2001/05/03 00:36:07 monnier Exp $ |
| 9 | 9 | ||
| 10 | ;; This file is part of GNU Emacs. | 10 | ;; This file is part of GNU Emacs. |
| 11 | 11 | ||
| @@ -462,7 +462,7 @@ These are passed to the checkin program by \\[vc-register]." | |||
| 462 | (defconst vc-maximum-comment-ring-size 32 | 462 | (defconst vc-maximum-comment-ring-size 32 |
| 463 | "Maximum number of saved comments in the comment ring.") | 463 | "Maximum number of saved comments in the comment ring.") |
| 464 | 464 | ||
| 465 | ;;; This is duplicated in diff.el. | 465 | ;; This is duplicated in diff.el. |
| 466 | (defvar diff-switches "-c" | 466 | (defvar diff-switches "-c" |
| 467 | "*A string or list of strings specifying switches to be passed to diff.") | 467 | "*A string or list of strings specifying switches to be passed to diff.") |
| 468 | 468 | ||
| @@ -592,27 +592,7 @@ and that its contents match what the master file says." | |||
| 592 | :group 'vc) | 592 | :group 'vc) |
| 593 | 593 | ||
| 594 | 594 | ||
| 595 | ;;; The main keymap | 595 | ;; The main keymap |
| 596 | |||
| 597 | (defvar vc-prefix-map | ||
| 598 | (let ((map (make-sparse-keymap))) | ||
| 599 | (define-key map "a" 'vc-update-change-log) | ||
| 600 | (define-key map "b" 'vc-switch-backend) | ||
| 601 | (define-key map "c" 'vc-cancel-version) | ||
| 602 | (define-key map "d" 'vc-directory) | ||
| 603 | (define-key map "g" 'vc-annotate) | ||
| 604 | (define-key map "h" 'vc-insert-headers) | ||
| 605 | (define-key map "i" 'vc-register) | ||
| 606 | (define-key map "l" 'vc-print-log) | ||
| 607 | (define-key map "m" 'vc-merge) | ||
| 608 | (define-key map "r" 'vc-retrieve-snapshot) | ||
| 609 | (define-key map "s" 'vc-create-snapshot) | ||
| 610 | (define-key map "u" 'vc-revert-buffer) | ||
| 611 | (define-key map "v" 'vc-next-action) | ||
| 612 | (define-key map "=" 'vc-diff) | ||
| 613 | (define-key map "~" 'vc-version-other-window) | ||
| 614 | map)) | ||
| 615 | (fset 'vc-prefix-map vc-prefix-map) | ||
| 616 | 596 | ||
| 617 | ;; Initialization code, to be done just once at load-time | 597 | ;; Initialization code, to be done just once at load-time |
| 618 | (defvar vc-log-mode-map | 598 | (defvar vc-log-mode-map |
| @@ -651,9 +631,9 @@ The keys are \(BUFFER . BACKEND\). See also `vc-annotate-get-backend'.") | |||
| 651 | (defvar vc-comment-ring-index nil) | 631 | (defvar vc-comment-ring-index nil) |
| 652 | (defvar vc-last-comment-match "") | 632 | (defvar vc-last-comment-match "") |
| 653 | 633 | ||
| 654 | ;;; functions that operate on RCS revision numbers. This code should | 634 | ;; functions that operate on RCS revision numbers. This code should |
| 655 | ;;; also be moved into the backends. It stays for now, however, since | 635 | ;; also be moved into the backends. It stays for now, however, since |
| 656 | ;;; it is used in code below. | 636 | ;; it is used in code below. |
| 657 | (defun vc-trunk-p (rev) | 637 | (defun vc-trunk-p (rev) |
| 658 | "Return t if REV is a revision on the trunk." | 638 | "Return t if REV is a revision on the trunk." |
| 659 | (not (eq nil (string-match "\\`[0-9]+\\.[0-9]+\\'" rev)))) | 639 | (not (eq nil (string-match "\\`[0-9]+\\.[0-9]+\\'" rev)))) |
| @@ -717,7 +697,7 @@ SETTINGS is a list of two-element lists, each of which has the | |||
| 717 | (or (eq (vc-checkout-model file) 'implicit) | 697 | (or (eq (vc-checkout-model file) 'implicit) |
| 718 | (memq (vc-state file) '(edited needs-merge)))) | 698 | (memq (vc-state file) '(edited needs-merge)))) |
| 719 | 699 | ||
| 720 | ;;; Two macros for elisp programming | 700 | ;; Two macros for elisp programming |
| 721 | ;;;###autoload | 701 | ;;;###autoload |
| 722 | (defmacro with-vc-file (file comment &rest body) | 702 | (defmacro with-vc-file (file comment &rest body) |
| 723 | "Check out a writable copy of FILE if necessary and execute the body. | 703 | "Check out a writable copy of FILE if necessary and execute the body. |
| @@ -1265,7 +1245,7 @@ merge in the changes into your working copy." | |||
| 1265 | (vc-next-action-on-file buffer-file-name verbose) | 1245 | (vc-next-action-on-file buffer-file-name verbose) |
| 1266 | (error "Buffer %s is not associated with a file" (buffer-name))))) | 1246 | (error "Buffer %s is not associated with a file" (buffer-name))))) |
| 1267 | 1247 | ||
| 1268 | ;;; These functions help the vc-next-action entry point | 1248 | ;; These functions help the vc-next-action entry point |
| 1269 | 1249 | ||
| 1270 | ;;;###autoload | 1250 | ;;;###autoload |
| 1271 | (defun vc-register (&optional set-version comment) | 1251 | (defun vc-register (&optional set-version comment) |
| @@ -2033,12 +2013,9 @@ The conflicts must be marked with rcsmerge conflict markers." | |||
| 2033 | (defvar vc-dired-mode-map | 2013 | (defvar vc-dired-mode-map |
| 2034 | (let ((map (make-sparse-keymap)) | 2014 | (let ((map (make-sparse-keymap)) |
| 2035 | (vmap (make-sparse-keymap))) | 2015 | (vmap (make-sparse-keymap))) |
| 2036 | (define-key map "\C-xv" vc-prefix-map) | 2016 | (define-key map "\C-xv" vmap) |
| 2037 | ;; Emacs-20 has a lousy keymap inheritance that won't work here. | ||
| 2038 | ;; Emacs-21's is still lousy but just better enough that it'd work. -sm | ||
| 2039 | ;; (set-keymap-parent vmap vc-prefix-map) | ||
| 2040 | (setq vmap vc-prefix-map) | ||
| 2041 | (define-key map "v" vmap) | 2017 | (define-key map "v" vmap) |
| 2018 | (set-keymap-parent vmap vc-prefix-map) | ||
| 2042 | (define-key vmap "t" 'vc-dired-toggle-terse-mode) | 2019 | (define-key vmap "t" 'vc-dired-toggle-terse-mode) |
| 2043 | map)) | 2020 | map)) |
| 2044 | 2021 | ||
| @@ -2790,7 +2767,7 @@ Uses `rcs2log' which only works for RCS and CVS." | |||
| 2790 | (setq default-directory (file-name-directory changelog)) | 2767 | (setq default-directory (file-name-directory changelog)) |
| 2791 | (delete-file tempfile))))) | 2768 | (delete-file tempfile))))) |
| 2792 | 2769 | ||
| 2793 | ;;; Annotate functionality | 2770 | ;; Annotate functionality |
| 2794 | 2771 | ||
| 2795 | ;; Declare globally instead of additional parameter to | 2772 | ;; Declare globally instead of additional parameter to |
| 2796 | ;; temp-buffer-show-function (not possible to pass more than one | 2773 | ;; temp-buffer-show-function (not possible to pass more than one |
| @@ -3076,7 +3053,7 @@ If `log-edit' is not available, resort to `vc-log-mode'." | |||
| 3076 | (set-buffer-modified-p nil) | 3053 | (set-buffer-modified-p nil) |
| 3077 | (setq buffer-file-name nil)) | 3054 | (setq buffer-file-name nil)) |
| 3078 | 3055 | ||
| 3079 | ;;; These things should probably be generally available | 3056 | ;; These things should probably be generally available |
| 3080 | 3057 | ||
| 3081 | (defun vc-file-tree-walk (dirname func &rest args) | 3058 | (defun vc-file-tree-walk (dirname func &rest args) |
| 3082 | "Walk recursively through DIRNAME. | 3059 | "Walk recursively through DIRNAME. |
| @@ -3102,350 +3079,353 @@ Invoke FUNC f ARGS on each VC-managed file f underneath it." | |||
| 3102 | 3079 | ||
| 3103 | (provide 'vc) | 3080 | (provide 'vc) |
| 3104 | 3081 | ||
| 3105 | ;;; DEVELOPER'S NOTES ON CONCURRENCY PROBLEMS IN THIS CODE | 3082 | ;; DEVELOPER'S NOTES ON CONCURRENCY PROBLEMS IN THIS CODE |
| 3106 | ;;; | 3083 | ;; |
| 3107 | ;;; These may be useful to anyone who has to debug or extend the package. | 3084 | ;; This is actually seriously out-of-date because the code has changed |
| 3108 | ;;; (Note that this information corresponds to versions 5.x. Some of it | 3085 | ;; a fair bit since then. -stef |
| 3109 | ;;; might have been invalidated by the additions to support branching | 3086 | ;; |
| 3110 | ;;; and RCS keyword lookup. AS, 1995/03/24) | 3087 | ;; These may be useful to anyone who has to debug or extend the package. |
| 3111 | ;;; | 3088 | ;; (Note that this information corresponds to versions 5.x. Some of it |
| 3112 | ;;; A fundamental problem in VC is that there are time windows between | 3089 | ;; might have been invalidated by the additions to support branching |
| 3113 | ;;; vc-next-action's computations of the file's version-control state and | 3090 | ;; and RCS keyword lookup. AS, 1995/03/24) |
| 3114 | ;;; the actions that change it. This is a window open to lossage in a | 3091 | ;; |
| 3115 | ;;; multi-user environment; someone else could nip in and change the state | 3092 | ;; A fundamental problem in VC is that there are time windows between |
| 3116 | ;;; of the master during it. | 3093 | ;; vc-next-action's computations of the file's version-control state and |
| 3117 | ;;; | 3094 | ;; the actions that change it. This is a window open to lossage in a |
| 3118 | ;;; The performance problem is that rlog/prs calls are very expensive; we want | 3095 | ;; multi-user environment; someone else could nip in and change the state |
| 3119 | ;;; to avoid them as much as possible. | 3096 | ;; of the master during it. |
| 3120 | ;;; | 3097 | ;; |
| 3121 | ;;; ANALYSIS: | 3098 | ;; The performance problem is that rlog/prs calls are very expensive; we want |
| 3122 | ;;; | 3099 | ;; to avoid them as much as possible. |
| 3123 | ;;; The performance problem, it turns out, simplifies in practice to the | 3100 | ;; |
| 3124 | ;;; problem of making vc-state fast. The two other functions that call | 3101 | ;; ANALYSIS: |
| 3125 | ;;; prs/rlog will not be so commonly used that the slowdown is a problem; one | 3102 | ;; |
| 3126 | ;;; makes snapshots, the other deletes the calling user's last change in the | 3103 | ;; The performance problem, it turns out, simplifies in practice to the |
| 3127 | ;;; master. | 3104 | ;; problem of making vc-state fast. The two other functions that call |
| 3128 | ;;; | 3105 | ;; prs/rlog will not be so commonly used that the slowdown is a problem; one |
| 3129 | ;;; The race condition implies that we have to either (a) lock the master | 3106 | ;; makes snapshots, the other deletes the calling user's last change in the |
| 3130 | ;;; during the entire execution of vc-next-action, or (b) detect and | 3107 | ;; master. |
| 3131 | ;;; recover from errors resulting from dispatch on an out-of-date state. | 3108 | ;; |
| 3132 | ;;; | 3109 | ;; The race condition implies that we have to either (a) lock the master |
| 3133 | ;;; Alternative (a) appears to be infeasible. The problem is that we can't | 3110 | ;; during the entire execution of vc-next-action, or (b) detect and |
| 3134 | ;;; guarantee that the lock will ever be removed. Suppose a user starts a | 3111 | ;; recover from errors resulting from dispatch on an out-of-date state. |
| 3135 | ;;; checkin, the change message buffer pops up, and the user, having wandered | 3112 | ;; |
| 3136 | ;;; off to do something else, simply forgets about it? | 3113 | ;; Alternative (a) appears to be infeasible. The problem is that we can't |
| 3137 | ;;; | 3114 | ;; guarantee that the lock will ever be removed. Suppose a user starts a |
| 3138 | ;;; Alternative (b), on the other hand, works well with a cheap way to speed up | 3115 | ;; checkin, the change message buffer pops up, and the user, having wandered |
| 3139 | ;;; vc-state. Usually, if a file is registered, we can read its locked/ | 3116 | ;; off to do something else, simply forgets about it? |
| 3140 | ;;; unlocked state and its current owner from its permissions. | 3117 | ;; |
| 3141 | ;;; | 3118 | ;; Alternative (b), on the other hand, works well with a cheap way to speed up |
| 3142 | ;;; This shortcut will fail if someone has manually changed the workfile's | 3119 | ;; vc-state. Usually, if a file is registered, we can read its locked/ |
| 3143 | ;;; permissions; also if developers are munging the workfile in several | 3120 | ;; unlocked state and its current owner from its permissions. |
| 3144 | ;;; directories, with symlinks to a master (in this latter case, the | 3121 | ;; |
| 3145 | ;;; permissions shortcut will fail to detect a lock asserted from another | 3122 | ;; This shortcut will fail if someone has manually changed the workfile's |
| 3146 | ;;; directory). | 3123 | ;; permissions; also if developers are munging the workfile in several |
| 3147 | ;;; | 3124 | ;; directories, with symlinks to a master (in this latter case, the |
| 3148 | ;;; Note that these cases correspond exactly to the errors which could happen | 3125 | ;; permissions shortcut will fail to detect a lock asserted from another |
| 3149 | ;;; because of a competing checkin/checkout race in between two instances of | 3126 | ;; directory). |
| 3150 | ;;; vc-next-action. | 3127 | ;; |
| 3151 | ;;; | 3128 | ;; Note that these cases correspond exactly to the errors which could happen |
| 3152 | ;;; For VC's purposes, a workfile/master pair may have the following states: | 3129 | ;; because of a competing checkin/checkout race in between two instances of |
| 3153 | ;;; | 3130 | ;; vc-next-action. |
| 3154 | ;;; A. Unregistered. There is a workfile, there is no master. | 3131 | ;; |
| 3155 | ;;; | 3132 | ;; For VC's purposes, a workfile/master pair may have the following states: |
| 3156 | ;;; B. Registered and not locked by anyone. | 3133 | ;; |
| 3157 | ;;; | 3134 | ;; A. Unregistered. There is a workfile, there is no master. |
| 3158 | ;;; C. Locked by calling user and unchanged. | 3135 | ;; |
| 3159 | ;;; | 3136 | ;; B. Registered and not locked by anyone. |
| 3160 | ;;; D. Locked by the calling user and changed. | 3137 | ;; |
| 3161 | ;;; | 3138 | ;; C. Locked by calling user and unchanged. |
| 3162 | ;;; E. Locked by someone other than the calling user. | 3139 | ;; |
| 3163 | ;;; | 3140 | ;; D. Locked by the calling user and changed. |
| 3164 | ;;; This makes for 25 states and 20 error conditions. Here's the matrix: | 3141 | ;; |
| 3165 | ;;; | 3142 | ;; E. Locked by someone other than the calling user. |
| 3166 | ;;; VC's idea of state | 3143 | ;; |
| 3167 | ;;; | | 3144 | ;; This makes for 25 states and 20 error conditions. Here's the matrix: |
| 3168 | ;;; V Actual state RCS action SCCS action Effect | 3145 | ;; |
| 3169 | ;;; A B C D E | 3146 | ;; VC's idea of state |
| 3170 | ;;; A . 1 2 3 4 ci -u -t- admin -fb -i<file> initial admin | 3147 | ;; | |
| 3171 | ;;; B 5 . 6 7 8 co -l get -e checkout | 3148 | ;; V Actual state RCS action SCCS action Effect |
| 3172 | ;;; C 9 10 . 11 12 co -u unget; get revert | 3149 | ;; A B C D E |
| 3173 | ;;; D 13 14 15 . 16 ci -u -m<comment> delta -y<comment>; get checkin | 3150 | ;; A . 1 2 3 4 ci -u -t- admin -fb -i<file> initial admin |
| 3174 | ;;; E 17 18 19 20 . rcs -u -M -l unget -n ; get -g steal lock | 3151 | ;; B 5 . 6 7 8 co -l get -e checkout |
| 3175 | ;;; | 3152 | ;; C 9 10 . 11 12 co -u unget; get revert |
| 3176 | ;;; All commands take the master file name as a last argument (not shown). | 3153 | ;; D 13 14 15 . 16 ci -u -m<comment> delta -y<comment>; get checkin |
| 3177 | ;;; | 3154 | ;; E 17 18 19 20 . rcs -u -M -l unget -n ; get -g steal lock |
| 3178 | ;;; In the discussion below, a "self-race" is a pathological situation in | 3155 | ;; |
| 3179 | ;;; which VC operations are being attempted simultaneously by two or more | 3156 | ;; All commands take the master file name as a last argument (not shown). |
| 3180 | ;;; Emacsen running under the same username. | 3157 | ;; |
| 3181 | ;;; | 3158 | ;; In the discussion below, a "self-race" is a pathological situation in |
| 3182 | ;;; The vc-next-action code has the following windows: | 3159 | ;; which VC operations are being attempted simultaneously by two or more |
| 3183 | ;;; | 3160 | ;; Emacsen running under the same username. |
| 3184 | ;;; Window P: | 3161 | ;; |
| 3185 | ;;; Between the check for existence of a master file and the call to | 3162 | ;; The vc-next-action code has the following windows: |
| 3186 | ;;; admin/checkin in vc-buffer-admin (apparent state A). This window may | 3163 | ;; |
| 3187 | ;;; never close if the initial-comment feature is on. | 3164 | ;; Window P: |
| 3188 | ;;; | 3165 | ;; Between the check for existence of a master file and the call to |
| 3189 | ;;; Window Q: | 3166 | ;; admin/checkin in vc-buffer-admin (apparent state A). This window may |
| 3190 | ;;; Between the call to vc-workfile-unchanged-p in and the immediately | 3167 | ;; never close if the initial-comment feature is on. |
| 3191 | ;;; following revert (apparent state C). | 3168 | ;; |
| 3192 | ;;; | 3169 | ;; Window Q: |
| 3193 | ;;; Window R: | 3170 | ;; Between the call to vc-workfile-unchanged-p in and the immediately |
| 3194 | ;;; Between the call to vc-workfile-unchanged-p in and the following | 3171 | ;; following revert (apparent state C). |
| 3195 | ;;; checkin (apparent state D). This window may never close. | 3172 | ;; |
| 3196 | ;;; | 3173 | ;; Window R: |
| 3197 | ;;; Window S: | 3174 | ;; Between the call to vc-workfile-unchanged-p in and the following |
| 3198 | ;;; Between the unlock and the immediately following checkout during a | 3175 | ;; checkin (apparent state D). This window may never close. |
| 3199 | ;;; revert operation (apparent state C). Included in window Q. | 3176 | ;; |
| 3200 | ;;; | 3177 | ;; Window S: |
| 3201 | ;;; Window T: | 3178 | ;; Between the unlock and the immediately following checkout during a |
| 3202 | ;;; Between vc-state and the following checkout (apparent state B). | 3179 | ;; revert operation (apparent state C). Included in window Q. |
| 3203 | ;;; | 3180 | ;; |
| 3204 | ;;; Window U: | 3181 | ;; Window T: |
| 3205 | ;;; Between vc-state and the following revert (apparent state C). | 3182 | ;; Between vc-state and the following checkout (apparent state B). |
| 3206 | ;;; Includes windows Q and S. | 3183 | ;; |
| 3207 | ;;; | 3184 | ;; Window U: |
| 3208 | ;;; Window V: | 3185 | ;; Between vc-state and the following revert (apparent state C). |
| 3209 | ;;; Between vc-state and the following checkin (apparent state | 3186 | ;; Includes windows Q and S. |
| 3210 | ;;; D). This window may never be closed if the user fails to complete the | 3187 | ;; |
| 3211 | ;;; checkin message. Includes window R. | 3188 | ;; Window V: |
| 3212 | ;;; | 3189 | ;; Between vc-state and the following checkin (apparent state |
| 3213 | ;;; Window W: | 3190 | ;; D). This window may never be closed if the user fails to complete the |
| 3214 | ;;; Between vc-state and the following steal-lock (apparent | 3191 | ;; checkin message. Includes window R. |
| 3215 | ;;; state E). This window may never close if the user fails to complete | 3192 | ;; |
| 3216 | ;;; the steal-lock message. Includes window X. | 3193 | ;; Window W: |
| 3217 | ;;; | 3194 | ;; Between vc-state and the following steal-lock (apparent |
| 3218 | ;;; Window X: | 3195 | ;; state E). This window may never close if the user fails to complete |
| 3219 | ;;; Between the unlock and the immediately following re-lock during a | 3196 | ;; the steal-lock message. Includes window X. |
| 3220 | ;;; steal-lock operation (apparent state E). This window may never close | 3197 | ;; |
| 3221 | ;;; if the user fails to complete the steal-lock message. | 3198 | ;; Window X: |
| 3222 | ;;; | 3199 | ;; Between the unlock and the immediately following re-lock during a |
| 3223 | ;;; Errors: | 3200 | ;; steal-lock operation (apparent state E). This window may never close |
| 3224 | ;;; | 3201 | ;; if the user fails to complete the steal-lock message. |
| 3225 | ;;; Apparent state A --- | 3202 | ;; |
| 3226 | ;;; | 3203 | ;; Errors: |
| 3227 | ;;; 1. File looked unregistered but is actually registered and not locked. | 3204 | ;; |
| 3228 | ;;; | 3205 | ;; Apparent state A --- |
| 3229 | ;;; Potential cause: someone else's admin during window P, with | 3206 | ;; |
| 3230 | ;;; caller's admin happening before their checkout. | 3207 | ;; 1. File looked unregistered but is actually registered and not locked. |
| 3231 | ;;; | 3208 | ;; |
| 3232 | ;;; RCS: Prior to version 5.6.4, ci fails with message | 3209 | ;; Potential cause: someone else's admin during window P, with |
| 3233 | ;;; "no lock set by <user>". From 5.6.4 onwards, VC uses the new | 3210 | ;; caller's admin happening before their checkout. |
| 3234 | ;;; ci -i option and the message is "<file>,v: already exists". | 3211 | ;; |
| 3235 | ;;; SCCS: admin will fail with error (ad19). | 3212 | ;; RCS: Prior to version 5.6.4, ci fails with message |
| 3236 | ;;; | 3213 | ;; "no lock set by <user>". From 5.6.4 onwards, VC uses the new |
| 3237 | ;;; We can let these errors be passed up to the user. | 3214 | ;; ci -i option and the message is "<file>,v: already exists". |
| 3238 | ;;; | 3215 | ;; SCCS: admin will fail with error (ad19). |
| 3239 | ;;; 2. File looked unregistered but is actually locked by caller, unchanged. | 3216 | ;; |
| 3240 | ;;; | 3217 | ;; We can let these errors be passed up to the user. |
| 3241 | ;;; Potential cause: self-race during window P. | 3218 | ;; |
| 3242 | ;;; | 3219 | ;; 2. File looked unregistered but is actually locked by caller, unchanged. |
| 3243 | ;;; RCS: Prior to version 5.6.4, reverts the file to the last saved | 3220 | ;; |
| 3244 | ;;; version and unlocks it. From 5.6.4 onwards, VC uses the new | 3221 | ;; Potential cause: self-race during window P. |
| 3245 | ;;; ci -i option, failing with message "<file>,v: already exists". | 3222 | ;; |
| 3246 | ;;; SCCS: will fail with error (ad19). | 3223 | ;; RCS: Prior to version 5.6.4, reverts the file to the last saved |
| 3247 | ;;; | 3224 | ;; version and unlocks it. From 5.6.4 onwards, VC uses the new |
| 3248 | ;;; Either of these consequences is acceptable. | 3225 | ;; ci -i option, failing with message "<file>,v: already exists". |
| 3249 | ;;; | 3226 | ;; SCCS: will fail with error (ad19). |
| 3250 | ;;; 3. File looked unregistered but is actually locked by caller, changed. | 3227 | ;; |
| 3251 | ;;; | 3228 | ;; Either of these consequences is acceptable. |
| 3252 | ;;; Potential cause: self-race during window P. | 3229 | ;; |
| 3253 | ;;; | 3230 | ;; 3. File looked unregistered but is actually locked by caller, changed. |
| 3254 | ;;; RCS: Prior to version 5.6.4, VC registers the caller's workfile as | 3231 | ;; |
| 3255 | ;;; a delta with a null change comment (the -t- switch will be | 3232 | ;; Potential cause: self-race during window P. |
| 3256 | ;;; ignored). From 5.6.4 onwards, VC uses the new ci -i option, | 3233 | ;; |
| 3257 | ;;; failing with message "<file>,v: already exists". | 3234 | ;; RCS: Prior to version 5.6.4, VC registers the caller's workfile as |
| 3258 | ;;; SCCS: will fail with error (ad19). | 3235 | ;; a delta with a null change comment (the -t- switch will be |
| 3259 | ;;; | 3236 | ;; ignored). From 5.6.4 onwards, VC uses the new ci -i option, |
| 3260 | ;;; 4. File looked unregistered but is locked by someone else. | 3237 | ;; failing with message "<file>,v: already exists". |
| 3261 | ;;; | 3238 | ;; SCCS: will fail with error (ad19). |
| 3262 | ;;; Potential cause: someone else's admin during window P, with | 3239 | ;; |
| 3263 | ;;; caller's admin happening *after* their checkout. | 3240 | ;; 4. File looked unregistered but is locked by someone else. |
| 3264 | ;;; | ||
| 3265 | ;;; RCS: Prior to version 5.6.4, ci fails with a | ||
| 3266 | ;;; "no lock set by <user>" message. From 5.6.4 onwards, | ||
| 3267 | ;;; VC uses the new ci -i option, failing with message | ||
| 3268 | ;;; "<file>,v: already exists". | ||
| 3269 | ;;; SCCS: will fail with error (ad19). | ||
| 3270 | ;;; | ||
| 3271 | ;;; We can let these errors be passed up to the user. | ||
| 3272 | ;;; | ||
| 3273 | ;;; Apparent state B --- | ||
| 3274 | ;;; | ||
| 3275 | ;;; 5. File looked registered and not locked, but is actually unregistered. | ||
| 3276 | ;;; | ||
| 3277 | ;;; Potential cause: master file got nuked during window P. | ||
| 3278 | ;;; | ||
| 3279 | ;;; RCS: will fail with "RCS/<file>: No such file or directory" | ||
| 3280 | ;;; SCCS: will fail with error ut4. | ||
| 3281 | ;;; | ||
| 3282 | ;;; We can let these errors be passed up to the user. | ||
| 3283 | ;;; | ||
| 3284 | ;;; 6. File looked registered and not locked, but is actually locked by the | ||
| 3285 | ;;; calling user and unchanged. | ||
| 3286 | ;;; | ||
| 3287 | ;;; Potential cause: self-race during window T. | ||
| 3288 | ;;; | ||
| 3289 | ;;; RCS: in the same directory as the previous workfile, co -l will fail | ||
| 3290 | ;;; with "co error: writable foo exists; checkout aborted". In any other | ||
| 3291 | ;;; directory, checkout will succeed. | ||
| 3292 | ;;; SCCS: will fail with ge17. | ||
| 3293 | ;;; | ||
| 3294 | ;;; Either of these consequences is acceptable. | ||
| 3295 | ;;; | ||
| 3296 | ;;; 7. File looked registered and not locked, but is actually locked by the | ||
| 3297 | ;;; calling user and changed. | ||
| 3298 | ;;; | ||
| 3299 | ;;; As case 6. | ||
| 3300 | ;;; | ||
| 3301 | ;;; 8. File looked registered and not locked, but is actually locked by another | ||
| 3302 | ;;; user. | ||
| 3303 | ;;; | ||
| 3304 | ;;; Potential cause: someone else checks it out during window T. | ||
| 3305 | ;;; | ||
| 3306 | ;;; RCS: co error: revision 1.3 already locked by <user> | ||
| 3307 | ;;; SCCS: fails with ge4 (in directory) or ut7 (outside it). | ||
| 3308 | ;;; | ||
| 3309 | ;;; We can let these errors be passed up to the user. | ||
| 3310 | ;;; | ||
| 3311 | ;;; Apparent state C --- | ||
| 3312 | ;;; | ||
| 3313 | ;;; 9. File looks locked by calling user and unchanged, but is unregistered. | ||
| 3314 | ;;; | ||
| 3315 | ;;; As case 5. | ||
| 3316 | ;;; | ||
| 3317 | ;;; 10. File looks locked by calling user and unchanged, but is actually not | ||
| 3318 | ;;; locked. | ||
| 3319 | ;;; | ||
| 3320 | ;;; Potential cause: a self-race in window U, or by the revert's | ||
| 3321 | ;;; landing during window X of some other user's steal-lock or window S | ||
| 3322 | ;;; of another user's revert. | ||
| 3323 | ;;; | ||
| 3324 | ;;; RCS: succeeds, refreshing the file from the identical version in | ||
| 3325 | ;;; the master. | ||
| 3326 | ;;; SCCS: fails with error ut4 (p file nonexistent). | ||
| 3327 | ;;; | ||
| 3328 | ;;; Either of these consequences is acceptable. | ||
| 3329 | ;;; | ||
| 3330 | ;;; 11. File is locked by calling user. It looks unchanged, but is actually | ||
| 3331 | ;;; changed. | ||
| 3332 | ;;; | ||
| 3333 | ;;; Potential cause: the file would have to be touched by a self-race | ||
| 3334 | ;;; during window Q. | ||
| 3335 | ;;; | ||
| 3336 | ;;; The revert will succeed, removing whatever changes came with | ||
| 3337 | ;;; the touch. It is theoretically possible that work could be lost. | ||
| 3338 | ;;; | ||
| 3339 | ;;; 12. File looks like it's locked by the calling user and unchanged, but | ||
| 3340 | ;;; it's actually locked by someone else. | ||
| 3341 | ;;; | ||
| 3342 | ;;; Potential cause: a steal-lock in window V. | ||
| 3343 | ;;; | ||
| 3344 | ;;; RCS: co error: revision <rev> locked by <user>; use co -r or rcs -u | ||
| 3345 | ;;; SCCS: fails with error un2 | ||
| 3346 | ;;; | ||
| 3347 | ;;; We can pass these errors up to the user. | ||
| 3348 | ;;; | ||
| 3349 | ;;; Apparent state D --- | ||
| 3350 | ;;; | ||
| 3351 | ;;; 13. File looks like it's locked by the calling user and changed, but it's | ||
| 3352 | ;;; actually unregistered. | ||
| 3353 | ;;; | ||
| 3354 | ;;; Potential cause: master file got nuked during window P. | ||
| 3355 | ;;; | ||
| 3356 | ;;; RCS: Prior to version 5.6.4, checks in the user's version as an | ||
| 3357 | ;;; initial delta. From 5.6.4 onwards, VC uses the new ci -j | ||
| 3358 | ;;; option, failing with message "no such file or directory". | ||
| 3359 | ;;; SCCS: will fail with error ut4. | ||
| 3360 | ;;; | ||
| 3361 | ;;; This case is kind of nasty. Under RCS prior to version 5.6.4, | ||
| 3362 | ;;; VC may fail to detect the loss of previous version information. | ||
| 3363 | ;;; | ||
| 3364 | ;;; 14. File looks like it's locked by the calling user and changed, but it's | ||
| 3365 | ;;; actually unlocked. | ||
| 3366 | ;;; | ||
| 3367 | ;;; Potential cause: self-race in window V, or the checkin happening | ||
| 3368 | ;;; during the window X of someone else's steal-lock or window S of | ||
| 3369 | ;;; someone else's revert. | ||
| 3370 | ;;; | ||
| 3371 | ;;; RCS: ci will fail with "no lock set by <user>". | ||
| 3372 | ;;; SCCS: delta will fail with error ut4. | ||
| 3373 | ;;; | ||
| 3374 | ;;; 15. File looks like it's locked by the calling user and changed, but it's | ||
| 3375 | ;;; actually locked by the calling user and unchanged. | ||
| 3376 | ;;; | ||
| 3377 | ;;; Potential cause: another self-race --- a whole checkin/checkout | ||
| 3378 | ;;; sequence by the calling user would have to land in window R. | ||
| 3379 | ;;; | ||
| 3380 | ;;; SCCS: checks in a redundant delta and leaves the file unlocked as usual. | ||
| 3381 | ;;; RCS: reverts to the file state as of the second user's checkin, leaving | ||
| 3382 | ;;; the file unlocked. | ||
| 3383 | ;;; | ||
| 3384 | ;;; It is theoretically possible that work could be lost under RCS. | ||
| 3385 | ;;; | ||
| 3386 | ;;; 16. File looks like it's locked by the calling user and changed, but it's | ||
| 3387 | ;;; actually locked by a different user. | ||
| 3388 | ;;; | ||
| 3389 | ;;; RCS: ci error: no lock set by <user> | ||
| 3390 | ;;; SCCS: unget will fail with error un2 | ||
| 3391 | ;;; | ||
| 3392 | ;;; We can pass these errors up to the user. | ||
| 3393 | ;;; | ||
| 3394 | ;;; Apparent state E --- | ||
| 3395 | ;;; | ||
| 3396 | ;;; 17. File looks like it's locked by some other user, but it's actually | ||
| 3397 | ;;; unregistered. | ||
| 3398 | ;;; | ||
| 3399 | ;;; As case 13. | ||
| 3400 | ;;; | ||
| 3401 | ;;; 18. File looks like it's locked by some other user, but it's actually | ||
| 3402 | ;;; unlocked. | ||
| 3403 | ;;; | ||
| 3404 | ;;; Potential cause: someone released a lock during window W. | ||
| 3405 | ;;; | ||
| 3406 | ;;; RCS: The calling user will get the lock on the file. | ||
| 3407 | ;;; SCCS: unget -n will fail with cm4. | ||
| 3408 | ;;; | ||
| 3409 | ;;; Either of these consequences will be OK. | ||
| 3410 | ;;; | ||
| 3411 | ;;; 19. File looks like it's locked by some other user, but it's actually | ||
| 3412 | ;;; locked by the calling user and unchanged. | ||
| 3413 | ;;; | ||
| 3414 | ;;; Potential cause: the other user relinquishing a lock followed by | ||
| 3415 | ;;; a self-race, both in window W. | ||
| 3416 | ;;; | ||
| 3417 | ;;; Under both RCS and SCCS, both unlock and lock will succeed, making | ||
| 3418 | ;;; the sequence a no-op. | ||
| 3419 | ;;; | ||
| 3420 | ;;; 20. File looks like it's locked by some other user, but it's actually | ||
| 3421 | ;;; locked by the calling user and changed. | ||
| 3422 | ;;; | ||
| 3423 | ;;; As case 19. | ||
| 3424 | ;;; | ||
| 3425 | ;;; PROBLEM CASES: | ||
| 3426 | ;;; | ||
| 3427 | ;;; In order of decreasing severity: | ||
| 3428 | ;;; | ||
| 3429 | ;;; Cases 11 and 15 are the only ones that potentially lose work. | ||
| 3430 | ;;; They would require a self-race for this to happen. | ||
| 3431 | ;;; | ||
| 3432 | ;;; Case 13 in RCS loses information about previous deltas, retaining | ||
| 3433 | ;;; only the information in the current workfile. This can only happen | ||
| 3434 | ;;; if the master file gets nuked in window P. | ||
| 3435 | ;;; | ||
| 3436 | ;;; Case 3 in RCS and case 15 under SCCS insert a redundant delta with | ||
| 3437 | ;;; no change comment in the master. This would require a self-race in | ||
| 3438 | ;;; window P or R respectively. | ||
| 3439 | ;;; | ||
| 3440 | ;;; Cases 2, 10, 19 and 20 do extra work, but make no changes. | ||
| 3441 | ;;; | ||
| 3442 | ;;; Unfortunately, it appears to me that no recovery is possible in these | ||
| 3443 | ;;; cases. They don't yield error messages, so there's no way to tell that | ||
| 3444 | ;;; a race condition has occurred. | ||
| 3445 | ;;; | ||
| 3446 | ;;; All other cases don't change either the workfile or the master, and | ||
| 3447 | ;;; trigger command errors which the user will see. | ||
| 3448 | ;;; | 3241 | ;;; |
| 3449 | ;;; Thus, there is no explicit recovery code. | 3242 | ;; Potential cause: someone else's admin during window P, with |
| 3243 | ;; caller's admin happening *after* their checkout. | ||
| 3244 | ;; | ||
| 3245 | ;; RCS: Prior to version 5.6.4, ci fails with a | ||
| 3246 | ;; "no lock set by <user>" message. From 5.6.4 onwards, | ||
| 3247 | ;; VC uses the new ci -i option, failing with message | ||
| 3248 | ;; "<file>,v: already exists". | ||
| 3249 | ;; SCCS: will fail with error (ad19). | ||
| 3250 | ;; | ||
| 3251 | ;; We can let these errors be passed up to the user. | ||
| 3252 | ;; | ||
| 3253 | ;; Apparent state B --- | ||
| 3254 | ;; | ||
| 3255 | ;; 5. File looked registered and not locked, but is actually unregistered. | ||
| 3256 | ;; | ||
| 3257 | ;; Potential cause: master file got nuked during window P. | ||
| 3258 | ;; | ||
| 3259 | ;; RCS: will fail with "RCS/<file>: No such file or directory" | ||
| 3260 | ;; SCCS: will fail with error ut4. | ||
| 3261 | ;; | ||
| 3262 | ;; We can let these errors be passed up to the user. | ||
| 3263 | ;; | ||
| 3264 | ;; 6. File looked registered and not locked, but is actually locked by the | ||
| 3265 | ;; calling user and unchanged. | ||
| 3266 | ;; | ||
| 3267 | ;; Potential cause: self-race during window T. | ||
| 3268 | ;; | ||
| 3269 | ;; RCS: in the same directory as the previous workfile, co -l will fail | ||
| 3270 | ;; with "co error: writable foo exists; checkout aborted". In any other | ||
| 3271 | ;; directory, checkout will succeed. | ||
| 3272 | ;; SCCS: will fail with ge17. | ||
| 3273 | ;; | ||
| 3274 | ;; Either of these consequences is acceptable. | ||
| 3275 | ;; | ||
| 3276 | ;; 7. File looked registered and not locked, but is actually locked by the | ||
| 3277 | ;; calling user and changed. | ||
| 3278 | ;; | ||
| 3279 | ;; As case 6. | ||
| 3280 | ;; | ||
| 3281 | ;; 8. File looked registered and not locked, but is actually locked by another | ||
| 3282 | ;; user. | ||
| 3283 | ;; | ||
| 3284 | ;; Potential cause: someone else checks it out during window T. | ||
| 3285 | ;; | ||
| 3286 | ;; RCS: co error: revision 1.3 already locked by <user> | ||
| 3287 | ;; SCCS: fails with ge4 (in directory) or ut7 (outside it). | ||
| 3288 | ;; | ||
| 3289 | ;; We can let these errors be passed up to the user. | ||
| 3290 | ;; | ||
| 3291 | ;; Apparent state C --- | ||
| 3292 | ;; | ||
| 3293 | ;; 9. File looks locked by calling user and unchanged, but is unregistered. | ||
| 3294 | ;; | ||
| 3295 | ;; As case 5. | ||
| 3296 | ;; | ||
| 3297 | ;; 10. File looks locked by calling user and unchanged, but is actually not | ||
| 3298 | ;; locked. | ||
| 3299 | ;; | ||
| 3300 | ;; Potential cause: a self-race in window U, or by the revert's | ||
| 3301 | ;; landing during window X of some other user's steal-lock or window S | ||
| 3302 | ;; of another user's revert. | ||
| 3303 | ;; | ||
| 3304 | ;; RCS: succeeds, refreshing the file from the identical version in | ||
| 3305 | ;; the master. | ||
| 3306 | ;; SCCS: fails with error ut4 (p file nonexistent). | ||
| 3307 | ;; | ||
| 3308 | ;; Either of these consequences is acceptable. | ||
| 3309 | ;; | ||
| 3310 | ;; 11. File is locked by calling user. It looks unchanged, but is actually | ||
| 3311 | ;; changed. | ||
| 3312 | ;; | ||
| 3313 | ;; Potential cause: the file would have to be touched by a self-race | ||
| 3314 | ;; during window Q. | ||
| 3315 | ;; | ||
| 3316 | ;; The revert will succeed, removing whatever changes came with | ||
| 3317 | ;; the touch. It is theoretically possible that work could be lost. | ||
| 3318 | ;; | ||
| 3319 | ;; 12. File looks like it's locked by the calling user and unchanged, but | ||
| 3320 | ;; it's actually locked by someone else. | ||
| 3321 | ;; | ||
| 3322 | ;; Potential cause: a steal-lock in window V. | ||
| 3323 | ;; | ||
| 3324 | ;; RCS: co error: revision <rev> locked by <user>; use co -r or rcs -u | ||
| 3325 | ;; SCCS: fails with error un2 | ||
| 3326 | ;; | ||
| 3327 | ;; We can pass these errors up to the user. | ||
| 3328 | ;; | ||
| 3329 | ;; Apparent state D --- | ||
| 3330 | ;; | ||
| 3331 | ;; 13. File looks like it's locked by the calling user and changed, but it's | ||
| 3332 | ;; actually unregistered. | ||
| 3333 | ;; | ||
| 3334 | ;; Potential cause: master file got nuked during window P. | ||
| 3335 | ;; | ||
| 3336 | ;; RCS: Prior to version 5.6.4, checks in the user's version as an | ||
| 3337 | ;; initial delta. From 5.6.4 onwards, VC uses the new ci -j | ||
| 3338 | ;; option, failing with message "no such file or directory". | ||
| 3339 | ;; SCCS: will fail with error ut4. | ||
| 3340 | ;; | ||
| 3341 | ;; This case is kind of nasty. Under RCS prior to version 5.6.4, | ||
| 3342 | ;; VC may fail to detect the loss of previous version information. | ||
| 3343 | ;; | ||
| 3344 | ;; 14. File looks like it's locked by the calling user and changed, but it's | ||
| 3345 | ;; actually unlocked. | ||
| 3346 | ;; | ||
| 3347 | ;; Potential cause: self-race in window V, or the checkin happening | ||
| 3348 | ;; during the window X of someone else's steal-lock or window S of | ||
| 3349 | ;; someone else's revert. | ||
| 3350 | ;; | ||
| 3351 | ;; RCS: ci will fail with "no lock set by <user>". | ||
| 3352 | ;; SCCS: delta will fail with error ut4. | ||
| 3353 | ;; | ||
| 3354 | ;; 15. File looks like it's locked by the calling user and changed, but it's | ||
| 3355 | ;; actually locked by the calling user and unchanged. | ||
| 3356 | ;; | ||
| 3357 | ;; Potential cause: another self-race --- a whole checkin/checkout | ||
| 3358 | ;; sequence by the calling user would have to land in window R. | ||
| 3359 | ;; | ||
| 3360 | ;; SCCS: checks in a redundant delta and leaves the file unlocked as usual. | ||
| 3361 | ;; RCS: reverts to the file state as of the second user's checkin, leaving | ||
| 3362 | ;; the file unlocked. | ||
| 3363 | ;; | ||
| 3364 | ;; It is theoretically possible that work could be lost under RCS. | ||
| 3365 | ;; | ||
| 3366 | ;; 16. File looks like it's locked by the calling user and changed, but it's | ||
| 3367 | ;; actually locked by a different user. | ||
| 3368 | ;; | ||
| 3369 | ;; RCS: ci error: no lock set by <user> | ||
| 3370 | ;; SCCS: unget will fail with error un2 | ||
| 3371 | ;; | ||
| 3372 | ;; We can pass these errors up to the user. | ||
| 3373 | ;; | ||
| 3374 | ;; Apparent state E --- | ||
| 3375 | ;; | ||
| 3376 | ;; 17. File looks like it's locked by some other user, but it's actually | ||
| 3377 | ;; unregistered. | ||
| 3378 | ;; | ||
| 3379 | ;; As case 13. | ||
| 3380 | ;; | ||
| 3381 | ;; 18. File looks like it's locked by some other user, but it's actually | ||
| 3382 | ;; unlocked. | ||
| 3383 | ;; | ||
| 3384 | ;; Potential cause: someone released a lock during window W. | ||
| 3385 | ;; | ||
| 3386 | ;; RCS: The calling user will get the lock on the file. | ||
| 3387 | ;; SCCS: unget -n will fail with cm4. | ||
| 3388 | ;; | ||
| 3389 | ;; Either of these consequences will be OK. | ||
| 3390 | ;; | ||
| 3391 | ;; 19. File looks like it's locked by some other user, but it's actually | ||
| 3392 | ;; locked by the calling user and unchanged. | ||
| 3393 | ;; | ||
| 3394 | ;; Potential cause: the other user relinquishing a lock followed by | ||
| 3395 | ;; a self-race, both in window W. | ||
| 3396 | ;; | ||
| 3397 | ;; Under both RCS and SCCS, both unlock and lock will succeed, making | ||
| 3398 | ;; the sequence a no-op. | ||
| 3399 | ;; | ||
| 3400 | ;; 20. File looks like it's locked by some other user, but it's actually | ||
| 3401 | ;; locked by the calling user and changed. | ||
| 3402 | ;; | ||
| 3403 | ;; As case 19. | ||
| 3404 | ;; | ||
| 3405 | ;; PROBLEM CASES: | ||
| 3406 | ;; | ||
| 3407 | ;; In order of decreasing severity: | ||
| 3408 | ;; | ||
| 3409 | ;; Cases 11 and 15 are the only ones that potentially lose work. | ||
| 3410 | ;; They would require a self-race for this to happen. | ||
| 3411 | ;; | ||
| 3412 | ;; Case 13 in RCS loses information about previous deltas, retaining | ||
| 3413 | ;; only the information in the current workfile. This can only happen | ||
| 3414 | ;; if the master file gets nuked in window P. | ||
| 3415 | ;; | ||
| 3416 | ;; Case 3 in RCS and case 15 under SCCS insert a redundant delta with | ||
| 3417 | ;; no change comment in the master. This would require a self-race in | ||
| 3418 | ;; window P or R respectively. | ||
| 3419 | ;; | ||
| 3420 | ;; Cases 2, 10, 19 and 20 do extra work, but make no changes. | ||
| 3421 | ;; | ||
| 3422 | ;; Unfortunately, it appears to me that no recovery is possible in these | ||
| 3423 | ;; cases. They don't yield error messages, so there's no way to tell that | ||
| 3424 | ;; a race condition has occurred. | ||
| 3425 | ;; | ||
| 3426 | ;; All other cases don't change either the workfile or the master, and | ||
| 3427 | ;; trigger command errors which the user will see. | ||
| 3428 | ;; | ||
| 3429 | ;; Thus, there is no explicit recovery code. | ||
| 3450 | 3430 | ||
| 3451 | ;;; vc.el ends here | 3431 | ;;; vc.el ends here |