Message ID | cef206d47c724f54220b0b915e5405b48f5eb2cb.1696967380.git.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | attr: add attr.tree config | expand |
On Tue, Oct 10, 2023 at 3:49 PM John Cai via GitGitGadget <gitgitgadget@gmail.com> wrote: > The motivation for 44451a2e5e (attr: teach "--attr-source=<tree>" global > option to "git" , 2023-05-06), was to make it possible to use > gitattributes with bare repositories. > > To make it easier to read gitattributes in bare repositories however, > let's just make HEAD:.gitattributes the default. This is in line with > how mailmap works, 8c473cecfd (mailmap: default mailmap.blob in bare > repositories, 2012-12-13). > > Signed-off-by: John Cai <johncai86@gmail.com> > --- > diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh > @@ -342,6 +342,20 @@ test_expect_success 'bare repository: check that .gitattribute is ignored' ' > +test_expect_success 'bare repo defaults to reading .gitattributes from HEAD' ' > + test_when_finished rm -rf test bare_with_gitattribute && > + git init test && > + ( > + cd test && > + test_commit gitattributes .gitattributes "f/path test=val" > + ) && Not at all worth a reroll, rather just for future reference... these days test_commit() supports -C, so the same could be accomplished without the subshell or `cd`: test_commit -C test gitattributes .gitattributes "f/path test=val" && > + git clone --bare test bare_with_gitattribute && > + echo "f/path: test: val" >expect && > + git -C bare_with_gitattribute check-attr test -- f/path >actual && > + test_cmp expect actual > +'
diff --git a/attr.c b/attr.c index 71c84fbcf86..bf2ea1626a6 100644 --- a/attr.c +++ b/attr.c @@ -1194,6 +1194,7 @@ static void collect_some_attrs(struct index_state *istate, } static const char *default_attr_source_tree_object_name; +static int ignore_bad_attr_tree; void set_git_attr_source(const char *tree_object_name) { @@ -1205,10 +1206,19 @@ static void compute_default_attr_source(struct object_id *attr_source) if (!default_attr_source_tree_object_name) default_attr_source_tree_object_name = getenv(GIT_ATTR_SOURCE_ENVIRONMENT); + if (!default_attr_source_tree_object_name && + startup_info->have_repository && + is_bare_repository()) { + default_attr_source_tree_object_name = "HEAD"; + ignore_bad_attr_tree = 1; + } + if (!default_attr_source_tree_object_name || !is_null_oid(attr_source)) return; - if (repo_get_oid_treeish(the_repository, default_attr_source_tree_object_name, attr_source)) + if (repo_get_oid_treeish(the_repository, + default_attr_source_tree_object_name, + attr_source) && !ignore_bad_attr_tree) die(_("bad --attr-source or GIT_ATTR_SOURCE")); } diff --git a/t/t0003-attributes.sh b/t/t0003-attributes.sh index 26e082f05b4..e6b1a117228 100755 --- a/t/t0003-attributes.sh +++ b/t/t0003-attributes.sh @@ -342,6 +342,20 @@ test_expect_success 'bare repository: check that .gitattribute is ignored' ' ) ' + +test_expect_success 'bare repo defaults to reading .gitattributes from HEAD' ' + test_when_finished rm -rf test bare_with_gitattribute && + git init test && + ( + cd test && + test_commit gitattributes .gitattributes "f/path test=val" + ) && + git clone --bare test bare_with_gitattribute && + echo "f/path: test: val" >expect && + git -C bare_with_gitattribute check-attr test -- f/path >actual && + test_cmp expect actual +' + test_expect_success 'bare repository: with --source' ' ( cd bare.git && diff --git a/t/t5001-archive-attr.sh b/t/t5001-archive-attr.sh index 0ff47a239db..eaf959d8f63 100755 --- a/t/t5001-archive-attr.sh +++ b/t/t5001-archive-attr.sh @@ -138,7 +138,7 @@ test_expect_success 'git archive with worktree attributes, bare' ' ' test_expect_missing bare-worktree/ignored -test_expect_exists bare-worktree/ignored-by-tree +test_expect_missing bare-worktree/ignored-by-tree test_expect_exists bare-worktree/ignored-by-worktree test_expect_success 'export-subst' '