diff options
author | Christian Couder <chriscool@tuxfamily.org> | 2007-09-17 05:28:20 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-09-18 02:58:13 -0700 |
commit | ce0cbad7727457854d631a6314d9aee7c837cb65 (patch) | |
tree | 1700bc7963fffe7eff00a73bd9dea707b6acb07b /builtin-rev-list.c | |
parent | 9346b4e1ad2d03541f18b38f7e9fb7ad0ca6434e (diff) | |
download | git-ce0cbad7727457854d631a6314d9aee7c837cb65.tar.gz |
rev-list --bisect: Move finding bisection into do_find_bisection.
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>
Diffstat (limited to 'builtin-rev-list.c')
-rw-r--r-- | builtin-rev-list.c | 90 |
1 files changed, 48 insertions, 42 deletions
diff --git a/builtin-rev-list.c b/builtin-rev-list.c index ac551d59f3..2dae287129 100644 --- a/builtin-rev-list.c +++ b/builtin-rev-list.c @@ -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; } |