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>
This commit is contained in:
parent
9346b4e1ad
commit
ce0cbad772
@ -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
|
* unknown. After running count_distance() first, they will get zero
|
||||||
* or positive distance.
|
* or positive distance.
|
||||||
*/
|
*/
|
||||||
|
static struct commit_list *do_find_bisection(struct commit_list *list,
|
||||||
static struct commit_list *find_bisection(struct commit_list *list,
|
int nr, int *weights)
|
||||||
int *reaches, int *all)
|
|
||||||
{
|
{
|
||||||
int n, nr, on_list, counted, distance;
|
int n, counted, distance;
|
||||||
struct commit_list *p, *best, *next, *last;
|
struct commit_list *p, *best;
|
||||||
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));
|
|
||||||
counted = 0;
|
counted = 0;
|
||||||
|
|
||||||
for (n = 0, p = list; p; p = p->next) {
|
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);
|
weight_set(p, distance);
|
||||||
|
|
||||||
/* Does it happen to be at exactly half-way? */
|
/* Does it happen to be at exactly half-way? */
|
||||||
if (halfway(p, distance, nr)) {
|
if (halfway(p, distance, nr))
|
||||||
p->next = NULL;
|
|
||||||
*reaches = distance;
|
|
||||||
free(weights);
|
|
||||||
return p;
|
return p;
|
||||||
}
|
|
||||||
counted++;
|
counted++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,14 +369,10 @@ static struct commit_list *find_bisection(struct commit_list *list,
|
|||||||
|
|
||||||
/* Does it happen to be at exactly half-way? */
|
/* Does it happen to be at exactly half-way? */
|
||||||
distance = weight(p);
|
distance = weight(p);
|
||||||
if (halfway(p, distance, nr)) {
|
if (halfway(p, distance, nr))
|
||||||
p->next = NULL;
|
|
||||||
*reaches = distance;
|
|
||||||
free(weights);
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
show_list("bisection 2 counted all", counted, nr, list);
|
show_list("bisection 2 counted all", counted, nr, list);
|
||||||
|
|
||||||
@ -425,12 +390,53 @@ static struct commit_list *find_bisection(struct commit_list *list,
|
|||||||
if (distance > counted) {
|
if (distance > counted) {
|
||||||
best = p;
|
best = p;
|
||||||
counted = distance;
|
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)
|
if (best)
|
||||||
best->next = NULL;
|
best->next = NULL;
|
||||||
|
|
||||||
|
*reaches = weight(best);
|
||||||
free(weights);
|
free(weights);
|
||||||
|
|
||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user