rev-list --bisect: Move finding bisection into do_find_bisection.
authorChristian Couder <chriscool@tuxfamily.org>
Mon, 17 Sep 2007 03:28:20 +0000 (05:28 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Sep 2007 09:58:13 +0000 (02:58 -0700)
This factorises some code and make a big function smaller.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin-rev-list.c
index ac551d59f3f6cb209a645ad708c46e4e88791295..2dae287129fa383ff6bf1b9309060623d569dcaa 100644 (file)
@@ -268,39 +268,12 @@ static void show_list(const char *debug, int counted, int nr,
  * unknown.  After running count_distance() first, they will get zero
  * or positive distance.
  */
-
-static struct commit_list *find_bisection(struct commit_list *list,
-                                         int *reaches, int *all)
+static struct commit_list *do_find_bisection(struct commit_list *list,
+                                            int nr, int *weights)
 {
-       int n, nr, on_list, counted, distance;
-       struct commit_list *p, *best, *next, *last;
-       int *weights;
-
-       show_list("bisection 2 entry", 0, 0, list);
-
-       /*
-        * Count the number of total and tree-changing items on the
-        * list, while reversing the list.
-        */
-       for (nr = on_list = 0, last = NULL, p = list;
-            p;
-            p = next) {
-               unsigned flags = p->item->object.flags;
+       int n, counted, distance;
+       struct commit_list *p, *best;
 
-               next = p->next;
-               if (flags & UNINTERESTING)
-                       continue;
-               p->next = last;
-               last = p;
-               if (!revs.prune_fn || (flags & TREECHANGE))
-                       nr++;
-               on_list++;
-       }
-       list = last;
-       show_list("bisection 2 sorted", 0, nr, list);
-
-       *all = nr;
-       weights = xcalloc(on_list, sizeof(*weights));
        counted = 0;
 
        for (n = 0, p = list; p; p = p->next) {
@@ -357,12 +330,8 @@ static struct commit_list *find_bisection(struct commit_list *list,
                weight_set(p, distance);
 
                /* Does it happen to be at exactly half-way? */
-               if (halfway(p, distance, nr)) {
-                       p->next = NULL;
-                       *reaches = distance;
-                       free(weights);
+               if (halfway(p, distance, nr))
                        return p;
-               }
                counted++;
        }
 
@@ -400,12 +369,8 @@ static struct commit_list *find_bisection(struct commit_list *list,
 
                        /* Does it happen to be at exactly half-way? */
                        distance = weight(p);
-                       if (halfway(p, distance, nr)) {
-                               p->next = NULL;
-                               *reaches = distance;
-                               free(weights);
+                       if (halfway(p, distance, nr))
                                return p;
-                       }
                }
        }
 
@@ -425,12 +390,53 @@ static struct commit_list *find_bisection(struct commit_list *list,
                if (distance > counted) {
                        best = p;
                        counted = distance;
-                       *reaches = weight(p);
                }
        }
+       return best;
+}
+
+static struct commit_list *find_bisection(struct commit_list *list,
+                                         int *reaches, int *all)
+{
+       int nr, on_list;
+       struct commit_list *p, *best, *next, *last;
+       int *weights;
+
+       show_list("bisection 2 entry", 0, 0, list);
+
+       /*
+        * Count the number of total and tree-changing items on the
+        * list, while reversing the list.
+        */
+       for (nr = on_list = 0, last = NULL, p = list;
+            p;
+            p = next) {
+               unsigned flags = p->item->object.flags;
+
+               next = p->next;
+               if (flags & UNINTERESTING)
+                       continue;
+               p->next = last;
+               last = p;
+               if (!revs.prune_fn || (flags & TREECHANGE))
+                       nr++;
+               on_list++;
+       }
+       list = last;
+       show_list("bisection 2 sorted", 0, nr, list);
+
+       *all = nr;
+       weights = xcalloc(on_list, sizeof(*weights));
+
+       /* Do the real work of finding bisection commit. */
+       best = do_find_bisection(list, nr, weights);
+
        if (best)
                best->next = NULL;
+
+       *reaches = weight(best);
        free(weights);
+
        return best;
 }