зеркало из https://github.com/microsoft/git.git
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:
Родитель
0b1f647557
Коммит
4fc970c438
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
16
diff-lib.c
16
diff-lib.c
|
@ -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];
|
||||||
|
|
Загрузка…
Ссылка в новой задаче