tree-diff: simplify emit_path() list management
In emit_path() we may append a new combine_diff_path entry to our list, decide that we don't want it (because opt->pathchange() told us so) and then roll it back. Between the addition and the rollback, it doesn't matter if it's in the list or not (no functions can even tell, since it's a singly-linked list and we pass around just the tail entry). So it's much simpler to just wait until opt->pathchange() tells us whether to keep it, and either attach it (or free it) then. We do still have to allocate it up front since it's that struct itself which is passed to the pathchange callback. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Jan 9, 2025 at 03:54 UTC
6632bcba514f4a195447eb77264f75fed3a768e6
1 file changed
+5
-6
tree-diff.c
+5
-6
@@ -177,14 +177,12 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *tail,
177
178
if (emitthis) {
179
int keep;
180
- struct combine_diff_path *pprev = tail, *p;
180
+ struct combine_diff_path *p;
181
182
strbuf_add(base, path, pathlen);
183
p = combine_diff_path_new(base->buf, base->len, mode,
184
oid ? oid : null_oid(),
185
nparent);
186
- tail->next = p;
187
- tail = p;
186
strbuf_setlen(base, old_baselen);
187
188
for (i = 0; i < nparent; ++i) {
@@ -220,10 +218,11 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *tail,
218
if (opt->pathchange)
219
keep = opt->pathchange(opt, p);
220
223
- if (!keep) {
221
+ if (keep) {
222
+ tail->next = p;
223
+ tail = p;
224
+ } else {
225
free(p);
225
- pprev->next = NULL;
226
- tail = pprev;
226
}
227
}
228