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>maint
parent
92b7de93fb
commit
34292bddb8
|
@ -40,6 +40,9 @@ endif::git-format-patch[]
|
||||||
--patch-with-raw::
|
--patch-with-raw::
|
||||||
Synonym for "-p --raw".
|
Synonym for "-p --raw".
|
||||||
|
|
||||||
|
--patience:
|
||||||
|
Generate a diff using the "patience diff" algorithm.
|
||||||
|
|
||||||
--stat[=width[,name-width]]::
|
--stat[=width[,name-width]]::
|
||||||
Generate a diffstat. You can override the default
|
Generate a diffstat. You can override the default
|
||||||
output width for 80-column terminal by "--stat=width".
|
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)
|
$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
|
||||||
|
|
||||||
XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \
|
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_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
|
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;
|
options->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE;
|
||||||
else if (!strcmp(arg, "--ignore-space-at-eol"))
|
else if (!strcmp(arg, "--ignore-space-at-eol"))
|
||||||
options->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL;
|
options->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL;
|
||||||
|
else if (!strcmp(arg, "--patience"))
|
||||||
|
options->xdl_opts |= XDF_PATIENCE_DIFF;
|
||||||
|
|
||||||
/* flags options */
|
/* flags options */
|
||||||
else if (!strcmp(arg, "--binary")) {
|
else if (!strcmp(arg, "--binary")) {
|
||||||
|
|
|
@ -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