Home
About
Blog
Products
Forum
Support
Contact
Sunbelt Computer Software
PL/B Language Development and Support
Home
About
Blog
Products
Forum
Support
Contact
git/attr.h at master · git/git · GitHub
Skip to content
Navigation Menu
Sign in
Appearance settings
Platform
AI CODE CREATION
GitHub Copilot
Write better code with AI
GitHub Copilot app
Direct agents from issue to merge
MCP Registry
Integrate external tools
DEVELOPER WORKFLOWS
Actions
Automate any workflow
Codespaces
Instant dev environments
Issues
Plan and track work
Code Review
Manage code changes
Code Quality
Enforce quality at merge
APPLICATION SECURITY
GitHub Advanced Security
Find and fix vulnerabilities
Code security
Secure your code as you build
Secret protection
Stop leaks before they start
EXPLORE
Why GitHub
Documentation
Blog
Changelog
Marketplace
View all features
Solutions
BY COMPANY SIZE
Enterprises
Small and medium teams
Startups
Nonprofits
BY USE CASE
App Modernization
DevSecOps
DevOps
CI/CD
View all use cases
BY INDUSTRY
Healthcare
Financial services
Manufacturing
Government
See all industries
View all solutions
Resources
EXPLORE BY TOPIC
AI
Software Development
DevOps
Security
View all topics
EXPLORE BY TYPE
Customer stories
Events & webinars
Ebooks & reports
Business insights
GitHub Skills
SUPPORT & SERVICES
Documentation
Customer support
Community forum
Trust center
Partners
View all resources
Open Source
COMMUNITY
GitHub Sponsors
Fund open source developers
PROGRAMS
Security Lab
Maintainer Community
GitHub Stars
Archive Program
REPOSITORIES
Topics
Trending
Collections
Enterprise
ENTERPRISE SOLUTIONS
Enterprise platform
AI-powered developer platform
AVAILABLE ADD-ONS
GitHub Advanced Security
Enterprise-grade security features
Copilot for Business
Enterprise-grade AI features
Premium Support
Enterprise-grade 24/7 support
Pricing
Search
/
Sign in
Sign up
Appearance settings
You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
Dismiss alert
{{ message }}
git
git
Repository navigation
Code
Pull requests
405
(405)
Actions
Security and quality
32
(32)
Insights
More
items
Files
Expand file tree
master
Breadcrumbs
git
/
attr.h
Copy path
Blame
More file actions
Blame
More file actions
Latest commit
History
History
History
286 lines (252 loc) · 8.09 KB
master
Breadcrumbs
git
/
attr.h
Copy path
Top
File metadata and controls
Code
Blame
286 lines (252 loc) · 8.09 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
#ifndef
ATTR_H
#define
ATTR_H
/**
* gitattributes mechanism gives a uniform way to associate various attributes
* to set of paths.
*
*
* Querying Specific Attributes
* ----------------------------
*
* - Prepare `struct attr_check` using attr_check_initl() function, enumerating
* the names of attributes whose values you are interested in, terminated with
* a NULL pointer. Alternatively, an empty `struct attr_check` can be
* prepared by calling `attr_check_alloc()` function and then attributes you
* want to ask about can be added to it with `attr_check_append()` function.
*
* - Call `git_check_attr()` to check the attributes for the path.
*
* - Inspect `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 "ident" are set for different paths.
*
* - Prepare a `struct attr_check` with two elements (because we are checking
* two attributes):
*
* ------------
* static struct attr_check *check;
* static void setup_check(void)
* {
* if (check)
* return; // already done
* check = attr_check_initl("crlf", "ident", NULL);
* }
* ------------
*
* - Call `git_check_attr()` with the prepared `struct attr_check`:
*
* ------------
* const char *path;
*
* setup_check();
* git_check_attr(&the_index, path, check);
* ------------
*
* - Act on `.value` member of the result, left in `check->items[]`:
*
* ------------
* const char *value = check->items[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 neither 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 ...) {
* ...
* }
* ------------
*
* To see how attributes in argv[] are set for different paths, only
* the first step in the above would be different.
*
* ------------
* static struct attr_check *check;
* static void setup_check(const char **argv)
* {
* check = attr_check_alloc();
* while (*argv) {
* struct git_attr *attr = git_attr(*argv);
* attr_check_append(check, attr);
* argv++;
* }
* }
* ------------
*
*
* Querying All Attributes
* -----------------------
*
* To get the values of all attributes associated with a file:
*
* - Prepare an empty `attr_check` structure by calling `attr_check_alloc()`.
*
* - Call `git_all_attrs()`, which populates the `attr_check` with the
* attributes attached to the path.
*
* - Iterate over the `attr_check.items[]` array to examine the attribute
* names and values. The name of the attribute described by an
* `attr_check.items[]` object can be retrieved via
* `git_attr_name(check->items[i].attr)`. (Please note that no items will be
* returned for unset attributes, so `ATTR_UNSET()` will return false for all
* returned `attr_check.items[]` objects.)
*
* - Free the `attr_check` struct by calling `attr_check_free()`.
*/
/**
* The maximum line length for a gitattributes file. If the line exceeds this
* length we will ignore it.
*/
#define
ATTR_MAX_LINE_LENGTH
2048
/**
* The maximum size of the giattributes file. If the file exceeds this size we
* will ignore it.
*/
#define
ATTR_MAX_FILE_SIZE
(100 * 1024 * 1024)
struct
index_state
;
/**
* 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 calling
* `git_attr_name()`.
*/
struct
git_attr
;
/* opaque structures used internally for attribute collection */
struct
all_attrs_item
;
struct
attr_stack
;
/*
* The textual object name for the tree-ish used by git_check_attr()
* to read attributes from (instead of from the working tree).
*/
void
set_git_attr_source
(
const
char
*
);
/*
* Given a string, return the gitattribute object that
* corresponds to it.
*/
const
struct
git_attr
*
git_attr
(
const
char
*
);
/* Internal use */
extern
const
char
git_attr__true
[];
extern
const
char
git_attr__false
[];
/**
* 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 attr_check_item` records
* it. The three macros check these, if none of them returns true, `.value`
* member points at a string value of the attribute for the path.
*/
/* Returns true if the attribute is Set for the path. */
#define
ATTR_TRUE
(
v
) ((v) == git_attr__true)
/* Returns true if the attribute is Unset for the path. */
#define
ATTR_FALSE
(
v
) ((v) == git_attr__false)
/* Returns true if the attribute is Unspecified for the path. */
#define
ATTR_UNSET
(
v
) ((v) == NULL)
/* This structure represents one attribute and its value. */
struct
attr_check_item
{
const
struct
git_attr
*
attr
;
const
char
*
value
;
};
/**
* This structure represents a collection of `attr_check_item`. It is passed to
* `git_check_attr()` function, specifying the attributes to check, and
* receives their values.
*/
struct
attr_check
{
int
nr
;
int
alloc
;
struct
attr_check_item
*
items
;
int
all_attrs_nr
;
struct
all_attrs_item
*
all_attrs
;
struct
attr_stack
*
stack
;
};
struct
attr_check
*
attr_check_alloc
(
void
);
LAST_ARG_MUST_BE_NULL
struct
attr_check
*
attr_check_initl
(
const
char
*
, ...);
struct
attr_check
*
attr_check_dup
(
const
struct
attr_check
*
check
);
struct
attr_check_item
*
attr_check_append
(
struct
attr_check
*
check
,
const
struct
git_attr
*
attr
);
void
attr_check_reset
(
struct
attr_check
*
check
);
void
attr_check_clear
(
struct
attr_check
*
check
);
void
attr_check_free
(
struct
attr_check
*
check
);
/*
* Return the name of the attribute represented by the argument. The
* return value is a pointer to a null-delimited string that is part
* of the internal data structure; it should not be modified or freed.
*/
const
char
*
git_attr_name
(
const
struct
git_attr
*
);
void
git_check_attr
(
struct
index_state
*
istate
,
const
char
*
path
,
struct
attr_check
*
check
);
/*
* Retrieve all attributes that apply to the specified path.
* check holds the attributes and their values.
*/
void
git_all_attrs
(
struct
index_state
*
istate
,
const
char
*
path
,
struct
attr_check
*
check
);
enum
git_attr_direction
{
GIT_ATTR_CHECKIN
,
GIT_ATTR_CHECKOUT
,
GIT_ATTR_INDEX
};
void
git_attr_set_direction
(
enum
git_attr_direction
new_direction
);
void
attr_start
(
void
);
/* Return the system gitattributes file. */
const
char
*
git_attr_system_file
(
void
);
/* Return the global gitattributes file, if any. */
const
char
*
git_attr_global_file
(
void
);
/* Return whether the system gitattributes file is enabled and should be used. */
int
git_attr_system_is_enabled
(
void
);
extern
char
*
git_attr_tree
;
/*
* Exposed for fuzz-testing only.
*/
/* What does a matched pattern decide? */
struct
attr_state
{
const
struct
git_attr
*
attr
;
const
char
*
setto
;
};
struct
pattern
{
const
char
*
pattern
;
int
patternlen
;
int
nowildcardlen
;
unsigned
flags
;
/* PATTERN_FLAG_* */
};
/*
* One rule, as from a .gitattributes file.
*
* If is_macro is true, then u.attr is a pointer to the git_attr being
* defined.
*
* If is_macro is false, then u.pat is the filename pattern to which the
* rule applies.
*
* In either case, num_attr is the number of attributes affected by
* this rule, and state is an array listing them. The attributes are
* listed as they appear in the file (macros unexpanded).
*/
struct
match_attr
{
union
{
struct
pattern
pat
;
const
struct
git_attr
*
attr
;
}
u
;
char
is_macro
;
size_t
num_attr
;
struct
attr_state
state
[
FLEX_ARRAY
];
};
struct
match_attr
*
parse_attr_line
(
const
char
*
line
,
const
char
*
src
,
int
lineno
,
unsigned
flags
);
#endif
/* ATTR_H */
You can’t perform that action at this time.