зеркало из https://github.com/microsoft/git.git
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:
Коммит
7bb5321be0
|
@ -205,6 +205,10 @@ endif::git-format-patch[]
|
|||
differences even if one line has whitespace where the other
|
||||
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::
|
||||
Make the program exit with codes similar to diff(1).
|
||||
That is, it exits with 1 if there were differences and
|
||||
|
|
|
@ -776,6 +776,7 @@ _git_diff ()
|
|||
--no-ext-diff
|
||||
--no-prefix --src-prefix= --dst-prefix=
|
||||
--base --ours --theirs
|
||||
--inter-hunk-context=
|
||||
"
|
||||
return
|
||||
;;
|
||||
|
@ -967,6 +968,7 @@ _git_log ()
|
|||
--color-words --walk-reflogs
|
||||
--parents --children --full-history
|
||||
--merge
|
||||
--inter-hunk-context=
|
||||
"
|
||||
return
|
||||
;;
|
||||
|
|
4
diff.c
4
diff.c
|
@ -1469,6 +1469,7 @@ static void builtin_diff(const char *name_a,
|
|||
ecbdata.file = o->file;
|
||||
xpp.flags = XDF_NEED_MINIMAL | o->xdl_opts;
|
||||
xecfg.ctxlen = o->context;
|
||||
xecfg.interhunkctxlen = o->interhunkcontext;
|
||||
xecfg.flags = XDL_EMIT_FUNCNAMES;
|
||||
if (pe)
|
||||
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;
|
||||
else if (!strcmp(arg, "--no-prefix"))
|
||||
options->a_prefix = options->b_prefix = "";
|
||||
else if (opt_arg(arg, '\0', "inter-hunk-context",
|
||||
&options->interhunkcontext))
|
||||
;
|
||||
else if (!prefixcmp(arg, "--output=")) {
|
||||
options->file = fopen(arg + strlen("--output="), "w");
|
||||
options->close_file = 1;
|
||||
|
|
1
diff.h
1
diff.h
|
@ -78,6 +78,7 @@ struct diff_options {
|
|||
const char *a_prefix, *b_prefix;
|
||||
unsigned flags;
|
||||
int context;
|
||||
int interhunkcontext;
|
||||
int break_opt;
|
||||
int detect_rename;
|
||||
int skip_stat_unmatch;
|
||||
|
|
|
@ -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 {
|
||||
long ctxlen;
|
||||
long interhunkctxlen;
|
||||
unsigned long flags;
|
||||
find_func_t find_func;
|
||||
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 *xch, *xchp;
|
||||
long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen;
|
||||
|
||||
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;
|
||||
|
||||
return xchp;
|
||||
|
|
Загрузка…
Ссылка в новой задаче