Skip to content

Commit

Permalink
git-prompt: show presence of unresolved conflicts at command prompt
Browse files Browse the repository at this point in the history
If GIT_PS1_SHOWCONFLICTSTATE is set to "yes", show the word "CONFLICT"
on the command prompt when there are unresolved conflicts.

Example prompt: (main|CONFLICT)

Signed-off-by: Justin Donnelly <justinrdonnelly@gmail.com>
  • Loading branch information
justinrdonnelly committed Jul 29, 2022
1 parent 6a475b7 commit 7154d69
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 5 deletions.
12 changes: 11 additions & 1 deletion contrib/completion/git-prompt.sh
Expand Up @@ -84,6 +84,10 @@
# single '?' character by setting GIT_PS1_COMPRESSSPARSESTATE, or omitted
# by setting GIT_PS1_OMITSPARSESTATE.
#
# If you would like to see a notification on the prompt when there are
# unresolved conflicts, set GIT_PS1_SHOWCONFLICTSTATE to "yes". The
# prompt will include "|CONFLICT".
#
# If you would like to see more information about the identity of
# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE
# to one of these values:
Expand Down Expand Up @@ -508,6 +512,12 @@ __git_ps1 ()
r="$r $step/$total"
fi

local conflict="" # state indicator for unresolved conflicts
if [[ "${GIT_PS1_SHOWCONFLICTSTATE}" == "yes" ]] &&
[[ $(git ls-files --unmerged 2>/dev/null) ]]; then
conflict="|CONFLICT"
fi

local w=""
local i=""
local s=""
Expand Down Expand Up @@ -572,7 +582,7 @@ __git_ps1 ()
fi

local f="$h$w$i$s$u$p"
local gitstring="$c$b${f:+$z$f}${sparse}$r${upstream}"
local gitstring="$c$b${f:+$z$f}${sparse}$r${upstream}${conflict}"

if [ $pcmode = yes ]; then
if [ "${__git_printf_supports_v-}" != yes ]; then
Expand Down
70 changes: 66 additions & 4 deletions t/t9903-bash-prompt.sh
Expand Up @@ -188,7 +188,23 @@ test_expect_success 'prompt - rebase merge' '
test_when_finished "git checkout main" &&
test_must_fail git rebase --merge b1 b2 &&
test_when_finished "git rebase --abort" &&
__git_ps1 >"$actual" &&
(
sane_unset GIT_PS1_SHOWCONFLICTSTATE &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual"
'

test_expect_success 'prompt - rebase merge conflict' '
printf " (b2|REBASE 1/3|CONFLICT)" >expected &&
git checkout b2 &&
test_when_finished "git checkout main" &&
test_must_fail git rebase --merge b1 b2 &&
test_when_finished "git rebase --abort" &&
(
GIT_PS1_SHOWCONFLICTSTATE="yes" &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual"
'

Expand All @@ -198,7 +214,23 @@ test_expect_success 'prompt - rebase am' '
test_when_finished "git checkout main" &&
test_must_fail git rebase --apply b1 b2 &&
test_when_finished "git rebase --abort" &&
__git_ps1 >"$actual" &&
(
sane_unset GIT_PS1_SHOWCONFLICTSTATE &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual"
'

test_expect_success 'prompt - rebase am conflict' '
printf " (b2|REBASE 1/3|CONFLICT)" >expected &&
git checkout b2 &&
test_when_finished "git checkout main" &&
test_must_fail git rebase --apply b1 b2 &&
test_when_finished "git rebase --abort" &&
(
GIT_PS1_SHOWCONFLICTSTATE="yes" &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual"
'

Expand All @@ -208,22 +240,52 @@ test_expect_success 'prompt - merge' '
test_when_finished "git checkout main" &&
test_must_fail git merge b2 &&
test_when_finished "git reset --hard" &&
__git_ps1 >"$actual" &&
(
sane_unset GIT_PS1_SHOWCONFLICTSTATE &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual"
'

test_expect_success 'prompt - merge conflict' '
printf " (b1|MERGING|CONFLICT)" >expected &&
git checkout b1 &&
test_when_finished "git checkout main" &&
test_must_fail git merge b2 &&
test_when_finished "git reset --hard" &&
(
GIT_PS1_SHOWCONFLICTSTATE="yes" &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual"
'

test_expect_success 'prompt - cherry-pick' '
printf " (main|CHERRY-PICKING)" >expected &&
test_must_fail git cherry-pick b1 b1^ &&
test_when_finished "git cherry-pick --abort" &&
__git_ps1 >"$actual" &&
(
sane_unset GIT_PS1_SHOWCONFLICTSTATE &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual" &&
git reset --merge &&
test_must_fail git rev-parse CHERRY_PICK_HEAD &&
__git_ps1 >"$actual" &&
test_cmp expected "$actual"
'

test_expect_success 'prompt - cherry-pick conflict' '
printf " (main|CHERRY-PICKING|CONFLICT)" >expected &&
test_must_fail git cherry-pick b1 b1^ &&
test_when_finished "git cherry-pick --abort" &&
(
GIT_PS1_SHOWCONFLICTSTATE="yes" &&
__git_ps1 >"$actual"
) &&
test_cmp expected "$actual"
'

test_expect_success 'prompt - revert' '
printf " (main|REVERTING)" >expected &&
test_must_fail git revert b1^ b1 &&
Expand Down

0 comments on commit 7154d69

Please sign in to comment.