Function: vc-cvs-parse-root
vc-cvs-parse-root is a byte-compiled function defined in vc-cvs.el.gz.
Signature
(vc-cvs-parse-root ROOT)
Documentation
Split CVS ROOT specification string into a list of fields.
A CVS root specification of the form
[:METHOD:][[USER@]HOSTNAME]:?/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
[USER@]HOSTNAME:/path/to/repository
is ext.
For an empty string, nil is returned (invalid CVS root).
Source Code
;; Defined in /usr/src/emacs/lisp/vc/vc-cvs.el.gz
(defun vc-cvs-parse-root (root)
"Split CVS ROOT specification string into a list of fields.
A CVS root specification of the form
[:METHOD:][[USER@]HOSTNAME]:?/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
[USER@]HOSTNAME:/path/to/repository
is `ext'.
For an empty string, nil is returned (invalid 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)
(let ((uhp (vc-cvs-parse-uhp (car root-list))))
(cons (if (car uhp) "ext" "local") uhp)))
((= len 2)
;; [USER@]HOST:PATH => method `ext'
(and (not (equal (car root-list) ""))
(cons "ext" root-list)))
((= len 3)
;; :METHOD:PATH or :METHOD:USER@HOSTNAME/PATH
(cons (cadr root-list)
(vc-cvs-parse-uhp (nth 2 root-list))))
(t
;; :METHOD:[USER@]HOST: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 USER@HOST
(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 nil))
;; Fix windows style CVS root `:local:C:\\project\\cvs\\some\\dir'
(and host
(equal method "local")
(setq root (concat host ":" root) host nil))
;; Normalize CVS root record
(list method user host root)))))