From: Junio C Hamano Date: Sat, 23 Aug 2008 05:20:13 GMT Subject: Re: [bug] Segfault in git rev-list --first-parent --bisect Message-ID: <7v7ia848aa.fsf@gitster.siamese.dyndns.org> In-Reply-To: <32541b130808222020v146e015dm8a98a005ad3e76a7@mail.gmail.com> "Avery Pennarun" writes: > $ git rev-list --first-parent --bisect 5109c91 ^d798a2bfe094 > Segmentation fault Totally untested, usefulness fairly unknown. builtin-rev-list.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) diff --git c/builtin-rev-list.c w/builtin-rev-list.c index 893762c..aab198f 100644 --- c/builtin-rev-list.c +++ w/builtin-rev-list.c @@ -530,19 +530,23 @@ static struct commit_list *do_find_bisection(struct commit_list *list, return best_bisection_sorted(list, nr); } +#define BISECT_FIND_ALL 01 +#define BISECT_FIRST_PARENT_ONLY 02 static struct commit_list *find_bisection(struct commit_list *list, int *reaches, int *all, - int find_all) + int flag) { int nr, on_list; struct commit_list *p, *best, *next, *last; int *weights; + int find_all = flag & BISECT_FIND_ALL; + int first_parent_only = flag & BISECT_FIRST_PARENT_ONLY; show_list("bisection 2 entry", 0, 0, list); /* * Count the number of total and tree-changing items on the - * list, while reversing the list. + * list, while reversing the list and removing. */ for (nr = on_list = 0, last = NULL, p = list; p; @@ -557,6 +561,8 @@ static struct commit_list *find_bisection(struct commit_list *list, if (!(flags & TREESAME)) nr++; on_list++; + if (first_parent_only && p->item->parents) + p->item->parents->next = NULL; } list = last; show_list("bisection 2 sorted", 0, nr, list); @@ -656,9 +662,13 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix) if (bisect_list) { int reaches = reaches, all = all; + int flag = 0; + if (bisect_find_all) + flag |= BISECT_FIND_ALL; + if (revs.first_parent_only) + flag |= BISECT_FIRST_PARENT_ONLY; + revs.commits = find_bisection(revs.commits, &reaches, &all, flag); - revs.commits = find_bisection(revs.commits, &reaches, &all, - bisect_find_all); if (bisect_show_vars) { int cnt; char hex[41];