Download raw body.
prevent log message loss during histedit
On Fri, Dec 11, 2020 at 01:55:11AM +0100, Stefan Sperling wrote: > 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.) This patch behaves as advertised with histedit -f, but I'm hitting an unexpected error (got: object <sha1> not found) when using histedit -m and saving an empty commit message. On the main branch, under this test Got will continue through the histedit and does not modify the original commit message at all. I think we'd want to make it work like histedit -f will after this patch, where the histedit is left in an interrupted state. > > 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