зеркало из https://github.com/microsoft/git.git
combine-diff: diff-files fix.
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:
Родитель
3654638513
Коммит
713a11fceb
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче