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() {
|
||||
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() {
|
||||
;;
|
||||
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() {
|
||||
# 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() {
|
||||
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() {
|
||||
;;
|
||||
*)
|
||||
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 () {
|
||||
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() {
|
||||
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() {
|
||||
}
|
||||
|
||||
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"
|
||||
|
@ -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' '
|
||||
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…
Reference in New Issue
Block a user