Skip to content

Commit 3a1b341

Browse files
HebaWalygitster
authored andcommitted
attr: move doc to attr.h
Move the documentation from Documentation/technical/api-gitattributes.txt to attr.h as it's easier for the developers to find the usage information beside the code instead of looking for it in another doc file. Also documentation/technical/api-gitattributes.txt is removed because the information it has is now redundant and it'll be hard to keep it up to date and synchronized with the documentation in the header file. Signed-off-by: Heba Waly <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 126c1cc commit 3a1b341

File tree

3 files changed

+135
-163
lines changed

3 files changed

+135
-163
lines changed

Documentation/technical/api-gitattributes.txt

-154
This file was deleted.

attr.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/*
22
* Handle git attributes. See gitattributes(5) for a description of
3-
* the file syntax, and Documentation/technical/api-gitattributes.txt
4-
* for a description of the API.
3+
* the file syntax, and attr.h for a description of the API.
54
*
65
* One basic design decision here is that we are not going to support
76
* an insanely large number of attributes.

attr.h

+134-7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,121 @@
11
#ifndef ATTR_H
22
#define ATTR_H
33

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+
4110
struct index_state;
5111

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+
*/
7119
struct git_attr;
8120

9121
/* opaque structures used internally for attribute collection */
@@ -21,21 +133,36 @@ const struct git_attr *git_attr(const char *);
21133
extern const char git_attr__true[];
22134
extern const char git_attr__false[];
23135

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. */
25147
#define ATTR_TRUE(v) ((v) == git_attr__true)
148+
149+
/* Returns true if the attribute is Unset for the path. */
26150
#define ATTR_FALSE(v) ((v) == git_attr__false)
151+
152+
/* Returns true if the attribute is Unspecified for the path. */
27153
#define ATTR_UNSET(v) ((v) == NULL)
28154

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. */
34156
struct attr_check_item {
35157
const struct git_attr *attr;
36158
const char *value;
37159
};
38160

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+
*/
39166
struct attr_check {
40167
int nr;
41168
int alloc;

0 commit comments

Comments
 (0)