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>
This commit is contained in:
parent
92b7de93fb
commit
34292bddb8
@ -40,6 +40,9 @@ endif::git-format-patch[]
|
||||
--patch-with-raw::
|
||||
Synonym for "-p --raw".
|
||||
|
||||
--patience:
|
||||
Generate a diff using the "patience diff" algorithm.
|
||||
|
||||
--stat[=width[,name-width]]::
|
||||
Generate a diffstat. You can override the default
|
||||
output width for 80-column terminal by "--stat=width".
|
||||
|
2
Makefile
2
Makefile
@ -1287,7 +1287,7 @@ $(LIB_FILE): $(LIB_OBJS)
|
||||
$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
|
||||
|
||||
XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \
|
||||
xdiff/xmerge.o
|
||||
xdiff/xmerge.o xdiff/xpatience.o
|
||||
$(XDIFF_OBJS): xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
|
||||
xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
|
||||
|
||||
|
2
diff.c
2
diff.c
@ -2471,6 +2471,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
|
||||
options->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE;
|
||||
else if (!strcmp(arg, "--ignore-space-at-eol"))
|
||||
options->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL;
|
||||
else if (!strcmp(arg, "--patience"))
|
||||
options->xdl_opts |= XDF_PATIENCE_DIFF;
|
||||
|
||||
/* flags options */
|
||||
else if (!strcmp(arg, "--binary")) {
|
||||
|
168
t/t4033-diff-patience.sh
Executable file
168
t/t4033-diff-patience.sh
Executable file
@ -0,0 +1,168 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='patience diff algorithm'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
cat >file1 <<\EOF
|
||||
#include <stdio.h>
|
||||
|
||||
// Frobs foo heartily
|
||||
int frobnitz(int foo)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 10; i++)
|
||||
{
|
||||
printf("Your answer is: ");
|
||||
printf("%d\n", foo);
|
||||
}
|
||||
}
|
||||
|
||||
int fact(int n)
|
||||
{
|
||||
if(n > 1)
|
||||
{
|
||||
return fact(n-1) * n;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
frobnitz(fact(10));
|
||||
}
|
||||
EOF
|
||||
|
||||
cat >file2 <<\EOF
|
||||
#include <stdio.h>
|
||||
|
||||
int fib(int n)
|
||||
{
|
||||
if(n > 2)
|
||||
{
|
||||
return fib(n-1) + fib(n-2);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Frobs foo heartily
|
||||
int frobnitz(int foo)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 10; i++)
|
||||
{
|
||||
printf("%d\n", foo);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
frobnitz(fib(10));
|
||||
}
|
||||
EOF
|
||||
|
||||
cat >expect <<\EOF
|
||||
diff --git a/file1 b/file2
|
||||
index 6faa5a3..e3af329 100644
|
||||
--- a/file1
|
||||
+++ b/file2
|
||||
@@ -1,26 +1,25 @@
|
||||
#include <stdio.h>
|
||||
|
||||
+int fib(int n)
|
||||
+{
|
||||
+ if(n > 2)
|
||||
+ {
|
||||
+ return fib(n-1) + fib(n-2);
|
||||
+ }
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
// Frobs foo heartily
|
||||
int frobnitz(int foo)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < 10; i++)
|
||||
{
|
||||
- printf("Your answer is: ");
|
||||
printf("%d\n", foo);
|
||||
}
|
||||
}
|
||||
|
||||
-int fact(int n)
|
||||
-{
|
||||
- if(n > 1)
|
||||
- {
|
||||
- return fact(n-1) * n;
|
||||
- }
|
||||
- return 1;
|
||||
-}
|
||||
-
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
- frobnitz(fact(10));
|
||||
+ frobnitz(fib(10));
|
||||
}
|
||||
EOF
|
||||
|
||||
test_expect_success 'patience diff' '
|
||||
|
||||
test_must_fail git diff --no-index --patience file1 file2 > output &&
|
||||
test_cmp expect output
|
||||
|
||||
'
|
||||
|
||||
test_expect_success 'patience diff output is valid' '
|
||||
|
||||
mv file2 expect &&
|
||||
git apply < output &&
|
||||
test_cmp expect file2
|
||||
|
||||
'
|
||||
|
||||
cat >uniq1 <<\EOF
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
EOF
|
||||
|
||||
cat >uniq2 <<\EOF
|
||||
a
|
||||
b
|
||||
c
|
||||
d
|
||||
e
|
||||
f
|
||||
EOF
|
||||
|
||||
cat >expect <<\EOF
|
||||
diff --git a/uniq1 b/uniq2
|
||||
index b414108..0fdf397 100644
|
||||
--- a/uniq1
|
||||
+++ b/uniq2
|
||||
@@ -1,6 +1,6 @@
|
||||
-1
|
||||
-2
|
||||
-3
|
||||
-4
|
||||
-5
|
||||
-6
|
||||
+a
|
||||
+b
|
||||
+c
|
||||
+d
|
||||
+e
|
||||
+f
|
||||
EOF
|
||||
|
||||
test_expect_success 'completely different files' '
|
||||
|
||||
test_must_fail git diff --no-index --patience uniq1 uniq2 > output &&
|
||||
test_cmp expect output
|
||||
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue
Block a user