]> git.ipfire.org Git - thirdparty/git.git/commitdiff
worktree add: stop reading ".git/HEAD"
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Thu, 26 Mar 2026 14:16:58 +0000 (14:16 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 Mar 2026 15:20:50 +0000 (08:20 -0700)
The function can_use_local_refs() prints a warning if there are no local
branches and HEAD is invalid or points to an unborn branch. As part of
the warning it prints the contents of ".git/HEAD". In a repository using
the reftable backend HEAD is not stored in the filesystem so reading
that file is pointless. In a repository using the files backend it is
unclear how useful printing it is - it would be better to diagnose the
problem for the user. For now, simplify the warning by not printing
the file contents and adjust the relevant test case accordingly. Also
fixup the test case to use test_grep so that anyone trying to debug a
test failure in the future is not met by a wall of silence.

Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/worktree.c
t/t2400-worktree-add.sh

index bc2d0d645ba945339281a1381d837f03889a70fe..9170b2e8981b658d5ed51bc1f8c4906f1cb7c75b 100644 (file)
@@ -692,25 +692,8 @@ static int can_use_local_refs(const struct add_opts *opts)
        if (refs_head_ref(get_main_ref_store(the_repository), first_valid_ref, NULL)) {
                return 1;
        } else if (refs_for_each_branch_ref(get_main_ref_store(the_repository), first_valid_ref, NULL)) {
-               if (!opts->quiet) {
-                       struct strbuf path = STRBUF_INIT;
-                       struct strbuf contents = STRBUF_INIT;
-                       char *wt_gitdir = get_worktree_git_dir(NULL);
-
-                       strbuf_add_real_path(&path, wt_gitdir);
-                       strbuf_addstr(&path, "/HEAD");
-                       strbuf_read_file(&contents, path.buf, 64);
-                       strbuf_stripspace(&contents, NULL);
-                       strbuf_strip_suffix(&contents, "\n");
-
-                       warning(_("HEAD points to an invalid (or orphaned) reference.\n"
-                                 "HEAD path: '%s'\n"
-                                 "HEAD contents: '%s'"),
-                                 path.buf, contents.buf);
-                       strbuf_release(&path);
-                       strbuf_release(&contents);
-                       free(wt_gitdir);
-               }
+               if (!opts->quiet)
+                       warning(_("HEAD points to an invalid (or orphaned) reference.\n"));
                return 1;
        }
        return 0;
index 023e1301c8e68eebf67ac9185fcf01a80ab91d54..58b4445cc441a84757749fd683ecbfa932a98ca4 100755 (executable)
@@ -987,7 +987,7 @@ test_dwim_orphan () {
                                then
                                        test_must_be_empty actual
                                else
-                                       grep "$info_text" actual
+                                       test_grep "$info_text" actual
                                fi
                        elif [ "$outcome" = "no_infer" ]
                        then
@@ -996,39 +996,35 @@ test_dwim_orphan () {
                                then
                                        test_must_be_empty actual
                                else
-                                       ! grep "$info_text" actual
+                                       test_grep ! "$info_text" actual
                                fi
                        elif [ "$outcome" = "fetch_error" ]
                        then
                                test_must_fail git $dashc_args worktree add $args 2>actual &&
-                               grep "$fetch_error_text" actual
+                               test_grep "$fetch_error_text" actual
                        elif [ "$outcome" = "fatal_orphan_bad_combo" ]
                        then
                                test_must_fail git $dashc_args worktree add $args 2>actual &&
                                if [ $use_quiet -eq 1 ]
                                then
-                                       ! grep "$info_text" actual
+                                       test_grep ! "$info_text" actual
                                else
-                                       grep "$info_text" actual
+                                       test_grep "$info_text" actual
                                fi &&
-                               grep "$bad_combo_regex" actual
+                               test_grep "$bad_combo_regex" actual
                        elif [ "$outcome" = "warn_bad_head" ]
                        then
                                test_must_fail git $dashc_args worktree add $args 2>actual &&
                                if [ $use_quiet -eq 1 ]
                                then
-                                       grep "$invalid_ref_regex" actual &&
-                                       ! grep "$orphan_hint" actual
+                                       test_grep "$invalid_ref_regex" actual &&
+                                       test_grep ! "$orphan_hint" actual
                                else
-                                       headpath=$(git $dashc_args rev-parse --path-format=absolute --git-path HEAD) &&
-                                       headcontents=$(cat "$headpath") &&
-                                       grep "HEAD points to an invalid (or orphaned) reference" actual &&
-                                       grep "HEAD path: .$headpath." actual &&
-                                       grep "HEAD contents: .$headcontents." actual &&
-                                       grep "$orphan_hint" actual &&
-                                       ! grep "$info_text" actual
+                                       test_grep "HEAD points to an invalid (or orphaned) reference" actual &&
+                                       test_grep "$orphan_hint" actual &&
+                                       test_grep ! "$info_text" actual
                                fi &&
-                               grep "$invalid_ref_regex" actual
+                               test_grep "$invalid_ref_regex" actual
                        else
                                # Unreachable
                                false