• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.9.5/emacs-92/emacs/lisp/

Lines Matching defs:diff

1 ;;; ediff-diff.el --- diff-related utilities
46 (defgroup ediff-diff nil
52 (defcustom ediff-diff-program "diff"
55 :group 'ediff-diff)
60 :group 'ediff-diff)
65 ;; The following functions needed for setting diff/diff3 options
66 ;; test if diff supports the --binary option
67 (defsubst ediff-test-utility (diff-util option &optional files)
70 (append (list diff-util nil nil nil option) files)))
71 (error (format "Cannot execute program %S." diff-util)))
74 (defun ediff-diff-mandatory-option (diff-util)
78 ((and (string= diff-util ediff-diff-program)
80 ediff-diff-program "--binary" (list file file)))
82 ((and (string= diff-util ediff-diff3-program)
89 ;; must be before ediff-reset-diff-options to avoid compiler errors
90 (fset 'ediff-set-actual-diff-options '(lambda () nil))
93 ;; ediff-diff-options or ediff-diff3-options in the customization widget
94 (defun ediff-reset-diff-options (symb val)
95 (let* ((diff-program
96 (if (eq symb 'ediff-diff-options)
97 ediff-diff-program
99 (mandatory-option (ediff-diff-mandatory-option diff-program)))
101 (ediff-set-actual-diff-options)
111 "*The shell used to run diff and patch.
118 :group 'ediff-diff)
124 :group 'ediff-diff)
128 If GNU diff is used as `ediff-cmp-program', then the most useful options
131 :group 'ediff-diff)
133 (defcustom ediff-diff-options ""
134 "*Options to pass to `ediff-diff-program'.
135 If Unix diff is used as `ediff-diff-program',
141 the command \\[ediff-show-diff-output]. Use the variable
142 `ediff-custom-diff-options' for that."
143 :set 'ediff-reset-diff-options
145 :group 'ediff-diff)
153 "*Option that causes the diff program to ignore case of letters."
155 :group 'ediff-diff)
161 :group 'ediff-diff)
164 (ediff-defvar-local ediff-actual-diff-options ediff-diff-options "")
166 (defcustom ediff-custom-diff-program ediff-diff-program
167 "*Program to use for generating custom diff output for saving it in a file.
170 :group 'ediff-diff)
171 (defcustom ediff-custom-diff-options "-c"
172 "*Options to pass to `ediff-custom-diff-program'."
174 :group 'ediff-diff)
182 :set 'ediff-reset-diff-options
184 :group 'ediff-diff)
194 :group 'ediff-diff)
196 ;; keeps the status of the current diff in 3-way jobs.
197 ;; the status can be =diff(A), =diff(B), or =diff(A+B)
198 (ediff-defvar-local ediff-diff-status "" "")
204 "If `on', Ediff auto-highlights fine diffs for the current diff region.
221 (defvar ediff-diff-ok-lines-regexp
232 "Regexp that matches normal output lines from `ediff-diff-program'.
237 (defvar ediff-match-diff-line
240 "Pattern to match lines produced by diff that describe differences.")
242 (ediff-defvar-local ediff-setup-diff-regions-function nil
244 For 2-way jobs and for ediff-merge, it should be `ediff-setup-diff-regions'.
245 For jobs requiring diff3, it should be `ediff-setup-diff-regions3'.
249 one optional arguments, diff-number to refine.")
257 ;; ediff-setup-diff-regions is called via a funcall to
258 ;; ediff-setup-diff-regions-function, which can also have the value
259 ;; ediff-setup-diff-regions3, which takes 4 arguments.
260 (defun ediff-setup-diff-regions (file-A file-B file-C)
263 ediff-diff-options)
264 (error "Options `-c', `-u', and `-i' are not allowed in `ediff-diff-options'"))
267 (or (ediff-buffer-live-p ediff-diff-buffer)
268 (setq ediff-diff-buffer
269 (get-buffer-create (ediff-unique-buffer-name "*ediff-diff" "*"))))
270 (ediff-make-diff2-buffer ediff-diff-buffer file-A file-B)
271 (ediff-prepare-error-list ediff-diff-ok-lines-regexp ediff-diff-buffer)
274 ediff-diff-buffer ediff-word-mode ediff-narrow-bounds)))
276 ;; Run the diff program on FILE1 and FILE2 and put the output in DIFF-BUFFER
279 (defun ediff-make-diff2-buffer (diff-buffer file1 file2)
297 ;; this erases the diff buffer automatically
298 (ediff-exec-process ediff-diff-program
299 diff-buffer
301 ediff-actual-diff-options file1 file2)
303 (ediff-with-current-buffer diff-buffer
310 (defun ediff-setup-fine-diff-regions (file-A file-B file-C reg-num)
311 (or (ediff-buffer-live-p ediff-fine-diff-buffer)
312 (setq ediff-fine-diff-buffer
314 (ediff-unique-buffer-name "*ediff-fine-diff" "*"))))
316 (let (diff3-job diff-program diff-options ok-regexp diff-list)
318 diff-program (if diff3-job ediff-diff3-program ediff-diff-program)
319 diff-options (if diff3-job
321 ediff-actual-diff-options)
324 ediff-diff-ok-lines-regexp))
327 (ediff-exec-process diff-program ediff-fine-diff-buffer 'synchronize
328 diff-options
338 (ediff-prepare-error-list ok-regexp ediff-fine-diff-buffer)
343 (setq diff-list
346 ediff-fine-diff-buffer '3way-comparison 'word-mode)
347 (ediff-extract-diffs ediff-fine-diff-buffer 'word-mode)))
348 ;; fixup diff-list
354 (cdr diff-list)))
359 (cdr diff-list)))
364 (cdr diff-list)))
367 (ediff-convert-fine-diffs-to-overlays diff-list reg-num)
371 (defun ediff-prepare-error-list (ok-regexp diff-buff)
378 (insert (ediff-with-current-buffer diff-buff (buffer-string)))
383 ;; If diff reports errors, show them then quit.
390 (error "Errors in diff output. Diff output is in %S" diff-buff))))
396 ;; This function handles diff-2 jobs including the case of
398 (defun ediff-extract-diffs (diff-buffer word-mode &optional bounds)
402 (a-prev 1) ; this is needed to set the first diff line correctly
408 diff-list shift-A shift-B
411 ;; diff list contains word numbers, unless changed later
412 (setq diff-list (cons (if word-mode 'words 'points)
413 diff-list))
432 (ediff-with-current-buffer diff-buffer
434 (while (re-search-forward ediff-match-diff-line nil t)
442 (diff-type (buffer-substring (match-beginning 4) (match-end 4)))
452 ;; fix the beginning and end numbers, because diff is somewhat
454 (if (string-equal diff-type "a")
458 (if (string-equal diff-type "d")
462 ;; (string-equal diff-type "c")
472 ;; compute main diff vector
474 ;; make diff-list contain word numbers
475 (setq diff-list
476 (nconc diff-list
483 nil ; state of diff
491 nil ; state of diff
547 (setq diff-list
549 diff-list
556 ;; state of diff
566 nil nil ; dummy state of diff & merge
572 diff-list
576 (defun ediff-convert-diffs-to-overlays (diff-list)
577 (ediff-set-diff-overlays-in-one-buffer 'A diff-list)
578 (ediff-set-diff-overlays-in-one-buffer 'B diff-list)
580 (ediff-set-diff-overlays-in-one-buffer 'C diff-list))
582 (ediff-set-diff-overlays-in-one-buffer 'Ancestor diff-list))
596 (cdr diff-list))
601 (defun ediff-set-diff-overlays-in-one-buffer (buf-type diff-list)
602 (let* ((current-diff -1)
605 ;; ediff-extract-diffs puts the type of diff-list as the first elt
607 (diff-list-type (car diff-list))
614 diff-overlay-list list-element total-diffs
615 begin end pt-saved overlay state-of-diff)
617 (setq diff-list (cdr diff-list)) ; discard diff list type
618 (setq total-diffs (length diff-list))
623 (while diff-list
624 (setq current-diff (1+ current-diff)
625 list-element (car diff-list)
634 state-of-diff (aref list-element 8)
637 (cond ((and (not (eq buf-type state-of-diff))
639 (memq state-of-diff '(A B C)))
640 (setq state-of-diff
641 (car (delq buf-type (delq state-of-diff (list 'A 'B 'C)))))
642 (setq state-of-diff (format "=diff(%S)" state-of-diff))
644 (t (setq state-of-diff nil)))
648 (if (eq diff-list-type 'words)
660 (ediff-overlay-put overlay 'ediff-diff-num current-diff)
664 overlay (ediff-background-face buf-type current-diff)))
666 (if (= 0 (mod current-diff 10))
668 buf-type current-diff total-diffs))
670 ;; The 2-d elt, nil, is a place holder for the fine diff vector.
672 ;; The 4-th elt says which diff region is different from the other two
674 (setq diff-overlay-list
676 diff-overlay-list
677 (list (vector overlay nil nil state-of-diff)))
678 diff-list
679 (cdr diff-list))
683 (vconcat diff-overlay-list))
686 ;; `n' is the diff region to work on. Default is ediff-current-difference.
707 (empty-A (ediff-empty-diff-region-p n 'A))
708 (empty-B (ediff-empty-diff-region-p n 'B))
709 (empty-C (ediff-empty-diff-region-p n 'C))
710 (whitespace-A (ediff-whitespace-diff-region-p n 'A))
711 (whitespace-B (ediff-whitespace-diff-region-p n 'B))
712 (whitespace-C (ediff-whitespace-diff-region-p n 'C))
713 cumulative-fine-diff-length)
740 (ediff-mark-diff-as-space-only n t)
743 (ediff-mark-diff-as-space-only n nil)))
745 ;; don't compute fine diffs if diff vector exists
746 ((and (eq flag 'noforce) (ediff-get-fine-diff-vector n 'A))
760 (or (ediff-get-fine-diff-vector n 'A)
771 (ediff-get-diff-posn 'A 'beg n)
772 (ediff-get-diff-posn 'A 'end n)
780 (ediff-get-diff-posn 'B 'beg n)
781 (ediff-get-diff-posn 'B 'end n)
791 (ediff-get-diff-posn 'C 'beg n)
792 (ediff-get-diff-posn 'C 'end n)
807 (ediff-setup-fine-diff-regions nil file-B file-C n))
809 (ediff-setup-fine-diff-regions file-A nil file-C n))
812 ;; ediff-empty-diff-region-p returns t in this case
814 (ediff-setup-fine-diff-regions file-A file-B nil n))
816 (ediff-setup-fine-diff-regions file-A file-B file-C n)))
818 (setq cumulative-fine-diff-length
819 (+ (length (ediff-get-fine-diff-vector n 'A))
820 (length (ediff-get-fine-diff-vector n 'B))
823 (length (ediff-get-fine-diff-vector n 'C))
833 (eq cumulative-fine-diff-length 0)))
834 (ediff-mark-diff-as-space-only n t)
837 ((eq cumulative-fine-diff-length 0)
841 (cond (whitespace-A (ediff-mark-diff-as-space-only n 'A)
843 (whitespace-B (ediff-mark-diff-as-space-only n 'B)
845 (whitespace-C (ediff-mark-diff-as-space-only n 'C)
848 (ediff-mark-diff-as-space-only n nil)))
851 (ediff-set-fine-diff-properties n)
855 (defun ediff-install-fine-diff-if-necessary (n)
862 (- (ediff-get-diff-posn 'A 'end n)
863 (ediff-get-diff-posn 'A 'beg n)))
865 (- (ediff-get-diff-posn 'B 'end n)
866 (ediff-get-diff-posn 'B 'beg n))))
875 ;; if fine diff vector is not set for diff N, then do nothing
876 (defun ediff-set-fine-diff-properties (n &optional default)
882 (ediff-set-fine-diff-properties-in-one-buffer 'A n default)
883 (ediff-set-fine-diff-properties-in-one-buffer 'B n default)
885 (ediff-set-fine-diff-properties-in-one-buffer 'C n default)))))
887 (defun ediff-set-fine-diff-properties-in-one-buffer (buf-type
889 (let ((fine-diff-vector (ediff-get-fine-diff-vector n buf-type))
894 buf-type ediff-fine-diff-face-alist))))
901 ediff-current-diff-overlay-alist))
907 fine-diff-vector)))
910 (defun ediff-set-fine-overlays-for-combined-merge (diff-list reg-num)
912 (while diff-list
916 (nth 0 diff-list) (nth 1 diff-list) ediff-buffer-C))
919 (if (> (length diff-list) 1)
920 (setq diff-list (cdr (cdr diff-list)))
925 (ediff-set-fine-diff-vector
930 ;; Convert diff list to overlays for a given DIFF-REGION
932 (defun ediff-set-fine-overlays-in-one-buffer (buf-type diff-list region-num)
933 (let* ((current-diff -1)
934 (reg-start (ediff-get-diff-posn buf-type 'beg region-num))
937 combined-merge-diff-list
938 diff-overlay-list list-element
942 (setq diff-list (cdr diff-list)) ; discard list type (words or points)
947 (setq combined-merge-diff-list
950 combined-merge-diff-list region-num)
951 ;; regular fine diff
952 (while diff-list
953 (setq current-diff (1+ current-diff)
954 list-element (car diff-list)
962 () ; skip this diff
970 (setq diff-overlay-list (nconc diff-overlay-list (list overlay))))
972 (setq diff-list (cdr diff-list))
976 (ediff-set-fine-diff-vector
977 region-num buf-type (vconcat diff-overlay-list))
981 (defsubst ediff-convert-fine-diffs-to-overlays (diff-list region-num)
982 (ediff-set-fine-overlays-in-one-buffer 'A diff-list region-num)
983 (ediff-set-fine-overlays-in-one-buffer 'B diff-list region-num)
985 (ediff-set-fine-overlays-in-one-buffer 'C diff-list region-num)
1026 (defun ediff-extract-diffs3 (diff-buffer word-mode three-way-comp
1032 (a-prev 1) ; needed to set the first diff line correctly
1039 diff-list shift-A shift-B shift-C
1042 ;; diff list contains word numbers or points, depending on word-mode
1043 (setq diff-list (cons (if word-mode 'words 'points)
1044 diff-list))
1069 (ediff-with-current-buffer diff-buffer
1088 (state-of-diff-merge
1090 (state-of-diff-comparison
1114 ;; compute main diff vector
1116 ;; make diff-list contain word numbers
1117 (setq diff-list
1118 (nconc diff-list
1124 nil ; state of diff
1192 (setq diff-list
1194 diff-list
1203 state-of-diff-comparison
1211 state-of-diff-merge
1219 diff-list
1225 (defun ediff-setup-diff-regions3 (file-A file-B file-C)
1227 (if (string-match "^-i\\| -i\\|\\(^\\| \\)-[^- ]+i" ediff-diff-options)
1230 (or (ediff-buffer-live-p ediff-diff-buffer)
1231 (setq ediff-diff-buffer
1232 (get-buffer-create (ediff-unique-buffer-name "*ediff-diff" "*"))))
1235 (ediff-exec-process ediff-diff3-program ediff-diff-buffer 'synchronize
1238 (ediff-prepare-error-list ediff-diff3-ok-lines-regexp ediff-diff-buffer)
1242 ediff-diff-buffer
1261 (eq buffer ediff-fine-diff-buffer)
1276 ;; custom diffs. So, we have to wait till custom diff
1318 ;; we do this because diff always exits with status 1, if diffs are found
1330 ;;; Word functions used to refine the current diff
1394 inbuf-syntax-tbl sv-point diff-string)
1402 (setq diff-string (buffer-substring-no-properties beg end))
1410 (insert diff-string)
1534 (defun ediff-set-actual-diff-options ()
1536 (setq ediff-actual-diff-options
1537 (concat ediff-diff-options " " ediff-ignore-case-option)
1540 (setq ediff-actual-diff-options ediff-diff-options
1543 (setq-default ediff-actual-diff-options ediff-actual-diff-options
1553 (ediff-set-actual-diff-options)
1562 (message "Ignoring letter case is not supported by this diff program"))
1569 (provide 'ediff-diff)
1579 ;;; ediff-diff.el ends here