commit - eec2f5a957bde0458cfa8ee022528e4aeabb708e
commit + 1af628f4bfa50c224b392a774e72a213c97f6009
blob - 5912a6838c3bd1d1e07865b39b522dbe23acb39a
blob + 555aa43713a57ed7659077b033dc3e9e0df572bf
--- lib/worktree.c
+++ lib/worktree.c
struct stat sb;
unsigned char status;
int local_changes_subsumed;
+ FILE *f_orig = NULL, *f_deriv = NULL, *f_deriv2 = NULL;
+ char *id_str = NULL, *label_deriv = NULL;
if (blob1 && blob2) {
ie = got_fileindex_entry_get(a->fileindex, path2,
repo, a->progress_cb, a->progress_arg);
free(link_target2);
} else {
- err = merge_blob(&local_changes_subsumed, a->worktree,
- blob1, ondisk_path, path2, sb.st_mode,
- a->label_orig, blob2, a->commit_id2, repo,
+ int fd;
+
+ f_orig = got_opentemp();
+ if (f_orig == NULL) {
+ err = got_error_from_errno("got_opentemp");
+ goto done;
+ }
+ err = got_object_blob_dump_to_file(NULL, NULL, NULL,
+ f_orig, blob1);
+ if (err)
+ goto done;
+
+ f_deriv = got_opentemp();
+ if (f_deriv == NULL)
+ goto done;
+ err = got_object_blob_dump_to_file(NULL, NULL, NULL,
+ f_deriv, blob2);
+ if (err)
+ goto done;
+
+ fd = open(ondisk_path, O_RDONLY | O_NOFOLLOW);
+ if (fd == -1) {
+ err = got_error_from_errno2("open",
+ ondisk_path);
+ goto done;
+ }
+ f_deriv2 = fdopen(fd, "r");
+ if (f_deriv2 == NULL) {
+ err = got_error_from_errno2("fdopen",
+ ondisk_path);
+ close(fd);
+ goto done;
+ }
+ err = got_object_id_str(&id_str, a->commit_id2);
+ if (err)
+ goto done;
+ if (asprintf(&label_deriv, "%s: commit %s",
+ GOT_MERGE_LABEL_MERGED, id_str) == -1) {
+ err = got_error_from_errno("asprintf");
+ goto done;
+ }
+ err = merge_file(&local_changes_subsumed, a->worktree,
+ f_orig, f_deriv, f_deriv2, ondisk_path, path2,
+ sb.st_mode, a->label_orig, label_deriv, repo,
a->progress_cb, a->progress_arg);
}
} else if (blob1) {
}
}
done:
+ if (f_orig && fclose(f_orig) == EOF && err == NULL)
+ err = got_error_from_errno("fclose");
+ if (f_deriv && fclose(f_deriv) == EOF && err == NULL)
+ err = got_error_from_errno("fclose");
+ if (f_deriv2 && fclose(f_deriv2) == EOF && err == NULL)
+ err = got_error_from_errno("fclose");
+ free(id_str);
+ free(label_deriv);
free(ondisk_path);
return err;
}