]> code.delx.au - gnu-emacs/blobdiff - lisp/userlock.el
(gs-options): Add -dSAFER. Mark it risky.
[gnu-emacs] / lisp / userlock.el
index 23430fa1e0495686a29cab41e2441533f2baff8f..e6e5ef0a1b510d00f354a3a9ec6c080917655532 100644 (file)
@@ -2,11 +2,14 @@
 
 ;; Copyright (C) 1985, 1986 Free Software Foundation, inc.
 
+;; Maintainer: FSF
+;; Keywords: internal
+
 ;; This file is part of GNU Emacs.
 
 ;; GNU Emacs is free software; you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 1, or (at your option)
+;; the Free Software Foundation; either version 2, or (at your option)
 ;; any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; GNU General Public License for more details.
 
 ;; 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, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; 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.
 
+;;; Commentary:
 
-;; This file is autloaded to handle certain conditions
+;; This file is autoloaded to handle certain conditions
 ;; detected by the file-locking code within Emacs.
 ;; The two entry points are `ask-user-about-lock' and
 ;; `ask-user-about-supersession-threat'.
 
+;;; Code:
 
 (put 'file-locked 'error-conditions '(file-locked file-error error))
+(put 'file-locked 'error-message "File is locked")
 
 ;;;###autoload
-(defun ask-user-about-lock (fn opponent)
-  "Ask user what to do when he wants to edit FILE but it is locked by USER.
+(defun ask-user-about-lock (file opponent)
+  "Ask user what to do when he wants to edit FILE but it is locked by OPPONENT.
 This function has a choice of three things to do:
-  do (signal 'buffer-file-locked (list FILE USER))
+  do (signal 'file-locked (list FILE OPPONENT))
     to refrain from editing the file
   return t (grab the lock on the file)
   return nil (edit the file even though it is locked).
-You can rewrite it to use any criterion you like to choose which one to do."
+You can redefine this function to choose among those three alternatives
+in any way you like."
   (discard-input)
   (save-window-excursion
-    (let (answer)
+    (let (answer short-opponent short-file)
+      (setq short-file
+           (if (> (length file) 22)
+               (concat "..." (substring file (- (length file) 22)))
+             file))
+      (setq short-opponent
+           (if (> (length opponent) 25)
+               (save-match-data
+                 (string-match " (pid [0-9]+)" opponent)
+                 (concat (substring opponent 0 13) "..."
+                         (match-string 0 opponent)))
+             opponent))
       (while (null answer)
-       (message "%s is locking %s: action (s, q, p, ?)? " opponent fn)
+       (message "%s locked by %s: (s, q, p, ?)? "
+                short-file short-opponent)
        (let ((tem (let ((inhibit-quit t)
                         (cursor-in-echo-area t))
                     (prog1 (downcase (read-char))
@@ -60,7 +80,7 @@ You can rewrite it to use any criterion you like to choose which one to do."
                   (ask-user-about-lock-help)
                   (setq answer nil))
                  ((eq (cdr answer) 'yield)
-                  (signal 'file-locked (list "File is locked" fn opponent)))))))
+                  (signal 'file-locked (list file opponent)))))))
       (cdr answer))))
 
 (defun ask-user-about-lock-help ()
@@ -71,7 +91,10 @@ already started modifying in EMACS.
 You can <s>teal the file; The other user becomes the
   intruder if (s)he ever unmodifies the file and then changes it again.
 You can <p>roceed; you edit at your own (and the other user's) risk.
-You can <q>uit; don't modify this file.")))
+You can <q>uit; don't modify this file.")
+    (save-excursion
+      (set-buffer standard-output)
+      (help-mode))))
 
 (put
  'file-supersession 'error-conditions '(file-supersession file-error error))
@@ -89,23 +112,30 @@ The buffer in question is current when this function is called."
   (save-window-excursion
     (let (answer)
       (while (null answer)
-       (message "File has changed on disk; really want to edit the buffer? (y, n or C-h) ")
+       (message "%s changed on disk; really edit the buffer? (y, n, r or C-h) "
+                (file-name-nondirectory fn))
        (let ((tem (downcase (let ((cursor-in-echo-area t))
-                              (read-char)))))
+                              (read-char-exclusive)))))
          (setq answer
                (if (= tem help-char)
                    'help
                  (cdr (assoc tem '((?n . yield)
                                    (?\C-g . yield)
                                    (?y . proceed)
+                                   (?r . revert)
                                    (?? . help))))))
          (cond ((null answer)
                 (beep)
-                (message "Please type y or n; or ? for help")
+                (message "Please type y, n or r; or ? for help")
                 (sit-for 3))
                ((eq answer 'help)
                 (ask-user-about-supersession-help)
                 (setq answer nil))
+               ((eq answer 'revert)
+                (revert-buffer nil (not (buffer-modified-p)))
+                                       ; ask confirmation iff buffer modified
+                (signal 'file-supersession
+                        (list "File reverted" fn)))
                ((eq answer 'yield)
                 (signal 'file-supersession
                         (list "File changed on disk" fn))))))
@@ -120,9 +150,15 @@ since you last read it in or saved it with this buffer.
 
 If you say `y' to go ahead and modify this buffer,
 you risk ruining the work of whoever rewrote the file.
+If you say `r' to revert, the contents of the buffer are refreshed
+from the file on disk.
 If you say `n', the change you started to make will be aborted.
 
 Usually, you should type `n' and then `M-x revert-buffer',
-to get the latest version of the file, then make the change again.")))
+to get the latest version of the file, then make the change again.")
+    (save-excursion
+      (set-buffer standard-output)
+      (help-mode))))
 
+;;; arch-tag: a61c5b60-e1c8-44fd-894a-c617f4dfc639
 ;;; userlock.el ends here