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 <haraldnordg...@gmail.com>
---

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)

Reply via email to