[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/vc-cvs.el [lexbind]
From: |
Miles Bader |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/vc-cvs.el [lexbind] |
Date: |
Tue, 14 Oct 2003 19:52:32 -0400 |
Index: emacs/lisp/vc-cvs.el
diff -c emacs/lisp/vc-cvs.el:1.41.2.1 emacs/lisp/vc-cvs.el:1.41.2.2
*** emacs/lisp/vc-cvs.el:1.41.2.1 Fri Apr 4 01:20:11 2003
--- emacs/lisp/vc-cvs.el Tue Oct 14 19:51:27 2003
***************
*** 1,11 ****
;;; vc-cvs.el --- non-resident support for CVS version-control
! ;; Copyright (C) 1995,98,99,2000,2001,2002 Free Software Foundation, Inc.
;; Author: FSF (see vc.el for full credits)
;; Maintainer: Andre Spiegel <address@hidden>
! ;; $Id: vc-cvs.el,v 1.41.2.1 2003/04/04 06:20:11 miles Exp $
;; This file is part of GNU Emacs.
--- 1,11 ----
;;; vc-cvs.el --- non-resident support for CVS version-control
! ;; Copyright (C) 1995,98,99,2000,2001,02,2003 Free Software Foundation, Inc.
;; Author: FSF (see vc.el for full credits)
;; Maintainer: Andre Spiegel <address@hidden>
! ;; $Id: vc-cvs.el,v 1.41.2.2 2003/10/14 23:51:27 miles Exp $
;; This file is part of GNU Emacs.
***************
*** 85,95 ****
"*Non-nil means use local operations when possible for remote repositories.
This avoids slow queries over the network and instead uses heuristics
and past information to determine the current status of a file.
! The value can also be a regular expression to match against the host name
! of a repository; then VC only stays local for hosts that match it."
:type '(choice (const :tag "Always stay local" t)
! (string :tag "Host regexp")
! (const :tag "Don't stay local" nil))
:version "21.1"
:group 'vc)
--- 85,103 ----
"*Non-nil means use local operations when possible for remote repositories.
This avoids slow queries over the network and instead uses heuristics
and past information to determine the current status of a file.
!
! The value can also be a regular expression or list of regular
! expressions to match against the host name of a repository; then VC
! only stays local for hosts that match it. Alternatively, the value
! can be a list of regular expressions where the first element is the
! symbol `except'; then VC always stays local except for hosts matched
! by these regular expressions."
:type '(choice (const :tag "Always stay local" t)
! (const :tag "Don't stay local" nil)
! (list :format "\nExamine hostname and %v" :tag "Examine
hostname ..."
! (set :format "%v" :inline t (const :format "%t" :tag
"don't" except))
! (regexp :format " stay local,\n%t: %v" :tag "if it
matches")
! (repeat :format "%v%i\n" :inline t (regexp :tag
"or"))))
:version "21.1"
:group 'vc)
***************
*** 169,175 ****
(case-fold-search nil))
(if (file-readable-p (expand-file-name "CVS/Entries" dirname))
(with-temp-buffer
! (vc-insert-file (expand-file-name "CVS/Entries" dirname))
(goto-char (point-min))
(cond
((re-search-forward
--- 177,183 ----
(case-fold-search nil))
(if (file-readable-p (expand-file-name "CVS/Entries" dirname))
(with-temp-buffer
! (vc-cvs-get-entries dirname)
(goto-char (point-min))
(cond
((re-search-forward
***************
*** 183,189 ****
(defun vc-cvs-state (file)
"CVS-specific version of `vc-state'."
! (if (vc-cvs-stay-local-p file)
(let ((state (vc-file-getprop file 'vc-state)))
;; If we should stay local, use the heuristic but only if
;; we don't have a more precise state already available.
--- 191,197 ----
(defun vc-cvs-state (file)
"CVS-specific version of `vc-state'."
! (if (vc-stay-local-p file)
(let ((state (vc-file-getprop file 'vc-state)))
;; If we should stay local, use the heuristic but only if
;; we don't have a more precise state already available.
***************
*** 207,227 ****
(defun vc-cvs-dir-state (dir)
"Find the CVS state of all files in DIR."
! ;; if DIR is not under CVS control, don't do anything
! (if (file-readable-p (expand-file-name "CVS/Entries" dir))
! (if (vc-cvs-stay-local-p dir)
! (vc-cvs-dir-state-heuristic dir)
! (let ((default-directory dir))
! ;; Don't specify DIR in this command, the default-directory is
! ;; enough. Otherwise it might fail with remote repositories.
! (with-temp-buffer
! (vc-do-command t 0 "cvs" nil "status" "-l")
! (goto-char (point-min))
! (while (re-search-forward "^=+\n\\([^=\n].*\n\\|\n\\)+" nil t)
! (narrow-to-region (match-beginning 0) (match-end 0))
! (vc-cvs-parse-status)
! (goto-char (point-max))
! (widen)))))))
(defun vc-cvs-workfile-version (file)
"CVS-specific version of `vc-workfile-version'."
--- 215,235 ----
(defun vc-cvs-dir-state (dir)
"Find the CVS state of all files in DIR."
! ;; if DIR is not under CVS control, don't do anything.
! (when (file-readable-p (expand-file-name "CVS/Entries" dir))
! (if (vc-stay-local-p dir)
! (vc-cvs-dir-state-heuristic dir)
! (let ((default-directory dir))
! ;; Don't specify DIR in this command, the default-directory is
! ;; enough. Otherwise it might fail with remote repositories.
! (with-temp-buffer
! (vc-cvs-command t 0 nil "status" "-l")
! (goto-char (point-min))
! (while (re-search-forward "^=+\n\\([^=\n].*\n\\|\n\\)+" nil t)
! (narrow-to-region (match-beginning 0) (match-end 0))
! (vc-cvs-parse-status)
! (goto-char (point-max))
! (widen)))))))
(defun vc-cvs-workfile-version (file)
"CVS-specific version of `vc-workfile-version'."
***************
*** 249,285 ****
Compared to the default implementation, this function does two things:
Handle the special case of a CVS file that is added but not yet
committed and support display of sticky tags."
! (let* ((state (vc-state file))
! (rev (vc-workfile-version file))
! (sticky-tag (vc-file-getprop file 'vc-cvs-sticky-tag))
! (sticky-tag-printable (and sticky-tag
! (not (string= sticky-tag ""))
! (concat "[" sticky-tag "]"))))
! (cond ((string= rev "0")
! ;; A file that is added but not yet committed.
! "CVS @@")
! ((or (eq state 'up-to-date)
! (eq state 'needs-patch))
! (concat "CVS-" rev sticky-tag-printable))
! ((stringp state)
! (concat "CVS:" state ":" rev sticky-tag-printable))
! (t
! ;; Not just for the 'edited state, but also a fallback
! ;; for all other states. Think about different symbols
! ;; for 'needs-patch and 'needs-merge.
! (concat "CVS:" rev sticky-tag-printable)))))
(defun vc-cvs-dired-state-info (file)
"CVS-specific version of `vc-dired-state-info'."
! (let* ((cvs-state (vc-state file))
! (state (cond ((eq cvs-state 'edited) "modified")
! ((eq cvs-state 'needs-patch) "patch")
! ((eq cvs-state 'needs-merge) "merge")
! ;; FIXME: those two states cannot occur right now
! ((eq cvs-state 'unlocked-changes) "conflict")
! ((eq cvs-state 'locally-added) "added")
! )))
! (if state (concat "(" state ")"))))
;;;
--- 257,279 ----
Compared to the default implementation, this function does two things:
Handle the special case of a CVS file that is added but not yet
committed and support display of sticky tags."
! (let ((sticky-tag (vc-file-getprop file 'vc-cvs-sticky-tag))
! (string (if (string= (vc-workfile-version file) "0")
! ;; A file that is added but not yet committed.
! "CVS @@"
! (vc-default-mode-line-string 'CVS file))))
! (if (zerop (length sticky-tag))
! string
! (concat string "[" sticky-tag "]"))))
(defun vc-cvs-dired-state-info (file)
"CVS-specific version of `vc-dired-state-info'."
! (let ((cvs-state (vc-state file)))
! (cond ((eq cvs-state 'edited)
! (if (equal (vc-workfile-version file) "0")
! "(added)" "(modified)"))
! ((eq cvs-state 'needs-patch) "(patch)")
! ((eq cvs-state 'needs-merge) "(merge)"))))
;;;
***************
*** 292,310 ****
`vc-register-switches' and `vc-cvs-register-switches' are passed to
the CVS command (in that order)."
! (let ((switches (append
! (if (stringp vc-register-switches)
! (list vc-register-switches)
! vc-register-switches)
! (if (stringp vc-cvs-register-switches)
! (list vc-cvs-register-switches)
! vc-cvs-register-switches))))
!
! (apply 'vc-cvs-command nil 0 file
! "add"
! (and comment (string-match "[^\t\n ]" comment)
! (concat "-m" comment))
! switches)))
(defun vc-cvs-responsible-p (file)
"Return non-nil if CVS thinks it is responsible for FILE."
--- 286,300 ----
`vc-register-switches' and `vc-cvs-register-switches' are passed to
the CVS command (in that order)."
! (when (and (not (vc-cvs-responsible-p file))
! (vc-cvs-could-register file))
! ;; Register the directory if needed.
! (vc-cvs-register (directory-file-name (file-name-directory file))))
! (apply 'vc-cvs-command nil 0 file
! "add"
! (and comment (string-match "[^\t\n ]" comment)
! (concat "-m" comment))
! (vc-switches 'CVS 'register)))
(defun vc-cvs-responsible-p (file)
"Return non-nil if CVS thinks it is responsible for FILE."
***************
*** 315,345 ****
(defun vc-cvs-could-register (file)
"Return non-nil if FILE could be registered in CVS.
! This is only possible if CVS is responsible for FILE's directory."
! (vc-cvs-responsible-p file))
(defun vc-cvs-checkin (file rev comment)
"CVS-specific version of `vc-backend-checkin'."
! (let ((switches (if (stringp vc-checkin-switches)
! (list vc-checkin-switches)
! vc-checkin-switches))
! status)
! (if (or (not rev) (vc-cvs-valid-version-number-p rev))
! (setq status (apply 'vc-cvs-command nil 1 file
! "ci" (if rev (concat "-r" rev))
! (concat "-m" comment)
! switches))
! (if (not (vc-cvs-valid-symbolic-tag-name-p rev))
! (error "%s is not a valid symbolic tag name" rev)
! ;; If the input revison is a valid symbolic tag name, we create it
! ;; as a branch, commit and switch to it.
! (apply 'vc-cvs-command nil 0 file "tag" "-b" (list rev))
! (apply 'vc-cvs-command nil 0 file "update" "-r" (list rev))
! (setq status (apply 'vc-cvs-command nil 1 file
! "ci"
! (concat "-m" comment)
! switches))
! (vc-file-setprop file 'vc-cvs-sticky-tag rev)))
(set-buffer "*vc*")
(goto-char (point-min))
(when (not (zerop status))
--- 305,335 ----
(defun vc-cvs-could-register (file)
"Return non-nil if FILE could be registered in CVS.
! This is only possible if CVS is managing FILE's directory or one of
! its parents."
! (let ((dir file))
! (while (and (stringp dir)
! (not (equal dir (setq dir (file-name-directory dir))))
! dir)
! (setq dir (if (file-directory-p
! (expand-file-name "CVS/Entries" dir))
! t (directory-file-name dir))))
! (eq dir t)))
(defun vc-cvs-checkin (file rev comment)
"CVS-specific version of `vc-backend-checkin'."
! (unless (or (not rev) (vc-cvs-valid-version-number-p rev))
! (if (not (vc-cvs-valid-symbolic-tag-name-p rev))
! (error "%s is not a valid symbolic tag name" rev)
! ;; If the input revison is a valid symbolic tag name, we create it
! ;; as a branch, commit and switch to it.
! (apply 'vc-cvs-command nil 0 file "tag" "-b" (list rev))
! (apply 'vc-cvs-command nil 0 file "update" "-r" (list rev))
! (vc-file-setprop file 'vc-cvs-sticky-tag rev)))
! (let ((status (apply 'vc-cvs-command nil 1 file
! "ci" (if rev (concat "-r" rev))
! (concat "-m" comment)
! (vc-switches 'CVS 'checkin))))
(set-buffer "*vc*")
(goto-char (point-min))
(when (not (zerop status))
***************
*** 378,386 ****
(and rev (not (string= rev ""))
(concat "-r" rev))
"-p"
! (if (stringp vc-checkout-switches)
! (list vc-checkout-switches)
! vc-checkout-switches)))
(defun vc-cvs-checkout (file &optional editable rev workfile)
"Retrieve a revision of FILE into a WORKFILE.
--- 368,374 ----
(and rev (not (string= rev ""))
(concat "-r" rev))
"-p"
! (vc-switches 'CVS 'checkout)))
(defun vc-cvs-checkout (file &optional editable rev workfile)
"Retrieve a revision of FILE into a WORKFILE.
***************
*** 393,401 ****
(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))
;; Save this buffer's default-directory
;; and use save-excursion to make sure it is restored
;; in the same buffer it was saved in.
--- 381,387 ----
(save-excursion
;; Change buffers to get local value of vc-checkout-switches.
(if file-buffer (set-buffer file-buffer))
! (setq switches (vc-switches 'CVS '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.
***************
*** 441,447 ****
(if (and (file-exists-p file) (not rev))
;; If no revision was specified, just make the file writable
;; if necessary (using `cvs-edit' if requested).
! (and editable (not (eq (vc-cvs-checkout-model file)
'implicit))
(if vc-cvs-use-edit
(vc-cvs-command nil 0 file "edit")
(set-file-modes file (logior (file-modes file) 128))
--- 427,433 ----
(if (and (file-exists-p file) (not rev))
;; If no revision was specified, just make the file writable
;; if necessary (using `cvs-edit' if requested).
! (and editable (not (eq (vc-cvs-checkout-model file) 'implicit))
(if vc-cvs-use-edit
(vc-cvs-command nil 0 file "edit")
(set-file-modes file (logior (file-modes file) 128))
***************
*** 455,469 ****
'implicit)))
"-w")
"update"
! ;; default for verbose checkout: clear the sticky tag so
! ;; that the actual update will get the head of the trunk
! (if (or (not rev) (eq rev t) (string= rev ""))
! "-A"
! (concat "-r" rev))
switches))))
(vc-mode-line file)
(message "Checking out %s...done" filename)))))
(defun vc-cvs-revert (file &optional contents-done)
"Revert FILE to the version it was based on."
(unless contents-done
--- 441,461 ----
'implicit)))
"-w")
"update"
! (when rev
! (unless (eq rev t)
! ;; default for verbose checkout: clear the
! ;; sticky tag so that the actual update will
! ;; get the head of the trunk
! (if (string= rev "")
! "-A"
! (concat "-r" rev))))
switches))))
(vc-mode-line file)
(message "Checking out %s...done" filename)))))
+ (defun vc-cvs-delete-file (file)
+ (vc-cvs-command nil 0 file "remove" "-f"))
+
(defun vc-cvs-revert (file &optional contents-done)
"Revert FILE to the version it was based on."
(unless contents-done
***************
*** 484,491 ****
(concat "-j" first-version)
(concat "-j" second-version))
(vc-file-setprop file 'vc-state 'edited)
! (save-excursion
! (set-buffer (get-buffer "*vc*"))
(goto-char (point-min))
(if (re-search-forward "conflicts during merge" nil t)
1 ; signal error
--- 476,482 ----
(concat "-j" first-version)
(concat "-j" second-version))
(vc-file-setprop file 'vc-state 'edited)
! (with-current-buffer (get-buffer "*vc*")
(goto-char (point-min))
(if (re-search-forward "conflicts during merge" nil t)
1 ; signal error
***************
*** 494,512 ****
(defun vc-cvs-merge-news (file)
"Merge in any new changes made to FILE."
(message "Merging changes into %s..." file)
! (save-excursion
! ;; (vc-file-setprop file 'vc-workfile-version nil)
! (vc-file-setprop file 'vc-checkout-time 0)
! (vc-cvs-command nil 0 file "update")
! ;; Analyze the merge result reported by CVS, and set
! ;; file properties accordingly.
! (set-buffer (get-buffer "*vc*"))
(goto-char (point-min))
;; get new workfile version
! (if (re-search-forward (concat "^Merging differences between "
! "[01234567890.]* and "
! "\\([01234567890.]*\\) into")
! nil t)
(vc-file-setprop file 'vc-workfile-version (match-string 1))
(vc-file-setprop file 'vc-workfile-version nil))
;; get file status
--- 485,500 ----
(defun vc-cvs-merge-news (file)
"Merge in any new changes made to FILE."
(message "Merging changes into %s..." file)
! ;; (vc-file-setprop file 'vc-workfile-version nil)
! (vc-file-setprop file 'vc-checkout-time 0)
! (vc-cvs-command nil 0 file "update")
! ;; Analyze the merge result reported by CVS, and set
! ;; file properties accordingly.
! (with-current-buffer (get-buffer "*vc*")
(goto-char (point-min))
;; get new workfile version
! (if (re-search-forward
! "^Merging differences between [0-9.]* and \\([0-9.]*\\) into" nil t)
(vc-file-setprop file 'vc-workfile-version (match-string 1))
(vc-file-setprop file 'vc-workfile-version nil))
;; get file status
***************
*** 549,589 ****
"Get change log associated with FILE."
(vc-cvs-command
nil
! (if (and (vc-cvs-stay-local-p file) (fboundp 'start-process)) 'async 0)
file "log"))
(defun vc-cvs-diff (file &optional oldvers newvers)
"Get a difference report using CVS between two versions of FILE."
! (let (options status (diff-switches-list (vc-diff-switches-list 'CVS)))
! (if (string= (vc-workfile-version file) "0")
! ;; This file is added but not yet committed; there is no master file.
! (if (or oldvers newvers)
! (error "No revisions of %s exist" file)
! ;; We regard this as "changed".
! ;; Diff it against /dev/null.
! ;; Note: this is NOT a "cvs diff".
! (apply 'vc-do-command "*vc-diff*"
! 1 "diff" file
! (append diff-switches-list '("/dev/null"))))
! (setq status
! (apply 'vc-cvs-command "*vc-diff*"
! (if (and (vc-cvs-stay-local-p file)
! (fboundp 'start-process))
! 'async
! 1)
! file "diff"
! (and oldvers (concat "-r" oldvers))
! (and newvers (concat "-r" newvers))
! diff-switches-list))
! (if (vc-cvs-stay-local-p file)
! 1 ;; async diff, pessimistic assumption
! status))))
(defun vc-cvs-diff-tree (dir &optional rev1 rev2)
"Diff all files at and below DIR."
(with-current-buffer "*vc-diff*"
(setq default-directory dir)
! (if (vc-cvs-stay-local-p dir)
;; local diff: do it filewise, and only for files that are modified
(vc-file-tree-walk
dir
--- 537,573 ----
"Get change log associated with FILE."
(vc-cvs-command
nil
! (if (and (vc-stay-local-p file) (fboundp 'start-process)) 'async 0)
file "log"))
(defun vc-cvs-diff (file &optional oldvers newvers)
"Get a difference report using CVS between two versions of FILE."
! (if (string= (vc-workfile-version file) "0")
! ;; This file is added but not yet committed; there is no master file.
! (if (or oldvers newvers)
! (error "No revisions of %s exist" file)
! ;; We regard this as "changed".
! ;; Diff it against /dev/null.
! ;; Note: this is NOT a "cvs diff".
! (apply 'vc-do-command "*vc-diff*"
! 1 "diff" file
! (append (vc-switches nil 'diff) '("/dev/null")))
! ;; Even if it's empty, it's locally modified.
! 1)
! (let* ((async (and (vc-stay-local-p file) (fboundp 'start-process)))
! (status (apply 'vc-cvs-command "*vc-diff*"
! (if async 'async 1)
! file "diff"
! (and oldvers (concat "-r" oldvers))
! (and newvers (concat "-r" newvers))
! (vc-switches 'CVS 'diff))))
! (if async 1 status)))) ; async diff, pessimistic assumption
(defun vc-cvs-diff-tree (dir &optional rev1 rev2)
"Diff all files at and below DIR."
(with-current-buffer "*vc-diff*"
(setq default-directory dir)
! (if (vc-stay-local-p dir)
;; local diff: do it filewise, and only for files that are modified
(vc-file-tree-walk
dir
***************
*** 601,613 ****
(apply 'vc-cvs-command "*vc-diff*" 1 nil "diff"
(and rev1 (concat "-r" rev1))
(and rev2 (concat "-r" rev2))
! (vc-diff-switches-list 'CVS))))))
(defun vc-cvs-annotate-command (file buffer &optional version)
"Execute \"cvs annotate\" on FILE, inserting the contents in BUFFER.
Optional arg VERSION is a version to annotate from."
! (vc-cvs-command buffer 0 file "annotate" (if version
! (concat "-r" version))))
(defun vc-cvs-annotate-current-time ()
"Return the current time, based at midnight of the current day, and
--- 585,596 ----
(apply 'vc-cvs-command "*vc-diff*" 1 nil "diff"
(and rev1 (concat "-r" rev1))
(and rev2 (concat "-r" rev2))
! (vc-switches 'CVS 'diff))))))
(defun vc-cvs-annotate-command (file buffer &optional version)
"Execute \"cvs annotate\" on FILE, inserting the contents in BUFFER.
Optional arg VERSION is a version to annotate from."
! (vc-cvs-command buffer 0 file "annotate" (if version (concat "-r"
version))))
(defun vc-cvs-annotate-current-time ()
"Return the current time, based at midnight of the current day, and
***************
*** 694,702 ****
;;; Miscellaneous
;;;
! (defun vc-cvs-make-version-backups-p (file)
! "Return non-nil if version backups should be made for FILE."
! (vc-cvs-stay-local-p file))
(defun vc-cvs-check-headers ()
"Check if the current file has any headers in it."
--- 677,684 ----
;;; Miscellaneous
;;;
! (defalias 'vc-cvs-make-version-backups-p 'vc-stay-local-p
! "Return non-nil if version backups should be made for FILE.")
(defun vc-cvs-check-headers ()
"Check if the current file has any headers in it."
***************
*** 720,749 ****
(append vc-cvs-global-switches
flags))))
! (defun vc-cvs-stay-local-p (file)
! "Return non-nil if VC should stay local when handling FILE."
! (if vc-cvs-stay-local
! (let* ((dirname (if (file-directory-p file)
! (directory-file-name file)
! (file-name-directory file)))
! (prop
! (or (vc-file-getprop dirname 'vc-cvs-stay-local-p)
! (let ((rootname (expand-file-name "CVS/Root" dirname)))
! (vc-file-setprop
! dirname 'vc-cvs-stay-local-p
! (when (file-readable-p rootname)
! (with-temp-buffer
! (vc-insert-file rootname)
! (goto-char (point-min))
! (if (looking-at "\\([^:]*\\):")
! (if (not (stringp vc-cvs-stay-local))
! 'yes
! (let ((hostname (match-string 1)))
! (if (string-match vc-cvs-stay-local hostname)
! 'yes
! 'no)))
! 'no))))))))
! (if (eq prop 'yes) t nil))))
(defun vc-cvs-parse-status (&optional full)
"Parse output of \"cvs status\" command in the current buffer.
--- 702,781 ----
(append vc-cvs-global-switches
flags))))
! (defalias 'vc-cvs-stay-local-p 'vc-stay-local-p) ;Back-compatibility.
!
! (defun vc-cvs-repository-hostname (dirname)
! "Hostname of the CVS server associated to workarea DIRNAME."
! (let ((rootname (expand-file-name "CVS/Root" dirname)))
! (when (file-readable-p rootname)
! (with-temp-buffer
! (let ((coding-system-for-read
! (or file-name-coding-system
! default-file-name-coding-system)))
! (vc-insert-file rootname))
! (goto-char (point-min))
! (nth 2 (vc-cvs-parse-root
! (buffer-substring (point)
! (line-end-position))))))))
!
! (defun vc-cvs-parse-root (root)
! "Split CVS ROOT specification string into a list of fields.
! A CVS root specification of the form
! [:METHOD:address@hidden:]/path/to/repository
! is converted to a normalized record with the following structure:
! \(METHOD USER HOSTNAME CVS-ROOT).
! The default METHOD for a CVS root of the form
! /path/to/repository
! is `local'.
! The default METHOD for a CVS root of the form
! address@hidden:/path/to/repository
! is `ext'.
! For an empty string, nil is returned (illegal CVS root)."
! ;; Split CVS root into colon separated fields (0-4).
! ;; The `x:' makes sure, that leading colons are not lost;
! ;; `HOST:/PATH' is then different from `:METHOD:/PATH'.
! (let* ((root-list (cdr (split-string (concat "x:" root) ":")))
! (len (length root-list))
! ;; All syntactic varieties will get a proper METHOD.
! (root-list
! (cond
! ((= len 0)
! ;; Invalid CVS root
! nil)
! ((= len 1)
! ;; Simple PATH => method `local'
! (cons "local"
! (cons nil root-list)))
! ((= len 2)
! ;; address@hidden:PATH => method `ext'
! (and (not (equal (car root-list) ""))
! (cons "ext" root-list)))
! ((= len 3)
! ;; :METHOD:PATH
! (cons (cadr root-list)
! (cons nil (cddr root-list))))
! (t
! ;; :METHOD:address@hidden:PATH
! (cdr root-list)))))
! (if root-list
! (let ((method (car root-list))
! (uhost (or (cadr root-list) ""))
! (root (nth 2 root-list))
! user host)
! ;; Split address@hidden
! (if (string-match "\\(.*\\)@\\(.*\\)" uhost)
! (setq user (match-string 1 uhost)
! host (match-string 2 uhost))
! (setq host uhost))
! ;; Remove empty HOST
! (and (equal host "")
! (setq host))
! ;; Fix windows style CVS root `:local:C:\\project\\cvs\\some\\dir'
! (and host
! (equal method "local")
! (setq root (concat host ":" root) host))
! ;; Normalize CVS root record
! (list method user host root)))))
(defun vc-cvs-parse-status (&optional full)
"Parse output of \"cvs status\" command in the current buffer.
***************
*** 781,787 ****
(defun vc-cvs-dir-state-heuristic (dir)
"Find the CVS state of all files in DIR, using only local information."
(with-temp-buffer
! (vc-insert-file (expand-file-name "CVS/Entries" dir))
(goto-char (point-min))
(while (not (eobp))
;; CVS-removed files are not taken under VC control.
--- 813,819 ----
(defun vc-cvs-dir-state-heuristic (dir)
"Find the CVS state of all files in DIR, using only local information."
(with-temp-buffer
! (vc-cvs-get-entries dir)
(goto-char (point-min))
(while (not (eobp))
;; CVS-removed files are not taken under VC control.
***************
*** 791,797 ****
(vc-cvs-parse-entry file t))))
(forward-line 1))))
!
(defun vc-cvs-valid-symbolic-tag-name-p (tag)
"Return non-nil if TAG is a valid symbolic tag name."
;; According to the CVS manual, a valid symbolic tag must start with
--- 823,837 ----
(vc-cvs-parse-entry file t))))
(forward-line 1))))
! (defun vc-cvs-get-entries (dir)
! "Insert the CVS/Entries file from below DIR into the current buffer.
! This function ensures that the correct coding system is used for that,
! which may not be the one that is used for the files' contents.
! CVS/Entries should only be accessed through this function."
! (let ((coding-system-for-read (or file-name-coding-system
! default-file-name-coding-system)))
! (vc-insert-file (expand-file-name "CVS/Entries" dir))))
!
(defun vc-cvs-valid-symbolic-tag-name-p (tag)
"Return non-nil if TAG is a valid symbolic tag name."
;; According to the CVS manual, a valid symbolic tag must start with
***************
*** 881,888 ****
"\\(.*\\)")) ;Sticky tag
(vc-file-setprop file 'vc-workfile-version (match-string 1))
(vc-file-setprop file 'vc-cvs-sticky-tag
! (vc-cvs-parse-sticky-tag (match-string 4) (match-string
5)))
! ;; compare checkout time and modification time
(let ((mtime (nth 5 (file-attributes file))))
(require 'parse-time)
(let ((parsed-time
--- 921,932 ----
"\\(.*\\)")) ;Sticky tag
(vc-file-setprop file 'vc-workfile-version (match-string 1))
(vc-file-setprop file 'vc-cvs-sticky-tag
! (vc-cvs-parse-sticky-tag (match-string 4)
! (match-string 5)))
! ;; Compare checkout time and modification time.
! ;; This is intentionally different from the algorithm that CVS uses
! ;; (which is based on textual comparison), because there can be problems
! ;; generating a time string that looks exactly like the one from CVS.
(let ((mtime (nth 5 (file-attributes file))))
(require 'parse-time)
(let ((parsed-time
***************
*** 898,901 ****
--- 942,946 ----
(provide 'vc-cvs)
+ ;;; arch-tag: 60e1402a-aa53-4607-927a-cf74f144b432
;;; vc-cvs.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/lisp/vc-cvs.el [lexbind],
Miles Bader <=