Merge branch 'js/rebase-reflog-action-fix'
"git rebase" reimplemented recently in C accidentally changed the way reflog entries are recorded (earlier "rebase -i" identified the entries it leaves with "rebase -i", but the new version always marks them with "rebase"). This has been corrected. * js/rebase-reflog-action-fix: rebase: fix GIT_REFLOG_ACTION regression
This commit is contained in:
commit
945f6bd1ce
@ -776,6 +776,23 @@ static void NORETURN error_on_missing_default_upstream(void)
|
|||||||
exit(1);
|
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)
|
int cmd_rebase(int argc, const char **argv, const char *prefix)
|
||||||
{
|
{
|
||||||
struct rebase_options options = {
|
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)
|
if (action != NO_ACTION && !in_progress)
|
||||||
die(_("No rebase in progress?"));
|
die(_("No rebase in progress?"));
|
||||||
|
setenv(GIT_REFLOG_ACTION_ENVIRONMENT, "rebase", 0);
|
||||||
|
|
||||||
if (action == ACTION_EDIT_TODO && !is_interactive(&options))
|
if (action == ACTION_EDIT_TODO && !is_interactive(&options))
|
||||||
die(_("The --edit-todo action can only be used during "
|
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;
|
int fd;
|
||||||
|
|
||||||
options.action = "continue";
|
options.action = "continue";
|
||||||
|
set_reflog_action(&options);
|
||||||
|
|
||||||
/* Sanity check */
|
/* Sanity check */
|
||||||
if (get_oid("HEAD", &head))
|
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;
|
struct string_list merge_rr = STRING_LIST_INIT_DUP;
|
||||||
|
|
||||||
options.action = "skip";
|
options.action = "skip";
|
||||||
|
set_reflog_action(&options);
|
||||||
|
|
||||||
rerere_clear(&merge_rr);
|
rerere_clear(&merge_rr);
|
||||||
string_list_clear(&merge_rr, 1);
|
string_list_clear(&merge_rr, 1);
|
||||||
@ -1033,6 +1053,7 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
|
|||||||
case ACTION_ABORT: {
|
case ACTION_ABORT: {
|
||||||
struct string_list merge_rr = STRING_LIST_INIT_DUP;
|
struct string_list merge_rr = STRING_LIST_INIT_DUP;
|
||||||
options.action = "abort";
|
options.action = "abort";
|
||||||
|
set_reflog_action(&options);
|
||||||
|
|
||||||
rerere_clear(&merge_rr);
|
rerere_clear(&merge_rr);
|
||||||
string_list_clear(&merge_rr, 1);
|
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_reset(&buf);
|
||||||
strbuf_addf(&buf, "rebase: checkout %s",
|
strbuf_addf(&buf, "%s: checkout %s",
|
||||||
|
getenv(GIT_REFLOG_ACTION_ENVIRONMENT),
|
||||||
options.switch_to);
|
options.switch_to);
|
||||||
if (reset_head(&oid, "checkout",
|
if (reset_head(&oid, "checkout",
|
||||||
options.head_name, 0,
|
options.head_name, 0,
|
||||||
NULL, NULL) < 0) {
|
NULL, buf.buf) < 0) {
|
||||||
ret = !!error(_("could not switch to "
|
ret = !!error(_("could not switch to "
|
||||||
"%s"),
|
"%s"),
|
||||||
options.switch_to);
|
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 "
|
printf(_("First, rewinding head to replay your work on top of "
|
||||||
"it...\n"));
|
"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,
|
if (reset_head(&options.onto->object.oid, "checkout", NULL,
|
||||||
RESET_HEAD_DETACH, NULL, msg.buf))
|
RESET_HEAD_DETACH, NULL, msg.buf))
|
||||||
die(_("Could not detach HEAD"));
|
die(_("Could not detach HEAD"));
|
||||||
|
@ -91,4 +91,30 @@ test_expect_success 'error out early upon -C<n> or --whitespace=<bad>' '
|
|||||||
test_i18ngrep "Invalid whitespace option" err
|
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
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user