annotate lisp/ediff-ptch.el @ 24419:30e478cd167e

(shell-command-default-error-buffer): Renamed from shell-command-on-region-default-error-buffer. (shell-command-on-region): Mention in echo area when there is some error output. Mention success or failure, too. Accumulate multiple error outputs going forward, with formfeed in between. Display the error buffer when we have put something in it. (shell-command): Add the ERROR-BUFFER argument feature.
author Karl Heuer <kwzh@gnu.org>
date Mon, 01 Mar 1999 03:19:32 +0000
parents 1ecc4a79d048
children 4f315ca65976
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
1 ;;; ediff-ptch.el --- Ediff's patch support
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
2
18054
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
3 ;; Copyright (C) 1996, 1997 Free Software Foundation, Inc.
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
4
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
5 ;; Author: Michael Kifer <kifer@cs.sunysb.edu>
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
6
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
7 ;; This file is part of GNU Emacs.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
8
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
10 ;; it under the terms of the GNU General Public License as published by
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
11 ;; the Free Software Foundation; either version 2, or (at your option)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
12 ;; any later version.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
13
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
14 ;; GNU Emacs is distributed in the hope that it will be useful,
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
17 ;; GNU General Public License for more details.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
18
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
19 ;; You should have received a copy of the GNU General Public License
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
22 ;; Boston, MA 02111-1307, USA.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
23
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
24
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
25 ;;; Code:
18054
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
26
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
27 (provide 'ediff-ptch)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
28
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
29 (defgroup ediff-ptch nil
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
30 "Ediff patch support"
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
31 :tag "Patch"
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
32 :prefix "ediff-"
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
33 :group 'ediff)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
34
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
35 ;; compiler pacifier
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
36 (defvar ediff-window-A)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
37 (defvar ediff-window-B)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
38 (defvar ediff-window-C)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
39 (defvar ediff-use-last-dir)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
40 (defvar ediff-shell)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
41
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
42 (eval-when-compile
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
43 (let ((load-path (cons (expand-file-name ".") load-path)))
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
44 (or (featurep 'ediff-init)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
45 (load "ediff-init.el" nil nil 'nosuffix))
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
46 (or (featurep 'ediff)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
47 (load "ediff.el" nil nil 'nosuffix))
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
48 ))
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
49 ;; end pacifier
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
50
15987
22da4beb0631 Require ediff-init.
Richard M. Stallman <rms@gnu.org>
parents: 15479
diff changeset
51 (require 'ediff-init)
22da4beb0631 Require ediff-init.
Richard M. Stallman <rms@gnu.org>
parents: 15479
diff changeset
52
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
53 (defcustom ediff-patch-program "patch"
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
54 "*Name of the program that applies patches.
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
55 It is recommended to use GNU-compatible versions."
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
56 :type 'string
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
57 :group 'ediff-ptch)
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
58 (defcustom ediff-patch-options "-f"
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
59 "*Options to pass to ediff-patch-program.
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
60
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
61 Note: the `-b' option should be specified in `ediff-backup-specs'.
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
62
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
63 It is recommended to pass the `-f' option to the patch program, so it won't ask
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
64 questions. However, some implementations don't accept this option, in which
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
65 case the default value for this variable should be changed."
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
66 :type 'string
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
67 :group 'ediff-ptch)
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
68
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
69 (defvar ediff-last-dir-patch nil
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
70 "Last directory used by an Ediff command for file to patch.")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
71
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
72 ;; the default backup extension
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
73 (defconst ediff-default-backup-extension
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
74 (if (memq system-type '(vax-vms axp-vms emx ms-dos))
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
75 "_orig" ".orig"))
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
76
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
77
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
78 (defcustom ediff-backup-extension ediff-default-backup-extension
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
79 "Backup extension used by the patch program.
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
80 See also `ediff-backup-specs'."
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
81 :type 'string
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
82 :group 'ediff-ptch)
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
83
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
84 (defun ediff-test-patch-utility ()
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
85 (cond ((zerop (call-process ediff-patch-program nil nil nil "-z." "-b"))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
86 ;; GNU `patch' v. >= 2.2
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
87 'gnu)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
88 ((zerop (call-process ediff-patch-program nil nil nil "-b"))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
89 'posix)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
90 (t 'traditional)))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
91
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
92 (defcustom ediff-backup-specs
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
93 (let ((type (ediff-test-patch-utility)))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
94 (cond ((eq type 'gnu)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
95 ;; GNU `patch' v. >= 2.2
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
96 (format "-z%s -b" ediff-backup-extension))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
97 ((eq type 'posix)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
98 ;; POSIX `patch' -- ediff-backup-extension must be ".orig"
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
99 (setq ediff-backup-extension ediff-default-backup-extension)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
100 "-b")
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
101 (t
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
102 ;; traditional `patch'
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
103 (format "-b %s" ediff-backup-extension))))
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
104 "*Backup directives to pass to the patch program.
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
105 Ediff requires that the old version of the file \(before applying the patch\)
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
106 be saved in a file named `the-patch-file.extension'. Usually `extension' is
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
107 `.orig', but this can be changed by the user and may depend on the system.
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
108 Therefore, Ediff needs to know the backup extension used by the patch program.
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
109
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
110 Some versions of the patch program let you specify `-b backup-extension'.
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
111 Other versions only permit `-b', which assumes the extension `.orig'
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
112 \(in which case ediff-backup-extension MUST be also `.orig'\). The latest
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
113 versions of GNU patch require `-b -z backup-extension'.
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
114
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
115 Note that both `ediff-backup-extension' and `ediff-backup-specs'
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
116 must be set properly. If your patch program takes the option `-b',
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
117 but not `-b extension', the variable `ediff-backup-extension' must
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
118 still be set so Ediff will know which extension to use.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
119
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
120 Ediff tries to guess the appropriate value for this variables. It is believed
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
121 to be working for `traditional' patch, all versions of GNU patch, and for POSIX
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
122 patch. So, don't change these variables, unless the default doesn't work."
18054
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
123 :type 'string
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
124 :group 'ediff-ptch)
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
125
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
126
18054
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
127 (defcustom ediff-patch-default-directory nil
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
128 "*Default directory to look for patches."
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
129 :type '(choice (const nil) string)
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
130 :group 'ediff-ptch)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
131
18054
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
132 (defcustom ediff-context-diff-label-regexp
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
133 (concat "\\(" ; context diff 2-liner
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
134 "^\\*\\*\\* \\([^ \t]+\\)[^*]+[\t ]*\n--- \\([^ \t]+\\)"
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
135 "\\|" ; GNU unified format diff 2-liner
16168
587b9c438823 (ediff-context-diff-label-regexp): Recognize -u format better.
Richard M. Stallman <rms@gnu.org>
parents: 15987
diff changeset
136 "^--- \\([^ \t]+\\)[\t ]+.*\n\\+\\+\\+ \\([^ \t]+\\)"
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
137 "\\)")
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
138 "*Regexp matching filename 2-liners at the start of each context diff.
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
139 You probably don't want to change that, unless you are using an obscure patch
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
140 program."
18054
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
141 :type 'regexp
0b9d9cbf3cd4 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16766
diff changeset
142 :group 'ediff-ptch)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
143
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
144 ;; The buffer of the patch file. Local to control buffer.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
145 (ediff-defvar-local ediff-patchbufer nil "")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
146
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
147 ;; The buffer where patch displays its diagnostics.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
148 (ediff-defvar-local ediff-patch-diagnostics nil "")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
149
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
150 ;; Map of patch buffer. Has the form:
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
151 ;; ((filename1 marker1 marker2) (filename2 marker1 marker2) ...)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
152 ;; where filenames are files to which patch would have applied the patch;
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
153 ;; marker1 delimits the beginning of the corresponding patch and marker2 does
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
154 ;; it for the end.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
155 (ediff-defvar-local ediff-patch-map nil "")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
156
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
157 ;; strip prefix from filename
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
158 ;; returns /dev/null, if can't strip prefix
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
159 (defsubst ediff-file-name-sans-prefix (filename prefix)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
160 (save-match-data
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
161 (if (string-match (concat "^" prefix) filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
162 (substring filename (match-end 0))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
163 (concat "/null/" filename))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
164
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
165
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
166
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
167 ;; no longer used
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
168 ;; return the number of matches of regexp in buf starting from the beginning
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
169 (defun ediff-count-matches (regexp buf)
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
170 (ediff-with-current-buffer buf
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
171 (let ((count 0) opoint)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
172 (save-excursion
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
173 (goto-char (point-min))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
174 (while (and (not (eobp))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
175 (progn (setq opoint (point))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
176 (re-search-forward regexp nil t)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
177 (if (= opoint (point))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
178 (forward-char 1)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
179 (setq count (1+ count)))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
180 count)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
181
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
182 ;; Scan BUF (which is supposed to contain a patch) and make a list of the form
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
183 ;; ((filename1 marker1 marker2) (filename2 marker1 marker2) ...)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
184 ;; where filenames are files to which patch would have applied the patch;
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
185 ;; marker1 delimits the beginning of the corresponding patch and marker2 does
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
186 ;; it for the end. This list is then assigned to ediff-patch-map.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
187 ;; Returns the number of elements in the list ediff-patch-map
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
188 (defun ediff-map-patch-buffer (buf)
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
189 (ediff-with-current-buffer buf
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
190 (let ((count 0)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
191 (mark1 (move-marker (make-marker) (point-min)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
192 (mark1-end (point-min))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
193 (possible-file-names '("/dev/null" . "/dev/null"))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
194 mark2-end mark2 filenames
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
195 beg1 beg2 end1 end2
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
196 patch-map opoint)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
197 (save-excursion
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
198 (goto-char (point-min))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
199 (setq opoint (point))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
200 (while (and (not (eobp))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
201 (re-search-forward ediff-context-diff-label-regexp nil t))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
202 (if (= opoint (point))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
203 (forward-char 1) ; ensure progress towards the end
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
204 (setq mark2 (move-marker (make-marker) (match-beginning 0))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
205 mark2-end (match-end 0)
16168
587b9c438823 (ediff-context-diff-label-regexp): Recognize -u format better.
Richard M. Stallman <rms@gnu.org>
parents: 15987
diff changeset
206 beg1 (or (match-beginning 2) (match-beginning 4))
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
207 end1 (or (match-end 2) (match-end 4))
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
208 beg2 (or (match-beginning 3) (match-beginning 5))
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
209 end2 (or (match-end 3) (match-end 5)))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
210 ;; possible-file-names is holding the new file names until we
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
211 ;; insert the old file name in the patch map
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
212 ;; It is a pair (filename from 1st header line . fn from 2nd line)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
213 (setq possible-file-names
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
214 (cons (if (and beg1 end1)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
215 (buffer-substring beg1 end1)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
216 "/dev/null")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
217 (if (and beg2 end2)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
218 (buffer-substring beg2 end2)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
219 "/dev/null")))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
220 ;; check for any `Index:' or `Prereq:' lines, but don't use them
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
221 (if (re-search-backward "^Index:" mark1-end 'noerror)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
222 (move-marker mark2 (match-beginning 0)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
223 (if (re-search-backward "^Prereq:" mark1-end 'noerror)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
224 (move-marker mark2 (match-beginning 0)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
225
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
226 (goto-char mark2-end)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
227
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
228 (if filenames
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
229 (setq patch-map (cons (list filenames mark1 mark2) patch-map)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
230 (setq mark1 mark2
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
231 mark1-end mark2-end
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
232 filenames possible-file-names))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
233 (setq opoint (point)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
234 count (1+ count))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
235 (setq mark2 (point-max-marker)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
236 patch-map (cons (list possible-file-names mark1 mark2) patch-map))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
237 (setq ediff-patch-map (nreverse patch-map))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
238 count)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
239
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
240 ;; Fix up the file names in the list using the argument FILENAME
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
241 ;; Algorithm: find the first file's directory and cut it out from each file
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
242 ;; name in the patch. Prepend the directory of FILENAME to each file in the
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
243 ;; patch. In addition, the first file in the patch is replaced by FILENAME.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
244 ;; Each file is actually a file-pair of files found in the context diff header
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
245 ;; In the end, for each pair, we select the shortest existing file.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
246 ;; Note: Ediff doesn't recognize multi-file patches that are separated
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
247 ;; with the `Index:' line. It treats them as a single-file patch.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
248 ;;
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
249 ;; Executes inside the patch buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
250 (defun ediff-fixup-patch-map (filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
251 (setq filename (expand-file-name filename))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
252 (let ((actual-dir (if (file-directory-p filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
253 ;; directory part of filename
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
254 (file-name-as-directory filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
255 (file-name-directory filename)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
256 ;; directory part of the first file in the patch
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
257 (base-dir1 (file-name-directory (car (car (car ediff-patch-map)))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
258 (base-dir2 (file-name-directory (cdr (car (car ediff-patch-map)))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
259 )
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
260
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
261 ;; chop off base-dirs
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
262 (mapcar (function (lambda (triple)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
263 (or (string= (car (car triple)) "/dev/null")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
264 (setcar (car triple)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
265 (ediff-file-name-sans-prefix
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
266 (car (car triple)) base-dir1)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
267 (or (string= (cdr (car triple)) "/dev/null")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
268 (setcdr (car triple)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
269 (ediff-file-name-sans-prefix
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
270 (cdr (car triple)) base-dir2)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
271 ))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
272 ediff-patch-map)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
273
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
274 ;; take the given file name into account
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
275 (or (file-directory-p filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
276 (string= "/dev/null" filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
277 (progn
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
278 (setcar (car ediff-patch-map)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
279 (cons (file-name-nondirectory filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
280 (file-name-nondirectory filename)))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
281
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
282 ;; prepend actual-dir
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
283 (mapcar (function (lambda (triple)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
284 (if (and (string-match "^/null/" (car (car triple)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
285 (string-match "^/null/" (cdr (car triple))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
286 ;; couldn't strip base-dir1 and base-dir2
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
287 ;; hence, something wrong
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
288 (progn
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
289 (with-output-to-temp-buffer ediff-msg-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
290 (princ
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
291 (format "
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
292 The patch file contains a context diff for
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
293 %s
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
294 %s
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
295 However, Ediff cannot infer the name of the actual file
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
296 to be patched on your system. If you know the correct file name,
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
297 please enter it now.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
298
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
299 If you don't know and still would like to apply patches to
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
300 other files, enter /dev/null
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
301 "
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
302 (substring (car (car triple)) 6)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
303 (substring (cdr (car triple)) 6))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
304 (let ((directory t)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
305 user-file)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
306 (while directory
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
307 (setq user-file
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
308 (read-file-name
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
309 "Please enter file name: "
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
310 actual-dir actual-dir t))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
311 (if (not (file-directory-p user-file))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
312 (setq directory nil)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
313 (setq directory t)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
314 (beep)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
315 (message "%s is a directory" user-file)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
316 (sit-for 2)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
317 (setcar triple (cons user-file user-file))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
318 (setcar (car triple)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
319 (expand-file-name
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
320 (concat actual-dir (car (car triple)))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
321 (setcdr (car triple)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
322 (expand-file-name
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
323 (concat actual-dir (cdr (car triple))))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
324 ))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
325 ediff-patch-map)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
326 ;; check for the shorter existing file in each pair and discard the other
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
327 ;; one
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
328 (mapcar (function (lambda (triple)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
329 (let* ((file1 (car (car triple)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
330 (file2 (cdr (car triple)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
331 (f1-exists (file-exists-p file1))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
332 (f2-exists (file-exists-p file2)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
333 (cond
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
334 ((and (< (length file2) (length file1))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
335 f2-exists)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
336 (setcar triple file2))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
337 ((and (< (length file1) (length file2))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
338 f1-exists)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
339 (setcar triple file1))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
340 ((and f1-exists f2-exists
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
341 (string= file1 file2))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
342 (setcar triple file1))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
343 ((and f1-exists f2-exists)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
344 (with-output-to-temp-buffer ediff-msg-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
345 (princ (format "
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
346 Ediff has inferred that
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
347 %s
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
348 %s
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
349 are two possible targets for applying the patch.
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
350 Both files seem to be plausible alternatives.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
351
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
352 Please advice:
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
353 Type `y' to use %s as the target;
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
354 Type `n' to use %s as the target.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
355 "
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
356 file1 file2 file2 file1)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
357 (setcar triple
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
358 (if (y-or-n-p (format "Use %s ? " file2))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
359 file2 file1)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
360 (f2-exists (setcar triple file2))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
361 (f1-exists (setcar triple file1))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
362 (t
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
363 (with-output-to-temp-buffer ediff-msg-buffer
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
364 (princ "\nEdiff has inferred that")
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
365 (if (string= file1 file2)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
366 (princ (format "
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
367 %s
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
368 is the target for this patch. However, this file does not exist."
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
369 file1))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
370 (princ (format "
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
371 %s
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
372 %s
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
373 are two possible targets for this patch. However, these files do not exist."
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
374 file1 file2)))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
375 (princ "
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
376 \nPlease enter an alternative patch target ...\n"))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
377 (let ((directory t)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
378 target)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
379 (while directory
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
380 (setq target (read-file-name
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
381 "Please enter a patch target: "
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
382 actual-dir actual-dir t))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
383 (if (not (file-directory-p target))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
384 (setq directory nil)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
385 (beep)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
386 (message "%s is a directory" target)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
387 (sit-for 2)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
388 (setcar triple target)))))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
389 ediff-patch-map)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
390 ))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
391
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
392 (defun ediff-show-patch-diagnostics ()
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
393 (interactive)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
394 (cond ((window-live-p ediff-window-A)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
395 (set-window-buffer ediff-window-A ediff-patch-diagnostics))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
396 ((window-live-p ediff-window-B)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
397 (set-window-buffer ediff-window-B ediff-patch-diagnostics))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
398 (t (display-buffer ediff-patch-diagnostics 'not-this-window))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
399
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
400 (defun ediff-get-patch-buffer ()
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
401 "Obtain patch buffer. If patch is already in a buffer---use it.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
402 Else, read patch file into a new buffer."
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
403 (let ((dir (cond (ediff-patch-default-directory) ; try patch default dir
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
404 (ediff-use-last-dir ediff-last-dir-patch)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
405 (t default-directory)))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
406 patch-buf)
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
407 (if (let ((last-nonmenu-event t) ; Emacs: don't use dialog box
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
408 last-command-event) ; XEmacs: don't use dialog box
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
409 (y-or-n-p "Is the patch already in a buffer? "))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
410 (setq patch-buf
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
411 (get-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
412 (read-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
413 "Which buffer contains the patch? "
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
414 (ediff-other-buffer
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
415 (if (eq (next-window (selected-window)) (selected-window))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
416 ;; only one window in frame --- don't skip current buff
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
417 ""
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
418 ;; >1 window --- skip current buff, assuming this is the one
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
419 ;; to patch, not the one that has the patch
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
420 (current-buffer)))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
421 'must-match)))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
422 (setq patch-buf
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
423 (find-file-noselect
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
424 (read-file-name "Which file contains the patch? "
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
425 dir nil 'must-match))))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
426
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
427 (ediff-with-current-buffer patch-buf
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
428 (goto-char (point-min))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
429 (or (ediff-get-visible-buffer-window patch-buf)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
430 (progn
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
431 (pop-to-buffer patch-buf 'other-window)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
432 (select-window (previous-window)))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
433 (ediff-map-patch-buffer patch-buf)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
434 patch-buf))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
435
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
436 ;; Dispatch the right patch file function: regular or meta-level,
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
437 ;; depending on how many patches are in the patch file.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
438 ;; At present, there is no support for meta-level patches.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
439 ;; Should return either the ctl buffer or the meta-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
440 (defun ediff-dispatch-file-patching-job (patch-buf filename
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
441 &optional startup-hooks)
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
442 (ediff-with-current-buffer patch-buf
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
443 ;; relativize names in the patch with respect to source-file
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
444 (ediff-fixup-patch-map filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
445 (if (< (length ediff-patch-map) 2)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
446 (ediff-patch-file-internal
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
447 patch-buf
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
448 (if (and (not (string-match "^/dev/null" (car (car ediff-patch-map))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
449 (> (length (car (car ediff-patch-map))) 1))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
450 (car (car ediff-patch-map))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
451 filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
452 startup-hooks)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
453 (ediff-multi-patch-internal patch-buf startup-hooks))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
454 ))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
455
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
456
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
457 ;; When patching a buffer, never change the orig file. Instead, create a new
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
458 ;; buffer, ***_patched, even if the buff visits a file.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
459 ;; Users who want to actually patch the buffer should use
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
460 ;; ediff-patch-file, not ediff-patch-buffer.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
461 (defun ediff-patch-buffer-internal (patch-buf
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
462 buf-to-patch-name
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
463 &optional startup-hooks)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
464 (let* ((buf-to-patch (get-buffer buf-to-patch-name))
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
465 (visited-file (if buf-to-patch (buffer-file-name buf-to-patch)))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
466 (buf-mod-status (buffer-modified-p buf-to-patch))
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
467 (multifile-patch-p (> (length (ediff-with-current-buffer patch-buf
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
468 ediff-patch-map)) 1))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
469 default-dir file-name ctl-buf)
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
470 (if multifile-patch-p
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
471 (error
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
472 "Can't apply multi-file patches to buffers that visit no files"))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
473
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
474 ;; create a temp file to patch
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
475 (ediff-with-current-buffer buf-to-patch
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
476 (setq default-dir default-directory)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
477 (setq file-name (ediff-make-temp-file buf-to-patch))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
478 ;; temporarily switch visited file name, if any
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
479 (set-visited-file-name file-name)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
480 ;; don't create auto-save file, if buff was visiting a file
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
481 (or visited-file
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
482 (setq buffer-auto-save-file-name nil))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
483 ;; don't confuse the user with a new bufname
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
484 (rename-buffer buf-to-patch-name)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
485 (set-buffer-modified-p nil)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
486 (set-visited-file-modtime) ; sync buffer and temp file
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
487 (setq default-directory default-dir)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
488 )
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
489
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
490 ;; dispatch a patch function
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
491 (setq ctl-buf (ediff-dispatch-file-patching-job
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
492 patch-buf file-name startup-hooks))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
493
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
494 (ediff-with-current-buffer ctl-buf
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
495 (delete-file (buffer-file-name ediff-buffer-A))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
496 (delete-file (buffer-file-name ediff-buffer-B))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
497 (ediff-with-current-buffer ediff-buffer-A
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
498 (if default-dir (setq default-directory default-dir))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
499 (set-visited-file-name visited-file) ; visited-file might be nil
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
500 (rename-buffer buf-to-patch-name)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
501 (set-buffer-modified-p buf-mod-status))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
502 (ediff-with-current-buffer ediff-buffer-B
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
503 (setq buffer-auto-save-file-name nil) ; don't create auto-save file
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
504 (if default-dir (setq default-directory default-dir))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
505 (set-visited-file-name nil)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
506 (rename-buffer (ediff-unique-buffer-name
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
507 (concat buf-to-patch-name "_patched") ""))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
508 (set-buffer-modified-p t)))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
509 ))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
510
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
511
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
512 ;; Traditional patch has weird return codes.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
513 ;; GNU and Posix return 1 if some hanks failed and 2 in case of trouble.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
514 ;; 0 is a good code in all cases.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
515 ;; We'll do the concervative thing.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
516 (defun ediff-patch-return-code-ok (code)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
517 (eq code 0))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
518 ;;; (if (eq (ediff-test-patch-utility) 'traditional)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
519 ;;; (eq code 0)
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
520 ;;; (not (eq code 2))))
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
521
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
522 (defun ediff-patch-file-internal (patch-buf source-filename
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
523 &optional startup-hooks)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
524 (setq source-filename (expand-file-name source-filename))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
525
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
526 (let* ((shell-file-name ediff-shell)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
527 (patch-diagnostics (get-buffer-create "*ediff patch diagnostics*"))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
528 ;; ediff-find-file may use a temp file to do the patch
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
529 ;; so, we save source-filename and true-source-filename as a var
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
530 ;; that initially is source-filename but may be changed to a temp
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
531 ;; file for the purpose of patching.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
532 (true-source-filename source-filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
533 (target-filename source-filename)
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
534 target-buf buf-to-patch file-name-magic-p
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
535 patch-return-code ctl-buf backup-style aux-wind)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
536
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
537 (if (string-match "V" ediff-patch-options)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
538 (error
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
539 "Ediff doesn't take the -V option in `ediff-patch-options'--sorry"))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
540
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
541 ;; Make a temp file, if source-filename has a magic file handler (or if
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
542 ;; it is handled via auto-mode-alist and similar magic).
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
543 ;; Check if there is a buffer visiting source-filename and if they are in
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
544 ;; sync; arrange for the deletion of temp file.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
545 (ediff-find-file 'true-source-filename 'buf-to-patch
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
546 'ediff-last-dir-patch 'startup-hooks)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
547
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
548 ;; Check if source file name has triggered black magic, such as file name
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
549 ;; handlers or auto mode alist, and make a note of it.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
550 ;; true-source-filename should be either the original name or a
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
551 ;; temporary file where we put the after-product of the file handler.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
552 (setq file-name-magic-p (not (equal (file-truename true-source-filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
553 (file-truename source-filename))))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
554
16766
beb94a5271e2 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16248
diff changeset
555 ;; Checkout orig file, if necessary, so that the patched file
beb94a5271e2 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16248
diff changeset
556 ;; could be checked back in.
beb94a5271e2 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16248
diff changeset
557 (ediff-maybe-checkout buf-to-patch)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
558
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
559 (ediff-with-current-buffer patch-diagnostics
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
560 (insert-buffer patch-buf)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
561 (message "Applying patch ... ")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
562 ;; fix environment for gnu patch, so it won't make numbered extensions
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
563 (setq backup-style (getenv "VERSION_CONTROL"))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
564 (setenv "VERSION_CONTROL" nil)
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
565 (setq patch-return-code
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
566 (call-process-region
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
567 (point-min) (point-max)
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
568 shell-file-name
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
569 t ; delete region (which contains the patch
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
570 t ; insert output (patch diagnostics) in current buffer
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
571 nil ; don't redisplay
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
572 shell-command-switch ; usually -c
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
573 (format "%s %s %s %s"
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
574 ediff-patch-program
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
575 ediff-patch-options
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
576 ediff-backup-specs
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
577 (expand-file-name true-source-filename))
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
578 ))
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
579
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
580 ;; restore environment for gnu patch
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
581 (setenv "VERSION_CONTROL" backup-style))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
582
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
583 (message "Applying patch ... done")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
584 (message "")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
585
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
586 (switch-to-buffer patch-diagnostics)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
587 (sit-for 0) ; synchronize - let the user see diagnostics
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
588
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
589 (or (and (ediff-patch-return-code-ok patch-return-code)
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
590 (file-exists-p
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
591 (concat true-source-filename ediff-backup-extension)))
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
592 (progn
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
593 (with-output-to-temp-buffer ediff-msg-buffer
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
594 (princ (format
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
595 "Patch program has failed due to a bad patch file,
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
596 it couldn't apply all hunks, OR
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
597 it couldn't create the backup for the file being patched.
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
598
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
599 The former could be caused by a corrupt patch file or because the %S
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
600 program doesn't understand the format of the patch file in use.
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
601
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
602 The second problem might be due to an incompatibility among these settings:
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
603 ediff-patch-program = %S ediff-patch-options = %S
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
604 ediff-backup-extension = %S ediff-backup-specs = %S
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
605
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
606 See Ediff on-line manual for more details on these variables.
19774
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
607 In particular, check the documentation for `ediff-backup-specs'.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
608
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
609 In any of the above cases, Ediff doesn't compare files automatically.
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
610 However, if the patch was applied partially and the backup file was created,
1ecc4a79d048 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 19047
diff changeset
611 you can still examine the changes via M-x ediff-files"
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
612 ediff-patch-program
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
613 ediff-patch-program
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
614 ediff-patch-options
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
615 ediff-backup-extension
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
616 ediff-backup-specs
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
617 )))
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
618 (beep 1)
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
619 (if (setq aux-wind (get-buffer-window ediff-msg-buffer))
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
620 (progn
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
621 (select-window aux-wind)
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
622 (goto-char (point-max))))
18839
1405083241e8 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18054
diff changeset
623 (switch-to-buffer-other-window patch-diagnostics)
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
624 (error "Patch appears to have failed")))
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
625
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
626 ;; If black magic is involved, apply patch to a temp copy of the
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
627 ;; file. Otherwise, apply patch to the orig copy. If patch is applied
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
628 ;; to temp copy, we name the result old-name_patched for local files
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
629 ;; and temp-copy_patched for remote files. The orig file name isn't
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
630 ;; changed, and the temp copy of the original is later deleted.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
631 ;; Without magic, the original file is renamed (usually into
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
632 ;; old-name_orig) and the result of patching will have the same name as
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
633 ;; the original.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
634 (if (not file-name-magic-p)
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
635 (ediff-with-current-buffer buf-to-patch
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
636 (set-visited-file-name
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
637 (concat source-filename ediff-backup-extension))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
638 (set-buffer-modified-p nil))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
639
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
640 ;; Black magic in effect.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
641 ;; If orig file was remote, put the patched file in the temp directory.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
642 ;; If orig file is local, put the patched file in the directory of
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
643 ;; the orig file.
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
644 (setq target-filename
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
645 (concat
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
646 (if (ediff-file-remote-p (file-truename source-filename))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
647 true-source-filename
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
648 source-filename)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
649 "_patched"))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
650
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
651 (rename-file true-source-filename target-filename t)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
652
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
653 ;; arrange that the temp copy of orig will be deleted
16248
b2fae8abc5b0 *** empty log message ***
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 16168
diff changeset
654 (rename-file (concat true-source-filename ediff-backup-extension)
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
655 true-source-filename t))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
656
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
657 ;; make orig buffer read-only
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
658 (setq startup-hooks
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
659 (cons 'ediff-set-read-only-in-buf-A startup-hooks))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
660
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
661 ;; set up a buf for the patched file
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
662 (setq target-buf (find-file-noselect target-filename))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
663
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
664 (setq ctl-buf
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
665 (ediff-buffers-internal
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
666 buf-to-patch target-buf nil
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
667 startup-hooks 'epatch))
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
668 (ediff-with-current-buffer ctl-buf
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
669 (setq ediff-patchbufer patch-buf
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
670 ediff-patch-diagnostics patch-diagnostics))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
671
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
672 (bury-buffer patch-diagnostics)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
673 (message "Type `P', if you need to see patch diagnostics")
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
674 ctl-buf))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
675
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
676 (defun ediff-multi-patch-internal (patch-buf &optional startup-hooks)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
677 (let (meta-buf)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
678 (setq startup-hooks
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
679 ;; this sets various vars in the meta buffer inside
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
680 ;; ediff-prepare-meta-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
681 (cons (` (lambda ()
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
682 ;; tell what to do if the user clicks on a session record
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
683 (setq ediff-session-action-function
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
684 'ediff-patch-file-form-meta
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
685 ediff-meta-patchbufer patch-buf)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
686 ))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
687 startup-hooks))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
688 (setq meta-buf (ediff-prepare-meta-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
689 'ediff-filegroup-action
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
690 (ediff-with-current-buffer patch-buf
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
691 ;; nil replaces a regular expression
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
692 (cons (list nil (format "%S" patch-buf))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
693 ediff-patch-map))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
694 "*Ediff Session Group Panel"
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
695 'ediff-redraw-directory-group-buffer
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
696 'ediff-multifile-patch
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
697 startup-hooks))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
698 (ediff-show-meta-buffer meta-buf)
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
699 ))
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
700
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
701
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
702
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
703
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
704 ;;; Local Variables:
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
705 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
19047
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
706 ;;; eval: (put 'ediff-with-current-buffer 'lisp-indent-hook 1)
f90d40b0bff5 new version
Michael Kifer <kifer@cs.stonybrook.edu>
parents: 18839
diff changeset
707 ;;; eval: (put 'ediff-with-current-buffer 'edebug-form-spec '(form body))
15479
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
708 ;;; End:
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
709
78863db629bb Initial revision
Michael Kifer <kifer@cs.stonybrook.edu>
parents:
diff changeset
710 ;;; ediff-ptch.el ends here