1 <!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">
5 <meta http-equiv=
"Content-Type" content=
"text/html; charset=UTF-8" />
6 <meta name=
"generator" content=
"AsciiDoc 8.4.5" />
7 <title>gitattributes API
</title>
8 <style type=
"text/css">
10 p
, li
, dt
, dd
, div
, pre
, h1
, h2
, h3
, h4
, h5
, h6
{
12 border: 1px solid red;
17 margin: 1em 5% 1em 5%;
22 text-decoration: underline
;
42 h1
, h2
, h3
, h4
, h5
, h6
{
44 font-family: sans-serif
;
51 border-bottom: 2px solid silver
;
69 border: 1px solid silver
;
88 font-family: sans-serif
;
94 span#revnumber
, span#revdate
, span#revremark
{
95 font-family: sans-serif
;
99 font-family: sans-serif
;
101 border-top: 2px solid silver
;
107 padding-bottom: 0.5em;
111 padding-bottom: 0.5em;
116 margin-bottom: 1.5em;
118 div
.tableblock
, div
.imageblock
, div
.exampleblock
, div
.verseblock
,
119 div
.quoteblock
, div
.literalblock
, div
.listingblock
, div
.sidebarblock
,
120 div
.admonitionblock
{
122 margin-bottom: 1.5em;
124 div
.admonitionblock
{
126 margin-bottom: 2.5em;
129 div
.content
{ /* Block element content. */
133 /* Block element titles. */
134 div
.title
, caption
.title
{
136 font-family: sans-serif
;
140 margin-bottom: 0.5em;
146 td div
.title:first-child
{
149 div
.content div
.title:first-child
{
152 div
.content
+ div
.title
{
156 div
.sidebarblock
> div
.content
{
158 border: 1px solid silver
;
162 div
.listingblock
> div
.content
{
163 border: 1px solid silver
;
172 div
.quoteblock
> div
.attribution
{
181 div
.verseblock
> div
.content
{
184 div
.verseblock
> div
.attribution
{
188 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
189 div
.verseblock
+ div
.attribution
{
193 div
.admonitionblock
.icon
{
197 text-decoration: underline
;
199 padding-right: 0.5em;
201 div
.admonitionblock td
.content
{
203 border-left: 2px solid silver
;
206 div
.exampleblock
> div
.content
{
207 border-left: 2px solid silver
;
211 div
.imageblock div
.content
{ padding-left: 0; }
212 span
.image img
{ border-style: none
; }
213 a
.image:visited
{ color: white
; }
217 margin-bottom: 0.8em;
230 list-style-position: outside
;
233 list-style-type: decimal
;
236 list-style-type: lower-alpha
;
239 list-style-type: upper-alpha
;
242 list-style-type: lower-roman
;
245 list-style-type: upper-roman
;
248 div
.compact ul
, div
.compact ol
,
249 div
.compact p
, div
.compact p
,
250 div
.compact div
, div
.compact div
{
252 margin-bottom: 0.1em;
255 div
.tableblock
> table
{
256 border: 3px solid
#527bbd;
259 font-family: sans-serif
;
271 /* Because the table frame attribute is overriden by CSS in most browsers. */
272 div
.tableblock
> table
[frame
="void"] {
275 div
.tableblock
> table
[frame
="hsides"] {
276 border-left-style: none
;
277 border-right-style: none
;
279 div
.tableblock
> table
[frame
="vsides"] {
280 border-top-style: none
;
281 border-bottom-style: none
;
287 margin-bottom: 0.8em;
290 padding-bottom: 15px;
292 dt
.hdlist1
.strong
, td
.hdlist1
.strong
{
298 padding-right: 0.8em;
304 div
.hdlist
.compact tr
{
314 div#footer-badges
{ display: none
; }
319 font-family: sans-serif
;
323 margin-bottom: 0.1em;
326 div
.toclevel1
, div
.toclevel2
, div
.toclevel3
, div
.toclevel4
{
342 /* Workarounds for IE6's broken and incomplete CSS2. */
344 div
.sidebar-content
{
346 border: 1px solid silver
;
349 div
.sidebar-title
, div
.image-title
{
351 font-family: sans-serif
;
354 margin-bottom: 0.5em;
357 div
.listingblock div
.content
{
358 border: 1px solid silver
;
363 div
.quoteblock-attribution
{
368 div
.verseblock-content
{
371 div
.verseblock-attribution
{
376 div
.exampleblock-content
{
377 border-left: 2px solid silver
;
381 /* IE6 sets dynamically generated links as visited. */
382 div#toc
a:visited
{ color: blue
; }
387 <h1>gitattributes API
</h1>
390 <div class=
"sectionbody">
391 <div class=
"paragraph"><p>gitattributes mechanism gives a uniform way to associate various
392 attributes to set of paths.
</p></div>
395 <h2 id=
"_data_structure">Data Structure
</h2>
396 <div class=
"sectionbody">
397 <div class=
"dlist"><dl>
399 <tt>struct git_attr
</tt>
403 An attribute is an opaque object that is identified by its name.
404 Pass the name and its length to
<tt>git_attr()
</tt> function to obtain
405 the object of this type. The internal representation of this
406 structure is of no interest to the calling programs.
410 <tt>struct git_attr_check
</tt>
414 This structure represents a set of attributes to check in a call
415 to
<tt>git_checkattr()
</tt> function, and receives the results.
420 <h2 id=
"_calling_sequence">Calling Sequence
</h2>
421 <div class=
"sectionbody">
422 <div class=
"ulist"><ul>
425 Prepare an array of
<tt>struct git_attr_check
</tt> to define the list of
426 attributes you would want to check. To populate this array, you would
427 need to define necessary attributes by calling
<tt>git_attr()
</tt> function.
432 Call git_checkattr() to check the attributes for the path.
437 Inspect
<tt>git_attr_check
</tt> structure to see how each of the attribute in
438 the array is defined for the path.
443 <h2 id=
"_attribute_values">Attribute Values
</h2>
444 <div class=
"sectionbody">
445 <div class=
"paragraph"><p>An attribute for a path can be in one of four states: Set, Unset,
446 Unspecified or set to a string, and
<tt>.value
</tt> member of
<tt>struct
447 git_attr_check
</tt> records it. There are three macros to check these:
</p></div>
448 <div class=
"dlist"><dl>
454 Returns true if the attribute is Set for the path.
458 <tt>ATTR_FALSE()
</tt>
462 Returns true if the attribute is Unset for the path.
466 <tt>ATTR_UNSET()
</tt>
470 Returns true if the attribute is Unspecified for the path.
474 <div class=
"paragraph"><p>If none of the above returns true,
<tt>.value
</tt> member points at a string
475 value of the attribute for the path.
</p></div>
477 <h2 id=
"_example">Example
</h2>
478 <div class=
"sectionbody">
479 <div class=
"paragraph"><p>To see how attributes
"crlf" and
"indent" are set for different paths.
</p></div>
480 <div class=
"olist arabic"><ol class=
"arabic">
483 Prepare an array of
<tt>struct git_attr_check
</tt> with two elements (because
484 we are checking two attributes). Initialize their
<tt>attr
</tt> member with
485 pointers to
<tt>struct git_attr
</tt> obtained by calling
<tt>git_attr()
</tt>:
489 <div class=
"listingblock">
490 <div class=
"content">
491 <pre><tt>static struct git_attr_check check[
2];
492 static void setup_check(void)
495 return; /* already done */
496 check[
0].attr = git_attr(
"crlf",
4);
497 check[
1].attr = git_attr(
"ident",
5);
500 <div class=
"olist arabic"><ol class=
"arabic">
503 Call
<tt>git_checkattr()
</tt> with the prepared array of
<tt>struct git_attr_check
</tt>:
507 <div class=
"listingblock">
508 <div class=
"content">
509 <pre><tt> const char *path;
512 git_checkattr(path, ARRAY_SIZE(check), check);
</tt></pre>
514 <div class=
"olist arabic"><ol class=
"arabic">
517 Act on
<tt>.value
</tt> member of the result, left in
<tt>check[]
</tt>:
521 <div class=
"listingblock">
522 <div class=
"content">
523 <pre><tt> const char *value = check[
0].value;
525 if (ATTR_TRUE(value)) {
526 The attribute is Set, by listing only the name of the
527 attribute in the gitattributes file for the path.
528 } else if (ATTR_FALSE(value)) {
529 The attribute is Unset, by listing the name of the
530 attribute prefixed with a dash - for the path.
531 } else if (ATTR_UNSET(value)) {
532 The attribute is not set nor unset for the path.
533 } else if (!strcmp(value,
"input")) {
534 If none of ATTR_TRUE(), ATTR_FALSE(), or ATTR_UNSET() is
535 true, the value is a string set in the gitattributes
536 file for the path by saying
"attr=value".
537 } else if (... other check using value as string ...) {
541 <div class=
"paragraph"><p>(JC)
</p></div>
544 <div id=
"footer-text">
545 Last updated
2008-
09-
19 06:
28:
28 UTC