summaryrefslogtreecommitdiff
path: root/combine-diff.c
diff options
context:
space:
mode:
Diffstat (limited to 'combine-diff.c')
-rw-r--r--combine-diff.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/combine-diff.c b/combine-diff.c
index 044633d164..3a9b32f6b8 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -92,14 +92,14 @@ struct sline {
static char *grab_blob(const unsigned char *sha1, unsigned long *size)
{
char *blob;
- char type[20];
+ enum object_type type;
if (is_null_sha1(sha1)) {
/* deleted blob */
*size = 0;
return xcalloc(1, 1);
}
- blob = read_sha1_file(sha1, type, size);
- if (strcmp(type, blob_type))
+ blob = read_sha1_file(sha1, &type, size);
+ if (type != OBJ_BLOB)
die("object '%s' is not a blob!", sha1_to_hex(sha1));
return blob;
}
@@ -684,7 +684,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
goto deleted_file;
if (S_ISLNK(st.st_mode)) {
- size_t len = st.st_size;
+ size_t len = xsize_t(st.st_size);
result_size = len;
result = xmalloc(len + 1);
if (result_size != readlink(elem->path, result, len)) {
@@ -697,10 +697,20 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
}
else if (0 <= (fd = open(elem->path, O_RDONLY)) &&
!fstat(fd, &st)) {
- size_t len = st.st_size;
+ size_t len = xsize_t(st.st_size);
size_t sz = 0;
+ int is_file, i;
elem->mode = canon_mode(st.st_mode);
+ /* if symlinks don't work, assume symlink if all parents
+ * are symlinks
+ */
+ is_file = has_symlinks;
+ for (i = 0; !is_file && i < num_parent; i++)
+ is_file = !S_ISLNK(elem->parent[i].mode);
+ if (!is_file)
+ elem->mode = canon_mode(S_IFLNK);
+
result_size = len;
result = xmalloc(len + 1);
while (sz < len) {