bisect: change calling-convention of `find_bisection()`

This function takes a commit list and returns a commit list. The
returned list is built by modifying the original list. Thus the caller
should not use the original list again (and after the next commit fixes
a memory leak, it must not).

Change the function signature so that it takes a **list and has void
return type. That should make it harder to misuse this function.

While we're here, document this function.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Martin Ågren 2017-11-05 21:24:28 +01:00 коммит произвёл Junio C Hamano
Родитель cb5918aa0d
Коммит 24d707f636
3 изменённых файлов: 17 добавлений и 14 удалений

Просмотреть файл

@ -360,21 +360,20 @@ static struct commit_list *do_find_bisection(struct commit_list *list,
return best_bisection_sorted(list, nr);
}
struct commit_list *find_bisection(struct commit_list *list,
int *reaches, int *all,
int find_all)
void find_bisection(struct commit_list **commit_list, int *reaches,
int *all, int find_all)
{
int nr, on_list;
struct commit_list *p, *best, *next, *last;
struct commit_list *list, *p, *best, *next, *last;
int *weights;
show_list("bisection 2 entry", 0, 0, list);
show_list("bisection 2 entry", 0, 0, *commit_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;
for (nr = on_list = 0, last = NULL, p = *commit_list;
p;
p = next) {
unsigned flags = p->item->object.flags;
@ -402,7 +401,7 @@ struct commit_list *find_bisection(struct commit_list *list,
*reaches = weight(best);
}
free(weights);
return best;
*commit_list = best;
}
static int register_ref(const char *refname, const struct object_id *oid,
@ -954,8 +953,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
bisect_common(&revs);
revs.commits = find_bisection(revs.commits, &reaches, &all,
!!skipped_revs.nr);
find_bisection(&revs.commits, &reaches, &all, !!skipped_revs.nr);
revs.commits = managed_skipped(revs.commits, &tried);
if (!revs.commits) {

Просмотреть файл

@ -1,9 +1,15 @@
#ifndef BISECT_H
#define BISECT_H
extern struct commit_list *find_bisection(struct commit_list *list,
int *reaches, int *all,
int find_all);
/*
* 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`.
*/
extern void find_bisection(struct commit_list **list, int *reaches, int *all,
int find_all);
extern struct commit_list *filter_skipped(struct commit_list *list,
struct commit_list **tried,

Просмотреть файл

@ -397,8 +397,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
if (bisect_list) {
int reaches = reaches, all = all;
revs.commits = find_bisection(revs.commits, &reaches, &all,
bisect_find_all);
find_bisection(&revs.commits, &reaches, &all, bisect_find_all);
if (bisect_show_vars)
return show_bisect_vars(&info, reaches, all);