When showing a conflicted merge from index stages and working
tree file, we did not fetch the mode from the working tree,
and mistook that as a deleted file.  Also if the manual
resolution (or automated resolution by git rerere) ended up
taking either parent's version, we did not show _anything_ for
that path.  Either was quite bad and confusing.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-02-13 23:07:04 -08:00
Родитель 3654638513
Коммит 713a11fceb
1 изменённых файлов: 5 добавлений и 4 удалений

Просмотреть файл

@ -630,9 +630,10 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
int i, show_hunks, shown_header = 0; int i, show_hunks, shown_header = 0;
char ourtmp_buf[TMPPATHLEN]; char ourtmp_buf[TMPPATHLEN];
char *ourtmp = ourtmp_buf; char *ourtmp = ourtmp_buf;
int working_tree_file = !memcmp(elem->sha1, null_sha1, 20);
/* Read the result of merge first */ /* Read the result of merge first */
if (memcmp(elem->sha1, null_sha1, 20)) { if (!working_tree_file) {
result = grab_blob(elem->sha1, &size); result = grab_blob(elem->sha1, &size);
write_to_temp_file(ourtmp, result, size); write_to_temp_file(ourtmp, result, size);
} }
@ -646,6 +647,7 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
int len = st.st_size; int len = st.st_size;
int cnt = 0; int cnt = 0;
elem->mode = DIFF_FILE_CANON_MODE(st.st_mode);
size = len; size = len;
result = xmalloc(len + 1); result = xmalloc(len + 1);
while (cnt < len) { while (cnt < len) {
@ -661,6 +663,7 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
else { else {
/* deleted file */ /* deleted file */
size = 0; size = 0;
elem->mode = 0;
result = xmalloc(1); result = xmalloc(1);
result[0] = 0; result[0] = 0;
ourtmp = "/dev/null"; ourtmp = "/dev/null";
@ -716,7 +719,7 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
show_hunks = make_hunks(sline, cnt, num_parent, dense); show_hunks = make_hunks(sline, cnt, num_parent, dense);
if (show_hunks || mode_differs) { if (show_hunks || mode_differs || working_tree_file) {
const char *abb; const char *abb;
if (header) { if (header) {
@ -731,8 +734,6 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
putchar('\n'); putchar('\n');
printf("index "); printf("index ");
for (i = 0; i < num_parent; i++) { for (i = 0; i < num_parent; i++) {
if (elem->parent[i].mode != elem->mode)
mode_differs = 1;
abb = find_unique_abbrev(elem->parent[i].sha1, abb = find_unique_abbrev(elem->parent[i].sha1,
DEFAULT_ABBREV); DEFAULT_ABBREV);
printf("%s%s", i ? "," : "", abb); printf("%s%s", i ? "," : "", abb);