 e4c7b33747
			
		
	
	e4c7b33747
	
	
	
		
			
			Reimplement the `bisect_skip()` shell function in C and also add `bisect-skip` subcommand to `git bisect--helper` to call it from git-bisect.sh Using `--bisect-skip` subcommand is a temporary measure to port shell function to C so as to use the existing test suite. Mentored-by: Lars Schneider <larsxschneider@gmail.com> Mentored-by: Christian Couder <chriscool@tuxfamily.org> Mentored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de> Signed-off-by: Pranit Bauva <pranit.bauva@gmail.com> Signed-off-by: Tanushree Tumane <tanushreetumane@gmail.com> Signed-off-by: Miriam Rubio <mirucam@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			170 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| USAGE='[help|start|bad|good|new|old|terms|skip|next|reset|visualize|view|replay|log|run]'
 | |
| LONG_USAGE='git bisect help
 | |
| 	print this long help message.
 | |
| git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]
 | |
| 		 [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<pathspec>...]
 | |
| 	reset bisect state and start bisection.
 | |
| git bisect (bad|new) [<rev>]
 | |
| 	mark <rev> a known-bad revision/
 | |
| 		a revision after change in a given property.
 | |
| git bisect (good|old) [<rev>...]
 | |
| 	mark <rev>... known-good revisions/
 | |
| 		revisions before change in a given property.
 | |
| git bisect terms [--term-good | --term-bad]
 | |
| 	show the terms used for old and new commits (default: bad, good)
 | |
| git bisect skip [(<rev>|<range>)...]
 | |
| 	mark <rev>... untestable revisions.
 | |
| git bisect next
 | |
| 	find next bisection to test and check it out.
 | |
| git bisect reset [<commit>]
 | |
| 	finish bisection search and go back to commit.
 | |
| git bisect (visualize|view)
 | |
| 	show bisect status in gitk.
 | |
| git bisect replay <logfile>
 | |
| 	replay bisection log.
 | |
| git bisect log
 | |
| 	show bisect log.
 | |
| git bisect run <cmd>...
 | |
| 	use <cmd>... to automatically bisect.
 | |
| 
 | |
| Please use "git help bisect" to get the full man page.'
 | |
| 
 | |
| OPTIONS_SPEC=
 | |
| . git-sh-setup
 | |
| 
 | |
| _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 | |
| _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 | |
| TERM_BAD=bad
 | |
| TERM_GOOD=good
 | |
| 
 | |
| bisect_visualize() {
 | |
| 	git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit
 | |
| 
 | |
| 	if test $# = 0
 | |
| 	then
 | |
| 		if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
 | |
| 			type gitk >/dev/null 2>&1
 | |
| 		then
 | |
| 			set gitk
 | |
| 		else
 | |
| 			set git log
 | |
| 		fi
 | |
| 	else
 | |
| 		case "$1" in
 | |
| 		git*|tig) ;;
 | |
| 		-*)	set git log "$@" ;;
 | |
| 		*)	set git "$@" ;;
 | |
| 		esac
 | |
| 	fi
 | |
| 
 | |
| 	eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
 | |
| }
 | |
| 
 | |
| bisect_run () {
 | |
| 	git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit
 | |
| 
 | |
| 	test -n "$*" || die "$(gettext "bisect run failed: no command provided.")"
 | |
| 
 | |
| 	while true
 | |
| 	do
 | |
| 		command="$@"
 | |
| 		eval_gettextln "running \$command"
 | |
| 		"$@"
 | |
| 		res=$?
 | |
| 
 | |
| 		# Check for really bad run error.
 | |
| 		if [ $res -lt 0 -o $res -ge 128 ]
 | |
| 		then
 | |
| 			eval_gettextln "bisect run failed:
 | |
| exit code \$res from '\$command' is < 0 or >= 128" >&2
 | |
| 			exit $res
 | |
| 		fi
 | |
| 
 | |
| 		# Find current state depending on run success or failure.
 | |
| 		# A special exit code of 125 means cannot test.
 | |
| 		if [ $res -eq 125 ]
 | |
| 		then
 | |
| 			state='skip'
 | |
| 		elif [ $res -gt 0 ]
 | |
| 		then
 | |
| 			state="$TERM_BAD"
 | |
| 		else
 | |
| 			state="$TERM_GOOD"
 | |
| 		fi
 | |
| 
 | |
| 		git bisect--helper --bisect-state $state >"$GIT_DIR/BISECT_RUN"
 | |
| 		res=$?
 | |
| 
 | |
| 		cat "$GIT_DIR/BISECT_RUN"
 | |
| 
 | |
| 		if sane_grep "first $TERM_BAD commit could be any of" "$GIT_DIR/BISECT_RUN" \
 | |
| 			>/dev/null
 | |
| 		then
 | |
| 			gettextln "bisect run cannot continue any more" >&2
 | |
| 			exit $res
 | |
| 		fi
 | |
| 
 | |
| 		if [ $res -ne 0 ]
 | |
| 		then
 | |
| 			eval_gettextln "bisect run failed:
 | |
| 'bisect-state \$state' exited with error code \$res" >&2
 | |
| 			exit $res
 | |
| 		fi
 | |
| 
 | |
| 		if sane_grep "is the first $TERM_BAD commit" "$GIT_DIR/BISECT_RUN" >/dev/null
 | |
| 		then
 | |
| 			gettextln "bisect run success"
 | |
| 			exit 0;
 | |
| 		fi
 | |
| 
 | |
| 	done
 | |
| }
 | |
| 
 | |
| get_terms () {
 | |
| 	if test -s "$GIT_DIR/BISECT_TERMS"
 | |
| 	then
 | |
| 		{
 | |
| 		read TERM_BAD
 | |
| 		read TERM_GOOD
 | |
| 		} <"$GIT_DIR/BISECT_TERMS"
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| case "$#" in
 | |
| 0)
 | |
| 	usage ;;
 | |
| *)
 | |
| 	cmd="$1"
 | |
| 	get_terms
 | |
| 	shift
 | |
| 	case "$cmd" in
 | |
| 	help)
 | |
| 		git bisect -h ;;
 | |
| 	start)
 | |
| 		git bisect--helper --bisect-start "$@" ;;
 | |
| 	bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
 | |
| 		git bisect--helper --bisect-state "$cmd" "$@" ;;
 | |
| 	skip)
 | |
| 		git bisect--helper --bisect-skip "$@" || exit;;
 | |
| 	next)
 | |
| 		# Not sure we want "next" at the UI level anymore.
 | |
| 		git bisect--helper --bisect-next "$@" || exit ;;
 | |
| 	visualize|view)
 | |
| 		bisect_visualize "$@" ;;
 | |
| 	reset)
 | |
| 		git bisect--helper --bisect-reset "$@" ;;
 | |
| 	replay)
 | |
| 		git bisect--helper --bisect-replay "$@" || exit;;
 | |
| 	log)
 | |
| 		git bisect--helper --bisect-log || exit ;;
 | |
| 	run)
 | |
| 		bisect_run "$@" ;;
 | |
| 	terms)
 | |
| 		git bisect--helper --bisect-terms "$@" || exit;;
 | |
| 	*)
 | |
| 		usage ;;
 | |
| 	esac
 | |
| esac
 |