Make it possible to implement bisecting only on first parents or on merge commits by passing flags to find_bisection(), instead of just a 'find_all' boolean. Signed-off-by: Harald Nordgren <haraldnordgren@xxxxxxxxx> --- Notes: Use unsigned type and cache flag value bisect.c | 15 ++++++++++----- bisect.h | 6 ++++-- builtin/rev-list.c | 6 +++--- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/bisect.c b/bisect.c index a579b50884..4eafc8262b 100644 --- a/bisect.c +++ b/bisect.c @@ -254,9 +254,10 @@ static struct commit_list *best_bisection_sorted(struct commit_list *list, int n */ static struct commit_list *do_find_bisection(struct commit_list *list, int nr, int *weights, - int find_all) + unsigned bisect_flags) { int n, counted; + unsigned find_all = bisect_flags & BISECT_FIND_ALL; struct commit_list *p; counted = 0; @@ -365,7 +366,7 @@ static struct commit_list *do_find_bisection(struct commit_list *list, } void find_bisection(struct commit_list **commit_list, int *reaches, - int *all, int find_all) + int *all, unsigned bisect_flags) { int nr, on_list; struct commit_list *list, *p, *best, *next, *last; @@ -400,9 +401,9 @@ void find_bisection(struct commit_list **commit_list, int *reaches, weights = xcalloc(on_list, sizeof(*weights)); /* Do the real work of finding bisection commit. */ - best = do_find_bisection(list, nr, weights, find_all); + best = do_find_bisection(list, nr, weights, bisect_flags); if (best) { - if (!find_all) { + if (!(bisect_flags & BISECT_FIND_ALL)) { list->item = best->item; free_commit_list(list->next); best = list; @@ -943,6 +944,7 @@ int bisect_next_all(const char *prefix, int no_checkout) struct rev_info revs; struct commit_list *tried; int reaches = 0, all = 0, nr, steps; + unsigned bisect_flags = 0; struct object_id *bisect_rev; char *steps_msg; @@ -957,7 +959,10 @@ int bisect_next_all(const char *prefix, int no_checkout) bisect_common(&revs); - find_bisection(&revs.commits, &reaches, &all, !!skipped_revs.nr); + if (skipped_revs.nr) + bisect_flags |= BISECT_FIND_ALL; + + find_bisection(&revs.commits, &reaches, &all, bisect_flags); revs.commits = managed_skipped(revs.commits, &tried); if (!revs.commits) { diff --git a/bisect.h b/bisect.h index a5d9248a47..1d40a33ad2 100644 --- a/bisect.h +++ b/bisect.h @@ -1,15 +1,17 @@ #ifndef BISECT_H #define BISECT_H +#define BISECT_FIND_ALL (1u<<0) + /* * Find bisection. If something is found, `reaches` will be the number of * commits that the best commit reaches. `all` will be the count of * non-SAMETREE commits. If nothing is found, `list` will be NULL. * Otherwise, it will be either all non-SAMETREE commits or the single - * best commit, as chosen by `find_all`. + * best commit, as chosen by flag `BISECT_FIND_ALL`. */ extern void find_bisection(struct commit_list **list, int *reaches, int *all, - int find_all); + unsigned bisect_flags); extern struct commit_list *filter_skipped(struct commit_list *list, struct commit_list **tried, diff --git a/builtin/rev-list.c b/builtin/rev-list.c index fadd3ec14c..8752f5bbed 100644 --- a/builtin/rev-list.c +++ b/builtin/rev-list.c @@ -360,8 +360,8 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) int i; int bisect_list = 0; int bisect_show_vars = 0; - int bisect_find_all = 0; int use_bitmap_index = 0; + unsigned bisect_flags = 0; const char *show_progress = NULL; if (argc == 2 && !strcmp(argv[1], "-h")) @@ -426,7 +426,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) } if (!strcmp(arg, "--bisect-all")) { bisect_list = 1; - bisect_find_all = 1; + bisect_flags |= BISECT_FIND_ALL; info.flags |= BISECT_SHOW_ALL; revs.show_decorations = 1; continue; @@ -538,7 +538,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) if (bisect_list) { int reaches, all; - find_bisection(&revs.commits, &reaches, &all, bisect_find_all); + find_bisection(&revs.commits, &reaches, &all, bisect_flags); if (bisect_show_vars) return show_bisect_vars(&info, reaches, all); -- 2.14.3 (Apple Git-98)