git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v4 0/2] attr: add attr.tree config

From
John Cai via GitGitGadget <gitgitgadget@gmail.com>
Date
Oct 11, 2023, 17:13 UTC
Message-ID
<pull.1577.v4.git.git.1697044422.gitgitgadget@gmail.com>
In-Reply-To
<pull.1577.v3.git.git.1696967380.gitgitgadget@gmail.com>

44451a2e5e (attr: teach "--attr-source=" global option to "git", 2023-05-06) provided the ability to pass in a treeish as the attr source. When a revision does not resolve to a valid tree is passed, Git will die. At GitLab, we server repositories as bare repos and would like to always read attributes from the default branch, so we'd like to pass in HEAD as the treeish to read gitattributes from on every command. In this context we would not want Git to die if HEAD is unborn, like in the case of empty repositories.

Instead of modifying the default behavior of --attr-source, create a new config attr.tree with which an admin can configure a ref for all commands to read gitattributes from. Also make the default tree to read from HEAD on bare repositories.

Changes since v2:
 * relax the restrictions around attr.tree so that if it does not resolve to
   a valid treeish, ignore it.
 * add a commit to default to HEAD in bare repositories
Changes since v1:
 * Added a commit to add attr.tree config
John Cai (2):
  attr: read attributes from HEAD when bare repo
  attr: add attr.tree for setting the treeish to read attributes from
 Documentation/config.txt      |  2 +
 Documentation/config/attr.txt |  7 +++
 attr.c                        | 19 +++++++-
 attr.h                        |  2 +
 config.c                      | 16 +++++++
 t/t0003-attributes.sh         | 84 +++++++++++++++++++++++++++++++++++
 t/t5001-archive-attr.sh       |  2 +-
 7 files changed, 130 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/config/attr.txt
base-commit: 1fc548b2d6a3596f3e1c1f8b1930d8dbd1e30bf3
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-1577%2Fjohn-cai%2Fjc%2Fconfig-attr-invalid-source-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-1577/john-cai/jc/config-attr-invalid-source-v4
Pull-Request: https://github.com/git/git/pull/1577
Range-diff vs v3:
 1:  cef206d47c7 ! 1:  eaa27c47810 attr: read attributes from HEAD when bare repo
     @@ t/t0003-attributes.sh: test_expect_success 'bare repository: check that .gitattr
      +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"
     -+	) &&
     ++	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 &&
 2:  dadb822da99 ! 2:  749d8a8082e attr: add attr.tree for setting the treeish to read attributes from
     @@ Documentation/config.txt: other popular tools, and describe them in your documen
      
       ## Documentation/config/attr.txt (new) ##
      @@
     -+attr.tree:
     -+	A <tree-ish> to read gitattributes from instead of the worktree. See
     -+	linkgit:gitattributes[5]. If `attr.tree` does not resolve to a valid tree,
     -+	treat it as an empty tree. --attr-source and GIT_ATTR_SOURCE take
     -+	precedence over attr.tree.
     ++attr.tree::
     ++	A reference to a tree in the repository from which to read attributes,
     ++	instead of the `.gitattributes` file in the working tree. In a bare
     ++	repository, this defaults to `HEAD:.gitattributes`. If the value does
     ++	not resolve to a valid tree object, an empty tree is used instead.
     ++	When the `GIT_ATTR_SOURCE` environment variable or `--attr-source`
     ++	command line option are used, this configuration variable has no effect.
      
       ## attr.c ##
      @@
     @@ attr.c: 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) {
     ++	if (!default_attr_source_tree_object_name && git_attr_tree) {
      +		default_attr_source_tree_object_name = git_attr_tree;
      +		ignore_bad_attr_tree = 1;
      +	}
     @@ config.c: static int git_default_mailmap_config(const char *var, const char *val
      +	if (!strcmp(var, "attr.tree"))
      +		return git_config_string(&git_attr_tree, var, value);
      +
     -+	/* Add other attribute related config variables here and to
     -+	   Documentation/config/attr.txt. */
     ++	/*
     ++	 * Add other attribute related config variables here and to
     ++	 * Documentation/config/attr.txt.
     ++	 */
      +	return 0;
      +}
      +
     @@ t/t0003-attributes.sh: test_expect_success 'bare repository: check that .gitattr
       
      +bad_attr_source_err="fatal: bad --attr-source or GIT_ATTR_SOURCE"
      +
     ++test_expect_success '--attr-source is bad' '
     ++	test_when_finished rm -rf empty &&
     ++	git init empty &&
     ++	(
     ++		cd empty &&
     ++		echo "$bad_attr_source_err" >expect_err &&
     ++		test_must_fail git --attr-source=HEAD check-attr test -- f/path 2>err &&
     ++		test_cmp expect_err err
     ++	)
     ++'
     ++
      +test_expect_success 'attr.tree when HEAD is unborn' '
      +	test_when_finished rm -rf empty &&
      +	git init empty &&
      +	(
      +		cd empty &&
     -+		echo $bad_attr_source_err >expect_err &&
      +		echo "f/path: test: unspecified" >expect &&
      +		git -c attr.tree=HEAD check-attr test -- f/path >actual 2>err &&
      +		test_must_be_empty err &&
     @@ t/t0003-attributes.sh: test_expect_success 'bare repository: check that .gitattr
      +	git init empty &&
      +	(
      +		cd empty &&
     -+		echo $bad_attr_source_err >expect_err &&
      +		echo "f/path: test: unspecified" >expect &&
      +		git -c attr.tree=refs/does/not/exist check-attr test -- f/path >actual 2>err &&
      +		test_must_be_empty err &&
     @@ t/t0003-attributes.sh: test_expect_success 'bare repo defaults to reading .gitat
       	test_cmp expect actual
       '
       
     -+test_expect_success '--attr-source and GIT_ATTR_SOURCE take precedence over attr.tree' '
     ++test_expect_success 'precedence of --attr-source, GIT_ATTR_SOURCE, then attr.tree' '
      +	test_when_finished rm -rf empty &&
      +	git init empty &&
      +	(
     @@ t/t0003-attributes.sh: test_expect_success 'bare repo defaults to reading .gitat
      +		test_commit "val2" .gitattributes "f/path test=val2" &&
      +		git checkout attr-source &&
      +		echo "f/path: test: val1" >expect &&
     -+		git -c attr.tree=attr-tree --attr-source=attr-source check-attr test -- f/path >actual &&
     ++		GIT_ATTR_SOURCE=attr-source git -c attr.tree=attr-tree --attr-source=attr-source \
     ++		check-attr test -- f/path >actual &&
      +		test_cmp expect actual &&
     -+		GIT_ATTR_SOURCE=attr-source git -c attr.tree=attr-tree check-attr test -- f/path >actual &&
     ++		GIT_ATTR_SOURCE=attr-source git -c attr.tree=attr-tree \
     ++		check-attr test -- f/path >actual &&
      +		test_cmp expect actual
      +	)
      +'
-- 
gitgitgadget
Previous: John CaiNext: John Cai via GitGitGadget
Message 23 of 34 in “attr: attr.allowInvalidSource config to allow invalid revision”
  1. attr: attr.allowInvalidSource config to allow invalid revisionJohn Cai via GitGitGadget, Sep 20, 2023
  2. Junio C HamanoSep 20, 2023
  3. Jeff KingSep 21, 2023
  4. Junio C HamanoSep 21, 2023
  5. Jeff KingSep 21, 2023
  6. John CaiSep 26, 2023
  7. John CaiSep 26, 2023
  8. John CaiSep 26, 2023
  9. 0/2 attr: add attr.tree and attr.allowInvalidSource configsJohn Cai via GitGitGadget, Oct 4, 2023
  10. 1/2 attr: add attr.tree for setting the treeish to read attributes fromJohn Cai via GitGitGadget, Oct 4, 2023
  11. Junio C HamanoOct 4, 2023
  12. Jeff KingOct 5, 2023
  13. John CaiOct 5, 2023
  14. Junio C HamanoOct 4, 2023
  15. Jonathan TanOct 6, 2023
  16. 2/2 attr: add attr.allowInvalidSource config to allow invalid revisionJohn Cai via GitGitGadget, Oct 4, 2023
  17. 0/2 attr: add attr.tree configJohn Cai via GitGitGadget, Oct 10, 2023
  18. 1/2 attr: read attributes from HEAD when bare repoJohn Cai via GitGitGadget, Oct 10, 2023
  19. Eric SunshineOct 10, 2023
  20. 2/2 attr: add attr.tree for setting the treeish to read attributes fromJohn Cai via GitGitGadget, Oct 10, 2023
  21. Junio C HamanoOct 10, 2023
  22. John CaiOct 11, 2023
  23. 0/2 attr: add attr.tree configJohn Cai via GitGitGadget, Oct 11, 2023
  24. 1/2 attr: read attributes from HEAD when bare repoJohn Cai via GitGitGadget, Oct 11, 2023
  25. 2/2 attr: add attr.tree for setting the treeish to read attributes fromJohn Cai via GitGitGadget, Oct 11, 2023
  26. Junio C HamanoOct 11, 2023
  27. John CaiOct 13, 2023
  28. 0/2 attr: add attr.tree configJohn Cai via GitGitGadget, Oct 13, 2023
  29. 1/2 attr: read attributes from HEAD when bare repoJohn Cai via GitGitGadget, Oct 13, 2023
  30. 2/2 attr: add attr.tree for setting the treeish to read attributes fromJohn Cai via GitGitGadget, Oct 13, 2023
  31. Junio C HamanoOct 13, 2023
  32. Junio C HamanoOct 13, 2023
  33. Junio C HamanoOct 13, 2023
  34. John CaiOct 19, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.