aboutsummaryrefslogtreecommitdiff
path: root/combine-diff.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-01-25 14:26:22 -0800
committerJunio C Hamano <junkio@cox.net>2006-01-28 00:08:29 -0800
commit8828cdcb445fc420de9e869d359596ceefce76be (patch)
tree65a6eb1aa86c2852ab0548e8b4501a83a74d0c2d /combine-diff.c
parent263eee29e94de935d62c7c4066fcea0ccfbe60b8 (diff)
downloadgit-8828cdcb445fc420de9e869d359596ceefce76be.tar.gz
git-8828cdcb445fc420de9e869d359596ceefce76be.tar.xz
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.c46
1 files changed, 30 insertions, 16 deletions
diff --git a/combine-diff.c b/combine-diff.c
index a91cafbd9..3b219a01a 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;
}
}