]> code.delx.au - gnu-emacs/blobdiff - lisp/vc-rcs.el
tag of miles@gnu.org--gnu-2003/emacs--cvs-trunk--0--patch-137
[gnu-emacs] / lisp / vc-rcs.el
index 9a4c4e89dd7afe3c4d445676290d911fac10dc28..1e86d0a06df4ff8f8b91feeed7cba30333b04a41 100644 (file)
@@ -5,7 +5,7 @@
 ;; Author:     FSF (see vc.el for full credits)
 ;; Maintainer: Andre Spiegel <spiegel@gnu.org>
 
-;; $Id: vc-rcs.el,v 1.28 2002/10/08 15:33:18 monnier Exp $
+;; $Id: vc-rcs.el,v 1.38 2003/09/01 15:45:17 miles Exp $
 
 ;; This file is part of GNU Emacs.
 
@@ -99,8 +99,13 @@ For a description of possible values, see `vc-check-master-templates'."
 ;;; State-querying functions
 ;;;
 
-;;;###autoload
-(progn (defun vc-rcs-registered (f) (vc-default-registered 'RCS f)))
+;;; The autoload cookie below places vc-rcs-registered directly into
+;;; loaddefs.el, so that vc-rcs.el does not need to be loaded for
+;;; every file that is visited.  The definition is repeated below
+;;; so that Help and etags can find it.
+
+;;;###autoload (defun vc-rcs-registered (f) (vc-default-registered 'RCS f))
+(defun vc-rcs-registered (f) (vc-default-registered 'RCS f))
 
 (defun vc-rcs-state (file)
   "Implementation of `vc-state' for RCS."
@@ -138,9 +143,9 @@ For a description of possible values, see `vc-check-master-templates'."
               (cond
                ((string-match ".rw..-..-." (nth 8 (file-attributes file)))
                 (vc-file-setprop file 'vc-checkout-model 'implicit)
-               (setq state 
-                     (if (vc-rcs-workfile-is-newer file) 
-                         'edited 
+               (setq state
+                     (if (vc-rcs-workfile-is-newer file)
+                         'edited
                        'up-to-date)))
                ((string-match ".r-..-..-." (nth 8 (file-attributes file)))
                 (vc-file-setprop file 'vc-checkout-model 'locking))))
@@ -157,7 +162,7 @@ For a description of possible values, see `vc-check-master-templates'."
                       (if (file-ownership-preserved-p file)
                           'edited
                         (vc-user-login-name owner-uid))
-                    (if (vc-rcs-workfile-is-newer file) 
+                    (if (vc-rcs-workfile-is-newer file)
                         'edited
                       'up-to-date)))
                   (t
@@ -230,15 +235,7 @@ the RCS command (in that order).
 
 Automatically retrieve a read-only version of the file with keywords
 expanded if `vc-keep-workfiles' is non-nil, otherwise, delete the workfile."
-    (let ((subdir (expand-file-name "RCS" (file-name-directory file)))
-         (switches (append
-                    (if (stringp vc-register-switches)
-                        (list vc-register-switches)
-                      vc-register-switches)
-                    (if (stringp vc-rcs-register-switches)
-                    (list vc-rcs-register-switches)
-                    vc-rcs-register-switches))))
-      
+    (let ((subdir (expand-file-name "RCS" (file-name-directory file))))
       (and (not (file-exists-p subdir))
           (not (directory-files (file-name-directory file)
                                 nil ".*,v$" t))
@@ -249,7 +246,7 @@ expanded if `vc-keep-workfiles' is non-nil, otherwise, delete the workfile."
             (and (vc-rcs-release-p "5.6.4") "-i")
             (concat (if vc-keep-workfiles "-u" "-r") rev)
             (and comment (concat "-t-" comment))
-            switches)
+            (vc-switches 'RCS 'register))
       ;; parse output to find master file name and workfile version
       (with-current-buffer "*vc*"
         (goto-char (point-min))
@@ -300,19 +297,17 @@ whether to remove it."
     (and (string= (file-name-nondirectory (directory-file-name dir)) "RCS")
         ;; check whether RCS dir is empty, i.e. it does not
         ;; contain any files except "." and ".."
-        (not (directory-files dir nil 
+        (not (directory-files dir nil
                               "^\\([^.]\\|\\.[^.]\\|\\.\\.[^.]\\).*"))
         (yes-or-no-p (format "Directory %s is empty; remove it? " dir))
         (delete-directory dir))))
 
 (defun vc-rcs-checkin (file rev comment)
   "RCS-specific version of `vc-backend-checkin'."
-  (let ((switches (if (stringp vc-checkin-switches)
-                     (list vc-checkin-switches)
-                   vc-checkin-switches)))
+  (let ((switches (vc-switches 'RCS 'checkin)))
     (let ((old-version (vc-workfile-version file)) new-version
          (default-branch (vc-file-getprop file 'vc-rcs-default-branch)))
-      ;; Force branch creation if an appropriate 
+      ;; Force branch creation if an appropriate
       ;; default branch has been set.
       (and (not rev)
           default-branch
@@ -320,6 +315,8 @@ whether to remove it."
                         default-branch)
           (setq rev default-branch)
           (setq switches (cons "-f" switches)))
+      (if (and (not rev) old-version)
+          (setq rev (vc-branch-part old-version)))
       (apply 'vc-do-command nil 0 "ci" (vc-name file)
             ;; if available, use the secure check-in option
             (and (vc-rcs-release-p "5.6.4") "-j")
@@ -344,7 +341,7 @@ whether to remove it."
        ((and old-version new-version
             (not (string= (vc-branch-part old-version)
                           (vc-branch-part new-version))))
-       (vc-rcs-set-default-branch file 
+       (vc-rcs-set-default-branch file
                                   (if (vc-trunk-p new-version) nil
                                     (vc-branch-part new-version)))
        ;; If this is an old RCS release, we might have
@@ -360,9 +357,7 @@ whether to remove it."
         buffer 0 "co" (vc-name file)
         "-q" ;; suppress diagnostic output
         (concat "-p" rev)
-        (if (stringp vc-checkout-switches)
-            (list vc-checkout-switches)
-          vc-checkout-switches)))
+        (vc-switches 'RCS 'checkout)))
 
 (defun vc-rcs-checkout (file &optional editable rev)
   "Retrieve a copy of a saved version of FILE."
@@ -372,9 +367,7 @@ whether to remove it."
     (save-excursion
       ;; Change buffers to get local value of vc-checkout-switches.
       (if file-buffer (set-buffer file-buffer))
-      (setq switches (if (stringp vc-checkout-switches)
-                        (list vc-checkout-switches)
-                      vc-checkout-switches))
+      (setq switches (vc-switches 'RCS 'checkout))
       ;; Save this buffer's default-directory
       ;; and use save-excursion to make sure it is restored
       ;; in the same buffer it was saved in.
@@ -395,12 +388,24 @@ whether to remove it."
                   ;; the writable workfile.
                   (if (eq (vc-checkout-model file) 'implicit) "-f")
                   (if editable "-l")
-                  (if rev (concat "-r" rev)
-                    ;; if no explicit revision was specified,
-                    ;; check out that of the working file
-                    (let ((workrev (vc-workfile-version file)))
-                      (if workrev (concat "-r" workrev)
-                        nil)))
+                   (if (stringp rev)
+                       ;; a literal revision was specified
+                       (concat "-r" rev)
+                     (let ((workrev (vc-workfile-version file)))
+                       (if workrev
+                           (concat "-r"
+                                   (if (not rev)
+                                       ;; no revision specified:
+                                       ;; use current workfile version
+                                       workrev
+                                     ;; REV is t ...
+                                     (if (not (vc-trunk-p workrev))
+                                         ;; ... go to head of current branch
+                                         (vc-branch-part workrev)
+                                       ;; ... go to head of trunk
+                                       (vc-rcs-set-default-branch file
+                                                                  nil)
+                                       ""))))))
                   switches)
            ;; determine the new workfile version
            (with-current-buffer "*vc*"
@@ -420,7 +425,8 @@ whether to remove it."
 (defun vc-rcs-revert (file &optional contents-done)
   "Revert FILE to the version it was based on."
   (vc-do-command nil 0 "co" (vc-name file) "-f"
-                (concat "-u" (vc-workfile-version file))))
+                 (concat (if (eq (vc-state file) 'edited) "-u" "-r")
+                         (vc-workfile-version file))))
 
 (defun vc-rcs-cancel-version (file editable)
   "Undo the most recent checkin of FILE.
@@ -463,7 +469,7 @@ The changes are between FIRST-VERSION and SECOND-VERSION."
   "Steal the lock on the current workfile for FILE and revision REV.
 Needs RCS 5.6.2 or later for -M."
   (vc-do-command nil 0 "rcs" (vc-name file) "-M" (concat "-u" rev))
-  ;; Do a real checkout after stealing the lock, so that we see 
+  ;; Do a real checkout after stealing the lock, so that we see
   ;; expanded headers.
   (vc-do-command nil 0 "co" (vc-name file) "-f" (concat "-l" rev)))
 
@@ -484,7 +490,7 @@ Needs RCS 5.6.2 or later for -M."
          (append (list "-q"
                        (concat "-r" oldvers)
                        (and newvers (concat "-r" newvers)))
-                 (vc-diff-switches-list 'RCS))))
+                 (vc-switches 'RCS 'diff))))
 
 \f
 ;;;
@@ -776,4 +782,5 @@ variable `vc-rcs-release' is set to the returned value."
 
 (provide 'vc-rcs)
 
+;;; arch-tag: 759b4916-5b0d-431d-b647-b185b8c652cf
 ;;; vc-rcs.el ends here