git-prompt: improve cherry-pick/revert detection
If the user commits or resets a conflict resolution in the middle of a sequence of cherry-picks or reverts then CHERRY_PICK_HEAD/REVERT_HEAD will be removed and so in the absence of those files we need to check .git/sequencer/todo to see if there is a cherry-pick or revert in progress. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
8dca754b1e
commit
e981bf7525
|
@ -286,6 +286,37 @@ __git_eread ()
|
||||||
test -r "$1" && IFS=$'\r\n' read "$2" <"$1"
|
test -r "$1" && IFS=$'\r\n' read "$2" <"$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# see if a cherry-pick or revert is in progress, if the user has committed a
|
||||||
|
# conflict resolution with 'git commit' in the middle of a sequence of picks or
|
||||||
|
# reverts then CHERRY_PICK_HEAD/REVERT_HEAD will not exist so we have to read
|
||||||
|
# the todo file.
|
||||||
|
__git_sequencer_status ()
|
||||||
|
{
|
||||||
|
local todo
|
||||||
|
if test -f "$g/CHERRY_PICK_HEAD"
|
||||||
|
then
|
||||||
|
r="|CHERRY-PICKING"
|
||||||
|
return 0;
|
||||||
|
elif test -f "$g/REVERT_HEAD"
|
||||||
|
then
|
||||||
|
r="|REVERTING"
|
||||||
|
return 0;
|
||||||
|
elif __git_eread "$g/sequencer/todo" todo
|
||||||
|
then
|
||||||
|
case "$todo" in
|
||||||
|
p[\ \ ]|pick[\ \ ]*)
|
||||||
|
r="|CHERRY-PICKING"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
revert[\ \ ]*)
|
||||||
|
r="|REVERTING"
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
|
# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
|
||||||
# when called from PS1 using command substitution
|
# when called from PS1 using command substitution
|
||||||
# in this mode it prints text to add to bash PS1 prompt (includes branch name)
|
# in this mode it prints text to add to bash PS1 prompt (includes branch name)
|
||||||
|
@ -417,10 +448,8 @@ __git_ps1 ()
|
||||||
fi
|
fi
|
||||||
elif [ -f "$g/MERGE_HEAD" ]; then
|
elif [ -f "$g/MERGE_HEAD" ]; then
|
||||||
r="|MERGING"
|
r="|MERGING"
|
||||||
elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
|
elif __git_sequencer_status; then
|
||||||
r="|CHERRY-PICKING"
|
:
|
||||||
elif [ -f "$g/REVERT_HEAD" ]; then
|
|
||||||
r="|REVERTING"
|
|
||||||
elif [ -f "$g/BISECT_LOG" ]; then
|
elif [ -f "$g/BISECT_LOG" ]; then
|
||||||
r="|BISECTING"
|
r="|BISECTING"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -211,8 +211,24 @@ test_expect_success 'prompt - merge' '
|
||||||
|
|
||||||
test_expect_success 'prompt - cherry-pick' '
|
test_expect_success 'prompt - cherry-pick' '
|
||||||
printf " (master|CHERRY-PICKING)" >expected &&
|
printf " (master|CHERRY-PICKING)" >expected &&
|
||||||
test_must_fail git cherry-pick b1 &&
|
test_must_fail git cherry-pick b1 b1^ &&
|
||||||
test_when_finished "git reset --hard" &&
|
test_when_finished "git cherry-pick --abort" &&
|
||||||
|
__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 - revert' '
|
||||||
|
printf " (master|REVERTING)" >expected &&
|
||||||
|
test_must_fail git revert b1^ b1 &&
|
||||||
|
test_when_finished "git revert --abort" &&
|
||||||
|
__git_ps1 >"$actual" &&
|
||||||
|
test_cmp expected "$actual" &&
|
||||||
|
git reset --merge &&
|
||||||
|
test_must_fail git rev-parse REVERT_HEAD &&
|
||||||
__git_ps1 >"$actual" &&
|
__git_ps1 >"$actual" &&
|
||||||
test_cmp expected "$actual"
|
test_cmp expected "$actual"
|
||||||
'
|
'
|
||||||
|
|
Loading…
Reference in New Issue