Re: [PATCH 1/4] line-log: avoid unnecessary tree diffs when processing merge commits
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 25, 2025, 15:35 UTC
- Message-ID
- <xmqqms7ntnvq.fsf@gitster.g>
- In-Reply-To
- <20250824190644.2573279-2-szeder.dev@gmail.com>
SZEDER Gábor <szeder.dev@gmail.com> writes:
Show 34 quoted lines
> @@ -1209,7 +1202,6 @@ static int process_ranges_ordinary_commit(struct rev_info *rev, struct commit *c
> static int process_ranges_merge_commit(struct rev_info *rev, struct commit *commit,
> struct line_log_data *range)
> {
> - struct diff_queue_struct *diffqueues;
> struct line_log_data **cand;
> struct commit **parents;
> struct commit_list *p;
> @@ -1220,20 +1212,19 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm
> if (nparents > 1 && rev->first_parent_only)
> nparents = 1;
>
> - ALLOC_ARRAY(diffqueues, nparents);
> CALLOC_ARRAY(cand, nparents);
> ALLOC_ARRAY(parents, nparents);
>
> p = commit->parents;
> for (i = 0; i < nparents; i++) {
> + struct diff_queue_struct diffqueue = DIFF_QUEUE_INIT;
> + int changed;
> parents[i] = p->item;
> p = p->next;
> - queue_diffs(range, &rev->diffopt, &diffqueues[i], commit, parents[i]);
> - }
> + queue_diffs(range, &rev->diffopt, &diffqueue, commit, parents[i]);
>
> - for (i = 0; i < nparents; i++) {
> - int changed;
> - changed = process_all_files(&cand[i], rev, &diffqueues[i], range);
> + changed = process_all_files(&cand[i], rev, &diffqueue, range);
> + diff_queue_clear(&diffqueue);
> if (!changed) {
> /*
> * This parent can take all the blame, so weThis is surprisingly small change that eliminates quite a lot of waste. Nicely done.
Show 8 quoted lines
> @@ -1267,7 +1258,6 @@ static int process_ranges_merge_commit(struct rev_info *rev, struct commit *comm > free(cand[i]); > } > free(cand); > - free_diffqueues(nparents, diffqueues); > return ret; > > /* NEEDSWORK evil merge detection stuff */