Merge branch 'rs/diff-ihc'
* rs/diff-ihc: diff: add option to show context between close hunks Conflicts: Documentation/diff-options.txt
This commit is contained in:
commit
7bb5321be0
@ -205,6 +205,10 @@ endif::git-format-patch[]
|
|||||||
differences even if one line has whitespace where the other
|
differences even if one line has whitespace where the other
|
||||||
line has none.
|
line has none.
|
||||||
|
|
||||||
|
--inter-hunk-context=<lines>::
|
||||||
|
Show the context between diff hunks, up to the specified number
|
||||||
|
of lines, thereby fusing hunks that are close to each other.
|
||||||
|
|
||||||
--exit-code::
|
--exit-code::
|
||||||
Make the program exit with codes similar to diff(1).
|
Make the program exit with codes similar to diff(1).
|
||||||
That is, it exits with 1 if there were differences and
|
That is, it exits with 1 if there were differences and
|
||||||
|
@ -776,6 +776,7 @@ _git_diff ()
|
|||||||
--no-ext-diff
|
--no-ext-diff
|
||||||
--no-prefix --src-prefix= --dst-prefix=
|
--no-prefix --src-prefix= --dst-prefix=
|
||||||
--base --ours --theirs
|
--base --ours --theirs
|
||||||
|
--inter-hunk-context=
|
||||||
"
|
"
|
||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
@ -967,6 +968,7 @@ _git_log ()
|
|||||||
--color-words --walk-reflogs
|
--color-words --walk-reflogs
|
||||||
--parents --children --full-history
|
--parents --children --full-history
|
||||||
--merge
|
--merge
|
||||||
|
--inter-hunk-context=
|
||||||
"
|
"
|
||||||
return
|
return
|
||||||
;;
|
;;
|
||||||
|
4
diff.c
4
diff.c
@ -1469,6 +1469,7 @@ static void builtin_diff(const char *name_a,
|
|||||||
ecbdata.file = o->file;
|
ecbdata.file = o->file;
|
||||||
xpp.flags = XDF_NEED_MINIMAL | o->xdl_opts;
|
xpp.flags = XDF_NEED_MINIMAL | o->xdl_opts;
|
||||||
xecfg.ctxlen = o->context;
|
xecfg.ctxlen = o->context;
|
||||||
|
xecfg.interhunkctxlen = o->interhunkcontext;
|
||||||
xecfg.flags = XDL_EMIT_FUNCNAMES;
|
xecfg.flags = XDL_EMIT_FUNCNAMES;
|
||||||
if (pe)
|
if (pe)
|
||||||
xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags);
|
xdiff_set_find_func(&xecfg, pe->pattern, pe->cflags);
|
||||||
@ -2538,6 +2539,9 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
|
|||||||
options->b_prefix = arg + 13;
|
options->b_prefix = arg + 13;
|
||||||
else if (!strcmp(arg, "--no-prefix"))
|
else if (!strcmp(arg, "--no-prefix"))
|
||||||
options->a_prefix = options->b_prefix = "";
|
options->a_prefix = options->b_prefix = "";
|
||||||
|
else if (opt_arg(arg, '\0', "inter-hunk-context",
|
||||||
|
&options->interhunkcontext))
|
||||||
|
;
|
||||||
else if (!prefixcmp(arg, "--output=")) {
|
else if (!prefixcmp(arg, "--output=")) {
|
||||||
options->file = fopen(arg + strlen("--output="), "w");
|
options->file = fopen(arg + strlen("--output="), "w");
|
||||||
options->close_file = 1;
|
options->close_file = 1;
|
||||||
|
1
diff.h
1
diff.h
@ -78,6 +78,7 @@ struct diff_options {
|
|||||||
const char *a_prefix, *b_prefix;
|
const char *a_prefix, *b_prefix;
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
int context;
|
int context;
|
||||||
|
int interhunkcontext;
|
||||||
int break_opt;
|
int break_opt;
|
||||||
int detect_rename;
|
int detect_rename;
|
||||||
int skip_stat_unmatch;
|
int skip_stat_unmatch;
|
||||||
|
92
t/t4032-diff-inter-hunk-context.sh
Executable file
92
t/t4032-diff-inter-hunk-context.sh
Executable file
@ -0,0 +1,92 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='diff hunk fusing'
|
||||||
|
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
f() {
|
||||||
|
echo $1
|
||||||
|
i=1
|
||||||
|
while test $i -le $2
|
||||||
|
do
|
||||||
|
echo $i
|
||||||
|
i=$(expr $i + 1)
|
||||||
|
done
|
||||||
|
echo $3
|
||||||
|
}
|
||||||
|
|
||||||
|
t() {
|
||||||
|
case $# in
|
||||||
|
4) hunks=$4; cmd="diff -U$3";;
|
||||||
|
5) hunks=$5; cmd="diff -U$3 --inter-hunk-context=$4";;
|
||||||
|
esac
|
||||||
|
label="$cmd, $1 common $2"
|
||||||
|
file=f$1
|
||||||
|
expected=expected.$file.$3.$hunks
|
||||||
|
|
||||||
|
if ! test -f $file
|
||||||
|
then
|
||||||
|
f A $1 B >$file
|
||||||
|
git add $file
|
||||||
|
git commit -q -m. $file
|
||||||
|
f X $1 Y >$file
|
||||||
|
fi
|
||||||
|
|
||||||
|
test_expect_success "$label: count hunks ($hunks)" "
|
||||||
|
test $(git $cmd $file | grep '^@@ ' | wc -l) = $hunks
|
||||||
|
"
|
||||||
|
|
||||||
|
test -f $expected &&
|
||||||
|
test_expect_success "$label: check output" "
|
||||||
|
git $cmd $file | grep -v '^index ' >actual &&
|
||||||
|
test_cmp $expected actual
|
||||||
|
"
|
||||||
|
}
|
||||||
|
|
||||||
|
cat <<EOF >expected.f1.0.1 || exit 1
|
||||||
|
diff --git a/f1 b/f1
|
||||||
|
--- a/f1
|
||||||
|
+++ b/f1
|
||||||
|
@@ -1,3 +1,3 @@
|
||||||
|
-A
|
||||||
|
+X
|
||||||
|
1
|
||||||
|
-B
|
||||||
|
+Y
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat <<EOF >expected.f1.0.2 || exit 1
|
||||||
|
diff --git a/f1 b/f1
|
||||||
|
--- a/f1
|
||||||
|
+++ b/f1
|
||||||
|
@@ -1 +1 @@
|
||||||
|
-A
|
||||||
|
+X
|
||||||
|
@@ -3 +3 @@ A
|
||||||
|
-B
|
||||||
|
+Y
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# common lines ctx intrctx hunks
|
||||||
|
t 1 line 0 2
|
||||||
|
t 1 line 0 0 2
|
||||||
|
t 1 line 0 1 1
|
||||||
|
t 1 line 0 2 1
|
||||||
|
t 1 line 1 1
|
||||||
|
|
||||||
|
t 2 lines 0 2
|
||||||
|
t 2 lines 0 0 2
|
||||||
|
t 2 lines 0 1 2
|
||||||
|
t 2 lines 0 2 1
|
||||||
|
t 2 lines 1 1
|
||||||
|
|
||||||
|
t 3 lines 1 2
|
||||||
|
t 3 lines 1 0 2
|
||||||
|
t 3 lines 1 1 1
|
||||||
|
t 3 lines 1 2 1
|
||||||
|
|
||||||
|
t 9 lines 3 2
|
||||||
|
t 9 lines 3 2 2
|
||||||
|
t 9 lines 3 3 1
|
||||||
|
|
||||||
|
test_done
|
@ -84,6 +84,7 @@ typedef long (*find_func_t)(const char *line, long line_len, char *buffer, long
|
|||||||
|
|
||||||
typedef struct s_xdemitconf {
|
typedef struct s_xdemitconf {
|
||||||
long ctxlen;
|
long ctxlen;
|
||||||
|
long interhunkctxlen;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
find_func_t find_func;
|
find_func_t find_func;
|
||||||
void *find_func_priv;
|
void *find_func_priv;
|
||||||
|
@ -59,9 +59,10 @@ static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *
|
|||||||
*/
|
*/
|
||||||
xdchange_t *xdl_get_hunk(xdchange_t *xscr, xdemitconf_t const *xecfg) {
|
xdchange_t *xdl_get_hunk(xdchange_t *xscr, xdemitconf_t const *xecfg) {
|
||||||
xdchange_t *xch, *xchp;
|
xdchange_t *xch, *xchp;
|
||||||
|
long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen;
|
||||||
|
|
||||||
for (xchp = xscr, xch = xscr->next; xch; xchp = xch, xch = xch->next)
|
for (xchp = xscr, xch = xscr->next; xch; xchp = xch, xch = xch->next)
|
||||||
if (xch->i1 - (xchp->i1 + xchp->chg1) > 2 * xecfg->ctxlen)
|
if (xch->i1 - (xchp->i1 + xchp->chg1) > max_common)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
return xchp;
|
return xchp;
|
||||||
|
Loading…
Reference in New Issue
Block a user