commit 1af628f4bfa50c224b392a774e72a213c97f6009 from: Stefan Sperling date: Thu Jun 03 12:38:42 2021 UTC switch merge_file_cb() to using merge_file() instead of merge_blob() commit - eec2f5a957bde0458cfa8ee022528e4aeabb708e commit + 1af628f4bfa50c224b392a774e72a213c97f6009 blob - 5912a6838c3bd1d1e07865b39b522dbe23acb39a blob + 555aa43713a57ed7659077b033dc3e9e0df572bf --- lib/worktree.c +++ lib/worktree.c @@ -2833,6 +2833,8 @@ merge_file_cb(void *arg, struct got_blob_object *blob1 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, @@ -2873,9 +2875,50 @@ merge_file_cb(void *arg, struct got_blob_object *blob1 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) { @@ -3047,6 +3090,14 @@ merge_file_cb(void *arg, struct got_blob_object *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; }