1
1
#ifndef ATTR_H
2
2
#define ATTR_H
3
3
4
+ /**
5
+ * gitattributes mechanism gives a uniform way to associate various attributes
6
+ * to set of paths.
7
+ *
8
+ *
9
+ * Querying Specific Attributes
10
+ * ----------------------------
11
+ *
12
+ * - Prepare `struct attr_check` using attr_check_initl() function, enumerating
13
+ * the names of attributes whose values you are interested in, terminated with
14
+ * a NULL pointer. Alternatively, an empty `struct attr_check` can be
15
+ * prepared by calling `attr_check_alloc()` function and then attributes you
16
+ * want to ask about can be added to it with `attr_check_append()` function.
17
+ *
18
+ * - Call `git_check_attr()` to check the attributes for the path.
19
+ *
20
+ * - Inspect `attr_check` structure to see how each of the attribute in the
21
+ * array is defined for the path.
22
+ *
23
+ *
24
+ * Example
25
+ * -------
26
+ *
27
+ * To see how attributes "crlf" and "ident" are set for different paths.
28
+ *
29
+ * - Prepare a `struct attr_check` with two elements (because we are checking
30
+ * two attributes):
31
+ *
32
+ * ------------
33
+ * static struct attr_check *check;
34
+ * static void setup_check(void)
35
+ * {
36
+ * if (check)
37
+ * return; // already done
38
+ * check = attr_check_initl("crlf", "ident", NULL);
39
+ * }
40
+ * ------------
41
+ *
42
+ * - Call `git_check_attr()` with the prepared `struct attr_check`:
43
+ *
44
+ * ------------
45
+ * const char *path;
46
+ *
47
+ * setup_check();
48
+ * git_check_attr(path, check);
49
+ * ------------
50
+ *
51
+ * - Act on `.value` member of the result, left in `check->items[]`:
52
+ *
53
+ * ------------
54
+ * const char *value = check->items[0].value;
55
+ *
56
+ * if (ATTR_TRUE(value)) {
57
+ * The attribute is Set, by listing only the name of the
58
+ * attribute in the gitattributes file for the path.
59
+ * } else if (ATTR_FALSE(value)) {
60
+ * The attribute is Unset, by listing the name of the
61
+ * attribute prefixed with a dash - for the path.
62
+ * } else if (ATTR_UNSET(value)) {
63
+ * The attribute is neither set nor unset for the path.
64
+ * } else if (!strcmp(value, "input")) {
65
+ * If none of ATTR_TRUE(), ATTR_FALSE(), or ATTR_UNSET() is
66
+ * true, the value is a string set in the gitattributes
67
+ * file for the path by saying "attr=value".
68
+ * } else if (... other check using value as string ...) {
69
+ * ...
70
+ * }
71
+ * ------------
72
+ *
73
+ * To see how attributes in argv[] are set for different paths, only
74
+ * the first step in the above would be different.
75
+ *
76
+ * ------------
77
+ * static struct attr_check *check;
78
+ * static void setup_check(const char **argv)
79
+ * {
80
+ * check = attr_check_alloc();
81
+ * while (*argv) {
82
+ * struct git_attr *attr = git_attr(*argv);
83
+ * attr_check_append(check, attr);
84
+ * argv++;
85
+ * }
86
+ * }
87
+ * ------------
88
+ *
89
+ *
90
+ * Querying All Attributes
91
+ * -----------------------
92
+ *
93
+ * To get the values of all attributes associated with a file:
94
+ *
95
+ * - Prepare an empty `attr_check` structure by calling `attr_check_alloc()`.
96
+ *
97
+ * - Call `git_all_attrs()`, which populates the `attr_check` with the
98
+ * attributes attached to the path.
99
+ *
100
+ * - Iterate over the `attr_check.items[]` array to examine the attribute
101
+ * names and values. The name of the attribute described by an
102
+ * `attr_check.items[]` object can be retrieved via
103
+ * `git_attr_name(check->items[i].attr)`. (Please note that no items will be
104
+ * returned for unset attributes, so `ATTR_UNSET()` will return false for all
105
+ * returned `attr_check.items[]` objects.)
106
+ *
107
+ * - Free the `attr_check` struct by calling `attr_check_free()`.
108
+ */
109
+
4
110
struct index_state ;
5
111
6
- /* An attribute is a pointer to this opaque structure */
112
+ /**
113
+ * An attribute is an opaque object that is identified by its name. Pass the
114
+ * name to `git_attr()` function to obtain the object of this type.
115
+ * The internal representation of this structure is of no interest to the
116
+ * calling programs. The name of the attribute can be retrieved by calling
117
+ * `git_attr_name()`.
118
+ */
7
119
struct git_attr ;
8
120
9
121
/* opaque structures used internally for attribute collection */
@@ -21,21 +133,36 @@ const struct git_attr *git_attr(const char *);
21
133
extern const char git_attr__true [];
22
134
extern const char git_attr__false [];
23
135
24
- /* For public to check git_attr_check results */
136
+ /**
137
+ * Attribute Values
138
+ * ----------------
139
+ *
140
+ * An attribute for a path can be in one of four states: Set, Unset, Unspecified
141
+ * or set to a string, and `.value` member of `struct attr_check_item` records
142
+ * it. The three macros check these, if none of them returns true, `.value`
143
+ * member points at a string value of the attribute for the path.
144
+ */
145
+
146
+ /* Returns true if the attribute is Set for the path. */
25
147
#define ATTR_TRUE (v ) ((v) == git_attr__true)
148
+
149
+ /* Returns true if the attribute is Unset for the path. */
26
150
#define ATTR_FALSE (v ) ((v) == git_attr__false)
151
+
152
+ /* Returns true if the attribute is Unspecified for the path. */
27
153
#define ATTR_UNSET (v ) ((v) == NULL)
28
154
29
- /*
30
- * Send one or more git_attr_check to git_check_attrs(), and
31
- * each 'value' member tells what its value is.
32
- * Unset one is returned as NULL.
33
- */
155
+ /* This structure represents one attribute and its value. */
34
156
struct attr_check_item {
35
157
const struct git_attr * attr ;
36
158
const char * value ;
37
159
};
38
160
161
+ /**
162
+ * This structure represents a collection of `attr_check_item`. It is passed to
163
+ * `git_check_attr()` function, specifying the attributes to check, and
164
+ * receives their values.
165
+ */
39
166
struct attr_check {
40
167
int nr ;
41
168
int alloc ;
0 commit comments