Browse Source

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.
maint
Junio C Hamano 17 years ago
parent
commit
faf8280850
  1. 33
      git-bisect.sh
  2. 39
      t/t6030-bisect-porcelain.sh

33
git-bisect.sh

@ -37,7 +37,7 @@ sq() { @@ -37,7 +37,7 @@ sq() {
}

bisect_autostart() {
test -d "$GIT_DIR/refs/bisect" || {
test -f "$GIT_DIR/BISECT_NAMES" || {
echo >&2 'You need to start by "git bisect start"'
if test -t 0
then
@ -72,7 +72,7 @@ bisect_start() { @@ -72,7 +72,7 @@ bisect_start() {
;;
refs/heads/*)
[ -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"
@ -83,7 +83,6 @@ bisect_start() { @@ -83,7 +83,6 @@ bisect_start() {
# Get rid of any old bisect state
#
bisect_clean_state
mkdir "$GIT_DIR/refs/bisect"

#
# Check for one bad and then some good revisions.
@ -131,7 +130,7 @@ bisect_write() { @@ -131,7 +130,7 @@ bisect_write() {
good|skip) tag="$state"-"$rev" ;;
*) die "Bad bisect_write argument: $state" ;;
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"
test -z "$nolog" && echo "git-bisect $state $rev" >>"$GIT_DIR/BISECT_LOG"
}
@ -192,7 +191,7 @@ bisect_next_check() { @@ -192,7 +191,7 @@ bisect_next_check() {
;;
*)
THEN=''
test -d "$GIT_DIR/refs/bisect" || {
test -f "$GIT_DIR/BISECT_NAMES" || {
echo >&2 'You need to start by "git bisect start".'
THEN='then '
}
@ -276,8 +275,7 @@ exit_if_skipped_commits () { @@ -276,8 +275,7 @@ exit_if_skipped_commits () {
if expr "$_tried" : ".*[|].*" > /dev/null ; then
echo "There are only 'skip'ped commit left to test."
echo "The first bad commit could be any of:"
echo "$_tried" | sed -e 's/[|]/\
/g'
echo "$_tried" | tr '[|]' '[\012]'
echo "We cannot bisect more!"
exit 2
fi
@ -318,20 +316,23 @@ bisect_next() { @@ -318,20 +316,23 @@ bisect_next() {
exit_if_skipped_commits "$bisect_rev"

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
mv "$GIT_DIR/refs/heads/new-bisect" "$GIT_DIR/refs/heads/bisect" &&
GIT_DIR="$GIT_DIR" git symbolic-ref HEAD refs/heads/bisect
git branch -M new-bisect bisect
git show-branch "$bisect_rev"
}

bisect_visualize() {
bisect_next_check fail
not=`cd "$GIT_DIR/refs" && echo bisect/good-*`
eval gitk bisect/bad --not $not -- $(cat "$GIT_DIR/BISECT_NAMES")
not=$(git for-each-ref --format='%(refname)' "refs/bisect/good-*")
eval gitk refs/bisect/bad --not $not -- $(cat "$GIT_DIR/BISECT_NAMES")
}

bisect_reset() {
test -f "$GIT_DIR/BISECT_NAMES" || {
echo "We are not bisecting."
return
}
case "$#" in
0) if [ -s "$GIT_DIR/head-name" ]; then
branch=`cat "$GIT_DIR/head-name"`
@ -351,8 +352,12 @@ bisect_reset() { @@ -351,8 +352,12 @@ bisect_reset() {
}

bisect_clean_state() {
rm -fr "$GIT_DIR/refs/bisect"
rm -f "$GIT_DIR/refs/heads/bisect"
# There may be some refs packed during bisection.
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_NAMES"
rm -f "$GIT_DIR/BISECT_RUN"

39
t/t6030-bisect-porcelain.sh

@ -71,6 +71,43 @@ test_expect_success 'bisect start with one bad and good' ' @@ -71,6 +71,43 @@ test_expect_success 'bisect start with one bad and good' '
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
# but $HASH2 is bad,
# 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' ' @@ -167,7 +204,7 @@ test_expect_success 'bisect skip: add line and then a new test' '
git bisect skip &&
git bisect good > 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
'


Loading…
Cancel
Save