Fix built-in rebase regression noticed by Debian's dgit
cover Fix built-in rebase regression noticed by Debian's dgit
It has been reported on the Debian bug tracker
[https://bugs.debian.org/914695] that the built-in rebase regresses on the scripted version, and later details emerged that this has something to do with the reflog messages: they were different with the built-in rebase than with the scripted one.
This here patch fixes that.
Johannes Schindelin (1):
rebase: fix GIT_REFLOG_ACTION regression
builtin/rebase.c | 29 ++++++++++++++++++++++++++--- t/t3406-rebase-message.sh | 26 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-)
base-commit: 7068cbc4abac53d9c3675dfba81c1e97d25e8eeb
Published-As: https://github.com/gitgitgadget/git/releases/tags/pr-91%2Fdscho%2Ffix-reflog-action-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-91/dscho/fix-reflog-action-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/91
Signature · 1 line
gitgitgadget
PATCH 1/1 rebase: fix GIT_REFLOG_ACTION regression
From: Johannes Schindelin <[email protected]>
The scripted version (partially) heeded the GIT_REFLOG_ACTION and when we converted to a built-in, this regressed.
Fix that, and add a regression test, both with GIT_REFLOG_ACTION set and unset.
Note: the reflog message for "rebase finished" did *not* heed GIT_REFLOG_ACTION, and as we are very late in the v2.20.0-rcN phase, we leave that bug for later (as it seems that that bug has been with us from the very beginning).
Reported by Ian Jackson.
--- builtin/rebase.c | 29 ++++++++++++++++++++++++++--- t/t3406-rebase-message.sh | 26 ++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-)
builtin/rebase.c +26 -3
@@ -776,6 +776,23 @@ static void NORETURN error_on_missing_default_upstream(void)exit (1 ); } +static void set_reflog_action (struct rebase_options *options) +{ +const char *env; +struct strbuf buf =STRBUF_INIT ; + +if (!is_interactive (options)) +return ; + + env =getenv (GIT_REFLOG_ACTION_ENVIRONMENT ); +if (env &&strcmp ("rebase" , env)) +return ;/* only override it if it is "rebase" */ + +strbuf_addf (&buf,"rebase -i (%s)" , options->action); +setenv (GIT_REFLOG_ACTION_ENVIRONMENT , buf.buf,1 ); +strbuf_release (&buf); +} +int cmd_rebase (int argc,const char **argv,const char *prefix) {struct rebase_options options = {
@@ -978,6 +995,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)if (action !=NO_ACTION && !in_progress)die (_ ("No rebase in progress?" )); +setenv (GIT_REFLOG_ACTION_ENVIRONMENT ,"rebase" ,0 );if (action ==ACTION_EDIT_TODO && !is_interactive (&options)) die(_("The --edit-todo action can only be used during "
@@ -990,6 +1008,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)int fd; options.action ="continue" ; +set_reflog_action (&options);/* Sanity check */ if (get_oid ("HEAD" , &head))
@@ -1018,6 +1037,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)struct string_list merge_rr =STRING_LIST_INIT_DUP ; options.action ="skip" ; +set_reflog_action (&options);rerere_clear (&merge_rr);string_list_clear (&merge_rr,1 );
@@ -1033,6 +1053,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)case ACTION_ABORT : {struct string_list merge_rr =STRING_LIST_INIT_DUP ; options.action ="abort" ; +set_reflog_action (&options);rerere_clear (&merge_rr);string_list_clear (&merge_rr,1 );
@@ -1440,11 +1461,12 @@ int cmd_rebase(int argc, const char **argv, const char *prefix) }strbuf_reset (&buf); -strbuf_addf (&buf,"rebase: checkout %s" , +strbuf_addf (&buf,"%s: checkout %s" , +getenv (GIT_REFLOG_ACTION_ENVIRONMENT ), options.switch_to);if (reset_head (&oid,"checkout" , options.head_name,0 , -NULL ,NULL ) <0 ) { +NULL , buf.buf) <0 ) { ret = !!error (_ ("could not switch to " "%s" ), options.switch_to);
@@ -1508,7 +1530,8 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)printf (_ ("First, rewinding head to replay your work on top of " "it...\n" )); -strbuf_addf (&msg,"rebase: checkout %s" , options.onto_name); +strbuf_addf (&msg,"%s: checkout %s" , +getenv (GIT_REFLOG_ACTION_ENVIRONMENT ), options.onto_name);if (reset_head (&options.onto->object.oid,"checkout" ,NULL ,RESET_HEAD_DETACH ,NULL , msg.buf))die (_ ("Could not detach HEAD" ));
t/t3406-rebase-message.sh +26 -0
@@ -91,4 +91,30 @@ test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' ' test_i18ngrep "Invalid whitespace option" err ' +test_expect_success 'GIT_REFLOG_ACTION' ' + git checkout start && + test_commit reflog-onto && + git checkout -b reflog-topic start && + test_commit reflog-to-rebase && + + git rebase reflog-onto && + git log -g --format=%gs -3 >actual && + cat >expect <<-\EOF && + rebase finished: returning to refs/heads/reflog-topic + rebase: reflog-to-rebase + rebase: checkout reflog-onto + EOF + test_cmp expect actual && + + git checkout -b reflog-prefix reflog-to-rebase && + GIT_REFLOG_ACTION=change-the-reflog git rebase reflog-onto && + git log -g --format=%gs -3 >actual && + cat >expect <<-\EOF && + rebase finished: returning to refs/heads/reflog-prefix + change-the-reflog: reflog-to-rebase + change-the-reflog: checkout reflog-onto + EOF + test_cmp expect actual +' + test_done
Signature · 1 line
gitgitgadget