diff options
author | Christian Couder <chriscool@tuxfamily.org> | 2008-04-14 05:41:45 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2008-04-16 00:11:37 -0700 |
commit | d3e54c88291c2d880ff3a72167c5d3159aed8e97 (patch) | |
tree | e1592f97734229af5ef9c59628b2856d574e07ed /git-bisect.sh | |
parent | 2e6e3e829f3759823d70e7af511bc04cd05ad0af (diff) | |
download | git-d3e54c88291c2d880ff3a72167c5d3159aed8e97.tar.gz git-d3e54c88291c2d880ff3a72167c5d3159aed8e97.tar.xz |
git-bisect: make "start", "good" and "skip" succeed or fail atomically
Before this patch, when "git bisect start", "git bisect good" or
"git bisect skip" were called with many revisions, they could fail
after having already marked some revisions as "good", "bad" or
"skip".
This could be especilally bad for "git bisect start" because as
the file ".git/BISECT_NAMES" would not have been written, there
would have been no attempt to clear the marked revisions on a
"git bisect reset". That's because if there is no
".git/BISECT_NAMES" file, nothing is done to clean things up, as
the bisect session is not supposed to have started.
While at it, let's also create the ".git/BISECT_START" file, only
after ".git/BISECT_NAMES" as been created.
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'git-bisect.sh')
-rwxr-xr-x | git-bisect.sh | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/git-bisect.sh b/git-bisect.sh index dd91bd5bc..b42f94cd3 100755 --- a/git-bisect.sh +++ b/git-bisect.sh @@ -65,6 +65,7 @@ bisect_start() { head=$(GIT_DIR="$GIT_DIR" git symbolic-ref -q HEAD) || head=$(GIT_DIR="$GIT_DIR" git rev-parse --verify HEAD) || die "Bad HEAD - I need a HEAD" + start_head='' case "$head" in refs/heads/bisect) if [ -s "$GIT_DIR/BISECT_START" ]; then @@ -78,7 +79,7 @@ bisect_start() { # This error message should only be triggered by cogito usage, # and cogito users should understand it relates to cg-seek. [ -s "$GIT_DIR/head-name" ] && die "won't bisect on seeked tree" - echo "${head#refs/heads/}" >"$GIT_DIR/BISECT_START" + start_head="${head#refs/heads/}" ;; *) die "Bad HEAD - strange symbolic ref" @@ -99,6 +100,7 @@ bisect_start() { done orig_args=$(sq "$@") bad_seen=0 + eval='' while [ $# -gt 0 ]; do arg="$1" case "$arg" in @@ -116,13 +118,15 @@ bisect_start() { 0) state='bad' ; bad_seen=1 ;; *) state='good' ;; esac - bisect_write "$state" "$rev" 'nolog' + eval="$eval bisect_write '$state' '$rev' 'nolog'; " shift ;; esac done sq "$@" >"$GIT_DIR/BISECT_NAMES" + test -n "$start_head" && echo "$start_head" >"$GIT_DIR/BISECT_START" + eval "$eval" echo "git-bisect start$orig_args" >>"$GIT_DIR/BISECT_LOG" bisect_auto_next } @@ -153,12 +157,14 @@ bisect_state() { bisect_write "$state" "$rev" ;; 2,bad|*,good|*,skip) shift + eval='' for rev in "$@" do sha=$(git rev-parse --verify "$rev^{commit}") || die "Bad rev input: $rev" - bisect_write "$state" "$sha" - done ;; + eval="$eval bisect_write '$state' '$sha'; " + done + eval "$eval" ;; *,bad) die "'git bisect bad' can take only one argument." ;; *) |