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@xxxxxxxxxxxxxxx> Signed-off-by: Valentin Duperray <Valentin.Duperray@xxxxxxxxxxxxxxx> Signed-off-by: Franck Jonas <Franck.Jonas@xxxxxxxxxxxxxxx> Signed-off-by: Thomas Nguy <Thomas.Nguy@xxxxxxxxxxxxxxx> Signed-off-by: Huynh Khoi Nguyen Nguyen <Huynh-Khoi-Nguyen.Nguyen@xxxxxxxxxxxxxxx> Signed-off-by: Matthieu Moy <Matthieu.Moy@xxxxxxxxxxxxxxx> --- t/t7512-status-help.sh | 55 ++++++++++++++++++++++++++++++++++ wt-status.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 0 deletions(-) diff --git a/t/t7512-status-help.sh b/t/t7512-status-help.sh index bdce192..a77574f 100755 --- a/t/t7512-status-help.sh +++ b/t/t7512-status-help.sh @@ -196,6 +196,61 @@ 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. + # (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_failure '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 (working directory clean) + EOF + git status --untracked-files=no >actual && + test_i18ncmp expected actual +' + + test_expect_success 'prepare am_session' ' git reset --hard master && git checkout -b am_session && diff --git a/wt-status.c b/wt-status.c index fcde045..5445dbf 100644 --- a/wt-status.c +++ b/wt-status.c @@ -12,6 +12,7 @@ #include "refs.h" #include "submodule.h" #include "column.h" +#include "strbuf.h" static char default_wt_status_colors[][COLOR_MAXLEN] = { GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */ @@ -817,6 +818,77 @@ static void show_am_in_progress(struct wt_status *s, wt_status_print_trailer(s); } +static int split_commit_in_progress() +{ + FILE *head; + struct strbuf buf_head; + FILE *orig_head; + struct strbuf buf_orig_head; + FILE *rebase_amend; + struct strbuf buf_rebase_amend; + FILE *rebase_orig_head; + struct strbuf buf_rebase_orig_head; + int split_in_progress = 0; + + head = fopen(git_path("HEAD"), "r"); + if (!head) + return 0; + + orig_head = fopen(git_path("ORIG_HEAD"), "r"); + if (!orig_head) { + fclose(head); + return 0; + } + + rebase_amend = fopen(git_path("rebase-merge/amend"), "r"); + if (!rebase_amend) { + fclose(head); + fclose(orig_head); + return 0; + } + + rebase_orig_head = fopen(git_path("rebase-merge/orig-head"), "r"); + if (!rebase_orig_head) { + fclose(head); + fclose(orig_head); + fclose(rebase_amend); + return 0; + } + + strbuf_init(&buf_head, 0); + strbuf_init(&buf_orig_head, 0); + strbuf_init(&buf_rebase_amend, 0); + strbuf_init(&buf_rebase_orig_head, 0); + + strbuf_getline(&buf_head, head, '\n'); + strbuf_getline(&buf_orig_head, orig_head, '\n'); + strbuf_getline(&buf_rebase_amend, rebase_amend, '\n'); + strbuf_getline(&buf_rebase_orig_head, rebase_orig_head, '\n'); + + fclose(head); + fclose(orig_head); + fclose(rebase_amend); + fclose(rebase_orig_head); + + if (!strbuf_cmp(&buf_rebase_amend, &buf_rebase_orig_head)) { + if (strbuf_cmp(&buf_head, &buf_rebase_amend)) + split_in_progress = 1; + } else if (!strbuf_cmp(&buf_orig_head, &buf_rebase_amend)) { + split_in_progress = 1; + } else if (strbuf_cmp(&buf_orig_head, &buf_rebase_orig_head)) { + split_in_progress = 1; + } + + if (!strbuf_cmp(&buf_head, &buf_rebase_amend)) + split_in_progress = 0; + + strbuf_release(&buf_head); + strbuf_release(&buf_orig_head); + strbuf_release(&buf_rebase_amend); + strbuf_release(&buf_rebase_orig_head); + return split_in_progress; +} + static void show_rebase_in_progress(struct wt_status *s, struct wt_status_state *state, const char *color) @@ -838,6 +910,11 @@ static void show_rebase_in_progress(struct wt_status *s, if (advice_status_hints) status_printf_ln(s, color, _(" (all conflicts fixed: run \"git rebase --continue\")")); + } else if (split_commit_in_progress()) { + status_printf_ln(s, color, _("You are currently splitting a commit.")); + if (advice_status_hints) + status_printf_ln(s, color, + _(" (Once your working directory is clean, run \"git rebase --continue\")")); } else { status_printf_ln(s, color, _("You are currently editing a commit during a rebase.")); if (advice_status_hints && !s->amend) { -- 1.7.8 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html