If --no-checkout=<ref> is specified, then the bisection process uses git update-ref --no-deref <ref> <trial> at each trial instead of: git checkout <trial> Signed-off-by: Jon Seymour <jon.seymour@xxxxxxxxx> --- bisect.c | 26 ++++++++++++++++++++++---- bisect.h | 2 +- builtin/bisect--helper.c | 7 +++++-- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/bisect.c b/bisect.c index dd7e8ed..e6c99a0 100644 --- a/bisect.c +++ b/bisect.c @@ -24,6 +24,8 @@ struct argv_array { static const char *argv_checkout[] = {"checkout", "-q", NULL, "--", NULL}; static const char *argv_show_branch[] = {"show-branch", NULL, NULL}; +static const char *argv_update_ref[] = {"update-ref", "--no-deref", NULL, NULL, NULL}; +static const char *cursor_ref = 0; /* bits #0-15 in revision.h */ @@ -714,9 +716,19 @@ static int bisect_checkout(char *bisect_rev_hex) mark_expected_rev(bisect_rev_hex); argv_checkout[2] = bisect_rev_hex; - res = run_command_v_opt(argv_checkout, RUN_GIT_CMD); - if (res) - exit(res); + if (!cursor_ref) { + res = run_command_v_opt(argv_checkout, RUN_GIT_CMD); + if (res) { + exit(res); + } + } else { + argv_update_ref[2] = cursor_ref; + argv_update_ref[3] = bisect_rev_hex; + res = run_command_v_opt(argv_update_ref, RUN_GIT_CMD); + if (res) { + die("update-ref --no-deref %s failed on %s", cursor_ref, bisect_rev_hex); + } + } argv_show_branch[1] = bisect_rev_hex; return run_command_v_opt(argv_show_branch, RUN_GIT_CMD); @@ -908,8 +920,12 @@ static void show_diff_tree(const char *prefix, struct commit *commit) * We use the convention that exiting with an exit code 10 means that * the bisection process finished successfully. * In this case the calling shell script should exit 0. + * + * If cursor_ref_param is not null, the bisection process does not + * checkout the trial commit but instead simply updates the specified + * cursor reference. */ -int bisect_next_all(const char *prefix) +int bisect_next_all(const char *prefix, const char *cursor_ref_param) { struct rev_info revs; struct commit_list *tried; @@ -917,6 +933,8 @@ int bisect_next_all(const char *prefix) const unsigned char *bisect_rev; char bisect_rev_hex[41]; + cursor_ref = cursor_ref_param; + if (read_bisect_refs()) die("reading bisect refs failed"); diff --git a/bisect.h b/bisect.h index 0862ce5..4fd4565 100644 --- a/bisect.h +++ b/bisect.h @@ -27,7 +27,7 @@ struct rev_list_info { const char *header_prefix; }; -extern int bisect_next_all(const char *prefix); +extern int bisect_next_all(const char *prefix, const char *no_checkout); extern int estimate_bisect_steps(int all); diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c index 5b22639..b3d9263 100644 --- a/builtin/bisect--helper.c +++ b/builtin/bisect--helper.c @@ -4,16 +4,19 @@ #include "bisect.h" static const char * const git_bisect_helper_usage[] = { - "git bisect--helper --next-all", + "git bisect--helper --next-all [ --no-checkout=<ref> ]", NULL }; int cmd_bisect__helper(int argc, const char **argv, const char *prefix) { int next_all = 0; + char * no_checkout = NULL; struct option options[] = { OPT_BOOLEAN(0, "next-all", &next_all, "perform 'git bisect next'"), + OPT_STRING(0, "no-checkout", &no_checkout, "ref", + "don't checkout but update <ref> instead."), OPT_END() }; @@ -24,5 +27,5 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) usage_with_options(git_bisect_helper_usage, options); /* next-all */ - return bisect_next_all(prefix); + return bisect_next_all(prefix, no_checkout); } -- 1.7.6.387.g991c2 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html