aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2001-07-11 22:55:25 +0000
committerStefan Monnier2001-07-11 22:55:25 +0000
commitec402ad4328f5bb8bdfcbbad6c1c4a34f2ef5a8d (patch)
treefbed509562771f725268476e25fb3bf235e7661a
parent14fef9dea4427b637a9593fe510a689c721732bf (diff)
downloademacs-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/ChangeLog8
-rw-r--r--lisp/vc.el738
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 @@
12001-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
12001-07-11 Gerd Moellmann <gerd@gnu.org> 92001-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