]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bisect: fix misuse of `refs_for_each_ref_in()`
authorPatrick Steinhardt <ps@pks.im>
Thu, 19 Feb 2026 07:57:51 +0000 (08:57 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 19 Feb 2026 18:41:18 +0000 (10:41 -0800)
All callers of `refs_for_each_ref_in()` pass in a string that is
terminated with a trailing slash to indicate that they only want to see
refs in that specific ref hierarchy. This is in fact a requirement if
one wants to use this function, as the function trims the prefix from
each yielded ref. So if there was a reference that was called
"refs/bisect" as in our example, the result after trimming would be the
empty string, and that's something we disallow.

Fix this by adding the trailing slash.

Furthermore, taking a closer look, we strip the prefix only to re-add it
in `mark_for_removal()`. This is somewhat roundabout, as we can instead
call `refs_for_each_fullref_in()` to not do any stripping at all. Do so
to simplify the code a bit.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
bisect.c

index 326b59c0dc70e7fe67eeadfb2d691790262d7bbc..4f0d1a185397e024de3b57a265983d7395ba742f 100644 (file)
--- a/bisect.c
+++ b/bisect.c
@@ -1180,7 +1180,7 @@ int estimate_bisect_steps(int all)
 static int mark_for_removal(const struct reference *ref, void *cb_data)
 {
        struct string_list *refs = cb_data;
-       char *bisect_ref = xstrfmt("refs/bisect%s", ref->name);
+       char *bisect_ref = xstrdup(ref->name);
        string_list_append(refs, bisect_ref);
        return 0;
 }
@@ -1191,9 +1191,9 @@ int bisect_clean_state(void)
 
        /* There may be some refs packed during bisection */
        struct string_list refs_for_removal = STRING_LIST_INIT_NODUP;
-       refs_for_each_ref_in(get_main_ref_store(the_repository),
-                            "refs/bisect", mark_for_removal,
-                            (void *) &refs_for_removal);
+       refs_for_each_fullref_in(get_main_ref_store(the_repository),
+                                "refs/bisect/", NULL, mark_for_removal,
+                                &refs_for_removal);
        string_list_append(&refs_for_removal, xstrdup("BISECT_HEAD"));
        string_list_append(&refs_for_removal, xstrdup("BISECT_EXPECTED_REV"));
        result = refs_delete_refs(get_main_ref_store(the_repository),