Download raw body.
prevent log message loss during histedit
On Fri, Dec 11, 2020 at 01:27:04AM +0100, Stefan Sperling wrote: > If the histedit log message editor exits without saving its buffer, > we currently throw away log messages of all commits which were folded. > Only the last commit message is preserved, which could be something > meaningless like "fixup". > > This patch makes us preserve the initial editor buffer content as-is. > That's not going to be an ideal log message, but doesn't throw away > information and stands out visually because the newly created log > message will start with a comment like: > [[[ > # log message of folded commit aabbcc00... > ]]] > > Git's approach is to concatentate all log messages and strip comments. > That has other downsides such as resulting in a potentially nonsensical > log message. > I'd like to stick to a simple "what you see is what you get" approach. > > Problem reported by jrick > > ok? Off-list, jrick suggested to keep the behaviour intact where histedit's commit operation is aborted if the saved log message is empty. Differentiating between "empty message" and "unchanged message" should be a good thing to do in general. ok? (This is the same change as the previous patch but with the empty log message behaviour kept as-is.) diff a2c1255649ab1b8d0fc66ec6ff07646b6176e764 e559f03aa5e4b408dced5ddbbcfd102692d19a36 blob - 7bdd9e142a5f26254c73c308684bb6d6da95ef20 blob + c8dbc08063b2590cb230bbb89b7864078f5b1a4d --- got/got.c +++ got/got.c @@ -448,7 +448,7 @@ edit_logmsg(char **logmsg, const char *editor, const c return got_error_from_errno("stat"); if (st.st_mtime == st2.st_mtime && st.st_size == st2.st_size) - return got_error_msg(GOT_ERR_COMMIT_MSG_EMPTY, + return got_error_msg(GOT_ERR_COMMIT_MSG_NOCHANGE, "no changes made to commit message, aborting"); /* @@ -521,7 +521,7 @@ edit_logmsg(char **logmsg, const char *editor, const c goto done; } if (strcmp(*logmsg, initial_content_stripped) == 0) - err = got_error_msg(GOT_ERR_COMMIT_MSG_EMPTY, + err = got_error_msg(GOT_ERR_COMMIT_MSG_NOCHANGE, "no changes made to commit message, aborting"); done: free(initial_content_stripped); @@ -803,6 +803,7 @@ cmd_import(int argc, char *argv[]) path_dir, refname); if (error) { if (error->code != GOT_ERR_COMMIT_MSG_EMPTY && + error->code != GOT_ERR_COMMIT_MSG_NOCHANGE && logmsg_path != NULL) preserve_logmsg = 1; goto done; @@ -5971,6 +5972,7 @@ add_tag(struct got_repository *repo, struct got_worktr tag_name, got_repo_get_path(repo)); if (err) { if (err->code != GOT_ERR_COMMIT_MSG_EMPTY && + err->code != GOT_ERR_COMMIT_MSG_NOCHANGE && tagmsg_path != NULL) preserve_tagmsg = 1; goto done; @@ -6904,6 +6906,7 @@ cmd_commit(int argc, char *argv[]) print_status, NULL, repo); if (error) { if (error->code != GOT_ERR_COMMIT_MSG_EMPTY && + error->code != GOT_ERR_COMMIT_MSG_NOCHANGE && cl_arg.logmsg_path != NULL) preserve_logmsg = 1; goto done; @@ -8016,9 +8019,12 @@ histedit_edit_logmsg(struct got_histedit_list_entry *h err = edit_logmsg(&hle->logmsg, editor, logmsg_path, logmsg, logmsg_len); if (err) { - if (err->code != GOT_ERR_COMMIT_MSG_EMPTY) + if (err->code != GOT_ERR_COMMIT_MSG_NOCHANGE) goto done; - err = got_object_commit_get_logmsg(&hle->logmsg, commit); + err = NULL; + hle->logmsg = strdup(new_msg); + if (hle->logmsg == NULL) + err = got_error_from_errno("strdup"); } done: if (logmsg_path && unlink(logmsg_path) != 0 && err == NULL) blob - 5fa8ffa0d2de4c2d61942eb2eed66a240149f6d0 blob + cfef35362eff7e295b62a678e352388f674a4b43 --- include/got_error.h +++ include/got_error.h @@ -109,7 +109,7 @@ #define GOT_ERR_NO_HISTEDIT_CMD 92 #define GOT_ERR_HISTEDIT_SYNTAX 93 #define GOT_ERR_HISTEDIT_CANCEL 94 -/* 95 is currently unused */ +#define GOT_ERR_COMMIT_MSG_NOCHANGE 95 #define GOT_ERR_HISTEDIT_BUSY 96 #define GOT_ERR_HISTEDIT_CMD 97 #define GOT_ERR_HISTEDIT_PATH 98 @@ -252,7 +252,7 @@ static const struct got_error { { GOT_ERR_NO_HISTEDIT_CMD,"no histedit commands provided" }, { GOT_ERR_HISTEDIT_SYNTAX,"syntax error in histedit command list" }, { GOT_ERR_HISTEDIT_CANCEL,"histedit operation cancelled" }, - { 95, "unused error code" }, + { GOT_ERR_COMMIT_MSG_NOCHANGE, "no changes made to commit message" }, { GOT_ERR_HISTEDIT_BUSY,"histedit operation is in progress in this " "work tree and must be continued or aborted first" }, { GOT_ERR_HISTEDIT_CMD, "bad histedit command" },
prevent log message loss during histedit