diff options
author | Junio C Hamano <junkio@cox.net> | 2005-09-11 02:18:31 +0400 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-09-11 02:18:31 +0400 |
commit | e204de28e69617265e88c73dd13c416ffa15f355 (patch) | |
tree | 61ee121abb7c4981dbc9799ceb5635a96c54586b | |
parent | 6bac10d89d0889118a3e747c9c9210fd437c140d (diff) |
Keep bisection log so that it can be replayed later.
The 'git bisect' command was very unforgiving in that once you made a
mistake telling it good/bad it was very hard to take it back. Keep a
log of what you told it in an earlier session, so that it can be
replayed after removing everything after what you botched last time.
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-x | git-bisect.sh | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/git-bisect.sh b/git-bisect.sh index 605d58a2be..a5be3a7293 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -8,7 +8,9 @@ git bisect bad [<rev>] mark <rev> a known-bad revision. git bisect good [<rev>...] mark <rev>... known-good revisions. git bisect next find next bisection to test and check it out. git bisect reset [<branch>] 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 <logfile> replay bisection log +git bisect log show bisect log.' exit 1 } @@ -54,6 +56,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 +69,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 +86,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 } @@ -129,6 +136,7 @@ bisect_next() { 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-show-branch "$rev" } bisect_visualize() { @@ -149,7 +157,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 +212,10 @@ case "$#" in bisect_visualize "$@" ;; reset) bisect_reset "$@" ;; + replay) + bisect_replay "$@" ;; + log) + cat "$GIT_DIR/BISECT_LOG" ;; *) usage ;; esac |