Antoine Pelisse <apeli...@gmail.com> writes:

> It might be kind of noisy, but I think trying to improve the solution
> might lead to over-engineering.
> How would we compute the "minimal distance between interesting and
> blank" so that the blank becomes interesting ?
> Using the context size for that is quite convenient, while creating
> another variable would probably become overkill..
>
> The original goal is to remove hunks created solely for
> addition/suppression, and I think it's what it should do for the
> moment.

Something like this on top of your original one is what I had in
mind as a starting point.

 t/t4015-diff-whitespace.sh |  5 +----
 xdiff/xemit.c              | 45 ++++++++++++++++++++++++++-------------------
 2 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/t/t4015-diff-whitespace.sh b/t/t4015-diff-whitespace.sh
index b3c4fcc..acc2159 100755
--- a/t/t4015-diff-whitespace.sh
+++ b/t/t4015-diff-whitespace.sh
@@ -185,7 +185,7 @@ test_expect_success 'ignore-blank-lines: with changes' '
        git diff --ignore-blank-lines >out.tmp &&
        sed -e "1,/^+++ b\/x/d" <out.tmp >out &&
        cat <<-\EOF >expect &&
-       @@ -1,6 +2,7 @@
+       @@ -1,11 +2,14 @@
         1
         2
         3
@@ -193,9 +193,6 @@ test_expect_success 'ignore-blank-lines: with changes' '
         4
         5
         6
-       @@ -5,7 +7,9 @@
-        5
-        6
         7
        +
         8
diff --git a/xdiff/xemit.c b/xdiff/xemit.c
index 52dfef8..27e1105 100644
--- a/xdiff/xemit.c
+++ b/xdiff/xemit.c
@@ -59,32 +59,39 @@ static int xdl_emit_record(xdfile_t *xdf, long ri, char 
const *pre, xdemitcb_t *
  * Also advance xscr if the first changes must be discareded.
  */
 xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg) {
-       xdchange_t *xch, *xchp;
+       xdchange_t *xch, *xchp = NULL, *xch_start = NULL;
        long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen;
-       long ignorable_context = max_common / 2 - 1;
-       int interesting = 0;
 
-       for (xchp = *xscr, xch = (*xscr)->next; xch; xchp = xch, xch = 
xch->next) {
-               long thresh;
-               if (xchp->ignore || xch->ignore)
-                       thresh = ignorable_context;
-               else
-                       thresh = max_common;
-
-               if (!xchp->ignore)
-                       interesting = 1;
+       /* Skip the ones that can be ignored from the beginning */
+       for (xch = *xscr; xch; xch = xch->next) {
+               if (xch->ignore)
+                       continue;
+               xch_start = xch;
+               break;
+       }
 
-               if (xch->i1 - (xchp->i1 + xchp->chg1) > thresh) {
-                       if (interesting)
+       for (xchp = xch_start; xchp; ) {
+               /* Find the next one that is not ignored */
+               for (xch = xchp->next; xch; xch = xch->next)
+                       if (!xch->ignore)
                                break;
-                       else
-                               *xscr = xch;
+               if (!xch)
+                       break; /* show xch_start thru xchp */
+
+               /* are these hunks close enough? */
+               if ((xchp->i1 + xchp->chg1) - xch->i1 < max_common) {
+                       xchp = xch;
+                       continue;
                }
-       }
 
-       if (!interesting && xchp->ignore)
-               *xscr = NULL;
+               /*
+                * otherwise, xchp is the last one (inclusive) we want
+                * to coalesce into a single output hunk.
+                */
+               break;
+       }
 
+       *xscr = xch_start;
        return xchp;
 }
 
-- 
1.8.3-477-gc2fede3

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to