diff options
author | Junio C Hamano <gitster@pobox.com> | 2011-08-04 22:39:10 +0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-08-04 23:05:47 +0400 |
commit | 99694544358b74c14982f2b9769f8804f017672c (patch) | |
tree | 22d10c5f840ee9a7f9de07ff1da88cb06ea49a91 | |
parent | 206af7c96b134b4962fa04fa174a25f29efd7e5e (diff) |
diff -c/--cc: do not mistake "resolved as deletion" as "use working tree"
The combined diff machinery can be used to compare:
- a merge commit with its parent commits;
- a working-tree file with multiple stages in an unmerged index; or
- a working-tree file with the HEAD and the index.
The internal function combine-diff.c:show_patch_diff() checked if it needs
to read the "result" from the working tree by looking at the object name
of the result --- if it is null_sha1, it read from the working tree.
This mistook a merge that records a deletion as the conflict resolution
as if it is a cue to read from the working tree. Pass this information
explicitly from the caller instead.
Noticed and reported by Johan Herland.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | combine-diff.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/combine-diff.c b/combine-diff.c index 655fa89d8a..360b816b3e 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -682,7 +682,8 @@ static void dump_quoted_path(const char *head, } static void show_patch_diff(struct combine_diff_path *elem, int num_parent, - int dense, struct rev_info *rev) + int dense, int working_tree_file, + struct rev_info *rev) { struct diff_options *opt = &rev->diffopt; unsigned long result_size, cnt, lno; @@ -691,7 +692,6 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, struct sline *sline; /* survived lines */ int mode_differs = 0; int i, show_hunks; - int working_tree_file = is_null_sha1(elem->sha1); int abbrev = DIFF_OPT_TST(opt, FULL_INDEX) ? 40 : DEFAULT_ABBREV; const char *a_prefix, *b_prefix; mmfile_t result_file; @@ -954,6 +954,12 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re write_name_quoted(p->path, stdout, line_termination); } +/* + * The result (p->elem) is from the working tree and their + * parents are typically from multiple stages during a merge + * (i.e. diff-files) or the state in HEAD and in the index + * (i.e. diff-index). + */ void show_combined_diff(struct combine_diff_path *p, int num_parent, int dense, @@ -967,7 +973,7 @@ void show_combined_diff(struct combine_diff_path *p, DIFF_FORMAT_NAME_STATUS)) show_raw_diff(p, num_parent, rev); else if (opt->output_format & DIFF_FORMAT_PATCH) - show_patch_diff(p, num_parent, dense, rev); + show_patch_diff(p, num_parent, dense, 1, rev); } void diff_tree_combined(const unsigned char *sha1, @@ -1035,7 +1041,7 @@ void diff_tree_combined(const unsigned char *sha1, for (p = paths; p; p = p->next) { if (p->len) show_patch_diff(p, num_parent, dense, - rev); + 0, rev); } } } |