]> code.delx.au - gnu-emacs/blobdiff - lisp/vc-sccs.el
(rmail-ignored-headers, rmail-displayed-headers)
[gnu-emacs] / lisp / vc-sccs.el
index d6e50defdd8a7cc0099f901fb7395bad674c34a8..7628a802677d48490936f45d94b25abae0bb5739 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))
@@ -152,14 +151,20 @@ For a description of possible values, see `vc-check-master-templates'."
     (vc-sccs-state file)))
 
 (defun vc-sccs-dir-status (dir update-function)
-  ;; Doing lots of individual VC-state calls is painful, but 
+  ;; FIXME: this function should be rewritten, using `vc-expand-dirs'
+  ;; is not TRTD because it returns files from multiple backends.
+  ;; It should also return 'unregistered files.
+
+  ;; Doing lots of individual VC-state calls is painful, but
   ;; there is no better option in SCCS-land.
   (let ((flist (vc-expand-dirs (list dir)))
        (result nil))
     (dolist (file flist)
       (let ((state (vc-state file))
            (frel (file-relative-name file)))
-       (push (list frel state) result)))
+       (when (and (eq (vc-backend file) 'SCCS)
+                  (not (eq state 'up-to-date)))
+         (push (list frel state) result))))
     (funcall update-function result)))
 
 (defun vc-sccs-working-revision (file)
@@ -174,7 +179,7 @@ For a description of possible values, see `vc-check-master-templates'."
 
 (defun vc-sccs-workfile-unchanged-p (file)
   "SCCS-specific implementation of `vc-workfile-unchanged-p'."
-  (zerop (apply 'vc-do-command nil 1 "vcdiff" (vc-name file)
+  (zerop (apply 'vc-do-command "*vc*" 1 "vcdiff" (vc-name file)
                 (list "--brief" "-q"
                       (concat "-r" (vc-working-revision file))))))
 
@@ -186,7 +191,7 @@ For a description of possible values, see `vc-check-master-templates'."
 (defun vc-sccs-do-command (buffer okstatus command file-or-list &rest flags)
   ;; (let ((load-path (append vc-sccs-path load-path)))
   ;;   (apply 'vc-do-command buffer okstatus command file-or-list flags))
-  (apply 'vc-do-command buffer okstatus "sccs" file-or-list command flags))
+  (apply 'vc-do-command (or buffer "*vc*") okstatus "sccs" file-or-list command flags))
 
 (defun vc-sccs-create-repo ()
   "Create a new SCCS repository."
@@ -197,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."
@@ -252,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)
@@ -287,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)
@@ -298,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))
@@ -309,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)))
@@ -319,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
@@ -346,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
 ;;;
@@ -367,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
@@ -384,9 +396,6 @@ revert all subfiles."
 ;;; 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
@@ -440,7 +449,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)))