Merge branch 'cc/bisect'
* cc/bisect: Bisect reset: do nothing when not bisecting. Bisect: use "$GIT_DIR/BISECT_NAMES" to check if we are bisecting. Bisect visualize: use "for-each-ref" to list all good refs. git-bisect: modernize branch shuffling hack git-bisect: use update-ref to mark good/bad commits git-bisect: war on "sed" Bisect reset: remove bisect refs that may have been packed.
This commit is contained in:
commit
faf8280850
@ -37,7 +37,7 @@ sq() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bisect_autostart() {
|
bisect_autostart() {
|
||||||
test -d "$GIT_DIR/refs/bisect" || {
|
test -f "$GIT_DIR/BISECT_NAMES" || {
|
||||||
echo >&2 'You need to start by "git bisect start"'
|
echo >&2 'You need to start by "git bisect start"'
|
||||||
if test -t 0
|
if test -t 0
|
||||||
then
|
then
|
||||||
@ -72,7 +72,7 @@ bisect_start() {
|
|||||||
;;
|
;;
|
||||||
refs/heads/*)
|
refs/heads/*)
|
||||||
[ -s "$GIT_DIR/head-name" ] && die "won't bisect on seeked tree"
|
[ -s "$GIT_DIR/head-name" ] && die "won't bisect on seeked tree"
|
||||||
echo "$head" | sed 's#^refs/heads/##' >"$GIT_DIR/head-name"
|
echo "${head#refs/heads/}" >"$GIT_DIR/head-name"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
die "Bad HEAD - strange symbolic ref"
|
die "Bad HEAD - strange symbolic ref"
|
||||||
@ -83,7 +83,6 @@ bisect_start() {
|
|||||||
# Get rid of any old bisect state
|
# Get rid of any old bisect state
|
||||||
#
|
#
|
||||||
bisect_clean_state
|
bisect_clean_state
|
||||||
mkdir "$GIT_DIR/refs/bisect"
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check for one bad and then some good revisions.
|
# Check for one bad and then some good revisions.
|
||||||
@ -131,7 +130,7 @@ bisect_write() {
|
|||||||
good|skip) tag="$state"-"$rev" ;;
|
good|skip) tag="$state"-"$rev" ;;
|
||||||
*) die "Bad bisect_write argument: $state" ;;
|
*) die "Bad bisect_write argument: $state" ;;
|
||||||
esac
|
esac
|
||||||
echo "$rev" >"$GIT_DIR/refs/bisect/$tag"
|
git update-ref "refs/bisect/$tag" "$rev"
|
||||||
echo "# $state: "$(git show-branch $rev) >>"$GIT_DIR/BISECT_LOG"
|
echo "# $state: "$(git show-branch $rev) >>"$GIT_DIR/BISECT_LOG"
|
||||||
test -z "$nolog" && echo "git-bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
|
test -z "$nolog" && echo "git-bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
|
||||||
}
|
}
|
||||||
@ -192,7 +191,7 @@ bisect_next_check() {
|
|||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
THEN=''
|
THEN=''
|
||||||
test -d "$GIT_DIR/refs/bisect" || {
|
test -f "$GIT_DIR/BISECT_NAMES" || {
|
||||||
echo >&2 'You need to start by "git bisect start".'
|
echo >&2 'You need to start by "git bisect start".'
|
||||||
THEN='then '
|
THEN='then '
|
||||||
}
|
}
|
||||||
@ -276,8 +275,7 @@ exit_if_skipped_commits () {
|
|||||||
if expr "$_tried" : ".*[|].*" > /dev/null ; then
|
if expr "$_tried" : ".*[|].*" > /dev/null ; then
|
||||||
echo "There are only 'skip'ped commit left to test."
|
echo "There are only 'skip'ped commit left to test."
|
||||||
echo "The first bad commit could be any of:"
|
echo "The first bad commit could be any of:"
|
||||||
echo "$_tried" | sed -e 's/[|]/\
|
echo "$_tried" | tr '[|]' '[\012]'
|
||||||
/g'
|
|
||||||
echo "We cannot bisect more!"
|
echo "We cannot bisect more!"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
@ -318,20 +316,23 @@ bisect_next() {
|
|||||||
exit_if_skipped_commits "$bisect_rev"
|
exit_if_skipped_commits "$bisect_rev"
|
||||||
|
|
||||||
echo "Bisecting: $bisect_nr revisions left to test after this"
|
echo "Bisecting: $bisect_nr revisions left to test after this"
|
||||||
echo "$bisect_rev" >"$GIT_DIR/refs/heads/new-bisect"
|
git branch -f new-bisect "$bisect_rev"
|
||||||
git checkout -q new-bisect || exit
|
git checkout -q new-bisect || exit
|
||||||
mv "$GIT_DIR/refs/heads/new-bisect" "$GIT_DIR/refs/heads/bisect" &&
|
git branch -M new-bisect bisect
|
||||||
GIT_DIR="$GIT_DIR" git symbolic-ref HEAD refs/heads/bisect
|
|
||||||
git show-branch "$bisect_rev"
|
git show-branch "$bisect_rev"
|
||||||
}
|
}
|
||||||
|
|
||||||
bisect_visualize() {
|
bisect_visualize() {
|
||||||
bisect_next_check fail
|
bisect_next_check fail
|
||||||
not=`cd "$GIT_DIR/refs" && echo bisect/good-*`
|
not=$(git for-each-ref --format='%(refname)' "refs/bisect/good-*")
|
||||||
eval gitk bisect/bad --not $not -- $(cat "$GIT_DIR/BISECT_NAMES")
|
eval gitk refs/bisect/bad --not $not -- $(cat "$GIT_DIR/BISECT_NAMES")
|
||||||
}
|
}
|
||||||
|
|
||||||
bisect_reset() {
|
bisect_reset() {
|
||||||
|
test -f "$GIT_DIR/BISECT_NAMES" || {
|
||||||
|
echo "We are not bisecting."
|
||||||
|
return
|
||||||
|
}
|
||||||
case "$#" in
|
case "$#" in
|
||||||
0) if [ -s "$GIT_DIR/head-name" ]; then
|
0) if [ -s "$GIT_DIR/head-name" ]; then
|
||||||
branch=`cat "$GIT_DIR/head-name"`
|
branch=`cat "$GIT_DIR/head-name"`
|
||||||
@ -351,8 +352,12 @@ bisect_reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bisect_clean_state() {
|
bisect_clean_state() {
|
||||||
rm -fr "$GIT_DIR/refs/bisect"
|
# There may be some refs packed during bisection.
|
||||||
rm -f "$GIT_DIR/refs/heads/bisect"
|
git for-each-ref --format='%(refname) %(objectname)' refs/bisect/\* refs/heads/bisect |
|
||||||
|
while read ref hash
|
||||||
|
do
|
||||||
|
git update-ref -d $ref $hash
|
||||||
|
done
|
||||||
rm -f "$GIT_DIR/BISECT_LOG"
|
rm -f "$GIT_DIR/BISECT_LOG"
|
||||||
rm -f "$GIT_DIR/BISECT_NAMES"
|
rm -f "$GIT_DIR/BISECT_NAMES"
|
||||||
rm -f "$GIT_DIR/BISECT_RUN"
|
rm -f "$GIT_DIR/BISECT_RUN"
|
||||||
|
@ -71,6 +71,43 @@ test_expect_success 'bisect start with one bad and good' '
|
|||||||
git bisect next
|
git bisect next
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'bisect reset: back in the master branch' '
|
||||||
|
git bisect reset &&
|
||||||
|
echo "* master" > branch.expect &&
|
||||||
|
git branch > branch.output &&
|
||||||
|
cmp branch.expect branch.output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'bisect reset: back in another branch' '
|
||||||
|
git checkout -b other &&
|
||||||
|
git bisect start &&
|
||||||
|
git bisect good $HASH1 &&
|
||||||
|
git bisect bad $HASH3 &&
|
||||||
|
git bisect reset &&
|
||||||
|
echo " master" > branch.expect &&
|
||||||
|
echo "* other" >> branch.expect &&
|
||||||
|
git branch > branch.output &&
|
||||||
|
cmp branch.expect branch.output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'bisect reset when not bisecting' '
|
||||||
|
git bisect reset &&
|
||||||
|
git branch > branch.output &&
|
||||||
|
cmp branch.expect branch.output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'bisect reset removes packed refs' '
|
||||||
|
git bisect reset &&
|
||||||
|
git bisect start &&
|
||||||
|
git bisect good $HASH1 &&
|
||||||
|
git bisect bad $HASH3 &&
|
||||||
|
git pack-refs --all --prune &&
|
||||||
|
git bisect next &&
|
||||||
|
git bisect reset &&
|
||||||
|
test -z "$(git for-each-ref "refs/bisect/*")" &&
|
||||||
|
test -z "$(git for-each-ref "refs/heads/bisect")"
|
||||||
|
'
|
||||||
|
|
||||||
# $HASH1 is good, $HASH4 is bad, we skip $HASH3
|
# $HASH1 is good, $HASH4 is bad, we skip $HASH3
|
||||||
# but $HASH2 is bad,
|
# but $HASH2 is bad,
|
||||||
# so we should find $HASH2 as the first bad commit
|
# so we should find $HASH2 as the first bad commit
|
||||||
@ -167,7 +204,7 @@ test_expect_success 'bisect skip: add line and then a new test' '
|
|||||||
git bisect skip &&
|
git bisect skip &&
|
||||||
git bisect good > my_bisect_log.txt &&
|
git bisect good > my_bisect_log.txt &&
|
||||||
grep "$HASH5 is first bad commit" my_bisect_log.txt &&
|
grep "$HASH5 is first bad commit" my_bisect_log.txt &&
|
||||||
git bisect log > log_to_replay.txt
|
git bisect log > log_to_replay.txt &&
|
||||||
git bisect reset
|
git bisect reset
|
||||||
'
|
'
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user