diff --cc: fix display of symlink conflicts during a merge.

"git-diff-files --cc" to show conflicts during merge did not pass
the correct mode information for the working tree down, and showed
bogus combined diff.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2007-02-25 22:24:47 -08:00
Родитель 0b1f647557
Коммит 4fc970c438
2 изменённых файлов: 34 добавлений и 7 удалений

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

@ -678,9 +678,25 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
else { else {
/* Used by diff-tree to read from the working tree */ /* Used by diff-tree to read from the working tree */
struct stat st; struct stat st;
int fd; int fd = -1;
if (0 <= (fd = open(elem->path, O_RDONLY)) &&
!fstat(fd, &st)) { if (lstat(elem->path, &st) < 0)
goto deleted_file;
if (S_ISLNK(st.st_mode)) {
int len = st.st_size;
result_size = len;
result = xmalloc(len + 1);
if (result_size != readlink(elem->path, result, len)) {
error("readlink(%s): %s", elem->path,
strerror(errno));
return;
}
result[len] = 0;
elem->mode = canon_mode(st.st_mode);
}
else if (0 <= (fd = open(elem->path, O_RDONLY)) &&
!fstat(fd, &st)) {
int len = st.st_size; int len = st.st_size;
int sz = 0; int sz = 0;
@ -698,11 +714,12 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
result[len] = 0; result[len] = 0;
} }
else { else {
/* deleted file */ deleted_file:
result_size = 0; result_size = 0;
elem->mode = 0; elem->mode = 0;
result = xcalloc(1, 1); result = xcalloc(1, 1);
} }
if (0 <= fd) if (0 <= fd)
close(fd); close(fd);
} }

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

@ -41,17 +41,27 @@ int run_diff_files(struct rev_info *revs, int silent_on_removed)
path_len = ce_namelen(ce); path_len = ce_namelen(ce);
dpath = xmalloc (combine_diff_path_size (5, path_len)); dpath = xmalloc(combine_diff_path_size(5, path_len));
dpath->path = (char *) &(dpath->parent[5]); dpath->path = (char *) &(dpath->parent[5]);
dpath->next = NULL; dpath->next = NULL;
dpath->len = path_len; dpath->len = path_len;
memcpy(dpath->path, ce->name, path_len); memcpy(dpath->path, ce->name, path_len);
dpath->path[path_len] = '\0'; dpath->path[path_len] = '\0';
dpath->mode = 0;
hashclr(dpath->sha1); hashclr(dpath->sha1);
memset(&(dpath->parent[0]), 0, memset(&(dpath->parent[0]), 0,
sizeof(struct combine_diff_parent)*5); sizeof(struct combine_diff_parent)*5);
if (lstat(ce->name, &st) < 0) {
if (errno != ENOENT && errno != ENOTDIR) {
perror(ce->name);
continue;
}
if (silent_on_removed)
continue;
}
else
dpath->mode = canon_mode(st.st_mode);
while (i < entries) { while (i < entries) {
struct cache_entry *nce = active_cache[i]; struct cache_entry *nce = active_cache[i];