diff options
author | Junio C Hamano <junkio@cox.net> | 2006-01-25 14:26:22 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-01-28 00:08:29 -0800 |
commit | 8828cdcb445fc420de9e869d359596ceefce76be (patch) | |
tree | 65a6eb1aa86c2852ab0548e8b4501a83a74d0c2d /combine-diff.c | |
parent | 263eee29e94de935d62c7c4066fcea0ccfbe60b8 (diff) | |
download | git-8828cdcb445fc420de9e869d359596ceefce76be.tar.gz |
diff-tree --cc: squelch header generation on empty patch.
Earlier round showed the commit log header and "diff --combined"
header even for paths that had no interesting hunk under --cc
flag. Move the header display logic around to squelch them.
With this, a merge that does not have any interesting merges
will not be shown with --cc option, unless -m is used at the
same time.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'combine-diff.c')
-rw-r--r-- | combine-diff.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/combine-diff.c b/combine-diff.c index a91cafbd9c..3b219a01a1 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -323,12 +323,13 @@ static unsigned long line_all_diff(struct sline *sline, unsigned long all_mask) return different; } -static void make_hunks(struct sline *sline, unsigned long cnt, +static int make_hunks(struct sline *sline, unsigned long cnt, int num_parent, int dense) { unsigned long all_mask = (1UL<<num_parent) - 1; unsigned long mark = (1UL<<num_parent); unsigned long i; + int has_interesting = 0; i = 0; while (i < cnt) { @@ -344,21 +345,23 @@ static void make_hunks(struct sline *sline, unsigned long cnt, j = (i + context < cnt) ? i + context : cnt; while (i < j) sline[i++].flag |= mark; + has_interesting = 1; continue; } i++; } if (!dense) - return; + return has_interesting; /* Look at each hunk, and if we have changes from only one * parent, or the changes are the same from all but one * parent, mark that uninteresting. */ + has_interesting = 0; i = 0; while (i < cnt) { int j, hunk_end, same, diff; - unsigned long same_diff, all_diff, this_diff; + unsigned long same_diff, all_diff; while (i < cnt && !(sline[i].flag & mark)) i++; if (cnt <= i) @@ -387,8 +390,11 @@ static void make_hunks(struct sline *sline, unsigned long cnt, for (j = i; j < hunk_end; j++) sline[j].flag &= ~mark; } + else + has_interesting = 1; i = hunk_end; } + return has_interesting; } static void dump_sline(struct sline *sline, int cnt, int num_parent) @@ -437,13 +443,13 @@ static void dump_sline(struct sline *sline, int cnt, int num_parent) } } -static void show_combined_diff(struct path_list *elem, int num_parent, - int dense) +static int show_combined_diff(struct path_list *elem, int num_parent, + int dense, const char *header, int show_empty) { unsigned long size, cnt, lno; char *result, *cp, *ep; struct sline *sline; /* survived lines */ - int i; + int i, show_hunks, shown_header = 0; char ourtmp[TMPPATHLEN]; /* Read the result of merge first */ @@ -479,9 +485,21 @@ static void show_combined_diff(struct path_list *elem, int num_parent, for (i = 0; i < num_parent; i++) combine_diff(elem->parent_sha1[i], ourtmp, sline, cnt, i); - make_hunks(sline, cnt, num_parent, dense); + show_hunks = make_hunks(sline, cnt, num_parent, dense); - dump_sline(sline, cnt, num_parent); + if (header && (show_hunks || show_empty)) { + shown_header++; + puts(header); + } + if (show_hunks) { + printf("diff --%s ", dense ? "cc" : "combined"); + if (quote_c_style(elem->path, NULL, NULL, 0)) + quote_c_style(elem->path, NULL, stdout, 0); + else + printf("%s", elem->path); + putchar('\n'); + dump_sline(sline, cnt, num_parent); + } unlink(ourtmp); free(result); @@ -496,6 +514,7 @@ static void show_combined_diff(struct path_list *elem, int num_parent, } } free(sline); + return shown_header; } int diff_tree_combined_merge(const unsigned char *sha1, @@ -535,17 +554,12 @@ int diff_tree_combined_merge(const unsigned char *sha1, num_paths++; } if (num_paths || show_empty_merge) { - puts(header); for (p = paths; p; p = p->next) { if (!p->len) continue; - printf("diff --%s ", dense ? "cc" : "combined"); - if (quote_c_style(p->path, NULL, NULL, 0)) - quote_c_style(p->path, NULL, stdout, 0); - else - printf("%s", p->path); - putchar('\n'); - show_combined_diff(p, num_parent, dense); + if (show_combined_diff(p, num_parent, dense, header, + show_empty_merge)) + header = NULL; } } |