]> code.delx.au - gnu-emacs/blobdiff - lisp/vc-sccs.el
* progmodes/compile.el (compilation-goto-locus): Use next-error-move-function.
[gnu-emacs] / lisp / vc-sccs.el
index f8a98f52702dcbee62fdba9811ac2af7ec812122..9236f604f80249b2246119120a25ec3928b21cd0 100644 (file)
@@ -1,7 +1,7 @@
 ;;; vc-sccs.el --- support for SCCS version-control
 
 ;; Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-;;   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+;;   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
 ;;   Free Software Foundation, Inc.
 
 ;; Author:     FSF (see vc.el for full credits)
 ;;   :group 'vc)
 
 (defcustom vc-sccs-register-switches nil
-  "*Extra switches for registering a file in SCCS.
+  "Switches for registering a file in SCCS.
 A string or list of strings passed to the checkin program by
-\\[vc-sccs-register]."
-  :type '(choice (const :tag "None" nil)
+\\[vc-register].  If nil, use the value of `vc-register-switches'.
+If t, use no switches."
+  :type '(choice (const :tag "Unspecified" nil)
+                (const :tag "None" t)
                 (string :tag "Argument String")
-                (repeat :tag "Argument List"
-                        :value ("")
-                        string))
+                (repeat :tag "Argument List" :value ("") string))
   :version "21.1"
   :group 'vc)
 
 (defcustom vc-sccs-diff-switches nil
-  "*A string or list of strings specifying extra switches for `vcdiff',
-the diff utility used for SCCS under VC."
-    :type '(choice (const :tag "None" nil)
+  "String or list of strings specifying switches for SCCS diff under VC.
+If nil, use the value of `vc-diff-switches'.  If t, use no switches."
+  :type '(choice (const :tag "Unspecified" nil)
+                (const :tag "None" t)
                 (string :tag "Argument String")
-                (repeat :tag "Argument List"
-                        :value ("")
-                        string))
+                (repeat :tag "Argument List" :value ("") string))
   :version "21.1"
   :group 'vc)
 
 (defcustom vc-sccs-header (or (cdr (assoc 'SCCS vc-header-alist)) '("%W%"))
-  "*Header keywords to be inserted by `vc-insert-headers'."
+  "Header keywords to be inserted by `vc-insert-headers'."
   :type '(repeat string)
   :group 'vc)
 
 ;;;###autoload
 (defcustom vc-sccs-master-templates
   '("%sSCCS/s.%s" "%ss.%s" vc-sccs-search-project-dir)
-  "*Where to look for SCCS master files.
+  "Where to look for SCCS master files.
 For a description of possible values, see `vc-check-master-templates'."
   :type '(choice (const :tag "Use standard SCCS file names"
                        ("%sSCCS/s.%s" "%ss.%s" vc-sccs-search-project-dir))
@@ -203,9 +202,8 @@ For a description of possible values, see `vc-check-master-templates'."
   "Register FILES into the SCCS version-control system.
 REV is the optional revision number for the file.  COMMENT can be used
 to provide an initial description of FILES.
-
-`vc-register-switches' and `vc-sccs-register-switches' are passed to
-the SCCS command (in that order).
+Passes either `vc-sccs-register-switches' or `vc-register-switches'
+to the SCCS command.
 
 Automatically retrieve a read-only version of the files with keywords
 expanded if `vc-keep-workfiles' is non-nil, otherwise, delete the workfile."
@@ -258,7 +256,7 @@ expanded if `vc-keep-workfiles' is non-nil, otherwise, delete the workfile."
 If FILE is a directory, all version-controlled files beneath are checked out.
 EDITABLE non-nil means that the file should be writable and
 locked.  REV is the revision to check out."
-  (if (file-directory-p file) 
+  (if (file-directory-p file)
       (mapc 'vc-sccs-checkout (vc-expand-dirs (list file)))
     (let ((file-buffer (get-file-buffer file))
          switches)
@@ -293,7 +291,7 @@ are expanded to all version-controlled subfiles."
       (error "SCCS backend doesn't support directory-level rollback."))
   (dolist (file files)
          (let ((discard (vc-working-revision file)))
-           (if (null (yes-or-no-p (format "Remove version %s from %s history? " 
+           (if (null (yes-or-no-p (format "Remove version %s from %s history? "
                                           discard file)))
                (error "Aborted"))
            (message "Removing revision %s from %s..." discard file)
@@ -304,7 +302,7 @@ are expanded to all version-controlled subfiles."
 (defun vc-sccs-revert (file &optional contents-done)
   "Revert FILE to the version it was based on. If FILE is a directory,
 revert all subfiles."
-  (if (file-directory-p file) 
+  (if (file-directory-p file)
       (mapc 'vc-sccs-revert (vc-expand-dirs (list file)))
     (vc-sccs-do-command nil 0 "unget" (vc-name file))
     (vc-sccs-do-command nil 0 "get" (vc-name file))
@@ -315,7 +313,7 @@ revert all subfiles."
 
 (defun vc-sccs-steal-lock (file &optional rev)
   "Steal the lock on the current workfile for FILE and revision REV."
-  (if (file-directory-p file) 
+  (if (file-directory-p file)
       (mapc 'vc-sccs-steal-lock (vc-expand-dirs (list file)))
     (vc-sccs-do-command nil 0 "unget"
                        (vc-name file) "-n" (if rev (concat "-r" rev)))
@@ -325,7 +323,7 @@ revert all subfiles."
 (defun vc-sccs-modify-change-comment (files rev comment)
   "Modify (actually, append to) the change comments for FILES on a specified REV."
   (dolist (file (vc-expand-dirs files))
-    (vc-sccs-do-command nil 0 "cdc" (vc-name file) 
+    (vc-sccs-do-command nil 0 "cdc" (vc-name file)
                         (concat "-y" comment) (concat "-r" rev))))
 
 \f
@@ -352,12 +350,20 @@ revert all subfiles."
 
 \f
 ;;;
-;;; Snapshot system
+;;; Tag system.  SCCS doesn't have tags, so we simulate them by maintaining
+;;; our own set of name-to-revision mappings.
 ;;;
 
-(defun vc-sccs-assign-name (file name)
-  "Assign to FILE's latest revision a given NAME."
-  (vc-sccs-add-triple name file (vc-working-revision file)))
+(defun vc-sccs-create-tag (backend dir name branchp)
+  (when branchp
+    (error "SCCS backend %s does not support module branches" backend))
+  (let ((result (vc-tag-precondition dir)))
+    (if (stringp result)
+       (error "File %s is not up-to-date" result)
+      (vc-file-tree-walk
+       dir
+       (lambda (f)
+        (vc-sccs-add-triple name f (vc-working-revision f)))))))
 
 \f
 ;;;
@@ -373,7 +379,7 @@ revert all subfiles."
 (defun vc-sccs-rename-file (old new)
   ;; Move the master file (using vc-rcs-master-templates).
   (vc-rename-master (vc-name old) new vc-sccs-master-templates)
-  ;; Update the snapshot file.
+  ;; Update the tag file.
   (with-current-buffer
       (find-file-noselect
        (expand-file-name vc-sccs-name-assoc-file
@@ -385,14 +391,18 @@ revert all subfiles."
     (basic-save-buffer)
     (kill-buffer (current-buffer))))
 
+(defun vc-sccs-find-file-hook ()
+  ;; If the file is locked by some other user, make
+  ;; the buffer read-only.  Like this, even root
+  ;; cannot modify a file that someone else has locked.
+  (and (stringp (vc-state buffer-file-name 'SCCS))
+       (setq buffer-read-only t)))
+
 \f
 ;;;
 ;;; Internal functions
 ;;;
 
-(defun vc-sccs-root (dir)
-  (vc-find-root dir "SCCS" t))
-
 ;; This function is wrapped with `progn' so that the autoload cookie
 ;; copies the whole function itself into loaddefs.el rather than just placing
 ;; a (autoload 'vc-sccs-search-project-dir "vc-sccs") which would not
@@ -446,7 +456,7 @@ The result is a list of the form ((REVISION . USER) (REVISION . USER) ...)."
     (kill-buffer (current-buffer))))
 
 (defun vc-sccs-lookup-triple (file name)
-  "Return the numeric revision corresponding to a named snapshot of FILE.
+  "Return the numeric revision corresponding to a named tag of FILE.
 If NAME is nil or a revision number string it's just passed through."
   (if (or (null name)
          (let ((firstchar (aref name 0)))