commit ef293bddb9ff1a451b85d62b6bdf44494e2f1810 from: Stefan Sperling date: Mon Oct 21 09:04:57 2019 UTC preserve the log message when an error occurs during import, as intended commit - f372d5cd8ece04d22b8e71608ba03a210acc1650 commit + ef293bddb9ff1a451b85d62b6bdf44494e2f1810 blob - 75e9f8a7e77561120d128294e3a6cf6eb3e80e4b blob + 4e4e359d901d8a0ede874f4f986969c60b0dd4a8 --- got/got.c +++ got/got.c @@ -461,10 +461,10 @@ done: } static const struct got_error * -collect_import_msg(char **logmsg, const char *editor, const char *path_dir, - const char *branch_name) +collect_import_msg(char **logmsg, char **logmsg_path, const char *editor, + const char *path_dir, const char *branch_name) { - char *initial_content = NULL, *logmsg_path = NULL; + char *initial_content = NULL; const struct got_error *err = NULL; int fd; @@ -473,17 +473,16 @@ collect_import_msg(char **logmsg, const char *editor, branch_name) == -1) return got_error_from_errno("asprintf"); - err = got_opentemp_named_fd(&logmsg_path, &fd, "/tmp/got-importmsg"); + err = got_opentemp_named_fd(logmsg_path, &fd, "/tmp/got-importmsg"); if (err) goto done; dprintf(fd, initial_content); close(fd); - err = edit_logmsg(logmsg, editor, logmsg_path, initial_content); + err = edit_logmsg(logmsg, editor, *logmsg_path, initial_content); done: free(initial_content); - free(logmsg_path); return err; } @@ -576,13 +575,14 @@ cmd_import(int argc, char *argv[]) char *path_dir = NULL, *repo_path = NULL, *logmsg = NULL; char *gitconfig_path = NULL, *editor = NULL, *author = NULL; const char *branch_name = "master"; - char *refname = NULL, *id_str = NULL; + char *refname = NULL, *id_str = NULL, *logmsg_path = NULL; struct got_repository *repo = NULL; struct got_reference *branch_ref = NULL, *head_ref = NULL; struct got_object_id *new_commit_id = NULL; int ch; struct got_pathlist_head ignores; struct got_pathlist_entry *pe; + int preserve_logmsg = 0; TAILQ_INIT(&ignores); @@ -679,54 +679,93 @@ cmd_import(int argc, char *argv[]) if (error) goto done; free(logmsg); - error = collect_import_msg(&logmsg, editor, path_dir, refname); - if (error) + error = collect_import_msg(&logmsg, &logmsg_path, editor, + path_dir, refname); + if (error) { + if (error->code != GOT_ERR_COMMIT_MSG_EMPTY && + logmsg_path != NULL) + preserve_logmsg = 1; goto done; + } } - if (unveil(path_dir, "r") != 0) - return got_error_from_errno2("unveil", path_dir); - - error = apply_unveil(got_repo_get_path(repo), 0, NULL); - if (error) + if (unveil(path_dir, "r") != 0) { + error = got_error_from_errno2("unveil", path_dir); + if (logmsg_path) + preserve_logmsg = 1; goto done; + } + error = apply_unveil(got_repo_get_path(repo), 0, NULL); + if (error) { + if (logmsg_path) + preserve_logmsg = 1; + goto done; + } + error = got_repo_import(&new_commit_id, path_dir, logmsg, author, &ignores, repo, import_progress, NULL); - if (error) + if (error) { + if (logmsg_path) + preserve_logmsg = 1; goto done; + } error = got_ref_alloc(&branch_ref, refname, new_commit_id); - if (error) + if (error) { + if (logmsg_path) + preserve_logmsg = 1; goto done; + } error = got_ref_write(branch_ref, repo); - if (error) + if (error) { + if (logmsg_path) + preserve_logmsg = 1; goto done; + } error = got_object_id_str(&id_str, new_commit_id); - if (error) + if (error) { + if (logmsg_path) + preserve_logmsg = 1; goto done; + } error = got_ref_open(&head_ref, repo, GOT_REF_HEAD, 0); if (error) { - if (error->code != GOT_ERR_NOT_REF) + if (error->code != GOT_ERR_NOT_REF) { + if (logmsg_path) + preserve_logmsg = 1; goto done; + } error = got_ref_alloc_symref(&head_ref, GOT_REF_HEAD, branch_ref); - if (error) + if (error) { + if (logmsg_path) + preserve_logmsg = 1; goto done; + } error = got_ref_write(head_ref, repo); - if (error) + if (error) { + if (logmsg_path) + preserve_logmsg = 1; goto done; + } } printf("Created branch %s with commit %s\n", got_ref_get_name(branch_ref), id_str); done: + if (preserve_logmsg) { + fprintf(stderr, "%s: log message preserved in %s\n", + getprogname(), logmsg_path); + } else if (logmsg_path && unlink(logmsg_path) == -1 && error == NULL) + error = got_error_from_errno2("unlink", logmsg_path); free(logmsg); + free(logmsg_path); free(repo_path); free(editor); free(refname);