1gitattributes API 2================= 3 4gitattributes mechanism gives a uniform way to associate various 5attributes to set of paths. 6 7 8Data Structure 9-------------- 10 11`struct git_attr`:: 12 13 An attribute is an opaque object that is identified by its name. 14 Pass the name to `git_attr()` function to obtain the object of 15 this type. The internal representation of this structure is 16 of no interest to the calling programs. The name of the 17 attribute can be retrieved by calling `git_attr_name()`. 18 19`struct git_attr_check`:: 20 21 This structure represents a set of attributes to check in a call 22 to `git_checkattr()` function, and receives the results. 23 24 25Calling Sequence 26---------------- 27 28* Prepare an array of `struct git_attr_check` to define the list of 29 attributes you would want to check. To populate this array, you would 30 need to define necessary attributes by calling `git_attr()` function. 31 32* Call git_checkattr() to check the attributes for the path. 33 34* Inspect `git_attr_check` structure to see how each of the attribute in 35 the array is defined for the path. 36 37 38Attribute Values 39---------------- 40 41An attribute for a path can be in one of four states: Set, Unset, 42Unspecified or set to a string, and `.value` member of `struct 43git_attr_check` records it. There are three macros to check these: 44 45`ATTR_TRUE()`:: 46 47 Returns true if the attribute is Set for the path. 48 49`ATTR_FALSE()`:: 50 51 Returns true if the attribute is Unset for the path. 52 53`ATTR_UNSET()`:: 54 55 Returns true if the attribute is Unspecified for the path. 56 57If none of the above returns true, `.value` member points at a string 58value of the attribute for the path. 59 60 61Example 62------- 63 64To see how attributes "crlf" and "indent" are set for different paths. 65 66. Prepare an array of `struct git_attr_check` with two elements (because 67 we are checking two attributes). Initialize their `attr` member with 68 pointers to `struct git_attr` obtained by calling `git_attr()`: 69 70------------ 71static struct git_attr_check check[2]; 72static void setup_check(void) 73{ 74 if (check[0].attr) 75 return; /* already done */ 76 check[0].attr = git_attr("crlf"); 77 check[1].attr = git_attr("ident"); 78} 79------------ 80 81. Call `git_checkattr()` with the prepared array of `struct git_attr_check`: 82 83------------ 84 const char *path; 85 86 setup_check(); 87 git_checkattr(path, ARRAY_SIZE(check), check); 88------------ 89 90. Act on `.value` member of the result, left in `check[]`: 91 92------------ 93 const char *value = check[0].value; 94 95 if (ATTR_TRUE(value)) { 96 The attribute is Set, by listing only the name of the 97 attribute in the gitattributes file for the path. 98 } else if (ATTR_FALSE(value)) { 99 The attribute is Unset, by listing the name of the 100 attribute prefixed with a dash - for the path. 101 } else if (ATTR_UNSET(value)) { 102 The attribute is not set nor unset for the path. 103 } else if (!strcmp(value, "input")) { 104 If none of ATTR_TRUE(), ATTR_FALSE(), or ATTR_UNSET() is 105 true, the value is a string set in the gitattributes 106 file for the path by saying "attr=value". 107 } else if (... other check using value as string ...) { 108 ... 109 } 110------------ 111 112(JC)