[Cl-darcs-cvs] r8 - cl-darcs/trunk
mhenoch at common-lisp.net
mhenoch at common-lisp.net
Sun Jun 11 15:32:21 UTC 2006
Author: mhenoch
Date: Sun Jun 11 11:32:20 2006
New Revision: 8
Added:
cl-darcs/trunk/equal.lisp
Log:
Forgot to add equal.lisp.
Added: cl-darcs/trunk/equal.lisp
==============================================================================
--- (empty file)
+++ cl-darcs/trunk/equal.lisp Sun Jun 11 11:32:20 2006
@@ -0,0 +1,68 @@
+(in-package :darcs)
+
+(defun equal-list (predicate a b)
+ "Return true if lists A and B are equal according to PREDICATE.
+That is, they have the same length, and for each corresponding
+pair of elements PREDICATE returns true."
+ (and (= (length a) (length b))
+ (catch 'not-equal
+ (mapc (lambda (x y)
+ (unless (funcall predicate x y)
+ (throw 'not-equal nil)))
+ a b)
+ t)))
+
+(defgeneric equal-patch (a b &optional really)
+ (:documentation "Return true if patches A and B are equal.
+If REALLY is false, consider named patches with the same name
+to be equal, regardless of content.")
+ (:method-combination and :most-specific-last))
+
+(defmethod equal-patch :around ((a patch) (b patch) &optional really)
+ "If there are no methods for comparing A and B, they are not equal."
+ (declare (ignore really))
+ (if (next-method-p)
+ (call-next-method)
+ nil))
+
+(defmethod equal-patch and ((a file-patch) (b file-patch) &optional really)
+ "Compare two file patches.
+Two file patches can be equal only if they are of the same type and
+patch the same file."
+ (declare (ignore really))
+ (and (eq (class-of a) (class-of b))
+ (equal (patch-filename a) (patch-filename b))))
+
+(defmethod equal-patch and ((a hunk-patch) (b hunk-patch) &optional really)
+ "Compare two hunk patches."
+ (declare (ignore really))
+ (flet ((compare (accessor)
+ ;; We use equalp, to make it descend into the vaguely
+ ;; string-like arrays.
+ (equalp (funcall accessor a) (funcall accessor b))))
+ (and (compare #'hunk-line-number)
+ (compare #'hunk-old-lines)
+ (compare #'hunk-new-lines))))
+
+(defmethod equal-patch and ((a binary-patch) (b binary-patch) &optional really)
+ "Compare two binary patches."
+ (declare (ignore really))
+ (and (equalp (binary-oldhex a) (binary-oldhex b))
+ (equalp (binary-newhex a) (binary-newhex b))))
+
+(defmethod equal-patch and ((a token-replace-patch) (b token-replace-patch) &optional really)
+ "Compare two token replacing patches."
+ (declare (ignore really))
+ (flet ((compare (accessor)
+ ;; Here we use string=.
+ (string= (funcall accessor a) (funcall accessor b))))
+ (and (compare #'token-regexp)
+ (compare #'old-token)
+ (compare #'new-token))))
+
+(defmethod equal-patch and ((a merger-patch) (b merger-patch) &optional really)
+ "Compare two merger patches."
+ (and (string= (merger-version a) (merger-version b))
+ (eql (merger-inverted a) (merger-inverted b))
+ (equal-patch (merger-first a) (merger-first b) really)
+ (equal-patch (merger-second a) (merger-second b) really)))
More information about the Cl-darcs-cvs
mailing list