status: better advices when splitting a commit (during rebase -i)
Add new informative help messages at the output of 'git status' when the user is splitting a commit. The code figures this state by comparing the contents of the following files in the .git/ directory: - HEAD - ORIG_HEAD - rebase-merge/amend - rebase-merge/orig-head Signed-off-by: Lucien Kong <Lucien.Kong@ensimag.imag.fr> Signed-off-by: Valentin Duperray <Valentin.Duperray@ensimag.imag.fr> Signed-off-by: Franck Jonas <Franck.Jonas@ensimag.imag.fr> Signed-off-by: Thomas Nguy <Thomas.Nguy@ensimag.imag.fr> Signed-off-by: Huynh Khoi Nguyen Nguyen <Huynh-Khoi-Nguyen.Nguyen@ensimag.imag.fr> Signed-off-by: Matthieu Moy <Matthieu.Moy@grenoble-inp.fr> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
96b0ec1a4c
commit
2d1ccebae4
|
|
@ -196,6 +196,283 @@ test_expect_success 'status when rebasing -i in edit mode' '
|
||||||
'
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status when splitting a commit' '
|
||||||
|
git reset --hard master &&
|
||||||
|
git checkout -b split_commit &&
|
||||||
|
test_commit one_split main.txt one &&
|
||||||
|
test_commit two_split main.txt two &&
|
||||||
|
test_commit three_split main.txt three &&
|
||||||
|
test_commit four_split main.txt four &&
|
||||||
|
FAKE_LINES="1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git reset HEAD^ &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently splitting a commit during a rebase.
|
||||||
|
# (Once your working directory is clean, run "git rebase --continue")
|
||||||
|
#
|
||||||
|
# Changes not staged for commit:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
#
|
||||||
|
# modified: main.txt
|
||||||
|
#
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status after editing the last commit with --amend during a rebase -i' '
|
||||||
|
git reset --hard master &&
|
||||||
|
git checkout -b amend_last &&
|
||||||
|
test_commit one_amend main.txt one &&
|
||||||
|
test_commit two_amend main.txt two &&
|
||||||
|
test_commit three_amend main.txt three &&
|
||||||
|
test_commit four_amend main.txt four &&
|
||||||
|
FAKE_LINES="1 2 edit 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git commit --amend -m "foo" &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently editing a commit during a rebase.
|
||||||
|
# (use "git commit --amend" to amend the current commit)
|
||||||
|
# (use "git rebase --continue" once you are satisfied with your changes)
|
||||||
|
#
|
||||||
|
nothing to commit (use -u to show untracked files)
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'prepare for several edits' '
|
||||||
|
git reset --hard master &&
|
||||||
|
git checkout -b several_edits &&
|
||||||
|
test_commit one_edits main.txt one &&
|
||||||
|
test_commit two_edits main.txt two &&
|
||||||
|
test_commit three_edits main.txt three &&
|
||||||
|
test_commit four_edits main.txt four
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (continue first edit) second edit' '
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git rebase --continue &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently editing a commit during a rebase.
|
||||||
|
# (use "git commit --amend" to amend the current commit)
|
||||||
|
# (use "git rebase --continue" once you are satisfied with your changes)
|
||||||
|
#
|
||||||
|
nothing to commit (use -u to show untracked files)
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (continue first edit) second edit and split' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git rebase --continue &&
|
||||||
|
git reset HEAD^ &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently splitting a commit during a rebase.
|
||||||
|
# (Once your working directory is clean, run "git rebase --continue")
|
||||||
|
#
|
||||||
|
# Changes not staged for commit:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
#
|
||||||
|
# modified: main.txt
|
||||||
|
#
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (continue first edit) second edit and amend' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git rebase --continue &&
|
||||||
|
git commit --amend -m "foo" &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently editing a commit during a rebase.
|
||||||
|
# (use "git commit --amend" to amend the current commit)
|
||||||
|
# (use "git rebase --continue" once you are satisfied with your changes)
|
||||||
|
#
|
||||||
|
nothing to commit (use -u to show untracked files)
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (amend first edit) second edit' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git commit --amend -m "a" &&
|
||||||
|
git rebase --continue &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently editing a commit during a rebase.
|
||||||
|
# (use "git commit --amend" to amend the current commit)
|
||||||
|
# (use "git rebase --continue" once you are satisfied with your changes)
|
||||||
|
#
|
||||||
|
nothing to commit (use -u to show untracked files)
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (amend first edit) second edit and split' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git commit --amend -m "b" &&
|
||||||
|
git rebase --continue &&
|
||||||
|
git reset HEAD^ &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently splitting a commit during a rebase.
|
||||||
|
# (Once your working directory is clean, run "git rebase --continue")
|
||||||
|
#
|
||||||
|
# Changes not staged for commit:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
#
|
||||||
|
# modified: main.txt
|
||||||
|
#
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (amend first edit) second edit and amend' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git commit --amend -m "c" &&
|
||||||
|
git rebase --continue &&
|
||||||
|
git commit --amend -m "d" &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently editing a commit during a rebase.
|
||||||
|
# (use "git commit --amend" to amend the current commit)
|
||||||
|
# (use "git rebase --continue" once you are satisfied with your changes)
|
||||||
|
#
|
||||||
|
nothing to commit (use -u to show untracked files)
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (split first edit) second edit' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git reset HEAD^ &&
|
||||||
|
git add main.txt &&
|
||||||
|
git commit -m "e" &&
|
||||||
|
git rebase --continue &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently editing a commit during a rebase.
|
||||||
|
# (use "git commit --amend" to amend the current commit)
|
||||||
|
# (use "git rebase --continue" once you are satisfied with your changes)
|
||||||
|
#
|
||||||
|
nothing to commit (use -u to show untracked files)
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (split first edit) second edit and split' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git reset HEAD^ &&
|
||||||
|
git add main.txt &&
|
||||||
|
git commit --amend -m "f" &&
|
||||||
|
git rebase --continue &&
|
||||||
|
git reset HEAD^ &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently splitting a commit during a rebase.
|
||||||
|
# (Once your working directory is clean, run "git rebase --continue")
|
||||||
|
#
|
||||||
|
# Changes not staged for commit:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
#
|
||||||
|
# modified: main.txt
|
||||||
|
#
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
|
test_expect_success 'status: (split first edit) second edit and amend' '
|
||||||
|
git reset --hard several_edits &&
|
||||||
|
FAKE_LINES="edit 1 edit 2 3" &&
|
||||||
|
export FAKE_LINES &&
|
||||||
|
test_when_finished "git rebase --abort" &&
|
||||||
|
git rebase -i HEAD~3 &&
|
||||||
|
git reset HEAD^ &&
|
||||||
|
git add main.txt &&
|
||||||
|
git commit --amend -m "g" &&
|
||||||
|
git rebase --continue &&
|
||||||
|
git commit --amend -m "h" &&
|
||||||
|
cat >expected <<-\EOF &&
|
||||||
|
# Not currently on any branch.
|
||||||
|
# You are currently editing a commit during a rebase.
|
||||||
|
# (use "git commit --amend" to amend the current commit)
|
||||||
|
# (use "git rebase --continue" once you are satisfied with your changes)
|
||||||
|
#
|
||||||
|
nothing to commit (use -u to show untracked files)
|
||||||
|
EOF
|
||||||
|
git status --untracked-files=no >actual &&
|
||||||
|
test_i18ncmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
|
|
||||||
test_expect_success 'prepare am_session' '
|
test_expect_success 'prepare am_session' '
|
||||||
git reset --hard master &&
|
git reset --hard master &&
|
||||||
git checkout -b am_session &&
|
git checkout -b am_session &&
|
||||||
|
|
|
||||||
52
wt-status.c
52
wt-status.c
|
|
@ -12,6 +12,7 @@
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "submodule.h"
|
#include "submodule.h"
|
||||||
#include "column.h"
|
#include "column.h"
|
||||||
|
#include "strbuf.h"
|
||||||
|
|
||||||
static char default_wt_status_colors[][COLOR_MAXLEN] = {
|
static char default_wt_status_colors[][COLOR_MAXLEN] = {
|
||||||
GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
|
GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
|
||||||
|
|
@ -817,6 +818,52 @@ static void show_am_in_progress(struct wt_status *s,
|
||||||
wt_status_print_trailer(s);
|
wt_status_print_trailer(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *read_line_from_git_path(const char *filename)
|
||||||
|
{
|
||||||
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
FILE *fp = fopen(git_path("%s", filename), "r");
|
||||||
|
if (!fp) {
|
||||||
|
strbuf_release(&buf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
strbuf_getline(&buf, fp, '\n');
|
||||||
|
if (!fclose(fp)) {
|
||||||
|
return strbuf_detach(&buf, NULL);
|
||||||
|
} else {
|
||||||
|
strbuf_release(&buf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int split_commit_in_progress(struct wt_status *s)
|
||||||
|
{
|
||||||
|
int split_in_progress = 0;
|
||||||
|
char *head = read_line_from_git_path("HEAD");
|
||||||
|
char *orig_head = read_line_from_git_path("ORIG_HEAD");
|
||||||
|
char *rebase_amend = read_line_from_git_path("rebase-merge/amend");
|
||||||
|
char *rebase_orig_head = read_line_from_git_path("rebase-merge/orig-head");
|
||||||
|
|
||||||
|
if (!head || !orig_head || !rebase_amend || !rebase_orig_head ||
|
||||||
|
!s->branch || strcmp(s->branch, "HEAD"))
|
||||||
|
return split_in_progress;
|
||||||
|
|
||||||
|
if (!strcmp(rebase_amend, rebase_orig_head)) {
|
||||||
|
if (strcmp(head, rebase_amend))
|
||||||
|
split_in_progress = 1;
|
||||||
|
} else if (strcmp(orig_head, rebase_orig_head)) {
|
||||||
|
split_in_progress = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!s->amend && !s->nowarn && !s->workdir_dirty)
|
||||||
|
split_in_progress = 0;
|
||||||
|
|
||||||
|
free(head);
|
||||||
|
free(orig_head);
|
||||||
|
free(rebase_amend);
|
||||||
|
free(rebase_orig_head);
|
||||||
|
return split_in_progress;
|
||||||
|
}
|
||||||
|
|
||||||
static void show_rebase_in_progress(struct wt_status *s,
|
static void show_rebase_in_progress(struct wt_status *s,
|
||||||
struct wt_status_state *state,
|
struct wt_status_state *state,
|
||||||
const char *color)
|
const char *color)
|
||||||
|
|
@ -838,6 +885,11 @@ static void show_rebase_in_progress(struct wt_status *s,
|
||||||
if (advice_status_hints)
|
if (advice_status_hints)
|
||||||
status_printf_ln(s, color,
|
status_printf_ln(s, color,
|
||||||
_(" (all conflicts fixed: run \"git rebase --continue\")"));
|
_(" (all conflicts fixed: run \"git rebase --continue\")"));
|
||||||
|
} else if (split_commit_in_progress(s)) {
|
||||||
|
status_printf_ln(s, color, _("You are currently splitting a commit during a rebase."));
|
||||||
|
if (advice_status_hints)
|
||||||
|
status_printf_ln(s, color,
|
||||||
|
_(" (Once your working directory is clean, run \"git rebase --continue\")"));
|
||||||
} else {
|
} else {
|
||||||
status_printf_ln(s, color, _("You are currently editing a commit during a rebase."));
|
status_printf_ln(s, color, _("You are currently editing a commit during a rebase."));
|
||||||
if (advice_status_hints && !s->amend) {
|
if (advice_status_hints && !s->amend) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue