blob: c8f6663a61e05b34ef877c4874527e13d5a98651 [file] [log] [blame]
Junio C Hamano3dac5042007-12-15 08:40:541<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4<head>
5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Junio C Hamano4604fe52008-09-19 06:37:106<meta name="generator" content="AsciiDoc 8.2.5" />
Junio C Hamano3dac5042007-12-15 08:40:547<style type="text/css">
8/* Debug borders */
9p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
10/*
11 border: 1px solid red;
12*/
13}
14
15body {
16 margin: 1em 5% 1em 5%;
17}
18
Junio C Hamano4604fe52008-09-19 06:37:1019a {
20 color: blue;
21 text-decoration: underline;
22}
23a:visited {
24 color: fuchsia;
25}
Junio C Hamano3dac5042007-12-15 08:40:5426
27em {
28 font-style: italic;
29}
30
31strong {
32 font-weight: bold;
33}
34
35tt {
36 color: navy;
37}
38
39h1, h2, h3, h4, h5, h6 {
40 color: #527bbd;
41 font-family: sans-serif;
42 margin-top: 1.2em;
43 margin-bottom: 0.5em;
44 line-height: 1.3;
45}
46
Junio C Hamano4604fe52008-09-19 06:37:1047h1, h2, h3 {
Junio C Hamano3dac5042007-12-15 08:40:5448 border-bottom: 2px solid silver;
49}
50h2 {
Junio C Hamano3dac5042007-12-15 08:40:5451 padding-top: 0.5em;
52}
Junio C Hamano4604fe52008-09-19 06:37:1053h3 {
54 float: left;
55}
56h3 + * {
57 clear: left;
58}
Junio C Hamano3dac5042007-12-15 08:40:5459
60div.sectionbody {
61 font-family: serif;
62 margin-left: 0;
63}
64
65hr {
66 border: 1px solid silver;
67}
68
69p {
70 margin-top: 0.5em;
71 margin-bottom: 0.5em;
72}
73
74pre {
75 padding: 0;
76 margin: 0;
77}
78
79span#author {
80 color: #527bbd;
81 font-family: sans-serif;
82 font-weight: bold;
Junio C Hamano4604fe52008-09-19 06:37:1083 font-size: 1.1em;
Junio C Hamano3dac5042007-12-15 08:40:5484}
85span#email {
86}
87span#revision {
88 font-family: sans-serif;
89}
90
91div#footer {
92 font-family: sans-serif;
93 font-size: small;
94 border-top: 2px solid silver;
95 padding-top: 0.5em;
96 margin-top: 4.0em;
97}
98div#footer-text {
99 float: left;
100 padding-bottom: 0.5em;
101}
102div#footer-badges {
103 float: right;
104 padding-bottom: 0.5em;
105}
106
107div#preamble,
108div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
109div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
110div.admonitionblock {
111 margin-right: 10%;
112 margin-top: 1.5em;
113 margin-bottom: 1.5em;
114}
115div.admonitionblock {
116 margin-top: 2.5em;
117 margin-bottom: 2.5em;
118}
119
120div.content { /* Block element content. */
121 padding: 0;
122}
123
124/* Block element titles. */
125div.title, caption.title {
126 font-family: sans-serif;
127 font-weight: bold;
128 text-align: left;
129 margin-top: 1.0em;
130 margin-bottom: 0.5em;
131}
132div.title + * {
133 margin-top: 0;
134}
135
136td div.title:first-child {
137 margin-top: 0.0em;
138}
139div.content div.title:first-child {
140 margin-top: 0.0em;
141}
142div.content + div.title {
143 margin-top: 0.0em;
144}
145
146div.sidebarblock > div.content {
147 background: #ffffee;
148 border: 1px solid silver;
149 padding: 0.5em;
150}
151
Junio C Hamano4604fe52008-09-19 06:37:10152div.listingblock {
153 margin-right: 0%;
154}
Junio C Hamano3dac5042007-12-15 08:40:54155div.listingblock > div.content {
156 border: 1px solid silver;
157 background: #f4f4f4;
158 padding: 0.5em;
159}
160
161div.quoteblock > div.content {
162 padding-left: 2.0em;
163}
Junio C Hamano4604fe52008-09-19 06:37:10164
165div.attribution {
Junio C Hamano3dac5042007-12-15 08:40:54166 text-align: right;
167}
Junio C Hamano4604fe52008-09-19 06:37:10168div.verseblock + div.attribution {
169 text-align: left;
170}
Junio C Hamano3dac5042007-12-15 08:40:54171
172div.admonitionblock .icon {
173 vertical-align: top;
174 font-size: 1.1em;
175 font-weight: bold;
176 text-decoration: underline;
177 color: #527bbd;
178 padding-right: 0.5em;
179}
180div.admonitionblock td.content {
181 padding-left: 0.5em;
182 border-left: 2px solid silver;
183}
184
185div.exampleblock > div.content {
186 border-left: 2px solid silver;
187 padding: 0.5em;
188}
189
190div.verseblock div.content {
191 white-space: pre;
192}
193
194div.imageblock div.content { padding-left: 0; }
195div.imageblock img { border: 1px solid silver; }
196span.image img { border-style: none; }
197
198dl {
199 margin-top: 0.8em;
200 margin-bottom: 0.8em;
201}
202dt {
203 margin-top: 0.5em;
204 margin-bottom: 0;
205 font-style: italic;
206}
207dd > *:first-child {
208 margin-top: 0;
209}
210
211ul, ol {
212 list-style-position: outside;
213}
Junio C Hamano4604fe52008-09-19 06:37:10214div.olist2 ol {
Junio C Hamano3dac5042007-12-15 08:40:54215 list-style-type: lower-alpha;
216}
217
218div.tableblock > table {
Junio C Hamano4604fe52008-09-19 06:37:10219 border: 3px solid #527bbd;
Junio C Hamano3dac5042007-12-15 08:40:54220}
221thead {
222 font-family: sans-serif;
223 font-weight: bold;
224}
225tfoot {
226 font-weight: bold;
227}
228
229div.hlist {
230 margin-top: 0.8em;
231 margin-bottom: 0.8em;
232}
Junio C Hamano4604fe52008-09-19 06:37:10233div.hlist td {
234 padding-bottom: 5px;
235}
Junio C Hamano3dac5042007-12-15 08:40:54236td.hlist1 {
237 vertical-align: top;
238 font-style: italic;
239 padding-right: 0.8em;
240}
241td.hlist2 {
242 vertical-align: top;
243}
244
245@media print {
246 div#footer-badges { display: none; }
247}
Junio C Hamano4604fe52008-09-19 06:37:10248
249div#toctitle {
250 color: #527bbd;
251 font-family: sans-serif;
252 font-size: 1.1em;
253 font-weight: bold;
254 margin-top: 1.0em;
255 margin-bottom: 0.1em;
256}
257
258div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
259 margin-top: 0;
260 margin-bottom: 0;
261}
262div.toclevel2 {
263 margin-left: 2em;
264 font-size: 0.9em;
265}
266div.toclevel3 {
267 margin-left: 4em;
268 font-size: 0.9em;
269}
270div.toclevel4 {
271 margin-left: 6em;
272 font-size: 0.9em;
273}
Junio C Hamano3dac5042007-12-15 08:40:54274/* Workarounds for IE6's broken and incomplete CSS2. */
275
276div.sidebar-content {
277 background: #ffffee;
278 border: 1px solid silver;
279 padding: 0.5em;
280}
281div.sidebar-title, div.image-title {
282 font-family: sans-serif;
283 font-weight: bold;
284 margin-top: 0.0em;
285 margin-bottom: 0.5em;
286}
287
288div.listingblock div.content {
289 border: 1px solid silver;
290 background: #f4f4f4;
291 padding: 0.5em;
292}
293
294div.quoteblock-content {
295 padding-left: 2.0em;
296}
297
298div.exampleblock-content {
299 border-left: 2px solid silver;
300 padding-left: 0.5em;
301}
Junio C Hamano4604fe52008-09-19 06:37:10302
303/* IE6 sets dynamically generated links as visited. */
304div#toc a:visited { color: blue; }
Junio C Hamano3dac5042007-12-15 08:40:54305</style>
306<title>gitattributes API</title>
307</head>
308<body>
309<div id="header">
310<h1>gitattributes API</h1>
311</div>
312<div id="preamble">
313<div class="sectionbody">
Junio C Hamano4604fe52008-09-19 06:37:10314<div class="para"><p>gitattributes mechanism gives a uniform way to associate various
315attributes to set of paths.</p></div>
Junio C Hamano3dac5042007-12-15 08:40:54316</div>
317</div>
Junio C Hamano4604fe52008-09-19 06:37:10318<h2 id="_data_structure">Data Structure</h2>
Junio C Hamano3dac5042007-12-15 08:40:54319<div class="sectionbody">
Junio C Hamano4604fe52008-09-19 06:37:10320<div class="vlist"><dl>
Junio C Hamano3dac5042007-12-15 08:40:54321<dt>
322<tt>struct git_attr</tt>
323</dt>
324<dd>
325<p>
326 An attribute is an opaque object that is identified by its name.
327 Pass the name and its length to <tt>git_attr()</tt> function to obtain
328 the object of this type. The internal representation of this
329 structure is of no interest to the calling programs.
330</p>
331</dd>
332<dt>
333<tt>struct git_attr_check</tt>
334</dt>
335<dd>
336<p>
337 This structure represents a set of attributes to check in a call
338 to <tt>git_checkattr()</tt> function, and receives the results.
339</p>
340</dd>
Junio C Hamano4604fe52008-09-19 06:37:10341</dl></div>
Junio C Hamano3dac5042007-12-15 08:40:54342</div>
Junio C Hamano4604fe52008-09-19 06:37:10343<h2 id="_calling_sequence">Calling Sequence</h2>
Junio C Hamano3dac5042007-12-15 08:40:54344<div class="sectionbody">
Junio C Hamano4604fe52008-09-19 06:37:10345<div class="ilist"><ul>
Junio C Hamano3dac5042007-12-15 08:40:54346<li>
347<p>
348Prepare an array of <tt>struct git_attr_check</tt> to define the list of
349 attributes you would want to check. To populate this array, you would
350 need to define necessary attributes by calling <tt>git_attr()</tt> function.
351</p>
352</li>
353<li>
354<p>
355Call git_checkattr() to check the attributes for the path.
356</p>
357</li>
358<li>
359<p>
360Inspect <tt>git_attr_check</tt> structure to see how each of the attribute in
361 the array is defined for the path.
362</p>
363</li>
Junio C Hamano4604fe52008-09-19 06:37:10364</ul></div>
Junio C Hamano3dac5042007-12-15 08:40:54365</div>
Junio C Hamano4604fe52008-09-19 06:37:10366<h2 id="_attribute_values">Attribute Values</h2>
Junio C Hamano3dac5042007-12-15 08:40:54367<div class="sectionbody">
Junio C Hamano4604fe52008-09-19 06:37:10368<div class="para"><p>An attribute for a path can be in one of four states: Set, Unset,
Junio C Hamano3dac5042007-12-15 08:40:54369Unspecified or set to a string, and <tt>.value</tt> member of <tt>struct
Junio C Hamano4604fe52008-09-19 06:37:10370git_attr_check</tt> records it. There are three macros to check these:</p></div>
371<div class="vlist"><dl>
Junio C Hamano3dac5042007-12-15 08:40:54372<dt>
373<tt>ATTR_TRUE()</tt>
374</dt>
375<dd>
376<p>
377 Returns true if the attribute is Set for the path.
378</p>
379</dd>
380<dt>
381<tt>ATTR_FALSE()</tt>
382</dt>
383<dd>
384<p>
385 Returns true if the attribute is Unset for the path.
386</p>
387</dd>
388<dt>
389<tt>ATTR_UNSET()</tt>
390</dt>
391<dd>
392<p>
393 Returns true if the attribute is Unspecified for the path.
394</p>
395</dd>
Junio C Hamano4604fe52008-09-19 06:37:10396</dl></div>
397<div class="para"><p>If none of the above returns true, <tt>.value</tt> member points at a string
398value of the attribute for the path.</p></div>
Junio C Hamano3dac5042007-12-15 08:40:54399</div>
Junio C Hamano4604fe52008-09-19 06:37:10400<h2 id="_example">Example</h2>
Junio C Hamano3dac5042007-12-15 08:40:54401<div class="sectionbody">
Junio C Hamano4604fe52008-09-19 06:37:10402<div class="para"><p>To see how attributes "crlf" and "indent" are set for different paths.</p></div>
403<div class="olist"><ol>
Junio C Hamano3dac5042007-12-15 08:40:54404<li>
405<p>
406Prepare an array of <tt>struct git_attr_check</tt> with two elements (because
407 we are checking two attributes). Initialize their <tt>attr</tt> member with
408 pointers to <tt>struct git_attr</tt> obtained by calling <tt>git_attr()</tt>:
409</p>
410</li>
Junio C Hamano4604fe52008-09-19 06:37:10411</ol></div>
Junio C Hamano3dac5042007-12-15 08:40:54412<div class="listingblock">
413<div class="content">
414<pre><tt>static struct git_attr_check check[2];
415static void setup_check(void)
416{
417 if (check[0].attr)
418 return; /* already done */
419 check[0].attr = git_attr("crlf", 4);
420 check[1].attr = git_attr("ident", 5);
421}</tt></pre>
422</div></div>
Junio C Hamano4604fe52008-09-19 06:37:10423<div class="olist"><ol>
Junio C Hamano3dac5042007-12-15 08:40:54424<li>
425<p>
426Call <tt>git_checkattr()</tt> with the prepared array of <tt>struct git_attr_check</tt>:
427</p>
428</li>
Junio C Hamano4604fe52008-09-19 06:37:10429</ol></div>
Junio C Hamano3dac5042007-12-15 08:40:54430<div class="listingblock">
431<div class="content">
432<pre><tt> const char *path;
433
434 setup_check();
435 git_checkattr(path, ARRAY_SIZE(check), check);</tt></pre>
436</div></div>
Junio C Hamano4604fe52008-09-19 06:37:10437<div class="olist"><ol>
Junio C Hamano3dac5042007-12-15 08:40:54438<li>
439<p>
440Act on <tt>.value</tt> member of the result, left in <tt>check[]</tt>:
441</p>
442</li>
Junio C Hamano4604fe52008-09-19 06:37:10443</ol></div>
Junio C Hamano3dac5042007-12-15 08:40:54444<div class="listingblock">
445<div class="content">
446<pre><tt> const char *value = check[0].value;
447
448 if (ATTR_TRUE(value)) {
449 The attribute is Set, by listing only the name of the
450 attribute in the gitattributes file for the path.
451 } else if (ATTR_FALSE(value)) {
452 The attribute is Unset, by listing the name of the
453 attribute prefixed with a dash - for the path.
454 } else if (ATTR_UNSET(value)) {
455 The attribute is not set nor unset for the path.
456 } else if (!strcmp(value, "input")) {
457 If none of ATTR_TRUE(), ATTR_FALSE(), or ATTR_UNSET() is
458 true, the value is a string set in the gitattributes
459 file for the path by saying "attr=value".
460 } else if (... other check using value as string ...) {
461 ...
462 }</tt></pre>
463</div></div>
Junio C Hamano4604fe52008-09-19 06:37:10464<div class="para"><p>(JC)</p></div>
Junio C Hamano3dac5042007-12-15 08:40:54465</div>
466<div id="footer">
467<div id="footer-text">
Junio C Hamanodca34822010-02-13 01:02:52468Last updated 2010-02-13 01:00:08 UTC
Junio C Hamano3dac5042007-12-15 08:40:54469</div>
470</div>
471</body>
472</html>