Merge branch 'mr/bisect-in-c-3'
Rewriting "git bisect" in C continues. * mr/bisect-in-c-3: bisect--helper: retire `--bisect-autostart` subcommand bisect--helper: retire `--write-terms` subcommand bisect--helper: retire `--check-expected-revs` subcommand bisect--helper: reimplement `bisect_state` & `bisect_head` shell functions in C bisect--helper: retire `--next-all` subcommand bisect--helper: retire `--bisect-clean-state` subcommand bisect--helper: finish porting `bisect_start()` to C
This commit is contained in:
@ -39,37 +39,6 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||
TERM_BAD=bad
|
||||
TERM_GOOD=good
|
||||
|
||||
bisect_head()
|
||||
{
|
||||
if git rev-parse --verify -q BISECT_HEAD > /dev/null
|
||||
then
|
||||
echo BISECT_HEAD
|
||||
else
|
||||
echo HEAD
|
||||
fi
|
||||
}
|
||||
|
||||
bisect_start() {
|
||||
git bisect--helper --bisect-start $@ || exit
|
||||
|
||||
#
|
||||
# Change state.
|
||||
# In case of mistaken revs or checkout error, or signals received,
|
||||
# "bisect_auto_next" below may exit or misbehave.
|
||||
# We have to trap this to be able to clean up using
|
||||
# "bisect_clean_state".
|
||||
#
|
||||
trap 'git bisect--helper --bisect-clean-state' 0
|
||||
trap 'exit 255' 1 2 3 15
|
||||
|
||||
#
|
||||
# Check if we can proceed to the next bisect state.
|
||||
#
|
||||
git bisect--helper --bisect-auto-next || exit
|
||||
|
||||
trap '-' 0
|
||||
}
|
||||
|
||||
bisect_skip() {
|
||||
all=''
|
||||
for arg in "$@"
|
||||
@ -82,43 +51,7 @@ bisect_skip() {
|
||||
esac
|
||||
all="$all $revs"
|
||||
done
|
||||
eval bisect_state 'skip' $all
|
||||
}
|
||||
|
||||
bisect_state() {
|
||||
git bisect--helper --bisect-autostart || exit
|
||||
state=$1
|
||||
git bisect--helper --check-and-set-terms $state $TERM_GOOD $TERM_BAD || exit
|
||||
get_terms
|
||||
case "$#,$state" in
|
||||
0,*)
|
||||
die "Please call 'bisect_state' with at least one argument." ;;
|
||||
1,"$TERM_BAD"|1,"$TERM_GOOD"|1,skip)
|
||||
bisected_head=$(bisect_head)
|
||||
rev=$(git rev-parse --verify "$bisected_head") ||
|
||||
die "$(eval_gettext "Bad rev input: \$bisected_head")"
|
||||
git bisect--helper --bisect-write "$state" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit
|
||||
git bisect--helper --check-expected-revs "$rev" ;;
|
||||
2,"$TERM_BAD"|*,"$TERM_GOOD"|*,skip)
|
||||
shift
|
||||
hash_list=''
|
||||
for rev in "$@"
|
||||
do
|
||||
sha=$(git rev-parse --verify "$rev^{commit}") ||
|
||||
die "$(eval_gettext "Bad rev input: \$rev")"
|
||||
hash_list="$hash_list $sha"
|
||||
done
|
||||
for rev in $hash_list
|
||||
do
|
||||
git bisect--helper --bisect-write "$state" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit
|
||||
done
|
||||
git bisect--helper --check-expected-revs $hash_list ;;
|
||||
*,"$TERM_BAD")
|
||||
die "$(eval_gettext "'git bisect \$TERM_BAD' can take only one argument.")" ;;
|
||||
*)
|
||||
usage ;;
|
||||
esac
|
||||
git bisect--helper --bisect-auto-next
|
||||
eval git bisect--helper --bisect-state 'skip' $all
|
||||
}
|
||||
|
||||
bisect_visualize() {
|
||||
@ -163,8 +96,7 @@ bisect_replay () {
|
||||
get_terms
|
||||
case "$command" in
|
||||
start)
|
||||
cmd="bisect_start $rev $tail"
|
||||
eval "$cmd" ;;
|
||||
eval "git bisect--helper --bisect-start $rev $tail" ;;
|
||||
"$TERM_GOOD"|"$TERM_BAD"|skip)
|
||||
git bisect--helper --bisect-write "$command" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit;;
|
||||
terms)
|
||||
@ -209,8 +141,7 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2
|
||||
state="$TERM_GOOD"
|
||||
fi
|
||||
|
||||
# We have to use a subshell because "bisect_state" can exit.
|
||||
( bisect_state $state >"$GIT_DIR/BISECT_RUN" )
|
||||
git bisect--helper --bisect-state $state >"$GIT_DIR/BISECT_RUN"
|
||||
res=$?
|
||||
|
||||
cat "$GIT_DIR/BISECT_RUN"
|
||||
@ -225,7 +156,7 @@ exit code \$res from '\$command' is < 0 or >= 128" >&2
|
||||
if [ $res -ne 0 ]
|
||||
then
|
||||
eval_gettextln "bisect run failed:
|
||||
'bisect_state \$state' exited with error code \$res" >&2
|
||||
'bisect-state \$state' exited with error code \$res" >&2
|
||||
exit $res
|
||||
fi
|
||||
|
||||
@ -264,9 +195,9 @@ case "$#" in
|
||||
help)
|
||||
git bisect -h ;;
|
||||
start)
|
||||
bisect_start "$@" ;;
|
||||
git bisect--helper --bisect-start "$@" ;;
|
||||
bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
|
||||
bisect_state "$cmd" "$@" ;;
|
||||
git bisect--helper --bisect-state "$cmd" "$@" ;;
|
||||
skip)
|
||||
bisect_skip "$@" ;;
|
||||
next)
|
||||
|
Reference in New Issue
Block a user