@matheusbsbs / matheus-bagliano / commits / 34292bddb8
Fork 0

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