run_diff_{files,index}(): update calling convention.
[gitweb.git] / combine-diff.c
index 8bf99f215c36c701bb3ff2ffc952587b8562c920..a5f2c8dd4a414e513d0421f9a499d06c73ecaf5a 100644 (file)
@@ -482,11 +482,11 @@ static int make_hunks(struct sline *sline, unsigned long cnt,
        return has_interesting;
 }
 
-static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long l1, int n)
+static void show_parent_lno(struct sline *sline, unsigned long l0, unsigned long l1, int n, unsigned long null_context)
 {
        l0 = sline[l0].p_lno[n];
        l1 = sline[l1].p_lno[n];
-       printf(" -%lu,%lu", l0, l1-l0);
+       printf(" -%lu,%lu", l0, l1-l0-null_context);
 }
 
 static int hunk_comment_line(const char *bol)
@@ -519,6 +519,7 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
                unsigned long hunk_end;
                unsigned long rlines;
                const char *hunk_comment = NULL;
+               unsigned long null_context = 0;
 
                while (lno <= cnt && !(sline[lno].flag & mark)) {
                        if (hunk_comment_line(sline[lno].bol))
@@ -535,10 +536,28 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
                rlines = hunk_end - lno;
                if (cnt < hunk_end)
                        rlines--; /* pointing at the last delete hunk */
+
+               if (!context) {
+                       /*
+                        * Even when running with --unified=0, all
+                        * lines in the hunk needs to be processed in
+                        * the loop below in order to show the
+                        * deletion recorded in lost_head.  However,
+                        * we do not want to show the resulting line
+                        * with all blank context markers in such a
+                        * case.  Compensate.
+                        */
+                       unsigned long j;
+                       for (j = lno; j < hunk_end; j++)
+                               if (!(sline[j].flag & (mark-1)))
+                                       null_context++;
+                       rlines -= null_context;
+               }
+
                fputs(c_frag, stdout);
                for (i = 0; i <= num_parent; i++) putchar(combine_marker);
                for (i = 0; i < num_parent; i++)
-                       show_parent_lno(sline, lno, hunk_end, i);
+                       show_parent_lno(sline, lno, hunk_end, i, null_context);
                printf(" +%lu,%lu ", lno+1, rlines);
                for (i = 0; i <= num_parent; i++) putchar(combine_marker);
 
@@ -578,8 +597,15 @@ static void dump_sline(struct sline *sline, unsigned long cnt, int num_parent,
                        if (cnt < lno)
                                break;
                        p_mask = 1;
-                       if (!(sl->flag & (mark-1)))
+                       if (!(sl->flag & (mark-1))) {
+                               /*
+                                * This sline was here to hang the
+                                * lost lines in front of it.
+                                */
+                               if (!context)
+                                       continue;
                                fputs(c_plain, stdout);
+                       }
                        else
                                fputs(c_new, stdout);
                        for (j = 0; j < num_parent; j++) {
@@ -898,8 +924,10 @@ void diff_tree_combined(const unsigned char *sha1,
                /* show stat against the first parent even
                 * when doing combined diff.
                 */
-               if (i == 0 && opt->output_format & DIFF_FORMAT_DIFFSTAT)
-                       diffopts.output_format = DIFF_FORMAT_DIFFSTAT;
+               int stat_opt = (opt->output_format &
+                               (DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT));
+               if (i == 0 && stat_opt)
+                       diffopts.output_format = stat_opt;
                else
                        diffopts.output_format = DIFF_FORMAT_NO_OUTPUT;
                diff_tree_sha1(parent[i], sha1, "", &diffopts);
@@ -929,7 +957,8 @@ void diff_tree_combined(const unsigned char *sha1,
                        }
                        needsep = 1;
                }
-               else if (opt->output_format & DIFF_FORMAT_DIFFSTAT)
+               else if (opt->output_format &
+                        (DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DIFFSTAT))
                        needsep = 1;
                if (opt->output_format & DIFF_FORMAT_PATCH) {
                        if (needsep)