* rs/diff-ihc:
  diff: add option to show context between close hunks

Conflicts:
	Documentation/diff-options.txt
This commit is contained in:
Junio C Hamano 2009-01-07 00:10:14 -08:00
Родитель ff32340669 6d0e674a57
Коммит 7bb5321be0
7 изменённых файлов: 106 добавлений и 1 удалений

Просмотреть файл

@ -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
Просмотреть файл

@ -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
Просмотреть файл

@ -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;