{"thread":{"id":"10187","subject":"[PATCH 2/2] Bisect: implement \"bisect dunno\" to mark untestable revisions.","startedAt":"2007-10-08T03:34:50Z","lastAt":"2007-10-08T05:36:52Z","messageCount":4,"participants":["Christian Couder","Johannes Schindelin"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"55151","messageId":"20071008053450.a52d7c5e.chriscool@tuxfamily.org","threadId":"10187","inReplyTo":null,"subject":"[PATCH 2/2] Bisect: implement \"bisect dunno\" to mark untestable revisions.","fromName":"Christian Couder","fromEmail":"chriscool@tuxfamily.org","sentAt":"2007-10-08T03:34:50Z","receivedAt":"2007-10-08T03:34:50Z","isPatch":true,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"When there are some dunno revisions, we add the '--bisect-all'\noption to \"git rev-list --bisect-vars\". Then we filter out the\ndunno revisions from the result of the rev-list command, and we\nmodify the \"bisect_rev\" var accordingly.\n\nWe don't always use \"--bisect-all\" because it is slower\nthan \"--bisect-vars\" or \"--bisect\".\n\nWhen we cannot find for sure the first bad commit because of\ndunno commits, we print the hash of each possible first bad\ncommit and then we exit with code 2.\n\nSigned-off-by: Christian Couder <chriscool@tuxfamily.org>\n---\n git-bisect.sh               |  127 +++++++++++++++++++++++++++++++++++++++++--\n t/t6030-bisect-porcelain.sh |   71 ++++++++++++++++++++++++\n 2 files changed, 193 insertions(+), 5 deletions(-)\n\ndiff --git a/git-bisect.sh b/git-bisect.sh\nindex 388887a..c556318 100755\n--- a/git-bisect.sh\n+++ b/git-bisect.sh\n@@ -17,6 +17,8 @@ git bisect replay <logfile>\n         replay bisection log.\n git bisect log\n         show bisect log.\n+git bisect dunno [<rev>...]\n+        mark <rev>... untestable revisions.\n git bisect run <cmd>...\n         use <cmd>... to automatically bisect.'\n \n@@ -143,7 +145,7 @@ bisect_write_bad() {\n \n bisect_good() {\n \tbisect_autostart\n-        case \"$#\" in\n+\tcase \"$#\" in\n \t0)    revs=$(git rev-parse --verify HEAD) || exit ;;\n \t*)    revs=$(git rev-parse --revs-only --no-flags \"$@\") &&\n \t\ttest '' != \"$revs\" || die \"Bad rev input: $@\" ;;\n@@ -153,7 +155,6 @@ bisect_good() {\n \t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n \t\tbisect_write_good \"$rev\"\n \t\techo \"git-bisect good $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n-\n \tdone\n \tbisect_auto_next\n }\n@@ -164,6 +165,28 @@ bisect_write_good() {\n \techo \"# good: \"$(git show-branch $rev) >>\"$GIT_DIR/BISECT_LOG\"\n }\n \n+bisect_dunno() {\n+\tbisect_autostart\n+\tcase \"$#\" in\n+\t0)    revs=$(git rev-parse --verify HEAD) || exit ;;\n+\t*)    revs=$(git rev-parse --revs-only --no-flags \"$@\") &&\n+\t\ttest '' != \"$revs\" || die \"Bad rev input: $@\" ;;\n+\tesac\n+\tfor rev in $revs\n+\tdo\n+\t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n+\t\tbisect_write_dunno \"$rev\"\n+\t\techo \"git-bisect dunno $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n+\tdone\n+\tbisect_auto_next\n+}\n+\n+bisect_write_dunno() {\n+\trev=\"$1\"\n+\techo \"$rev\" >\"$GIT_DIR/refs/bisect/dunno-$rev\"\n+\techo \"# dunno: \"$(git show-branch $rev) >>\"$GIT_DIR/BISECT_LOG\"\n+}\n+\n bisect_next_check() {\n \tmissing_good= missing_bad=\n \tgit show-ref -q --verify refs/bisect/bad || missing_bad=t\n@@ -206,17 +229,104 @@ bisect_auto_next() {\n \tbisect_next_check && bisect_next || :\n }\n \n+search_dunno() {\n+\t_hash=\"$1\"\n+\t_dunno=\"$2\"\n+\n+\tfor _val in $_dunno ; do\n+\t\tcase $_hash in $_val) return 1 ;; esac\n+\tdone\n+\treturn 0\n+}\n+\n+filter_dunno() {\n+\t_eval=\"$1\"\n+\t_dunno=\"$2\"\n+\n+\tif [ -z \"$_dunno\" ]; then\n+\t\teval $_eval\n+\t\treturn\n+\tfi\n+\n+\t# Let's parse the output of:\n+\t# \"git rev-list --bisect-vars --bisect-all ...\"\n+\teval $_eval | while read hash line\n+\tdo\n+\t\tcase \"$VARS,$FOUND,$TRIED,$hash\" in\n+\t\t\t# We display some vars.\n+\t\t\t1,*,*,*) echo \"$hash $line\" ;;\n+\n+\t\t\t# Split line.\n+\t\t\t,*,*,---*) ;;\n+\n+\t\t\t# We had nothing to search.\n+\t\t\t,,,bisect_rev*)\n+\t\t\t\techo \"bisect_rev=\"\n+\t\t\t\tVARS=1\n+\t\t\t\t;;\n+\n+\t\t\t# We did not find a good bisect rev.\n+\t\t\t# This should happen only if the \"bad\"\n+\t\t\t# commit is also a \"dunno\" commit.\n+\t\t\t,,*,bisect_rev*)\n+\t\t\t\techo \"bisect_rev=$TRIED\"\n+\t\t\t\tVARS=1\n+\t\t\t\t;;\n+\n+\t\t\t# We are searching.\n+\t\t\t,,*,*)\n+\t\t\t\tTRIED=\"${TRIED:+$TRIED|}$hash\"\n+\t\t\t\tif search_dunno \"$hash\" \"$_dunno\" ; then\n+\t\t\t\t\techo \"bisect_rev=$hash\"\n+\t\t\t\t\techo \"bisect_tried=\\\"$TRIED\\\"\"\n+\t\t\t\t\tFOUND=1\n+\t\t\t\tfi\n+\t\t\t\t;;\n+\n+\t\t\t# We have already found a rev to be tested.\n+\t\t\t,1,*,bisect_rev*) VARS=1 ;;\n+\t\t\t,1,*,*) ;;\n+\n+\t\t\t# ???\n+\t\t\t*) die \"filter_dunno error \" \\\n+\t\t\t    \"VARS: '$VARS' \" \\\n+\t\t\t    \"FOUND: '$FOUND' \" \\\n+\t\t\t    \"TRIED: '$TRIED' \" \\\n+\t\t\t    \"hash: '$hash' \" \\\n+\t\t\t    \"line: '$line'\"\n+\t\t\t;;\n+\t\tesac\n+\tdone\n+}\n+\n+exit_if_dunno_commits () {\n+\t_tried=$1\n+\tif expr \"$_tried\" : \".*[|].*\" > /dev/null ; then\n+\t\techo \"There are only 'dunno' commit left to test.\"\n+\t\techo \"The first bad commit could be any of:\"\n+\t\techo \"$_tried\" | sed -e 's/[|]/\\n/g'\n+\t\techo \"We cannot bisect more!\"\n+\t\texit 2\n+\tfi\n+}\n+\n bisect_next() {\n-        case \"$#\" in 0) ;; *) usage ;; esac\n+\tcase \"$#\" in 0) ;; *) usage ;; esac\n \tbisect_autostart\n \tbisect_next_check good\n \n+\tdunno=$(git for-each-ref --format='%(objectname)' \\\n+\t\t\"refs/bisect/dunno-*\" | tr '[\\012]' ' ') || exit\n+\n+\tBISECT_OPT=''\n+\ttest -n \"$dunno\" && BISECT_OPT='--bisect-all'\n+\n \tbad=$(git rev-parse --verify refs/bisect/bad) &&\n \tgood=$(git for-each-ref --format='^%(objectname)' \\\n \t\t\"refs/bisect/good-*\" | tr '[\\012]' ' ') &&\n-\teval=\"git rev-list --bisect-vars $good $bad --\" &&\n+\teval=\"git rev-list --bisect-vars $BISECT_OPT $good $bad --\" &&\n \teval=\"$eval $(cat \"$GIT_DIR/BISECT_NAMES\")\" &&\n-\teval=$(eval \"$eval\") &&\n+\teval=$(filter_dunno \"$eval\" \"$dunno\") &&\n \teval \"$eval\" || exit\n \n \tif [ -z \"$bisect_rev\" ]; then\n@@ -224,11 +334,16 @@ bisect_next() {\n \t\texit 1\n \tfi\n \tif [ \"$bisect_rev\" = \"$bad\" ]; then\n+\t\texit_if_dunno_commits \"$bisect_tried\"\n \t\techo \"$bisect_rev is first bad commit\"\n \t\tgit diff-tree --pretty $bisect_rev\n \t\texit 0\n \tfi\n \n+\t# We should exit here only if the \"bad\"\n+\t# commit is also a \"dunno\" commit (see above).\n+\texit_if_dunno_commits \"$bisect_rev\"\n+\n \techo \"Bisecting: $bisect_nr revisions left to test after this\"\n \techo \"$bisect_rev\" >\"$GIT_DIR/refs/heads/new-bisect\"\n \tgit checkout -q new-bisect || exit\n@@ -363,6 +478,8 @@ case \"$#\" in\n         bisect_bad \"$@\" ;;\n     good)\n         bisect_good \"$@\" ;;\n+    dunno)\n+        bisect_dunno \"$@\" ;;\n     next)\n         # Not sure we want \"next\" at the UI level anymore.\n         bisect_next \"$@\" ;;\ndiff --git a/t/t6030-bisect-porcelain.sh b/t/t6030-bisect-porcelain.sh\nindex 03cdba5..7f41a46 100755\n--- a/t/t6030-bisect-porcelain.sh\n+++ b/t/t6030-bisect-porcelain.sh\n@@ -71,6 +71,63 @@ test_expect_success 'bisect start with one bad and good' '\n \tgit bisect next\n '\n \n+# $HASH1 is good, $HASH4 is bad, we dunno about $HASH3\n+# but $HASH2 is bad,\n+# so we should find $HASH2 as the first bad commit\n+test_expect_success 'bisect dunno: successfull result' '\n+\tgit bisect reset &&\n+\tgit bisect start $HASH4 $HASH1 &&\n+\tgit bisect dunno &&\n+\tgit bisect bad > my_bisect_log.txt &&\n+\tgrep \"$HASH2 is first bad commit\" my_bisect_log.txt &&\n+\tgit bisect reset\n+'\n+\n+# $HASH1 is good, $HASH4 is bad, we dunno about $HASH3 and $HASH2\n+# so we should not be able to tell the first bad commit\n+# among $HASH2, $HASH3 and $HASH4\n+test_expect_success 'bisect dunno: cannot tell between 3 commits' '\n+\tgit bisect start $HASH4 $HASH1 &&\n+\tgit bisect dunno || return 1\n+\n+\tif git bisect dunno > my_bisect_log.txt\n+\tthen\n+\t\techo Oops, should have failed.\n+\t\tfalse\n+\telse\n+\t\ttest $? -eq 2 &&\n+\t\tgrep \"first bad commit could be any of\" my_bisect_log.txt &&\n+\t\t! grep $HASH1 my_bisect_log.txt &&\n+\t\tgrep $HASH2 my_bisect_log.txt &&\n+\t\tgrep $HASH3 my_bisect_log.txt &&\n+\t\tgrep $HASH4 my_bisect_log.txt &&\n+\t\tgit bisect reset\n+\tfi\n+'\n+\n+# $HASH1 is good, $HASH4 is bad, we dunno about $HASH3\n+# but $HASH2 is good,\n+# so we should not be able to tell the first bad commit\n+# among $HASH3 and $HASH4\n+test_expect_success 'bisect dunno: cannot tell between 2 commits' '\n+\tgit bisect start $HASH4 $HASH1 &&\n+\tgit bisect dunno || return 1\n+\n+\tif git bisect good > my_bisect_log.txt\n+\tthen\n+\t\techo Oops, should have failed.\n+\t\tfalse\n+\telse\n+\t\ttest $? -eq 2 &&\n+\t\tgrep \"first bad commit could be any of\" my_bisect_log.txt &&\n+\t\t! grep $HASH1 my_bisect_log.txt &&\n+\t\t! grep $HASH2 my_bisect_log.txt &&\n+\t\tgrep $HASH3 my_bisect_log.txt &&\n+\t\tgrep $HASH4 my_bisect_log.txt &&\n+\t\tgit bisect reset\n+\tfi\n+'\n+\n # We want to automatically find the commit that\n # introduced \"Another\" into hello.\n test_expect_success \\\n@@ -99,6 +156,20 @@ test_expect_success \\\n      grep \"$HASH4 is first bad commit\" my_bisect_log.txt &&\n      git bisect reset'\n \n+# $HASH1 is good, $HASH5 is bad, we dunno about $HASH3\n+# but $HASH4 is good,\n+# so we should find $HASH5 as the first bad commit\n+HASH5=\n+test_expect_success 'bisect dunno: add line and then a new test' '\n+\tadd_line_into_file \"5: Another new line.\" hello &&\n+\tHASH5=$(git rev-parse --verify HEAD) &&\n+\tgit bisect start $HASH5 $HASH1 &&\n+\tgit bisect dunno &&\n+\tgit bisect good > my_bisect_log.txt &&\n+\tgrep \"$HASH5 is first bad commit\" my_bisect_log.txt &&\n+\tgit bisect reset\n+'\n+\n #\n #\n test_done\n-- \n1.5.3.4.208.g996ad\n"},{"id":"55153","messageId":"Pine.LNX.4.64.0710080444290.4174@racer.site","threadId":"10187","inReplyTo":"20071008053450.a52d7c5e.chriscool@tuxfamily.org","subject":"Re: [PATCH 2/2] Bisect: implement \"bisect dunno\" to mark untestable revisions.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-10-08T03:49:32Z","receivedAt":"2007-10-08T03:49:32Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Mon, 8 Oct 2007, Christian Couder wrote:\n\n> diff --git a/git-bisect.sh b/git-bisect.sh\n> index 388887a..c556318 100755\n> --- a/git-bisect.sh\n> +++ b/git-bisect.sh\n> @@ -143,7 +145,7 @@ bisect_write_bad() {\n>  \n>  bisect_good() {\n>  \tbisect_autostart\n> -        case \"$#\" in\n> +\tcase \"$#\" in\n\nWhite space breakage.\n\n> @@ -153,7 +155,6 @@ bisect_good() {\n>  \t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n>  \t\tbisect_write_good \"$rev\"\n>  \t\techo \"git-bisect good $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n> -\n\n?\n\n> @@ -164,6 +165,28 @@ bisect_write_good() {\n>  \techo \"# good: \"$(git show-branch $rev) >>\"$GIT_DIR/BISECT_LOG\"\n>  }\n>  \n> +bisect_dunno() {\n> +\tbisect_autostart\n> +\tcase \"$#\" in\n> +\t0)    revs=$(git rev-parse --verify HEAD) || exit ;;\n> +\t*)    revs=$(git rev-parse --revs-only --no-flags \"$@\") &&\n> +\t\ttest '' != \"$revs\" || die \"Bad rev input: $@\" ;;\n> +\tesac\n> +\tfor rev in $revs\n> +\tdo\n> +\t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n> +\t\tbisect_write_dunno \"$rev\"\n> +\t\techo \"git-bisect dunno $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n\nShould the last line not be put into bisect_write_dunno?  OTOH this is the \nonly call site of that function, so I strongly doubt that the function \n(consisting of 3 lines, where the first is 'rev=\"$1\"') is necessary at \nall.\n\n> @@ -206,17 +229,104 @@ bisect_auto_next() {\n>  \tbisect_next_check && bisect_next || :\n>  }\n>  \n> +search_dunno() {\n> +\t_hash=\"$1\"\n> +\t_dunno=\"$2\"\n> +\n> +\tfor _val in $_dunno ; do\n> +\t\tcase $_hash in $_val) return 1 ;; esac\n> +\tdone\n\nThis would be faster as\n\n\tcase \" $1\" in \" $2\") return 1 ;; esac\n\nI guess.\n\nBut as I said in the other reply, I think this logic belongs into the C \ncore, instead of generating mostly useless information, passing it down to \nthe script, and filtering it out again.\n\nThanks,\nDscho\n"},{"id":"55160","messageId":"200710080734.23878.chriscool@tuxfamily.org","threadId":"10187","inReplyTo":"Pine.LNX.4.64.0710080444290.4174@racer.site","subject":"Re: [PATCH 2/2] Bisect: implement \"bisect dunno\" to mark untestable revisions.","fromName":"Christian Couder","fromEmail":"chriscool@tuxfamily.org","sentAt":"2007-10-08T05:34:23Z","receivedAt":"2007-10-08T05:34:23Z","isPatch":true,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"Le lundi 8 octobre 2007, Johannes Schindelin a écrit :\n> Hi,\n>\n> On Mon, 8 Oct 2007, Christian Couder wrote:\n> > diff --git a/git-bisect.sh b/git-bisect.sh\n> > index 388887a..c556318 100755\n> > --- a/git-bisect.sh\n> > +++ b/git-bisect.sh\n> > @@ -143,7 +145,7 @@ bisect_write_bad() {\n> >\n> >  bisect_good() {\n> >  \tbisect_autostart\n> > -        case \"$#\" in\n> > +\tcase \"$#\" in\n>\n> White space breakage.\n\nThe patch tries to fix some white space breakages.\n\n> > @@ -153,7 +155,6 @@ bisect_good() {\n> >  \t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n> >  \t\tbisect_write_good \"$rev\"\n> >  \t\techo \"git-bisect good $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n> > -\n>\n> ?\n\nIt also removes this unneeded blank line.\n\n> > @@ -164,6 +165,28 @@ bisect_write_good() {\n> >  \techo \"# good: \"$(git show-branch $rev) >>\"$GIT_DIR/BISECT_LOG\"\n> >  }\n> >\n> > +bisect_dunno() {\n> > +\tbisect_autostart\n> > +\tcase \"$#\" in\n> > +\t0)    revs=$(git rev-parse --verify HEAD) || exit ;;\n> > +\t*)    revs=$(git rev-parse --revs-only --no-flags \"$@\") &&\n> > +\t\ttest '' != \"$revs\" || die \"Bad rev input: $@\" ;;\n> > +\tesac\n> > +\tfor rev in $revs\n> > +\tdo\n> > +\t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n> > +\t\tbisect_write_dunno \"$rev\"\n> > +\t\techo \"git-bisect dunno $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n>\n> Should the last line not be put into bisect_write_dunno?  OTOH this is\n> the only call site of that function, so I strongly doubt that the\n> function (consisting of 3 lines, where the first is 'rev=\"$1\"') is\n> necessary at all.\n\nWell, there are \"bisect_write_bad\" and \"bisect_write_good\" that already do \nthe same thing as \"bisect_write_dunno\". In fact I thought that it was \nbetter to just copy \"bisect_dunno\" from \"bisect_good\" \nand \"bisect_write_dunno\" from \"bisect_write_good\".\n\nIf needed I can send another patch to factorise these functions.\n\n> > @@ -206,17 +229,104 @@ bisect_auto_next() {\n> >  \tbisect_next_check && bisect_next || :\n> >  }\n> >\n> > +search_dunno() {\n> > +\t_hash=\"$1\"\n> > +\t_dunno=\"$2\"\n> > +\n> > +\tfor _val in $_dunno ; do\n> > +\t\tcase $_hash in $_val) return 1 ;; esac\n> > +\tdone\n>\n> This would be faster as\n>\n> \tcase \" $1\" in \" $2\") return 1 ;; esac\n>\n> I guess.\n\nI will try your suggestion and send an updated patch. Thanks.\n\n> But as I said in the other reply, I think this logic belongs into the C\n> core, instead of generating mostly useless information, passing it down\n> to the script, and filtering it out again.\n\nYeah, it's not efficient.\n\nBest regards,\nChristian.\n"},{"id":"55161","messageId":"Pine.LNX.4.64.0710080632510.4174@racer.site","threadId":"10187","inReplyTo":"200710080734.23878.chriscool@tuxfamily.org","subject":"Re: [PATCH 2/2] Bisect: implement \"bisect dunno\" to mark untestable revisions.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-10-08T05:36:52Z","receivedAt":"2007-10-08T05:36:52Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Mon, 8 Oct 2007, Christian Couder wrote:\n\n> Le lundi 8 octobre 2007, Johannes Schindelin a ?crit :\n>\n> > On Mon, 8 Oct 2007, Christian Couder wrote:\n> > > diff --git a/git-bisect.sh b/git-bisect.sh\n> > > index 388887a..c556318 100755\n> > > --- a/git-bisect.sh\n> > > +++ b/git-bisect.sh\n> > > @@ -143,7 +145,7 @@ bisect_write_bad() {\n> > >\n> > >  bisect_good() {\n> > >  \tbisect_autostart\n> > > -        case \"$#\" in\n> > > +\tcase \"$#\" in\n> >\n> > White space breakage.\n> \n> The patch tries to fix some white space breakages.\n> \n> > > @@ -153,7 +155,6 @@ bisect_good() {\n> > >  \t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n> > >  \t\tbisect_write_good \"$rev\"\n> > >  \t\techo \"git-bisect good $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n> > > -\n> >\n> > ?\n> \n> It also removes this unneeded blank line.\n\nBoth laudable changes; alas, they distracted me.\n\n> > > @@ -164,6 +165,28 @@ bisect_write_good() {\n> > >  \techo \"# good: \"$(git show-branch $rev) >>\"$GIT_DIR/BISECT_LOG\"\n> > >  }\n> > >\n> > > +bisect_dunno() {\n> > > +\tbisect_autostart\n> > > +\tcase \"$#\" in\n> > > +\t0)    revs=$(git rev-parse --verify HEAD) || exit ;;\n> > > +\t*)    revs=$(git rev-parse --revs-only --no-flags \"$@\") &&\n> > > +\t\ttest '' != \"$revs\" || die \"Bad rev input: $@\" ;;\n> > > +\tesac\n> > > +\tfor rev in $revs\n> > > +\tdo\n> > > +\t\trev=$(git rev-parse --verify \"$rev^{commit}\") || exit\n> > > +\t\tbisect_write_dunno \"$rev\"\n> > > +\t\techo \"git-bisect dunno $rev\" >>\"$GIT_DIR/BISECT_LOG\"\n> >\n> > Should the last line not be put into bisect_write_dunno?  OTOH this is\n> > the only call site of that function, so I strongly doubt that the\n> > function (consisting of 3 lines, where the first is 'rev=\"$1\"') is\n> > necessary at all.\n> \n> Well, there are \"bisect_write_bad\" and \"bisect_write_good\" that already \n> do the same thing as \"bisect_write_dunno\". In fact I thought that it was \n> better to just copy \"bisect_dunno\" from \"bisect_good\" and \n> \"bisect_write_dunno\" from \"bisect_write_good\".\n\nIf they also are called by just one site, and also do not do the complete \nprinting to the log in the function (but also in the caller), I think they \nare not really worth it, either.\n\n> If needed I can send another patch to factorise these functions.\n\nThat's not up to me to decide.  I'm just saying what I dislike.\n\nPlease do not take my criticism as a sign of a personal attack; if I did \nnot find your patch worthwhile, I would not bother to respond.  So in a \nway, it is my way to show my appreciation for your work that I review and \ncriticize it; for efficiency, I do not mention what I like ;-)\n\nCiao,\nDscho\n"}]}