Mercurial > emacs
diff lisp/ediff-diff.el @ 62963:fcacef2ed810
2005-06-03 Michael Kifer <kifer@cs.stonybrook.edu>
* ediff-diff.el (ediff-same-contents) Eliminate CL-type functions.
* ediff-mult.el (ediff-intersect-directories) Make sure that ".." and
"." files are deleted from all file lists before comparison
* viper-keym.el
(viper-toggle-key,viper-quoted-insert-key,viper-ESC-key):
Made them customizable.
* viper.el (viper-non-hook-settings): fixed the names of defadvices.
| author | Michael Kifer <kifer@cs.stonybrook.edu> |
|---|---|
| date | Fri, 03 Jun 2005 08:04:04 +0000 |
| parents | a7e02ef1e3d6 |
| children | d9c0fd880028 01137c1fdbe9 |
line wrap: on
line diff
--- a/lisp/ediff-diff.el Thu Jun 02 12:27:05 2005 +0000 +++ b/lisp/ediff-diff.el Fri Jun 03 08:04:04 2005 +0000 @@ -1353,7 +1353,7 @@ If FILTER-RE is non-nil, recursive checking in directories affects only files whose names match the expression." ;; Normalize empty filter RE to nil. - (unless (length filter-re) (setq filter-re nil)) + (unless (> (length filter-re) 0) (setq filter-re nil)) ;; Indicate progress (message "Comparing '%s' and '%s' modulo '%s'" d1 d2 filter-re) (cond @@ -1367,27 +1367,11 @@ (if (eq ediff-recurse-to-subdirectories 'yes) (let* ((all-entries-1 (directory-files d1 t filter-re)) (all-entries-2 (directory-files d2 t filter-re)) - (entries-1 (remove-if (lambda (s) - (string-match "^\\.\\.?$" - (file-name-nondirectory s))) - all-entries-1)) - (entries-2 (remove-if (lambda (s) - (string-match "^\\.\\.?$" - (file-name-nondirectory s))) - all-entries-2)) + (entries-1 (ediff-delete-all-matches "^\\.\\.?$" all-entries-1)) + (entries-2 (ediff-delete-all-matches "^\\.\\.?$" all-entries-2)) ) - ;; First, check only the names (works quickly and ensures a - ;; precondition for subsequent code) - (if (and (= (length entries-1) (length entries-2)) - (every (lambda (a b) (equal (file-name-nondirectory a) - (file-name-nondirectory b))) - entries-1 entries-2)) - ;; With name equality established, compare the entries - ;; through recursion. - (every (lambda (a b) - (ediff-same-contents a b filter-re)) - entries-1 entries-2) - ) + + (ediff-same-file-contents-lists entries-1 entries-2 filter-re) )) ) ; end of the directories case ;; D1 & D2 are both files => compare directly @@ -1398,6 +1382,42 @@ ) ) +;; If lists have the same length and names of files are pairwise equal +;; (removing the directories) then compare contents pairwise. +;; True if all contents are the same; false otherwise +(defun ediff-same-file-contents-lists (entries-1 entries-2 filter-re) + ;; First, check only the names (works quickly and ensures a + ;; precondition for subsequent code) + (if (and (= (length entries-1) (length entries-2)) + (equal (mapcar 'file-name-nondirectory entries-1) + (mapcar 'file-name-nondirectory entries-2))) + ;; With name equality established, compare the entries + ;; through recursion. + (let ((continue t)) + (while (and entries-1 continue) + (if (ediff-same-contents + (car entries-1) (car entries-2) filter-re) + (setq entries-1 (cdr entries-1) + entries-2 (cdr entries-2)) + (setq continue nil)) + ) + ;; if reached the end then lists are equal + (null entries-1)) + ) + ) + + +;; ARG1 is a regexp, ARG2 is a list of full-filenames +;; Delete all entries that match the regexp +(defun ediff-delete-all-matches (regex file-list-list) + (let (result elt) + (while file-list-list + (setq elt (car file-list-list)) + (or (string-match regex (file-name-nondirectory elt)) + (setq result (cons elt result))) + (setq file-list-list (cdr file-list-list))) + (reverse result))) + ;;; Local Variables: ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
