X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=git-bisect.sh;h=1ab2f187dcfd1ab9b81bbc3ebb3605601b4d29f0;hb=3d32051f4fd657747de00cb9d516dc3512bb377d;hp=605d58a2becf8bb61281f57db864cd9e5419f694;hpb=215a7ad1ef790467a4cd3f0dcffbd6e5f04c38f7;p=git.git diff --git a/git-bisect.sh b/git-bisect.sh index 605d58a2..1ab2f187 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -8,7 +8,9 @@ git bisect bad [] mark a known-bad revision. git bisect good [...] mark ... known-good revisions. git bisect next find next bisection to test and check it out. git bisect reset [] finish bisection search and go back to branch. -git bisect visualize show bisect status in gitk.' +git bisect visualize show bisect status in gitk. +git bisect replay replay bisection log +git bisect log show bisect log.' exit 1 } @@ -36,7 +38,8 @@ bisect_start() { # Verify HEAD. If we were bisecting before this, reset to the # top-of-line master first! # - head=$(readlink $GIT_DIR/HEAD) || die "Bad HEAD - I need a symlink" + head=$(GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD) || + die "Bad HEAD - I need a symbolic ref" case "$head" in refs/heads/bisect*) git checkout master || exit @@ -44,7 +47,7 @@ bisect_start() { refs/heads/*) ;; *) - die "Bad HEAD - strange symlink" + die "Bad HEAD - strange symbolic ref" ;; esac @@ -54,6 +57,7 @@ bisect_start() { rm -f "$GIT_DIR/refs/heads/bisect" rm -rf "$GIT_DIR/refs/bisect/" mkdir "$GIT_DIR/refs/bisect" + echo "git-bisect start" >"$GIT_DIR/BISECT_LOG" } bisect_bad() { @@ -66,7 +70,9 @@ bisect_bad() { *) usage ;; esac || exit - echo "$rev" > "$GIT_DIR/refs/bisect/bad" + echo "$rev" >"$GIT_DIR/refs/bisect/bad" + echo "# bad: "$(git-show-branch $rev) >>"$GIT_DIR/BISECT_LOG" + echo "git-bisect bad $rev" >>"$GIT_DIR/BISECT_LOG" bisect_auto_next } @@ -81,6 +87,8 @@ bisect_good() { do rev=$(git-rev-parse --verify "$rev") || exit echo "$rev" >"$GIT_DIR/refs/bisect/good-$rev" + echo "# good: "$(git-show-branch $rev) >>"$GIT_DIR/BISECT_LOG" + echo "git-bisect good $rev" >>"$GIT_DIR/BISECT_LOG" done bisect_auto_next } @@ -103,7 +111,7 @@ bisect_next_check() { } bisect_auto_next() { - bisect_next_check && bisect_next + bisect_next_check && bisect_next || : } bisect_next() { @@ -128,7 +136,8 @@ bisect_next() { echo "$rev" > "$GIT_DIR/refs/heads/new-bisect" git checkout new-bisect || exit mv "$GIT_DIR/refs/heads/new-bisect" "$GIT_DIR/refs/heads/bisect" && - ln -sf refs/heads/bisect "$GIT_DIR/HEAD" + GIT_DIR="$GIT_DIR" git-symbolic-ref HEAD refs/heads/bisect + git-show-branch "$rev" } bisect_visualize() { @@ -149,7 +158,39 @@ bisect_reset() { esac git checkout "$branch" && rm -fr "$GIT_DIR/refs/bisect" - rm -f "$GIT_DIR/refs/reads/bisect" + rm -f "$GIT_DIR/refs/heads/bisect" + rm -f "$GIT_DIR/BISECT_LOG" +} + +bisect_replay () { + test -r "$1" || { + echo >&2 "cannot read $1 for replaying" + exit 1 + } + bisect_reset + while read bisect command rev + do + test "$bisect" = "git-bisect" || continue + case "$command" in + start) + bisect_start + ;; + good) + echo "$rev" >"$GIT_DIR/refs/bisect/good-$rev" + echo "# good: "$(git-show-branch $rev) >>"$GIT_DIR/BISECT_LOG" + echo "git-bisect good $rev" >>"$GIT_DIR/BISECT_LOG" + ;; + bad) + echo "$rev" >"$GIT_DIR/refs/bisect/bad" + echo "# bad: "$(git-show-branch $rev) >>"$GIT_DIR/BISECT_LOG" + echo "git-bisect bad $rev" >>"$GIT_DIR/BISECT_LOG" + ;; + *) + echo >&2 "?? what are you talking about?" + exit 1 ;; + esac + done <"$1" + bisect_auto_next } case "$#" in @@ -172,6 +213,10 @@ case "$#" in bisect_visualize "$@" ;; reset) bisect_reset "$@" ;; + replay) + bisect_replay "$@" ;; + log) + cat "$GIT_DIR/BISECT_LOG" ;; *) usage ;; esac