From c2ee27a40e51cc7bff54799ec546b60748c81e96 Mon Sep 17 00:00:00 2001 From: Todd Zullinger Date: Sat, 4 Apr 2020 12:13:48 -0400 Subject: [PATCH] fix issue with fast-forward rebases when rebase.abbreviateCommands is set Quoting from the upstream patch: Jan Alexander Steffens reported that when `rebase.abbreviateCommands' is set, the merge backend fails to fast forward. This is because the backend generates a todo list with only a `noop', and since this command has no abbreviated form, it is replaced by a comment mark. The sequencer then interprets it as if there is nothing to do, and fails. References: https://github.com/git/git/commit/68e7090f31 https://lore.kernel.org/git/9b4bc756764d87c9f34c11e6ec2fc6482f531805.camel@gmail.com/ --- ...abbreviate-a-command-if-it-doesn-t-h.patch | 58 +++++++++++++++++ ...-with-rebase.abbreviateCommands-true.patch | 64 +++++++++++++++++++ git.spec | 12 +++- 3 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 0001-sequencer-don-t-abbreviate-a-command-if-it-doesn-t-h.patch create mode 100644 0002-t3432-test-merge-with-rebase.abbreviateCommands-true.patch diff --git a/0001-sequencer-don-t-abbreviate-a-command-if-it-doesn-t-h.patch b/0001-sequencer-don-t-abbreviate-a-command-if-it-doesn-t-h.patch new file mode 100644 index 0000000..e5a2058 --- /dev/null +++ b/0001-sequencer-don-t-abbreviate-a-command-if-it-doesn-t-h.patch @@ -0,0 +1,58 @@ +From 68e7090f31b4d4f2c7b9a25240af61149fbebb5c Mon Sep 17 00:00:00 2001 +From: Alban Gruin +Date: Mon, 30 Mar 2020 14:42:35 +0200 +Subject: [PATCH 1/2] sequencer: don't abbreviate a command if it doesn't have + a short form + +When the sequencer is requested to abbreviate commands, it will replace +those that do not have a short form (eg. `noop') by a comment mark. +`noop' serves no purpose, except when fast-forwarding (ie. by running +`git rebase'). Removing it will break this command when +`rebase.abbreviateCommands' is set to true. + +Teach todo_list_to_strbuf() to check if a command has an actual +short form, and to ignore it if not. + +Signed-off-by: Alban Gruin +Signed-off-by: Junio C Hamano +--- + sequencer.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/sequencer.c b/sequencer.c +index e528225e78..c2f97f94ba 100644 +--- a/sequencer.c ++++ b/sequencer.c +@@ -1564,7 +1564,7 @@ static const char *command_to_string(const enum todo_command command) + + static char command_to_char(const enum todo_command command) + { +- if (command < TODO_COMMENT && todo_command_info[command].c) ++ if (command < TODO_COMMENT) + return todo_command_info[command].c; + return comment_line_char; + } +@@ -4947,6 +4947,8 @@ static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_lis + max = num; + + for (item = todo_list->items, i = 0; i < max; i++, item++) { ++ char cmd; ++ + /* if the item is not a command write it and continue */ + if (item->command >= TODO_COMMENT) { + strbuf_addf(buf, "%.*s\n", item->arg_len, +@@ -4955,8 +4957,9 @@ static void todo_list_to_strbuf(struct repository *r, struct todo_list *todo_lis + } + + /* add command to the buffer */ +- if (flags & TODO_LIST_ABBREVIATE_CMDS) +- strbuf_addch(buf, command_to_char(item->command)); ++ cmd = command_to_char(item->command); ++ if ((flags & TODO_LIST_ABBREVIATE_CMDS) && cmd) ++ strbuf_addch(buf, cmd); + else + strbuf_addstr(buf, command_to_string(item->command)); + +-- +2.26.0 + diff --git a/0002-t3432-test-merge-with-rebase.abbreviateCommands-true.patch b/0002-t3432-test-merge-with-rebase.abbreviateCommands-true.patch new file mode 100644 index 0000000..662fd3b --- /dev/null +++ b/0002-t3432-test-merge-with-rebase.abbreviateCommands-true.patch @@ -0,0 +1,64 @@ +From de9f1d3ef45ec885339d04f9e34293eb2de8605d Mon Sep 17 00:00:00 2001 +From: Alban Gruin +Date: Mon, 30 Mar 2020 14:42:36 +0200 +Subject: [PATCH 2/2] t3432: test `--merge' with `rebase.abbreviateCommands = + true', too + +When fast forwarding, `git --merge' should act the same whether +`rebase.abbreviateCommands' is set or not, but so far it was not the +case. This duplicates the tests ensuring that `--merge' works when fast +forwarding to check if it also works with abbreviated commands. + +Signed-off-by: Alban Gruin +Signed-off-by: Junio C Hamano +--- + t/t3432-rebase-fast-forward.sh | 24 +++++++++++++++++++----- + 1 file changed, 19 insertions(+), 5 deletions(-) + +diff --git a/t/t3432-rebase-fast-forward.sh b/t/t3432-rebase-fast-forward.sh +index 6c9d4a1375..6f0452c0ea 100755 +--- a/t/t3432-rebase-fast-forward.sh ++++ b/t/t3432-rebase-fast-forward.sh +@@ -28,10 +28,12 @@ test_rebase_same_head () { + shift && + cmp_f="$1" && + shift && +- test_rebase_same_head_ $status_n $what_n $cmp_n " --apply" "$*" && +- test_rebase_same_head_ $status_f $what_f $cmp_f " --apply --no-ff" "$*" +- test_rebase_same_head_ $status_n $what_n $cmp_n " --merge" "$*" && +- test_rebase_same_head_ $status_f $what_f $cmp_f " --merge --no-ff" "$*" ++ test_rebase_same_head_ $status_n $what_n $cmp_n 0 " --apply" "$*" && ++ test_rebase_same_head_ $status_f $what_f $cmp_f 0 " --apply --no-ff" "$*" ++ test_rebase_same_head_ $status_n $what_n $cmp_n 0 " --merge" "$*" && ++ test_rebase_same_head_ $status_f $what_f $cmp_f 0 " --merge --no-ff" "$*" ++ test_rebase_same_head_ $status_n $what_n $cmp_n 1 " --merge" "$*" && ++ test_rebase_same_head_ $status_f $what_f $cmp_f 1 " --merge --no-ff" "$*" + } + + test_rebase_same_head_ () { +@@ -41,9 +43,21 @@ test_rebase_same_head_ () { + shift && + cmp="$1" && + shift && ++ abbreviate="$1" && ++ shift && + flag="$1" + shift && +- test_expect_$status "git rebase$flag $* with $changes is $what with $cmp HEAD" " ++ if test $abbreviate -eq 1 ++ then ++ msg="git rebase$flag $* (rebase.abbreviateCommands = true) with $changes is $what with $cmp HEAD" ++ else ++ msg="git rebase$flag $* with $changes is $what with $cmp HEAD" ++ fi && ++ test_expect_$status "$msg" " ++ if test $abbreviate -eq 1 ++ then ++ test_config rebase.abbreviateCommands true ++ fi && + oldhead=\$(git rev-parse HEAD) && + test_when_finished 'git reset --hard \$oldhead' && + cp .git/logs/HEAD expect && +-- +2.26.0 + diff --git a/git.spec b/git.spec index e66629f..4869759 100644 --- a/git.spec +++ b/git.spec @@ -85,7 +85,7 @@ Name: git Version: 2.26.0 -Release: 1%{?rcrev}%{?dist}.1 +Release: 2%{?rcrev}%{?dist} Summary: Fast Version Control System License: GPLv2 URL: https://git-scm.com/ @@ -117,6 +117,13 @@ Source99: print-failed-test-output # https://bugzilla.redhat.com/490602 Patch0: git-cvsimport-Ignore-cvsps-2.2b1-Branches-output.patch +# Fix issue with fast-forward rebases when rebase.abbreviateCommands is set +# https://lore.kernel.org/git/9b4bc756764d87c9f34c11e6ec2fc6482f531805.camel@gmail.com/ +# https://github.com/git/git/commit/68e7090f31 +Patch1: 0001-sequencer-don-t-abbreviate-a-command-if-it-doesn-t-h.patch +# https://github.com/git/git/commit/de9f1d3ef4 +Patch2: 0002-t3432-test-merge-with-rebase.abbreviateCommands-true.patch + %if %{with docs} # pod2man is needed to build Git.3pm BuildRequires: %{_bindir}/pod2man @@ -1053,6 +1060,9 @@ rmdir --ignore-fail-on-non-empty "$testdir" %{?with_docs:%{_pkgdocdir}/git-svn.html} %changelog +* Sat Apr 04 2020 Todd Zullinger - 2.26.0-2 +- fix issue with fast-forward rebases when rebase.abbreviateCommands is set + * Thu Apr 02 2020 Björn Esser - 2.26.0-1.1 - Fix string quoting for rpm >= 4.16