blob: 6a7afaea8da09fa3fb3670d1a688421fbf152747 [file] [log] [blame]
Linus Torvalds8cc6a082005-07-30 10:08:20 -07001#!/bin/sh
Fredrik Kuivinend0255242005-12-11 10:55:49 +01002
Robert P. J. Daydbc349b2017-11-12 04:30:38 -05003USAGE='[help|start|bad|good|new|old|terms|skip|next|reset|visualize|view|replay|log|run]'
Christian Couder243a60f2008-04-11 05:55:21 +02004LONG_USAGE='git bisect help
Jon Seymour6021be82011-08-05 21:31:30 +10005 print this long help message.
Hugo Locurcioef4d9f82020-08-28 15:31:19 +00006git bisect start [--term-{new,bad}=<term> --term-{old,good}=<term>]
Aaron Lipman6028f5f2020-08-22 16:32:03 -04007 [--no-checkout] [--first-parent] [<bad> [<good>...]] [--] [<pathspec>...]
Jon Seymour6021be82011-08-05 21:31:30 +10008 reset bisect state and start bisection.
Antoine Delaite21e5cfd2015-06-29 17:40:33 +02009git bisect (bad|new) [<rev>]
10 mark <rev> a known-bad revision/
11 a revision after change in a given property.
12git bisect (good|old) [<rev>...]
13 mark <rev>... known-good revisions/
14 revisions before change in a given property.
Matthieu Moy21b55e32015-06-29 17:40:34 +020015git bisect terms [--term-good | --term-bad]
16 show the terms used for old and new commits (default: bad, good)
Christian Couder54138122008-12-02 14:53:51 +010017git bisect skip [(<rev>|<range>)...]
Jon Seymour6021be82011-08-05 21:31:30 +100018 mark <rev>... untestable revisions.
Christian Couder38a47fd2007-04-04 07:12:02 +020019git bisect next
Jon Seymour6021be82011-08-05 21:31:30 +100020 find next bisection to test and check it out.
Anders Kaseorg6b87ce22009-10-13 17:02:24 -040021git bisect reset [<commit>]
Jon Seymour6021be82011-08-05 21:31:30 +100022 finish bisection search and go back to commit.
Robert P. J. Daydbc349b2017-11-12 04:30:38 -050023git bisect (visualize|view)
Jon Seymour6021be82011-08-05 21:31:30 +100024 show bisect status in gitk.
Christian Couder38a47fd2007-04-04 07:12:02 +020025git bisect replay <logfile>
Jon Seymour6021be82011-08-05 21:31:30 +100026 replay bisection log.
Christian Couder38a47fd2007-04-04 07:12:02 +020027git bisect log
Jon Seymour6021be82011-08-05 21:31:30 +100028 show bisect log.
Christian Couder38a47fd2007-04-04 07:12:02 +020029git bisect run <cmd>...
Jon Seymour6021be82011-08-05 21:31:30 +100030 use <cmd>... to automatically bisect.
Christian Couder243a60f2008-04-11 05:55:21 +020031
32Please use "git help bisect" to get the full man page.'
Fredrik Kuivinend0255242005-12-11 10:55:49 +010033
Junio C Hamano8f321a32007-11-06 01:50:02 -080034OPTIONS_SPEC=
Junio C Hamanoae2b0f12005-11-24 00:12:11 -080035. git-sh-setup
Linus Torvalds8cc6a082005-07-30 10:08:20 -070036
Johannes Schindelince326602008-02-10 13:59:50 +000037_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
38_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
Antoine Delaite43f9d9f2015-06-29 17:40:29 +020039TERM_BAD=bad
40TERM_GOOD=good
Johannes Schindelince326602008-02-10 13:59:50 +000041
Junio C Hamanocc9f24d2005-08-30 12:45:41 -070042bisect_visualize() {
Pranit Bauva129a6cf2019-01-02 07:38:34 -080043 git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit
Junio C Hamano235997c2007-12-07 02:25:34 -080044
45 if test $# = 0
46 then
Jeff Kingc4e4644e2011-03-21 09:14:22 -040047 if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
Junio C Hamano43b8ff42011-08-05 10:09:23 -070048 type gitk >/dev/null 2>&1
Jon Seymoureef12a92011-08-05 21:31:31 +100049 then
Jeff Kingc4e4644e2011-03-21 09:14:22 -040050 set gitk
51 else
52 set git log
53 fi
Junio C Hamano235997c2007-12-07 02:25:34 -080054 else
55 case "$1" in
56 git*|tig) ;;
57 -*) set git log "$@" ;;
58 *) set git "$@" ;;
59 esac
60 fi
61
Christian Couderfc13aa32009-11-23 05:16:14 +010062 eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
Junio C Hamanocc9f24d2005-08-30 12:45:41 -070063}
64
Christian Coudera17c4102007-03-23 08:49:59 +010065bisect_run () {
Pranit Bauva129a6cf2019-01-02 07:38:34 -080066 git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit
Christian Couder83020122007-03-27 06:49:57 +020067
Stephan Beyerfecd2dd2017-11-12 21:55:33 +010068 test -n "$*" || die "$(gettext "bisect run failed: no command provided.")"
69
Jon Seymour6021be82011-08-05 21:31:30 +100070 while true
71 do
72 command="$@"
Jon Seymour3145b1a2011-08-31 09:09:47 +100073 eval_gettextln "running \$command"
Jon Seymour6021be82011-08-05 21:31:30 +100074 "$@"
75 res=$?
Christian Coudera17c4102007-03-23 08:49:59 +010076
Jon Seymour6021be82011-08-05 21:31:30 +100077 # Check for really bad run error.
Jon Seymoureef12a92011-08-05 21:31:31 +100078 if [ $res -lt 0 -o $res -ge 128 ]
79 then
Jon Seymour3145b1a2011-08-31 09:09:47 +100080 eval_gettextln "bisect run failed:
81exit code \$res from '\$command' is < 0 or >= 128" >&2
Jon Seymour6021be82011-08-05 21:31:30 +100082 exit $res
83 fi
Christian Coudera17c4102007-03-23 08:49:59 +010084
Jon Seymour6021be82011-08-05 21:31:30 +100085 # Find current state depending on run success or failure.
86 # A special exit code of 125 means cannot test.
Jon Seymoureef12a92011-08-05 21:31:31 +100087 if [ $res -eq 125 ]
88 then
Jon Seymour6021be82011-08-05 21:31:30 +100089 state='skip'
Jon Seymoureef12a92011-08-05 21:31:31 +100090 elif [ $res -gt 0 ]
91 then
Antoine Delaite43f9d9f2015-06-29 17:40:29 +020092 state="$TERM_BAD"
Jon Seymour6021be82011-08-05 21:31:30 +100093 else
Antoine Delaite43f9d9f2015-06-29 17:40:29 +020094 state="$TERM_GOOD"
Jon Seymour6021be82011-08-05 21:31:30 +100095 fi
Christian Coudera17c4102007-03-23 08:49:59 +010096
Pranit Bauva27257bc2020-10-15 15:38:35 +020097 git bisect--helper --bisect-state $state >"$GIT_DIR/BISECT_RUN"
Jon Seymour6021be82011-08-05 21:31:30 +100098 res=$?
Christian Coudera17c4102007-03-23 08:49:59 +010099
Jon Seymour6021be82011-08-05 21:31:30 +1000100 cat "$GIT_DIR/BISECT_RUN"
Christian Coudera17c4102007-03-23 08:49:59 +0100101
Antoine Delaite43f9d9f2015-06-29 17:40:29 +0200102 if sane_grep "first $TERM_BAD commit could be any of" "$GIT_DIR/BISECT_RUN" \
Jacopo Notarstefano305a2332014-03-04 01:21:43 +0100103 >/dev/null
Jon Seymoureef12a92011-08-05 21:31:31 +1000104 then
Jon Seymour3145b1a2011-08-31 09:09:47 +1000105 gettextln "bisect run cannot continue any more" >&2
Jon Seymour6021be82011-08-05 21:31:30 +1000106 exit $res
107 fi
Christian Couder71b02512007-10-26 05:39:37 +0200108
Jon Seymoureef12a92011-08-05 21:31:31 +1000109 if [ $res -ne 0 ]
110 then
Jon Seymour3145b1a2011-08-31 09:09:47 +1000111 eval_gettextln "bisect run failed:
Pranit Bauva27257bc2020-10-15 15:38:35 +0200112'bisect-state \$state' exited with error code \$res" >&2
Jon Seymour6021be82011-08-05 21:31:30 +1000113 exit $res
114 fi
Christian Coudera17c4102007-03-23 08:49:59 +0100115
Antoine Delaite43f9d9f2015-06-29 17:40:29 +0200116 if sane_grep "is the first $TERM_BAD commit" "$GIT_DIR/BISECT_RUN" >/dev/null
Jon Seymoureef12a92011-08-05 21:31:31 +1000117 then
Jon Seymour3145b1a2011-08-31 09:09:47 +1000118 gettextln "bisect run success"
Jon Seymour6021be82011-08-05 21:31:30 +1000119 exit 0;
120 fi
Christian Coudera17c4102007-03-23 08:49:59 +0100121
Jon Seymour6021be82011-08-05 21:31:30 +1000122 done
Christian Coudera17c4102007-03-23 08:49:59 +0100123}
124
Antoine Delaitecb46d632015-06-29 17:40:30 +0200125get_terms () {
126 if test -s "$GIT_DIR/BISECT_TERMS"
127 then
128 {
129 read TERM_BAD
130 read TERM_GOOD
131 } <"$GIT_DIR/BISECT_TERMS"
132 fi
133}
134
Linus Torvalds8cc6a082005-07-30 10:08:20 -0700135case "$#" in
1360)
Jon Seymour6021be82011-08-05 21:31:30 +1000137 usage ;;
Linus Torvalds8cc6a082005-07-30 10:08:20 -0700138*)
Jon Seymour6021be82011-08-05 21:31:30 +1000139 cmd="$1"
Antoine Delaitecb46d632015-06-29 17:40:30 +0200140 get_terms
Jon Seymour6021be82011-08-05 21:31:30 +1000141 shift
142 case "$cmd" in
143 help)
144 git bisect -h ;;
145 start)
Pranit Bauva88ad3722020-10-15 15:38:32 +0200146 git bisect--helper --bisect-start "$@" ;;
Antoine Delaite21e5cfd2015-06-29 17:40:33 +0200147 bad|good|new|old|"$TERM_BAD"|"$TERM_GOOD")
Pranit Bauva27257bc2020-10-15 15:38:35 +0200148 git bisect--helper --bisect-state "$cmd" "$@" ;;
Jon Seymour6021be82011-08-05 21:31:30 +1000149 skip)
Pranit Bauvae4c7b332021-02-03 22:54:37 +0100150 git bisect--helper --bisect-skip "$@" || exit;;
Jon Seymour6021be82011-08-05 21:31:30 +1000151 next)
152 # Not sure we want "next" at the UI level anymore.
Pranit Bauva517ecb32020-09-24 14:33:40 +0200153 git bisect--helper --bisect-next "$@" || exit ;;
Jon Seymour6021be82011-08-05 21:31:30 +1000154 visualize|view)
155 bisect_visualize "$@" ;;
156 reset)
Pranit Bauva5e82c3d2019-01-02 07:38:31 -0800157 git bisect--helper --bisect-reset "$@" ;;
Jon Seymour6021be82011-08-05 21:31:30 +1000158 replay)
Pranit Bauva2b1fd942021-02-03 22:54:33 +0100159 git bisect--helper --bisect-replay "$@" || exit;;
Jon Seymour6021be82011-08-05 21:31:30 +1000160 log)
Pranit Bauva97d5ba62021-02-03 22:54:32 +0100161 git bisect--helper --bisect-log || exit ;;
Jon Seymour6021be82011-08-05 21:31:30 +1000162 run)
163 bisect_run "$@" ;;
Matthieu Moy21b55e32015-06-29 17:40:34 +0200164 terms)
Pranit Bauva450ebb72019-01-02 07:38:35 -0800165 git bisect--helper --bisect-terms "$@" || exit;;
Jon Seymour6021be82011-08-05 21:31:30 +1000166 *)
167 usage ;;
168 esac
Linus Torvalds8cc6a082005-07-30 10:08:20 -0700169esac