changeset 12967:ee545522ef2a

(vc-utc-string): New function. (vc-find-cvs-master): Use it to compare mtime and checkout time. (vc-locking-user): CVS case: *only* use checkout time. (vc-find-cvs-master): Don't attempt to find the RCS master file. Throw the full name of CVS/Entries. (vc-name): Doc change (special CVS case). (vc-after-save): Handle the case when a file is saved in the very second in which it was checked out.
author André Spiegel <spiegel@gnu.org>
date Tue, 29 Aug 1995 10:47:45 +0000
parents ce60b1a64399
children a0d985336555
files lisp/vc-hooks.el
diffstat 1 files changed, 51 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/vc-hooks.el	Tue Aug 29 04:36:12 1995 +0000
+++ b/lisp/vc-hooks.el	Tue Aug 29 10:47:45 1995 +0000
@@ -454,7 +454,8 @@
     (setq vc-default-back-end (if (vc-find-binary "rcs") 'RCS 'SCCS)))))
 
 (defun vc-name (file)
-  "Return the master name of a file, nil if it is not registered."
+  "Return the master name of a file, nil if it is not registered.
+For CVS, the full name of CVS/Entries is returned."
   (or (vc-file-getprop file 'vc-name)
       (let ((name-and-type (vc-registered file)))
 	(if name-and-type
@@ -587,10 +588,10 @@
        ((eq (vc-backend file) 'CVS)
 	(or (and (eq (vc-checkout-model file) 'manual)
 		 (vc-lock-from-permissions file))
-	    (if (or (eq (vc-cvs-status file) 'up-to-date)
-		    (eq (vc-cvs-status file) 'needs-checkout))
-		(vc-file-setprop file 'vc-locking-user 'none)
-	      (vc-file-setprop file 'vc-locking-user (vc-file-owner file)))))
+	    (and (equal (vc-file-getprop file 'vc-checkout-time)
+			(nth 5 (file-attributes file)))
+		 (vc-file-setprop file 'vc-locking-user 'none))
+	    (vc-file-setprop file 'vc-locking-user (vc-file-owner file))))
 
        ((eq (vc-backend file) 'RCS)
 	(let (p-lock)
@@ -730,18 +731,32 @@
 	   vc-master-templates)
 	  nil)))))
 
+(defun vc-utc-string (timeval)
+  ;; Convert a time value into universal time, and return it as a
+  ;; human-readable string.  This is to compare CVS checkout times
+  ;; with file modification times.
+  (let (utc (high (car timeval)) (low  (nth 1 timeval))
+	(offset (car (current-time-zone))))
+    (setq low (- low offset))
+    (setq utc (if (> low 65535) 
+		  (list (1+ high) (- low 65536))
+		(if (< low 0)
+		    (list (1- high) (+ 65536 low))
+		  (list high low))))
+    (current-time-string utc)))
+	  
 (defun vc-find-cvs-master (dirname basename)
   ;; Check if DIRNAME/BASENAME is handled by CVS.
   ;; If it is, do a (throw 'found (cons MASTER 'CVS)).
-  ;; Note: If the file is ``cvs add''ed but not yet ``cvs commit''ed 
-  ;; the MASTER will not actually exist yet.  The other parts of VC
-  ;; checks for this condition.  This function returns nil if 
-  ;; DIRNAME/BASENAME is not handled by CVS.
+  ;; Note: This function throws the name of CVS/Entries
+  ;; NOT that of the RCS master file (because we wouldn't be able
+  ;; to access it under remote CVS).
+  ;; The function returns nil if DIRNAME/BASENAME is not handled by CVS.
   (if (and vc-handle-cvs
 	   (file-directory-p (concat dirname "CVS/"))
-	   (file-readable-p (concat dirname "CVS/Entries"))
-	   (file-readable-p (concat dirname "CVS/Repository")))
-      (let (buffer (fold case-fold-search))
+	   (file-readable-p (concat dirname "CVS/Entries")))
+      (let (buffer time (fold case-fold-search)
+	    (file (concat dirname basename)))
 	(unwind-protect
 	    (save-excursion
 	      (setq buffer (set-buffer (get-buffer-create "*vc-info*")))
@@ -752,23 +767,22 @@
 	      (setq case-fold-search nil)
 	      (cond
 	       ((re-search-forward
-		 (concat "^/" (regexp-quote basename) "/\\([^/]*\\)/")
+		 (concat "^/" (regexp-quote basename) 
+			 "/\\([^/]*\\)/\\([^/]*\\)/")
 		 nil t)
 		(setq case-fold-search fold)  ;; restore the old value
-		;; We found it.  Store away version number, now
-		;; that we are anyhow so close to finding it.
-		(vc-file-setprop (concat dirname basename) 
+		;; We found it.  Store away version number now that we 
+		;; are anyhow so close to finding it.
+		(vc-file-setprop file
 				 'vc-workfile-version
-				 (buffer-substring (match-beginning 1)
-						   (match-end 1)))
-		(vc-insert-file (concat dirname "CVS/Repository"))
-		(let ((master
-		       (concat (file-name-as-directory 
-				(buffer-substring (point-min)
-						  (1- (point-max))))
-			       basename
-			       ",v")))
-		  (throw 'found (cons master 'CVS))))
+				 (match-string 1))
+		;; If the file hasn't been modified since checkout,
+		;; store the checkout-time.
+		(setq mtime (nth 5 (file-attributes file)))
+		(if (string= (match-string 2) (vc-utc-string mtime))
+		    (vc-file-setprop file 'vc-checkout-time mtime)
+		  (vc-file-setprop file 'vc-checkout-time 0))
+		(throw 'found (cons (concat dirname "CVS/Entries") 'CVS)))
 	       (t (setq case-fold-search fold)  ;; restore the old value
 		  nil)))
 	  (kill-buffer buffer)))))
@@ -803,13 +817,20 @@
 	 ;; The property is computed when the file is visited, so if it
 	 ;; is `nil' now, it is certain that the file is NOT 
 	 ;; version-controlled.
+	 (or (and (equal (vc-file-getprop file 'vc-checkout-time)
+			 (nth 5 (file-attributes file)))
+		  ;; File has been saved in the same second in which
+		  ;; it was checked out.  Clear the checkout-time
+		  ;; to avoid confusion.
+		  (vc-file-setprop file 'vc-checkout-time nil))
+	     t)
 	 (not (vc-locking-user file))
 	 (eq (vc-checkout-model file) 'implicit)
 	 (vc-file-setprop file 'vc-locking-user (user-login-name))
-	 (progn
-	   (and (eq (vc-backend file) 'CVS) 
-		(vc-file-setprop file 'vc-cvs-status nil))
-	   (vc-mode-line file)))))
+	 (or (and (eq (vc-backend file) 'CVS) 
+		  (vc-file-setprop file 'vc-cvs-status nil))
+	     t)
+	 (vc-mode-line file))))
 
 (defun vc-mode-line (file &optional label)
   "Set `vc-mode' to display type of version control for FILE.