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>
This commit is contained in:
parent
206af7c96b
commit
9969454435
@ -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,
|
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;
|
struct diff_options *opt = &rev->diffopt;
|
||||||
unsigned long result_size, cnt, lno;
|
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 */
|
struct sline *sline; /* survived lines */
|
||||||
int mode_differs = 0;
|
int mode_differs = 0;
|
||||||
int i, show_hunks;
|
int i, show_hunks;
|
||||||
int working_tree_file = is_null_sha1(elem->sha1);
|
|
||||||
int abbrev = DIFF_OPT_TST(opt, FULL_INDEX) ? 40 : DEFAULT_ABBREV;
|
int abbrev = DIFF_OPT_TST(opt, FULL_INDEX) ? 40 : DEFAULT_ABBREV;
|
||||||
const char *a_prefix, *b_prefix;
|
const char *a_prefix, *b_prefix;
|
||||||
mmfile_t result_file;
|
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);
|
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,
|
void show_combined_diff(struct combine_diff_path *p,
|
||||||
int num_parent,
|
int num_parent,
|
||||||
int dense,
|
int dense,
|
||||||
@ -967,7 +973,7 @@ void show_combined_diff(struct combine_diff_path *p,
|
|||||||
DIFF_FORMAT_NAME_STATUS))
|
DIFF_FORMAT_NAME_STATUS))
|
||||||
show_raw_diff(p, num_parent, rev);
|
show_raw_diff(p, num_parent, rev);
|
||||||
else if (opt->output_format & DIFF_FORMAT_PATCH)
|
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,
|
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) {
|
for (p = paths; p; p = p->next) {
|
||||||
if (p->len)
|
if (p->len)
|
||||||
show_patch_diff(p, num_parent, dense,
|
show_patch_diff(p, num_parent, dense,
|
||||||
rev);
|
0, rev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user