]> git.ipfire.org Git - thirdparty/git.git/commitdiff
tree-diff: simplify emit_path() list management
authorJeff King <peff@peff.net>
Thu, 9 Jan 2025 08:54:05 +0000 (03:54 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 9 Jan 2025 20:24:26 +0000 (12:24 -0800)
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>
tree-diff.c

index a1a611bef6f7aba527144f2f1841477bd629736d..f5ec19113c79bea1576361c9f9a5ce0c6de960fe 100644 (file)
@@ -177,14 +177,12 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *tail,
 
        if (emitthis) {
                int keep;
-               struct combine_diff_path *pprev = tail, *p;
+               struct combine_diff_path *p;
 
                strbuf_add(base, path, pathlen);
                p = combine_diff_path_new(base->buf, base->len, mode,
                                          oid ? oid : null_oid(),
                                          nparent);
-               tail->next = p;
-               tail = p;
                strbuf_setlen(base, old_baselen);
 
                for (i = 0; i < nparent; ++i) {
@@ -220,10 +218,11 @@ static struct combine_diff_path *emit_path(struct combine_diff_path *tail,
                if (opt->pathchange)
                        keep = opt->pathchange(opt, p);
 
-               if (!keep) {
+               if (keep) {
+                       tail->next = p;
+                       tail = p;
+               } else {
                        free(p);
-                       pprev->next = NULL;
-                       tail = pprev;
                }
        }