gitattributes mechanism gives a uniform way to associate various attributes to set of paths.
Data Structure
-
struct git_attr
-
An attribute is an opaque object that is identified by its name. Pass the name to
git_attr()
function to obtain the object of this type. The internal representation of this structure is of no interest to the calling programs. The name of the attribute can be retrieved by callinggit_attr_name()
. -
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.
Attribute Values
An attribute for a path can be in one of four states: Set, Unset,
Unspecified or set to a string, and .value
member of struct
git_attr_check
records it. There are three macros to check these:
-
ATTR_TRUE()
-
Returns true if the attribute is Set for the path.
-
ATTR_FALSE()
-
Returns true if the attribute is Unset for the path.
-
ATTR_UNSET()
-
Returns true if the attribute is Unspecified for the path.
If none of the above returns true, .value
member points at a string
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 callinggit_attr()
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.
Example
To see how attributes "crlf" and "indent" are set for different paths.
-
Prepare an array of
struct git_attr_check
with two elements (because we are checking two attributes). Initialize theirattr
member with pointers tostruct git_attr
obtained by callinggit_attr()
:
static struct git_attr_check check[2];
static void setup_check(void)
{
if (check[0].attr)
return; /* already done */
check[0].attr = git_attr("crlf");
check[1].attr = git_attr("ident");
}
-
Call
git_check_attr()
with the prepared array ofstruct git_attr_check
:
const char *path;
setup_check();
git_check_attr(path, ARRAY_SIZE(check), check);
-
Act on
.value
member of the result, left incheck[]
:
const char *value = check[0].value;
if (ATTR_TRUE(value)) {
The attribute is Set, by listing only the name of the
attribute in the gitattributes file for the path.
} else if (ATTR_FALSE(value)) {
The attribute is Unset, by listing the name of the
attribute prefixed with a dash - for the path.
} else if (ATTR_UNSET(value)) {
The attribute is not set nor unset for the path.
} else if (!strcmp(value, "input")) {
If none of ATTR_TRUE(), ATTR_FALSE(), or ATTR_UNSET() is
true, the value is a string set in the gitattributes
file for the path by saying "attr=value".
} else if (... other check using value as string ...) {
...
}
Querying All Attributes
To get the values of all attributes associated with a file:
-
Call
git_all_attrs()
, which returns an array ofgit_attr_check
structures. -
Iterate over the
git_attr_check
array to examine the attribute names and values. The name of the attribute described by agit_attr_check
object can be retrieved viagit_attr_name(check[i].attr)
. (Please note that no items will be returned for unset attributes, soATTR_UNSET()
will return false for all returnedgit_array_check
objects.) -
Free the
git_array_check
array.