Introduce the diff option '--patience'
This commit teaches Git to produce diff output using the patience diff algorithm with the diff option '--patience'. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Johannes Schindelin committed
Jan 1, 2009 at 17:39 UTC
34292bddb861f3cb52a524fdce67234430a744fe
4 files changed
+174
-1
Documentation/diff-options.txt
+3
@@ -40,6 +40,9 @@ endif::git-format-patch[]
40
--patch-with-raw::
41
Synonym for "-p --raw".
42
43
+--patience:
44
+ Generate a diff using the "patience diff" algorithm.
45
+
46
--stat[=width[,name-width]]::
47
Generate a diffstat. You can override the default
48
output width for 80-column terminal by "--stat=width".
Makefile
+1
-1
@@ -1287,7 +1287,7 @@ $(LIB_FILE): $(LIB_OBJS)
1287
$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
1288
1289
XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \
1290
- xdiff/xmerge.o
1290
+ xdiff/xmerge.o xdiff/xpatience.o
1291
$(XDIFF_OBJS): xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
1292
xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
1293
diff.c
+2
@@ -2471,6 +2471,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
2471
options->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE;
2472
else if (!strcmp(arg, "--ignore-space-at-eol"))
2473
options->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL;
2474
+ else if (!strcmp(arg, "--patience"))
2475
+ options->xdl_opts |= XDF_PATIENCE_DIFF;
2476
2477
/* flags options */
2478
else if (!strcmp(arg, "--binary")) {
t/t4033-diff-patience.sh
new
+168
@@ -0,0 +1,168 @@
1
+#!/bin/sh
2
+
3
+test_description='patience diff algorithm'
4
+
5
+. ./test-lib.sh
6
+
7
+cat >file1 <<\EOF
8
+#include <stdio.h>
9
+
10
+// Frobs foo heartily
11
+int frobnitz(int foo)
12
+{
13
+ int i;
14
+ for(i = 0; i < 10; i++)
15
+ {
16
+ printf("Your answer is: ");
17
+ printf("%d\n", foo);
18
+ }
19
+}
20
+
21
+int fact(int n)
22
+{
23
+ if(n > 1)
24
+ {
25
+ return fact(n-1) * n;
26
+ }
27
+ return 1;
28
+}
29
+
30
+int main(int argc, char **argv)
31
+{
32
+ frobnitz(fact(10));
33
+}
34
+EOF
35
+
36
+cat >file2 <<\EOF
37
+#include <stdio.h>
38
+
39
+int fib(int n)
40
+{
41
+ if(n > 2)
42
+ {
43
+ return fib(n-1) + fib(n-2);
44
+ }
45
+ return 1;
46
+}
47
+
48
+// Frobs foo heartily
49
+int frobnitz(int foo)
50
+{
51
+ int i;
52
+ for(i = 0; i < 10; i++)
53
+ {
54
+ printf("%d\n", foo);
55
+ }
56
+}
57
+
58
+int main(int argc, char **argv)
59
+{
60
+ frobnitz(fib(10));
61
+}
62
+EOF
63
+
64
+cat >expect <<\EOF
65
+diff --git a/file1 b/file2
66
+index 6faa5a3..e3af329 100644
67
+--- a/file1
68
++++ b/file2
69
+@@ -1,26 +1,25 @@
70
+ #include <stdio.h>
71
+
72
++int fib(int n)
73
++{
74
++ if(n > 2)
75
++ {
76
++ return fib(n-1) + fib(n-2);
77
++ }
78
++ return 1;
79
++}
80
++
81
+ // Frobs foo heartily
82
+ int frobnitz(int foo)
83
+ {
84
+ int i;
85
+ for(i = 0; i < 10; i++)
86
+ {
87
+- printf("Your answer is: ");
88
+ printf("%d\n", foo);
89
+ }
90
+ }
91
+
92
+-int fact(int n)
93
+-{
94
+- if(n > 1)
95
+- {
96
+- return fact(n-1) * n;
97
+- }
98
+- return 1;
99
+-}
100
+-
101
+ int main(int argc, char **argv)
102
+ {
103
+- frobnitz(fact(10));
104
++ frobnitz(fib(10));
105
+ }
106
+EOF
107
+
108
+test_expect_success 'patience diff' '
109
+
110
+ test_must_fail git diff --no-index --patience file1 file2 > output &&
111
+ test_cmp expect output
112
+
113
+'
114
+
115
+test_expect_success 'patience diff output is valid' '
116
+
117
+ mv file2 expect &&
118
+ git apply < output &&
119
+ test_cmp expect file2
120
+
121
+'
122
+
123
+cat >uniq1 <<\EOF
124
+1
125
+2
126
+3
127
+4
128
+5
129
+6
130
+EOF
131
+
132
+cat >uniq2 <<\EOF
133
+a
134
+b
135
+c
136
+d
137
+e
138
+f
139
+EOF
140
+
141
+cat >expect <<\EOF
142
+diff --git a/uniq1 b/uniq2
143
+index b414108..0fdf397 100644
144
+--- a/uniq1
145
++++ b/uniq2
146
+@@ -1,6 +1,6 @@
147
+-1
148
+-2
149
+-3
150
+-4
151
+-5
152
+-6
153
++a
154
++b
155
++c
156
++d
157
++e
158
++f
159
+EOF
160
+
161
+test_expect_success 'completely different files' '
162
+
163
+ test_must_fail git diff --no-index --patience uniq1 uniq2 > output &&
164
+ test_cmp expect output
165
+
166
+'
167
+
168
+test_done