{"thread":{"id":"53111","subject":"git rebase fast-forward fails with abbreviateCommands","startedAt":"2020-03-27T11:45:06Z","lastAt":"2020-03-30T18:15:47Z","messageCount":11,"participants":["Jan Alexander Steffens (heftig)","Alban Gruin","Elijah Newren","Junio C Hamano","Eric Sunshine"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"394164","messageId":"9b4bc756764d87c9f34c11e6ec2fc6482f531805.camel@gmail.com","threadId":"53111","inReplyTo":null,"subject":"git rebase fast-forward fails with abbreviateCommands","fromName":"Jan Alexander Steffens (heftig)","fromEmail":"jan.steffens@gmail.com","sentAt":"2020-03-27T11:44:57Z","receivedAt":"2020-03-27T11:45:06Z","isPatch":false,"sender":{"key":"jan.steffens@gmail.com","avatar":null},"body":"Hi,\n\nSince 2.26.0 a simple \"git rebase\" fails to fast-forward a\nbranch, reporting \"error: nothing to do.\"\n\nIt started to work again after removing my gitconfig. I've\nreduced it to the following:\n\n    git init foo; cd foo\n    git commit --allow-empty -m foo\n    git commit --allow-empty -m bar\n    git checkout -tb foo\n    git reset HEAD~\n    git -c rebase.abbreviateCommands=true rebase\n\n"},{"id":"394175","messageId":"a3cc46ca-824d-8cab-e333-83f51a7824ca@gmail.com","threadId":"53111","inReplyTo":"9b4bc756764d87c9f34c11e6ec2fc6482f531805.camel@gmail.com","subject":"Re: git rebase fast-forward fails with abbreviateCommands","fromName":"Alban Gruin","fromEmail":"alban.gruin@gmail.com","sentAt":"2020-03-27T15:46:32Z","receivedAt":"2020-03-27T15:46:49Z","isPatch":false,"sender":{"key":"alban.gruin@gmail.com","avatar":"https://avatars.githubusercontent.com/u/6310153?v=4"},"body":"Hi Jan,\n\n+cc Johannes, Elijah, and Phillip.\n\nLe 27/03/2020 à 12:44, Jan Alexander Steffens (heftig) a écrit :\n> Hi,\n> \n> Since 2.26.0 a simple \"git rebase\" fails to fast-forward a\n> branch, reporting \"error: nothing to do.\"\n> \n> It started to work again after removing my gitconfig. I've\n> reduced it to the following:\n> \n>     git init foo; cd foo\n>     git commit --allow-empty -m foo\n>     git commit --allow-empty -m bar\n>     git checkout -tb foo\n>     git reset HEAD~\n>     git -c rebase.abbreviateCommands=true rebase\n> \n\nThank you for reporting this bug.\n\nSince git 2.26, the default rebase backend switched from \"am\" to\n\"merge\".  So, by default, a todo list is created, even if you can't see it.\n\nIn this case, the todo list contains only a `noop', but this command has\nno short form, and is abbreviated with a comment mark.  As there is no\nmore commands in the list, the backend will fail with the error \"nothing\nto do\".\n\nThree approach to fix this:\n\n 1) add an abbreviation to `noop';  this is the simplest fix, and \"n\" is\nnot taken.\n 2) if a command has no short form, do not abbreviate it;  this is\ntrivial to do, and should not break anything.\n\nA third approach would be to change the meaning of an empty buffer, but\nthis would break some tests (at least t3404.3) and cause more confusion\nfor users than necessary.\n\nThank you again for reporting this.\n\nCheers,\nAlban\n\n"},{"id":"394187","messageId":"CABPp-BEV0NxMLuM3U8fqECkEB_XHTvLMav1q_TiYveBWrpsr_w@mail.gmail.com","threadId":"53111","inReplyTo":"a3cc46ca-824d-8cab-e333-83f51a7824ca@gmail.com","subject":"Re: git rebase fast-forward fails with abbreviateCommands","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2020-03-27T18:39:33Z","receivedAt":"2020-03-27T18:39:48Z","isPatch":false,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"Hi Alban,\n\nOn Fri, Mar 27, 2020 at 8:46 AM Alban Gruin <alban.gruin@gmail.com> wrote:\n>\n> Hi Jan,\n>\n> +cc Johannes, Elijah, and Phillip.\n>\n> Le 27/03/2020 à 12:44, Jan Alexander Steffens (heftig) a écrit :\n> > Hi,\n> >\n> > Since 2.26.0 a simple \"git rebase\" fails to fast-forward a\n> > branch, reporting \"error: nothing to do.\"\n> >\n> > It started to work again after removing my gitconfig. I've\n> > reduced it to the following:\n> >\n> >     git init foo; cd foo\n> >     git commit --allow-empty -m foo\n> >     git commit --allow-empty -m bar\n> >     git checkout -tb foo\n> >     git reset HEAD~\n> >     git -c rebase.abbreviateCommands=true rebase\n> >\n>\n> Thank you for reporting this bug.\n>\n> Since git 2.26, the default rebase backend switched from \"am\" to\n> \"merge\".  So, by default, a todo list is created, even if you can't see it.\n>\n> In this case, the todo list contains only a `noop', but this command has\n> no short form, and is abbreviated with a comment mark.  As there is no\n> more commands in the list, the backend will fail with the error \"nothing\n> to do\".\n>\n> Three approach to fix this:\n>\n>  1) add an abbreviation to `noop';  this is the simplest fix, and \"n\" is\n> not taken.\n>  2) if a command has no short form, do not abbreviate it;  this is\n> trivial to do, and should not break anything.\n\nBoth sound reasonable to me.\n\n> A third approach would be to change the meaning of an empty buffer, but\n> this would break some tests (at least t3404.3) and cause more confusion\n> for users than necessary.\n\nWell, \"error: nothing to do\" probably makes sense if the user\nspecifies a list of empty commands or sees a list of empty commands\nand agrees to pass these to the backend.  But I'm not sure that\nmessage makes sense for implicitly interactive runs as opposed to\nexplicitly interactive ones.  Perhaps we could change the message to\njust be \"Already up to date\" if the buffer is empty and the run is not\nexplicitly interactive?\n\n\nElijah\n"},{"id":"394189","messageId":"58dbecff48068644daa24b5e39c03dc8ddfb0053.camel@gmail.com","threadId":"53111","inReplyTo":"CABPp-BEV0NxMLuM3U8fqECkEB_XHTvLMav1q_TiYveBWrpsr_w@mail.gmail.com","subject":"Re: git rebase fast-forward fails with abbreviateCommands","fromName":"Jan Alexander Steffens (heftig)","fromEmail":"jan.steffens@gmail.com","sentAt":"2020-03-27T18:44:34Z","receivedAt":"2020-03-27T18:44:39Z","isPatch":false,"sender":{"key":"jan.steffens@gmail.com","avatar":null},"body":"On Fri, 2020-03-27 at 11:39 -0700, Elijah Newren wrote:\n> Hi Alban,\n> \n> On Fri, Mar 27, 2020 at 8:46 AM Alban Gruin <alban.gruin@gmail.com>\n> wrote:\n> > Hi Jan,\n> > \n> > +cc Johannes, Elijah, and Phillip.\n> > \n> > Le 27/03/2020 à 12:44, Jan Alexander Steffens (heftig) a écrit :\n> > > Hi,\n> > > \n> > > Since 2.26.0 a simple \"git rebase\" fails to fast-forward a\n> > > branch, reporting \"error: nothing to do.\"\n> > > \n> > > It started to work again after removing my gitconfig. I've\n> > > reduced it to the following:\n> > > \n> > >     git init foo; cd foo\n> > >     git commit --allow-empty -m foo\n> > >     git commit --allow-empty -m bar\n> > >     git checkout -tb foo\n> > >     git reset HEAD~\n> > >     git -c rebase.abbreviateCommands=true rebase\n> > > \n> > \n> > Thank you for reporting this bug.\n> > \n> > Since git 2.26, the default rebase backend switched from \"am\" to\n> > \"merge\".  So, by default, a todo list is created, even if you can't\n> > see it.\n> > \n> > In this case, the todo list contains only a `noop', but this\n> > command has\n> > no short form, and is abbreviated with a comment mark.  As there is\n> > no\n> > more commands in the list, the backend will fail with the error\n> > \"nothing\n> > to do\".\n> > \n> > Three approach to fix this:\n> > \n> >  1) add an abbreviation to `noop';  this is the simplest fix, and\n> > \"n\" is\n> > not taken.\n> >  2) if a command has no short form, do not abbreviate it;  this is\n> > trivial to do, and should not break anything.\n> \n> Both sound reasonable to me.\n> \n> > A third approach would be to change the meaning of an empty buffer,\n> > but\n> > this would break some tests (at least t3404.3) and cause more\n> > confusion\n> > for users than necessary.\n> \n> Well, \"error: nothing to do\" probably makes sense if the user\n> specifies a list of empty commands or sees a list of empty commands\n> and agrees to pass these to the backend.  But I'm not sure that\n> message makes sense for implicitly interactive runs as opposed to\n> explicitly interactive ones.  Perhaps we could change the message to\n> just be \"Already up to date\" if the buffer is empty and the run is\n> not\n> explicitly interactive?\n\nChanging just the message and return code wouldn't be enough, as the\nempty todo results in the rebase being aborted without fast-forwarding\nthe branch.\n\n"},{"id":"394201","messageId":"xmqq5zepfppt.fsf@gitster.c.googlers.com","threadId":"53111","inReplyTo":"a3cc46ca-824d-8cab-e333-83f51a7824ca@gmail.com","subject":"Re: git rebase fast-forward fails with abbreviateCommands","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-03-27T21:33:02Z","receivedAt":"2020-03-27T21:33:08Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alban Gruin <alban.gruin@gmail.com> writes:\n\n> Three approach to fix this:\n>\n>  1) add an abbreviation to `noop';  this is the simplest fix, and \"n\" is\n> not taken.\n>  2) if a command has no short form, do not abbreviate it;  this is\n> trivial to do, and should not break anything.\n\nI think the second is the most sensible.  Thanks.\n"},{"id":"394220","messageId":"4aeffccc-3a62-b92c-f6f5-0438995f676b@gmail.com","threadId":"53111","inReplyTo":"CABPp-BEV0NxMLuM3U8fqECkEB_XHTvLMav1q_TiYveBWrpsr_w@mail.gmail.com","subject":"Re: git rebase fast-forward fails with abbreviateCommands","fromName":"Alban Gruin","fromEmail":"alban.gruin@gmail.com","sentAt":"2020-03-28T12:21:50Z","receivedAt":"2020-03-28T12:22:13Z","isPatch":false,"sender":{"key":"alban.gruin@gmail.com","avatar":"https://avatars.githubusercontent.com/u/6310153?v=4"},"body":"Hi Elijah,\n\nLe 27/03/2020 à 19:39, Elijah Newren a écrit :\n\n>> A third approach would be to change the meaning of an empty buffer, but\n>> this would break some tests (at least t3404.3) and cause more confusion\n>> for users than necessary.\n> \n> Well, \"error: nothing to do\" probably makes sense if the user\n> specifies a list of empty commands or sees a list of empty commands\n> and agrees to pass these to the backend.  But I'm not sure that\n> message makes sense for implicitly interactive runs as opposed to\n> explicitly interactive ones.  Perhaps we could change the message to\n> just be \"Already up to date\" if the buffer is empty and the run is not\n> explicitly interactive?\n> \n> \n\nIs this even supposed to happen in non-interactive mode?  When I try to\nrebase an already up-to-date branch, rebase fails with the message\n\"Current branch … is up to date.\"\n\n> Elijah\n> \n\nCheers,\nAlban\n\n"},{"id":"394338","messageId":"20200330124236.6716-1-alban.gruin@gmail.com","threadId":"53111","inReplyTo":"9b4bc756764d87c9f34c11e6ec2fc6482f531805.camel@gmail.com","subject":"[PATCH v1 0/2] rebase --merge: fix fast forwarding when `rebase.abbreviateCommands' is set","fromName":"Alban Gruin","fromEmail":"alban.gruin@gmail.com","sentAt":"2020-03-30T12:42:34Z","receivedAt":"2020-03-30T12:43:38Z","isPatch":true,"sender":{"key":"alban.gruin@gmail.com","avatar":"https://avatars.githubusercontent.com/u/6310153?v=4"},"body":"Jan Alexander Steffens reported that when `rebase.abbreviateCommands' is\nset, the merge backend fails to fast forward.  This is because the\nbackend generates a todo list with only a `noop', and since this command\nhas no abbreviated form, it is replaced by a comment mark.  The\nsequencer then interprets it as if there is nothing to do, and fails.\n\nThis patch series fixes this issue by teaching the sequencer not to\nabbreviate a command if it does not have a short form, and adds a bunch\nof regression tests.\n\nThis series is based on 9fadedd637 (\"Merge branch\n'ds/default-pack-use-sparse-to-true'\", 2020-03-29).\n\nThe tip of this series is tagged as \"rebase-dont-abbreviate-v1\" at\nhttps://github.com/agrn/git.\n\nAlban Gruin (2):\n  sequencer: don't abbreviate a command if it doesn't have a short form\n  t3432: test `--merge' with `rebase.abbreviateCommands = true', too\n\n sequencer.c                    |  9 ++++++---\n t/t3432-rebase-fast-forward.sh | 24 +++++++++++++++++++-----\n 2 files changed, 25 insertions(+), 8 deletions(-)\n\n-- \n2.25.0\n\n"},{"id":"394339","messageId":"20200330124236.6716-2-alban.gruin@gmail.com","threadId":"53111","inReplyTo":"20200330124236.6716-1-alban.gruin@gmail.com","subject":"[PATCH v1 1/2] sequencer: don't abbreviate a command if it doesn't have a short form","fromName":"Alban Gruin","fromEmail":"alban.gruin@gmail.com","sentAt":"2020-03-30T12:42:35Z","receivedAt":"2020-03-30T12:43:42Z","isPatch":true,"sender":{"key":"alban.gruin@gmail.com","avatar":"https://avatars.githubusercontent.com/u/6310153?v=4"},"body":"When the sequencer is requested to abbreviate commands, it will replace\nthose that does not have a short form (eg. `noop') by a comment mark.\n`noop' serves no purpose, except when fast-forwarding (ie. by running\n`git rebase').  Removing it will break this command when\n`rebase.abbreviateCommands' is set to true.\n\nThis changes todo_list_to_strbuf() to check if a command has an actual\nshort form, and to ignore it if not.\n\nSigned-off-by: Alban Gruin <alban.gruin@gmail.com>\n---\n sequencer.c | 9 ++++++---\n 1 file changed, 6 insertions(+), 3 deletions(-)\n\ndiff --git a/sequencer.c b/sequencer.c\nindex 6fd2674632..79d0c5cb2e 100644\n--- a/sequencer.c\n+++ b/sequencer.c\n@@ -1578,7 +1578,7 @@ static const char *command_to_string(const enum todo_command command)\n \n static char command_to_char(const enum todo_command command)\n {\n-\tif (command < TODO_COMMENT && todo_command_info[command].c)\n+\tif (command < TODO_COMMENT)\n \t\treturn todo_command_info[command].c;\n \treturn comment_line_char;\n }\n@@ -4963,6 +4963,8 @@ static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_lis\n \t\tmax = num;\n \n \tfor (item = todo_list->items, i = 0; i < max; i++, item++) {\n+\t\tchar cmd;\n+\n \t\t/* if the item is not a command write it and continue */\n \t\tif (item->command >= TODO_COMMENT) {\n \t\t\tstrbuf_addf(buf, \"%.*s\\n\", item->arg_len,\n@@ -4971,8 +4973,9 @@ static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_lis\n \t\t}\n \n \t\t/* add command to the buffer */\n-\t\tif (flags & TODO_LIST_ABBREVIATE_CMDS)\n-\t\t\tstrbuf_addch(buf, command_to_char(item->command));\n+\t\tcmd = command_to_char(item->command);\n+\t\tif (flags & TODO_LIST_ABBREVIATE_CMDS && cmd)\n+\t\t\tstrbuf_addch(buf, cmd);\n \t\telse\n \t\t\tstrbuf_addstr(buf, command_to_string(item->command));\n \n-- \n2.25.0\n\n"},{"id":"394340","messageId":"20200330124236.6716-3-alban.gruin@gmail.com","threadId":"53111","inReplyTo":"20200330124236.6716-1-alban.gruin@gmail.com","subject":"[PATCH v1 2/2] t3432: test `--merge' with `rebase.abbreviateCommands = true', too","fromName":"Alban Gruin","fromEmail":"alban.gruin@gmail.com","sentAt":"2020-03-30T12:42:36Z","receivedAt":"2020-03-30T12:43:47Z","isPatch":true,"sender":{"key":"alban.gruin@gmail.com","avatar":"https://avatars.githubusercontent.com/u/6310153?v=4"},"body":"When fast forwarding, `git --merge' should act the same whether\n`rebase.abbreviateCommands' is set or not, but so far it was not the\ncase.  This duplicates the tests ensuring that `--merge' works when fast\nforwarding to check if it also works with abbreviated commands.\n\nSigned-off-by: Alban Gruin <alban.gruin@gmail.com>\n---\n t/t3432-rebase-fast-forward.sh | 24 +++++++++++++++++++-----\n 1 file changed, 19 insertions(+), 5 deletions(-)\n\ndiff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh\nindex 6c9d4a1375..6f0452c0ea 100755\n--- a/t/t3432-rebase-fast-forward.sh\n+++ b/t/t3432-rebase-fast-forward.sh\n@@ -28,10 +28,12 @@ test_rebase_same_head () {\n \tshift &&\n \tcmp_f=\"$1\" &&\n \tshift &&\n-\ttest_rebase_same_head_ $status_n $what_n $cmp_n \" --apply\" \"$*\" &&\n-\ttest_rebase_same_head_ $status_f $what_f $cmp_f \" --apply --no-ff\" \"$*\"\n-\ttest_rebase_same_head_ $status_n $what_n $cmp_n \" --merge\" \"$*\" &&\n-\ttest_rebase_same_head_ $status_f $what_f $cmp_f \" --merge --no-ff\" \"$*\"\n+\ttest_rebase_same_head_ $status_n $what_n $cmp_n 0 \" --apply\" \"$*\" &&\n+\ttest_rebase_same_head_ $status_f $what_f $cmp_f 0 \" --apply --no-ff\" \"$*\"\n+\ttest_rebase_same_head_ $status_n $what_n $cmp_n 0 \" --merge\" \"$*\" &&\n+\ttest_rebase_same_head_ $status_f $what_f $cmp_f 0 \" --merge --no-ff\" \"$*\"\n+\ttest_rebase_same_head_ $status_n $what_n $cmp_n 1 \" --merge\" \"$*\" &&\n+\ttest_rebase_same_head_ $status_f $what_f $cmp_f 1 \" --merge --no-ff\" \"$*\"\n }\n \n test_rebase_same_head_ () {\n@@ -41,9 +43,21 @@ test_rebase_same_head_ () {\n \tshift &&\n \tcmp=\"$1\" &&\n \tshift &&\n+\tabbreviate=\"$1\" &&\n+\tshift &&\n \tflag=\"$1\"\n \tshift &&\n-\ttest_expect_$status \"git rebase$flag $* with $changes is $what with $cmp HEAD\" \"\n+\tif test $abbreviate -eq 1\n+\tthen\n+\t\tmsg=\"git rebase$flag $* (rebase.abbreviateCommands = true) with $changes is $what with $cmp HEAD\"\n+\telse\n+\t\tmsg=\"git rebase$flag $* with $changes is $what with $cmp HEAD\"\n+\tfi &&\n+\ttest_expect_$status \"$msg\" \"\n+\t\tif test $abbreviate -eq 1\n+\t\tthen\n+\t\t\ttest_config rebase.abbreviateCommands true\n+\t\tfi &&\n \t\toldhead=\\$(git rev-parse HEAD) &&\n \t\ttest_when_finished 'git reset --hard \\$oldhead' &&\n \t\tcp .git/logs/HEAD expect &&\n-- \n2.25.0\n\n"},{"id":"394385","messageId":"xmqqeet991fj.fsf@gitster.c.googlers.com","threadId":"53111","inReplyTo":"20200330124236.6716-2-alban.gruin@gmail.com","subject":"Re: [PATCH v1 1/2] sequencer: don't abbreviate a command if it doesn't have a short form","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2020-03-30T17:50:56Z","receivedAt":"2020-03-30T17:51:04Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Alban Gruin <alban.gruin@gmail.com> writes:\n\n>  static char command_to_char(const enum todo_command command)\n>  {\n> -\tif (command < TODO_COMMENT && todo_command_info[command].c)\n> +\tif (command < TODO_COMMENT)\n>  \t\treturn todo_command_info[command].c;\n>  \treturn comment_line_char;\n>  }\n\nThis is not a new issue, and it may not even be an issue at all, but\nit is curious that command_to_string() barfs with \"unknown command\"\nwhen fed an int outside enum todo_command or TODO_COMMENT iteslf,\nwhile this returns comment_line_char.  Makes a reader wonder if both\nof them should be dying the same way.\n\n> @@ -4963,6 +4963,8 @@ static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_lis\n>  \t\tmax = num;\n>  \n>  \tfor (item = todo_list->items, i = 0; i < max; i++, item++) {\n> +\t\tchar cmd;\n> +\n>  \t\t/* if the item is not a command write it and continue */\n>  \t\tif (item->command >= TODO_COMMENT) {\n>  \t\t\tstrbuf_addf(buf, \"%.*s\\n\", item->arg_len,\n> @@ -4971,8 +4973,9 @@ static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_lis\n>  \t\t}\n>  \n>  \t\t/* add command to the buffer */\n> -\t\tif (flags & TODO_LIST_ABBREVIATE_CMDS)\n> -\t\t\tstrbuf_addch(buf, command_to_char(item->command));\n> +\t\tcmd = command_to_char(item->command);\n> +\t\tif (flags & TODO_LIST_ABBREVIATE_CMDS && cmd)\n\nEven though the precedence rule may not require it, for\nreadability's sake, it would be easier to see the association if\nthis is written with an extra set of parentheses, i.e.\n\n\t\tif ((flags & TODO_LIST_ABBREVIATE_CMDS) && cmd)\n\n> +\t\t\tstrbuf_addch(buf, cmd);\n>  \t\telse\n>  \t\t\tstrbuf_addstr(buf, command_to_string(item->command));\n\nThe logic is quite clear.  If there is an abbreviation and the user\nprefers to see it, we use it, but otherwise we'll give the full\nspelling.\n\nWe are sure we will never get TODO_COMMENT here in item->command at\nthis point (the loop would have already continued after adding it to\nthe buffer), so it does not affect us that command_to_string() would\ndie.  For that matter, if we made command_to_char() die, just like\ncommand_to_string() would, nobody will get hurt and the resulting\ncode would become saner.  But obviously it is outside the scope of\nthis fix (#leftoverbits).\n\nThanks.\n"},{"id":"394388","messageId":"CAPig+cQDCqUh9zpUHreS1GqG7hFgV9ChzZj0mtnMbcmVeY0ofQ@mail.gmail.com","threadId":"53111","inReplyTo":"20200330124236.6716-2-alban.gruin@gmail.com","subject":"Re: [PATCH v1 1/2] sequencer: don't abbreviate a command if it doesn't have a short form","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2020-03-30T18:15:33Z","receivedAt":"2020-03-30T18:15:47Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Mon, Mar 30, 2020 at 8:43 AM Alban Gruin <alban.gruin@gmail.com> wrote:\n> When the sequencer is requested to abbreviate commands, it will replace\n> those that does not have a short form (eg. `noop') by a comment mark.\n\ns/does/do/\n\n> `noop' serves no purpose, except when fast-forwarding (ie. by running\n> `git rebase').  Removing it will break this command when\n> `rebase.abbreviateCommands' is set to true.\n>\n> This changes todo_list_to_strbuf() to check if a command has an actual\n> short form, and to ignore it if not.\n\nPerhaps: s/This changes/Change/\n\n> Signed-off-by: Alban Gruin <alban.gruin@gmail.com>\n"}]}