Skip to content

Commit

Permalink
Merge branch 'rs/diff-ihc'
Browse files Browse the repository at this point in the history
* rs/diff-ihc:
  diff: add option to show context between close hunks

Conflicts:
	Documentation/diff-options.txt
  • Loading branch information
Junio C Hamano committed Jan 7, 2009
2 parents ff32340 + 6d0e674 commit 7bb5321
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 1 deletion.
4 changes: 4 additions & 0 deletions Documentation/diff-options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions contrib/completion/git-completion.bash
Original file line number Diff line number Diff line change
Expand Up @@ -776,6 +776,7 @@ _git_diff ()
--no-ext-diff
--no-prefix --src-prefix= --dst-prefix=
--base --ours --theirs
--inter-hunk-context=
"
return
;;
Expand Down Expand Up @@ -967,6 +968,7 @@ _git_log ()
--color-words --walk-reflogs
--parents --children --full-history
--merge
--inter-hunk-context=
"
return
;;
Expand Down
4 changes: 4 additions & 0 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
92 changes: 92 additions & 0 deletions t/t4032-diff-inter-hunk-context.sh
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions xdiff/xdiff.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion xdiff/xemit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 7bb5321

Please sign in to comment.