]> git.ipfire.org Git - thirdparty/git.git/commitdiff
attr: fix BUG() when parsing attrs outside of repo
authorPatrick Steinhardt <ps@pks.im>
Tue, 7 May 2024 04:53:05 +0000 (06:53 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 7 May 2024 05:50:49 +0000 (22:50 -0700)
If either the `--attr-source` option or the `GIT_ATTR_SOURCE` envvar are
set, then `compute_default_attr_source()` will try to look up the value
as a treeish. It is possible to hit that function while outside of a Git
repository though, for example when using `git grep --no-index`. In that
case, Git will hit a bug because we try to look up the main ref store
outside of a repository.

Handle the case gracefully and detect when we try to look up an attr
source without a repository.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
attr.c
t/t0003-attributes.sh

diff --git a/attr.c b/attr.c
index a5b717e4cef1b22351b8d563d507d66428a02c51..c89ab3478ef468b42e15684adb3477f71c96e2da 100644 (file)
--- a/attr.c
+++ b/attr.c
@@ -1227,6 +1227,12 @@ static int compute_default_attr_source(struct object_id *attr_source)
        if (!default_attr_source_tree_object_name)
                return 0;
 
+       if (!startup_info->have_repository) {
+               if (!ignore_bad_attr_tree)
+                       die(_("cannot use --attr-source or GIT_ATTR_SOURCE without repo"));
+               return 0;
+       }
+
        if (repo_get_oid_treeish(the_repository,
                                 default_attr_source_tree_object_name,
                                 attr_source)) {
index d755cc3c298147ab97ecc734e688c16e2ac2af77..72fadca1e803cf5f398a7352f13bf7f85ac87cae 100755 (executable)
@@ -434,6 +434,21 @@ test_expect_success 'precedence of --attr-source, GIT_ATTR_SOURCE, then attr.tre
        )
 '
 
+test_expect_success 'diff without repository with attr source' '
+       mkdir -p "$TRASH_DIRECTORY/outside/nongit" &&
+       (
+               cd "$TRASH_DIRECTORY/outside/nongit" &&
+               GIT_CEILING_DIRECTORIES="$TRASH_DIRECTORY/outside" &&
+               export GIT_CEILING_DIRECTORIES &&
+               touch file &&
+               cat >expect <<-EOF &&
+               fatal: cannot use --attr-source or GIT_ATTR_SOURCE without repo
+               EOF
+               test_must_fail env GIT_ATTR_SOURCE=HEAD git grep --no-index foo file 2>err &&
+               test_cmp expect err
+       )
+'
+
 test_expect_success 'bare repository: with --source' '
        (
                cd bare.git &&