Merge from emacs--rel--22
[bpt/emacs.git] / lisp / userlock.el
index 7844f45..0602f2e 100644 (file)
@@ -1,16 +1,17 @@
 ;;; userlock.el --- handle file access contention between multiple users
 
-;; Copyright (C) 1985, 1986 Free Software Foundation, inc.
+;; Copyright (C) 1985, 1986, 2001, 2002, 2003, 2004,
+;;   2005, 2006, 2007, 2008 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
+;; 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 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -18,9 +19,7 @@
 ;; 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, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 ;;; 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))
@@ -66,15 +79,15 @@ 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 ()
   (with-output-to-temp-buffer "*Help*"
     (princ "It has been detected that you want to modify a file that someone else has
-already started modifying in EMACS.
+already started modifying in Emacs.
 
-You can <s>teal the file; The other user becomes the
+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.")
@@ -101,7 +114,7 @@ The buffer in question is current when this function is called."
        (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
@@ -119,7 +132,7 @@ The buffer in question is current when this function is called."
                 (setq answer nil))
                ((eq answer 'revert)
                 (revert-buffer nil (not (buffer-modified-p)))
-                                       ; ask confirmation iff buffer modified
+                                       ; ask confirmation if buffer modified
                 (signal 'file-supersession
                         (list "File reverted" fn)))
                ((eq answer 'yield)
@@ -146,4 +159,5 @@ to get the latest version of the file, then make the change again.")
       (set-buffer standard-output)
       (help-mode))))
 
+;; arch-tag: a61c5b60-e1c8-44fd-894a-c617f4dfc639
 ;;; userlock.el ends here