On 2/1/2021 11:12 AM, René Scharfe. wrote: > Am 01.02.21 um 13:47 schrieb Derrick Stolee via GitGitGadget: >> @@ -210,12 +204,110 @@ static int remove_redundant(struct repository *r, struct commit **array, int cnt >> for (i = filled = 0; i < cnt; i++) >> if (!redundant[i]) >> array[filled++] = work[i]; >> + for (j = filled, i = 0; i < cnt; i++) >> + if (redundant[i]) >> + array[j++] = work[i]; > > This puts the loop back in that you removed in the previous commit. > Intentionally? Not intentional. Thanks for noticing. >> + /* rearrange array */ >> + for (i = count_non_stale = 0; i < cnt; i++) { >> + if (!(array[i]->object.flags & STALE)) > > Here I would have added another condition, count_non_stale != i, to > avoid self-assignment (array[x] = array[x]). The code works without > it, though. Not sure if there is a performance benefit to be had --> branch vs. pointer copy. Probably not worth it.. You are correct, but I'm going to go on the side of not worth it. >> + array[count_non_stale++] = array[i]; >> + } >> + >> + /* clear marks */ >> + for (i = 0; i < walk_start_nr; i++) >> + clear_commit_marks(walk_start[i], STALE); > > You can replace this loop with a call to clear_commit_marks_many(). Right! Earlier I was using a 'struct commit_list *' which would not work, but this 'struct commit ** walk_start' does work. Thanks. -Stolee