Hi Junio On 15/08/2018 19:05, Junio C Hamano wrote: > > Phillip Wood <phillip.wood@xxxxxxxxxxxx> writes: > >> From: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> >> >> Commit e12a7ef597 ("rebase -i: Handle "combination of <n> commits" with >> GETTEXT_POISON", 2018-04-27) changed the way that individual commit >> messages are labelled when squashing commits together. In doing so a >> regression was introduced where the numbering of the messages is off by >> one. This commit fixes that and adds a test for the numbering. >> >> Signed-off-by: Phillip Wood <phillip.wood@xxxxxxxxxxxxx> >> --- >> sequencer.c | 4 ++-- >> t/t3418-rebase-continue.sh | 4 +++- >> 2 files changed, 5 insertions(+), 3 deletions(-) >> >> diff --git a/sequencer.c b/sequencer.c >> index 2eb5ec7227..77d3c2346f 100644 >> --- a/sequencer.c >> +++ b/sequencer.c >> @@ -1387,13 +1387,13 @@ static int update_squash_messages(enum todo_command command, >> unlink(rebase_path_fixup_msg()); >> strbuf_addf(&buf, "\n%c ", comment_line_char); >> strbuf_addf(&buf, _("This is the commit message #%d:"), >> - ++opts->current_fixup_count); >> + ++opts->current_fixup_count + 1); >> strbuf_addstr(&buf, "\n\n"); >> strbuf_addstr(&buf, body); >> } else if (command == TODO_FIXUP) { >> strbuf_addf(&buf, "\n%c ", comment_line_char); >> strbuf_addf(&buf, _("The commit message #%d will be skipped:"), >> - ++opts->current_fixup_count); >> + ++opts->current_fixup_count + 1); >> strbuf_addstr(&buf, "\n\n"); >> strbuf_add_commented_lines(&buf, body, strlen(body)); >> } else > > Good spotting. When viewed in a wider context (e.g. "git show -W" > after applying this patch), the way opts->current_fixup_count is > used is somewhat incoherent and adding 1 to pre-increment would make > it even more painful to read. Given that there already is > > strbuf_addf(&header, _("This is a combination of %d commits."), > opts->current_fixup_count + 2); > > before this part, the code should make it clear these three places > refer to the same number for it to be readable. > > I wonder if it makes it easier to read, understand and maintain if > there were a local variable that gets opts->current_fixup_count+2 at > the beginning of the function, make these three places refer to that > variable, and move the increment of opts->current_fixup_count down > in the function, after the "if we are squashing, do this, if we are > fixing up, do that, otherwise, we do not know what we are doing" > cascade. And use the more common post-increment, as we no longer > depend on the returned value while at it. > > IOW, something like this (untested), on top of yours. I think you'd need to change commit_staged_changes() as well as it relies on the current_fixup_count counting the number of fixups, not the number of fixups plus two. Having said that using 'current_fixup_count + 2' to create the labels and incrementing the count at the end of update_squash_messages() would probably be clearer than my version. I'm about to go away so it'll probably be the second week of September before I can re-roll this, will that be too late for getting it into 2.19? Best Wishes Phillip > > sequencer.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/sequencer.c b/sequencer.c > index 77d3c2346f..f82c283a89 100644 > --- a/sequencer.c > +++ b/sequencer.c > @@ -1331,8 +1331,9 @@ static int update_squash_messages(enum todo_command command, > struct strbuf buf = STRBUF_INIT; > int res; > const char *message, *body; > + int fixup_count = opts->current_fixup_count + 2; > > - if (opts->current_fixup_count > 0) { > + if (fixup_count > 2) { > struct strbuf header = STRBUF_INIT; > char *eol; > > @@ -1345,7 +1346,7 @@ static int update_squash_messages(enum todo_command command, > > strbuf_addf(&header, "%c ", comment_line_char); > strbuf_addf(&header, _("This is a combination of %d commits."), > - opts->current_fixup_count + 2); > + fixup_count); > strbuf_splice(&buf, 0, eol - buf.buf, header.buf, header.len); > strbuf_release(&header); > } else { > @@ -1387,18 +1388,19 @@ static int update_squash_messages(enum todo_command command, > unlink(rebase_path_fixup_msg()); > strbuf_addf(&buf, "\n%c ", comment_line_char); > strbuf_addf(&buf, _("This is the commit message #%d:"), > - ++opts->current_fixup_count + 1); > + fixup_count); > strbuf_addstr(&buf, "\n\n"); > strbuf_addstr(&buf, body); > } else if (command == TODO_FIXUP) { > strbuf_addf(&buf, "\n%c ", comment_line_char); > strbuf_addf(&buf, _("The commit message #%d will be skipped:"), > - ++opts->current_fixup_count + 1); > + fixup_count); > strbuf_addstr(&buf, "\n\n"); > strbuf_add_commented_lines(&buf, body, strlen(body)); > } else > return error(_("unknown command: %d"), command); > unuse_commit_buffer(commit, message); > + opts->current_fixup_count++; > > res = write_message(buf.buf, buf.len, rebase_path_squash_msg(), 0); > strbuf_release(&buf); > >