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

[PATCH 14/36] attr: retire git_check_attrs() API

From
Stefan Beller <sbeller@google.com>
Date
Oct 22, 2016, 23:32 UTC
Message-ID
<20161022233225.8883-15-sbeller@google.com>
In-Reply-To
<20161022233225.8883-1-sbeller@google.com>
From: Junio C Hamano <gitster@pobox.com>

Since nobody uses the old API, make it file-scope static, and update the documentation to describe the new API.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
---
 Documentation/technical/api-gitattributes.txt | 82 ++++++++++++++++++---------
 attr.c                                        |  3 +-
 attr.h                                        |  2 -
 3 files changed, 56 insertions(+), 31 deletions(-)
diff --git a/Documentation/technical/api-gitattributes.txt b/Documentation/technical/api-gitattributes.txt
index 2602668..92fc32a 100644
--- a/Documentation/technical/api-gitattributes.txt
+++ b/Documentation/technical/api-gitattributes.txt
@@ -16,10 +16,15 @@ Data Structure
 	of no interest to the calling programs.  The name of the
 	attribute can be retrieved by calling `git_attr_name()`.
 
+`struct git_attr_check_elem`::
+
+	This structure represents one attribute and its value.
+
 `struct git_attr_check`::
 
-	This structure represents a set of attributes to check in a call
-	to `git_check_attr()` function, and receives the results.
+	This structure represents a collection of `git_attr_check_elem`.
+	It is passed to `git_check_attr()` function, specifying the
+	attributes to check, and receives their values.
 
 
 Attribute Values
@@ -48,49 +53,51 @@ value of the attribute for the path.
 Querying Specific Attributes
 ----------------------------
 
-* Prepare an array of `struct git_attr_check` to define the list of
-  attributes you would want to check.  To populate this array, you would
-  need to define necessary attributes by calling `git_attr()` function.
+* Prepare `struct git_attr_check` using git_attr_check_initl()
+  function, enumerating the names of attributes whose values you are
+  interested in, terminated with a NULL pointer.  Alternatively, an
+  empty `struct git_attr_check` can be prepared by calling
+  `git_attr_check_alloc()` function and then attributes you want to
+  ask about can be added to it with `git_attr_check_append()`
+  function.
 
 * Call `git_check_attr()` to check the attributes for the path.
 
-* Inspect `git_attr_check` structure to see how each of the attribute in
-  the array is defined for the path.
+* Inspect `git_attr_check` structure to see how each of the
+  attribute in the array is defined for the path.
 
 
 Example
 -------
 
-To see how attributes "crlf" and "indent" are set for different paths.
+To see how attributes "crlf" and "ident" are set for different paths.
 
-. Prepare an array of `struct git_attr_check` with two elements (because
-  we are checking two attributes).  Initialize their `attr` member with
-  pointers to `struct git_attr` obtained by calling `git_attr()`:
+. Prepare a `struct git_attr_check` with two elements (because
+  we are checking two attributes):
 
 ------------
-static struct git_attr_check check[2];
+static struct git_attr_check *check;
 static void setup_check(void)
 {
-	if (check[0].attr)
+	if (check)
 		return; /* already done */
-	check[0].attr = git_attr("crlf");
-	check[1].attr = git_attr("ident");
+	check = git_attr_check_initl("crlf", "ident", NULL);
 }
 ------------
 
-. Call `git_check_attr()` with the prepared array of `struct git_attr_check`:
+. Call `git_check_attr()` with the prepared `struct git_attr_check`:
 
 ------------
 	const char *path;
 
 	setup_check();
-	git_check_attr(path, ARRAY_SIZE(check), check);
+	git_check_attr(path, check);
 ------------
 
-. Act on `.value` member of the result, left in `check[]`:
+. Act on `.value` member of the result, left in `check->check[]`:
 
 ------------
-	const char *value = check[0].value;
+	const char *value = check->check[0].value;
 
 	if (ATTR_TRUE(value)) {
 		The attribute is Set, by listing only the name of the
@@ -109,20 +116,39 @@ static void setup_check(void)
 	}
 ------------
 
+To see how attributes in argv[] are set for different paths, only
+the first step in the above would be different.
+
+------------
+static struct git_attr_check *check;
+static void setup_check(const char **argv)
+{
+	check = git_attr_check_alloc();
+	while (*argv) {
+		struct git_attr *attr = git_attr(*argv);
+		git_attr_check_append(check, attr);
+		argv++;
+	}
+}
+------------
+
 
 Querying All Attributes
 -----------------------
 
 To get the values of all attributes associated with a file:
 
-* Call `git_all_attrs()`, which returns an array of `git_attr_check`
-  structures.
+* Prepare an empty `git_attr_check` structure by calling
+  `git_attr_check_alloc()`.
+
+* Call `git_all_attrs()`, which populates the `git_attr_check`
+  with the attributes attached to the path.
 
-* Iterate over the `git_attr_check` array to examine the attribute
-  names and values.  The name of the attribute described by a
-  `git_attr_check` object can be retrieved via
-  `git_attr_name(check[i].attr)`.  (Please note that no items will be
-  returned for unset attributes, so `ATTR_UNSET()` will return false
-  for all returned `git_array_check` objects.)
+* Iterate over the `git_attr_check.check[]` array to examine
+  the attribute names and values.  The name of the attribute
+  described by a  `git_attr_check.check[]` object can be retrieved via
+  `git_attr_name(check->check[i].attr)`.  (Please note that no items
+  will be returned for unset attributes, so `ATTR_UNSET()` will return
+  false for all returned `git_array_check` objects.)
 
-* Free the `git_array_check` array.
+* Free the `git_array_check` by calling `git_attr_check_free()`.
diff --git a/attr.c b/attr.c
index 76f0d6b..d427798 100644
--- a/attr.c
+++ b/attr.c
@@ -778,7 +778,8 @@ static void collect_some_attrs(const char *path, int num,
 		rem = fill(path, pathlen, basename_offset, stk, rem);
 }
 
-int git_check_attrs(const char *path, int num, struct git_attr_check_elem *check)
+static int git_check_attrs(const char *path, int num,
+			   struct git_attr_check_elem *check)
 {
 	int i;
 
diff --git a/attr.h b/attr.h
index 0d94077..506db0c 100644
--- a/attr.h
+++ b/attr.h
@@ -52,8 +52,6 @@ extern void git_attr_check_free(struct git_attr_check *);
  */
 extern const char *git_attr_name(const struct git_attr *);
 
-int git_check_attrs(const char *path, int, struct git_attr_check_elem *);
-
 /*
  * Retrieve all attributes that apply to the specified path.
  * check holds the attributes and their values.
-- 
2.10.1.508.g6572022
Previous: Stefan BellerNext: Stefan Beller
Message 13 of 81 in “[PATCHv2 00/36] Revamping the attr subsystem!”
  1. Stefan BellerOct 22, 2016
  2. 01/36 commit.c: use strchrnul() to scan for one lineStefan Beller, Oct 22, 2016
  3. 02/36 attr.c: use strchrnul() to scan for one lineStefan Beller, Oct 22, 2016
  4. 04/36 attr.c: explain the lack of attr-name syntax check in parse_attr()Stefan Beller, Oct 22, 2016
  5. 06/36 attr.c: mark where #if DEBUG ends more clearlyStefan Beller, Oct 22, 2016
  6. 05/36 attr.c: complete a sentence in a commentStefan Beller, Oct 22, 2016
  7. 03/36 attr.c: update a stale comment on "struct match_attr"Stefan Beller, Oct 22, 2016
  8. 09/36 attr.c: plug small leak in parse_attr_line()Stefan Beller, Oct 22, 2016
  9. 07/36 attr.c: simplify macroexpand_one()Stefan Beller, Oct 22, 2016
  10. 10/36 attr: rename function and struct related to checking attributesStefan Beller, Oct 22, 2016
  11. 08/36 attr.c: tighten constness around "git_attr" structureStefan Beller, Oct 22, 2016
  12. 12/36 attr: convert git_all_attrs() to use "struct git_attr_check"Stefan Beller, Oct 22, 2016
  13. 14/36 attr: retire git_check_attrs() APIStefan Beller, Oct 22, 2016
  14. 11/36 attr: (re)introduce git_check_attr() and struct git_attr_checkStefan Beller, Oct 22, 2016
  15. 16/36 attr: add counted string version of git_attr()Stefan Beller, Oct 22, 2016
  16. 17/36 attr: expose validity check for attribute namesStefan Beller, Oct 22, 2016
  17. Ramsay JonesOct 23, 2016
  18. Stefan BellerOct 24, 2016
  19. Stefan BellerOct 27, 2016
  20. attr: expose error reporting function for invalid attribute namesStefan Beller, Oct 26, 2016
  21. 18/36 attr: support quoting pathname patterns in C styleStefan Beller, Oct 22, 2016
  22. 19/36 attr.c: add push_stack() helperStefan Beller, Oct 22, 2016
  23. 21/36 attr.c: rename a local variable checkStefan Beller, Oct 22, 2016
  24. 15/36 attr: add counted string version of git_check_attr()Stefan Beller, Oct 22, 2016
  25. 22/36 attr.c: correct ugly hack for git_all_attrs()Stefan Beller, Oct 22, 2016
  26. 23/36 attr.c: introduce empty_attr_check_elems()Stefan Beller, Oct 22, 2016
  27. 20/36 attr.c: pass struct git_attr_check down the callchainStefan Beller, Oct 22, 2016
  28. 27/36 attr: convert to new threadsafe APIStefan Beller, Oct 22, 2016
  29. Junio C HamanoOct 24, 2016
  30. Stefan BellerOct 24, 2016
  31. Duy NguyenOct 26, 2016
  32. Johannes SchindelinOct 26, 2016
  33. Simon RuderichOct 26, 2016
  34. Jeff KingOct 26, 2016
  35. Stefan BellerOct 26, 2016
  36. Jeff KingOct 26, 2016
  37. Johannes SixtOct 26, 2016
  38. Jeff KingOct 26, 2016
  39. Johannes SixtOct 26, 2016
  40. Stefan BellerOct 26, 2016
  41. 1/2 attr: convert to new threadsafe APIStefan Beller, Oct 26, 2016
  42. Junio C HamanoOct 26, 2016
  43. Stefan BellerOct 27, 2016
  44. Junio C HamanoOct 27, 2016
  45. Stefan BellerOct 27, 2016
  46. Junio C HamanoOct 27, 2016
  47. Junio C HamanoOct 27, 2016
  48. Stefan BellerOct 27, 2016
  49. Junio C HamanoOct 27, 2016
  50. Junio C HamanoOct 27, 2016
  51. attr: convert to new threadsafe APIStefan Beller, Oct 27, 2016
  52. Johannes SchindelinOct 28, 2016
  53. Junio C HamanoOct 28, 2016
  54. Junio C HamanoOct 28, 2016
  55. Johannes SixtOct 28, 2016
  56. Stefan BellerOct 26, 2016
  57. Duy NguyenOct 26, 2016
  58. 26/36 attr: make git_check_attr_counted staticStefan Beller, Oct 22, 2016
  59. 30/36 pathspec: move long magic parsing out of prefix_pathspecStefan Beller, Oct 22, 2016
  60. 31/36 pathspec: move prefix check out of the inner loopStefan Beller, Oct 22, 2016
  61. 29/36 Documentation: fix a typoStefan Beller, Oct 22, 2016
  62. 28/36 attr: keep attr stack for each checkStefan Beller, Oct 22, 2016
  63. Ramsay JonesOct 23, 2016
  64. Stefan BellerOct 26, 2016
  65. Junio C HamanoOct 24, 2016
  66. Stefan BellerOct 24, 2016
  67. Junio C HamanoOct 24, 2016
  68. 25/36 attr.c: outline the future plans by heavily commentingStefan Beller, Oct 22, 2016
  69. 24/36 attr.c: always pass check[] to collect_some_attrs()Stefan Beller, Oct 22, 2016
  70. 36/36 completion: clone can initialize specific submodulesStefan Beller, Oct 22, 2016
  71. 35/36 clone: add --init-submodule=<pathspec> switchStefan Beller, Oct 22, 2016
  72. 34/36 submodule update: add `--init-default-path` switchStefan Beller, Oct 22, 2016
  73. 33/36 pathspec: allow escaped query valuesStefan Beller, Oct 22, 2016
  74. 32/36 pathspec: allow querying for attributesStefan Beller, Oct 22, 2016
  75. Duy NguyenOct 26, 2016
  76. Stefan BellerOct 27, 2016
  77. Junio C HamanoOct 27, 2016
  78. Duy NguyenNov 9, 2016
  79. Stefan BellerNov 9, 2016
  80. Junio C HamanoNov 9, 2016
  81. 13/36 attr: convert git_check_attrs() callers to use the new APIStefan Beller, Oct 22, 2016

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.