Function: cvs-tree-merge

cvs-tree-merge is a byte-compiled function defined in cvs-status.el.gz.

Signature

(cvs-tree-merge TREE1 TREE2)

Documentation

Merge tags trees TREE1 and TREE2 into one.

BEWARE: because of stability issues, this is not a symmetric operation.

Source Code

;; Defined in /usr/src/emacs/lisp/vc/cvs-status.el.gz
(defun cvs-tree-merge (tree1 tree2)
  "Merge tags trees TREE1 and TREE2 into one.
BEWARE:  because of stability issues, this is not a symmetric operation."
  (cl-assert (and (listp tree1) (listp tree2)))
  (cond
   ((null tree1) tree2)
   ((null tree2) tree1)
   (t
    (let* ((rev1 (car tree1))
	   (tag1 (cvs-car rev1))
	   (vl1 (cvs-tag->vlist tag1))
	   (l1 (length vl1))
	   (rev2 (car tree2))
	   (tag2 (cvs-car rev2))
	   (vl2 (cvs-tag->vlist tag2))
	   (l2 (length vl2)))
    (cond
     ((= l1 l2)
      (pcase (cvs-tag-compare tag1 tag2)
	('more1 (cons rev2 (cvs-tree-merge tree1 (cdr tree2))))
	('more2 (cons rev1 (cvs-tree-merge (cdr tree1) tree2)))
	('equal
	 (cons (cons (cvs-tag-merge tag1 tag2)
		     (cvs-tree-merge (cvs-cdr rev1) (cvs-cdr rev2)))
	       (cvs-tree-merge (cdr tree1) (cdr tree2))))))
     ((> l1 l2)
      (cvs-tree-merge
       (list (cons (cvs-tag-make (butlast vl1)) tree1)) tree2))
     ((< l1 l2)
      (cvs-tree-merge
       tree1 (list (cons (cvs-tag-make (butlast vl2)) tree2)))))))))