blob: 2b90a6c5e891cf72056c8834652c9508b31bbc2d [file] [log] [blame]
Junio C Hamanoe0238c22012-02-23 22:45:501<!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" />
6<meta name="generator" content="AsciiDoc 8.5.2" />
7<title>config API</title>
8<style type="text/css">
9/* Debug borders */
10p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
11/*
12 border: 1px solid red;
13*/
14}
15
16body {
17 margin: 1em 5% 1em 5%;
18}
19
20a {
21 color: blue;
22 text-decoration: underline;
23}
24a:visited {
25 color: fuchsia;
26}
27
28em {
29 font-style: italic;
30 color: navy;
31}
32
33strong {
34 font-weight: bold;
35 color: #083194;
36}
37
38tt {
39 color: navy;
40}
41
42h1, h2, h3, h4, h5, h6 {
43 color: #527bbd;
44 font-family: sans-serif;
45 margin-top: 1.2em;
46 margin-bottom: 0.5em;
47 line-height: 1.3;
48}
49
50h1, h2, h3 {
51 border-bottom: 2px solid silver;
52}
53h2 {
54 padding-top: 0.5em;
55}
56h3 {
57 float: left;
58}
59h3 + * {
60 clear: left;
61}
62
63div.sectionbody {
64 font-family: serif;
65 margin-left: 0;
66}
67
68hr {
69 border: 1px solid silver;
70}
71
72p {
73 margin-top: 0.5em;
74 margin-bottom: 0.5em;
75}
76
77ul, ol, li > p {
78 margin-top: 0;
79}
80
81pre {
82 padding: 0;
83 margin: 0;
84}
85
86span#author {
87 color: #527bbd;
88 font-family: sans-serif;
89 font-weight: bold;
90 font-size: 1.1em;
91}
92span#email {
93}
94span#revnumber, span#revdate, span#revremark {
95 font-family: sans-serif;
96}
97
98div#footer {
99 font-family: sans-serif;
100 font-size: small;
101 border-top: 2px solid silver;
102 padding-top: 0.5em;
103 margin-top: 4.0em;
104}
105div#footer-text {
106 float: left;
107 padding-bottom: 0.5em;
108}
109div#footer-badges {
110 float: right;
111 padding-bottom: 0.5em;
112}
113
114div#preamble {
115 margin-top: 1.5em;
116 margin-bottom: 1.5em;
117}
118div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
119div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
120div.admonitionblock {
121 margin-top: 1.0em;
122 margin-bottom: 1.5em;
123}
124div.admonitionblock {
125 margin-top: 2.0em;
126 margin-bottom: 2.0em;
127 margin-right: 10%;
128 color: #606060;
129}
130
131div.content { /* Block element content. */
132 padding: 0;
133}
134
135/* Block element titles. */
136div.title, caption.title {
137 color: #527bbd;
138 font-family: sans-serif;
139 font-weight: bold;
140 text-align: left;
141 margin-top: 1.0em;
142 margin-bottom: 0.5em;
143}
144div.title + * {
145 margin-top: 0;
146}
147
148td div.title:first-child {
149 margin-top: 0.0em;
150}
151div.content div.title:first-child {
152 margin-top: 0.0em;
153}
154div.content + div.title {
155 margin-top: 0.0em;
156}
157
158div.sidebarblock > div.content {
159 background: #ffffee;
160 border: 1px solid silver;
161 padding: 0.5em;
162}
163
164div.listingblock > div.content {
165 border: 1px solid silver;
166 background: #f4f4f4;
167 padding: 0.5em;
168}
169
170div.quoteblock, div.verseblock {
171 padding-left: 1.0em;
172 margin-left: 1.0em;
173 margin-right: 10%;
174 border-left: 5px solid #dddddd;
175 color: #777777;
176}
177
178div.quoteblock > div.attribution {
179 padding-top: 0.5em;
180 text-align: right;
181}
182
183div.verseblock > div.content {
184 white-space: pre;
185}
186div.verseblock > div.attribution {
187 padding-top: 0.75em;
188 text-align: left;
189}
190/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
191div.verseblock + div.attribution {
192 text-align: left;
193}
194
195div.admonitionblock .icon {
196 vertical-align: top;
197 font-size: 1.1em;
198 font-weight: bold;
199 text-decoration: underline;
200 color: #527bbd;
201 padding-right: 0.5em;
202}
203div.admonitionblock td.content {
204 padding-left: 0.5em;
205 border-left: 3px solid #dddddd;
206}
207
208div.exampleblock > div.content {
209 border-left: 3px solid #dddddd;
210 padding-left: 0.5em;
211}
212
213div.imageblock div.content { padding-left: 0; }
214span.image img { border-style: none; }
215a.image:visited { color: white; }
216
217dl {
218 margin-top: 0.8em;
219 margin-bottom: 0.8em;
220}
221dt {
222 margin-top: 0.5em;
223 margin-bottom: 0;
224 font-style: normal;
225 color: navy;
226}
227dd > *:first-child {
228 margin-top: 0.1em;
229}
230
231ul, ol {
232 list-style-position: outside;
233}
234ol.arabic {
235 list-style-type: decimal;
236}
237ol.loweralpha {
238 list-style-type: lower-alpha;
239}
240ol.upperalpha {
241 list-style-type: upper-alpha;
242}
243ol.lowerroman {
244 list-style-type: lower-roman;
245}
246ol.upperroman {
247 list-style-type: upper-roman;
248}
249
250div.compact ul, div.compact ol,
251div.compact p, div.compact p,
252div.compact div, div.compact div {
253 margin-top: 0.1em;
254 margin-bottom: 0.1em;
255}
256
257div.tableblock > table {
258 border: 3px solid #527bbd;
259}
260thead, p.table.header {
261 font-family: sans-serif;
262 font-weight: bold;
263}
264tfoot {
265 font-weight: bold;
266}
267td > div.verse {
268 white-space: pre;
269}
270p.table {
271 margin-top: 0;
272}
273/* Because the table frame attribute is overriden by CSS in most browsers. */
274div.tableblock > table[frame="void"] {
275 border-style: none;
276}
277div.tableblock > table[frame="hsides"] {
278 border-left-style: none;
279 border-right-style: none;
280}
281div.tableblock > table[frame="vsides"] {
282 border-top-style: none;
283 border-bottom-style: none;
284}
285
286
287div.hdlist {
288 margin-top: 0.8em;
289 margin-bottom: 0.8em;
290}
291div.hdlist tr {
292 padding-bottom: 15px;
293}
294dt.hdlist1.strong, td.hdlist1.strong {
295 font-weight: bold;
296}
297td.hdlist1 {
298 vertical-align: top;
299 font-style: normal;
300 padding-right: 0.8em;
301 color: navy;
302}
303td.hdlist2 {
304 vertical-align: top;
305}
306div.hdlist.compact tr {
307 margin: 0;
308 padding-bottom: 0;
309}
310
311.comment {
312 background: yellow;
313}
314
315.footnote, .footnoteref {
316 font-size: 0.8em;
317}
318
319span.footnote, span.footnoteref {
320 vertical-align: super;
321}
322
323#footnotes {
324 margin: 20px 0 20px 0;
325 padding: 7px 0 0 0;
326}
327
328#footnotes div.footnote {
329 margin: 0 0 5px 0;
330}
331
332#footnotes hr {
333 border: none;
334 border-top: 1px solid silver;
335 height: 1px;
336 text-align: left;
337 margin-left: 0;
338 width: 20%;
339 min-width: 100px;
340}
341
342
343@media print {
344 div#footer-badges { display: none; }
345}
346
347div#toc {
348 margin-bottom: 2.5em;
349}
350
351div#toctitle {
352 color: #527bbd;
353 font-family: sans-serif;
354 font-size: 1.1em;
355 font-weight: bold;
356 margin-top: 1.0em;
357 margin-bottom: 0.1em;
358}
359
360div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
361 margin-top: 0;
362 margin-bottom: 0;
363}
364div.toclevel2 {
365 margin-left: 2em;
366 font-size: 0.9em;
367}
368div.toclevel3 {
369 margin-left: 4em;
370 font-size: 0.9em;
371}
372div.toclevel4 {
373 margin-left: 6em;
374 font-size: 0.9em;
375}
376/* Workarounds for IE6's broken and incomplete CSS2. */
377
378div.sidebar-content {
379 background: #ffffee;
380 border: 1px solid silver;
381 padding: 0.5em;
382}
383div.sidebar-title, div.image-title {
384 color: #527bbd;
385 font-family: sans-serif;
386 font-weight: bold;
387 margin-top: 0.0em;
388 margin-bottom: 0.5em;
389}
390
391div.listingblock div.content {
392 border: 1px solid silver;
393 background: #f4f4f4;
394 padding: 0.5em;
395}
396
397div.quoteblock-attribution {
398 padding-top: 0.5em;
399 text-align: right;
400}
401
402div.verseblock-content {
403 white-space: pre;
404}
405div.verseblock-attribution {
406 padding-top: 0.75em;
407 text-align: left;
408}
409
410div.exampleblock-content {
411 border-left: 3px solid #dddddd;
412 padding-left: 0.5em;
413}
414
415/* IE6 sets dynamically generated links as visited. */
416div#toc a:visited { color: blue; }
417</style>
418<script type="text/javascript">
419/*<![CDATA[*/
420window.onload = function(){asciidoc.footnotes();}
421var asciidoc = { // Namespace.
422
423/////////////////////////////////////////////////////////////////////
424// Table Of Contents generator
425/////////////////////////////////////////////////////////////////////
426
427/* Author: Mihai Bazon, September 2002
428 * http://students.infoiasi.ro/~mishoo
429 *
430 * Table Of Content generator
431 * Version: 0.4
432 *
433 * Feel free to use this script under the terms of the GNU General Public
434 * License, as long as you do not remove or alter this notice.
435 */
436
437 /* modified by Troy D. Hanson, September 2006. License: GPL */
438 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
439
440// toclevels = 1..4.
441toc: function (toclevels) {
442
443 function getText(el) {
444 var text = "";
445 for (var i = el.firstChild; i != null; i = i.nextSibling) {
446 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
447 text += i.data;
448 else if (i.firstChild != null)
449 text += getText(i);
450 }
451 return text;
452 }
453
454 function TocEntry(el, text, toclevel) {
455 this.element = el;
456 this.text = text;
457 this.toclevel = toclevel;
458 }
459
460 function tocEntries(el, toclevels) {
461 var result = new Array;
462 var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
463 // Function that scans the DOM tree for header elements (the DOM2
464 // nodeIterator API would be a better technique but not supported by all
465 // browsers).
466 var iterate = function (el) {
467 for (var i = el.firstChild; i != null; i = i.nextSibling) {
468 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
469 var mo = re.exec(i.tagName);
470 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
471 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
472 }
473 iterate(i);
474 }
475 }
476 }
477 iterate(el);
478 return result;
479 }
480
481 var toc = document.getElementById("toc");
482 var entries = tocEntries(document.getElementById("content"), toclevels);
483 for (var i = 0; i < entries.length; ++i) {
484 var entry = entries[i];
485 if (entry.element.id == "")
486 entry.element.id = "_toc_" + i;
487 var a = document.createElement("a");
488 a.href = "#" + entry.element.id;
489 a.appendChild(document.createTextNode(entry.text));
490 var div = document.createElement("div");
491 div.appendChild(a);
492 div.className = "toclevel" + entry.toclevel;
493 toc.appendChild(div);
494 }
495 if (entries.length == 0)
496 toc.parentNode.removeChild(toc);
497},
498
499
500/////////////////////////////////////////////////////////////////////
501// Footnotes generator
502/////////////////////////////////////////////////////////////////////
503
504/* Based on footnote generation code from:
505 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
506 */
507
508footnotes: function () {
509 var cont = document.getElementById("content");
510 var noteholder = document.getElementById("footnotes");
511 var spans = cont.getElementsByTagName("span");
512 var refs = {};
513 var n = 0;
514 for (i=0; i<spans.length; i++) {
515 if (spans[i].className == "footnote") {
516 n++;
517 // Use [\s\S] in place of . so multi-line matches work.
518 // Because JavaScript has no s (dotall) regex flag.
519 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
520 noteholder.innerHTML +=
521 "<div class='footnote' id='_footnote_" + n + "'>" +
522 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
523 n + "</a>. " + note + "</div>";
524 spans[i].innerHTML =
525 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
526 "' title='View footnote' class='footnote'>" + n + "</a>]";
527 var id =spans[i].getAttribute("id");
528 if (id != null) refs["#"+id] = n;
529 }
530 }
531 if (n == 0)
532 noteholder.parentNode.removeChild(noteholder);
533 else {
534 // Process footnoterefs.
535 for (i=0; i<spans.length; i++) {
536 if (spans[i].className == "footnoteref") {
537 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
538 href = href.match(/#.*/)[0]; // Because IE return full URL.
539 n = refs[href];
540 spans[i].innerHTML =
541 "[<a href='#_footnote_" + n +
542 "' title='View footnote' class='footnote'>" + n + "</a>]";
543 }
544 }
545 }
546}
547
548}
549/*]]>*/
550</script>
551</head>
552<body>
553<div id="header">
554<h1>config API</h1>
555</div>
556<div id="content">
557<div id="preamble">
558<div class="sectionbody">
559<div class="paragraph"><p>The config API gives callers a way to access git configuration files
Junio C Hamano719b8a32012-06-08 18:40:53560(and files which have the same syntax). See <a href="../git-config.html">git-config(1)</a> for a
Junio C Hamanoe0238c22012-02-23 22:45:50561discussion of the config file syntax.</p></div>
562</div>
563</div>
564<h2 id="_general_usage">General Usage</h2>
565<div class="sectionbody">
566<div class="paragraph"><p>Config files are parsed linearly, and each variable found is passed to a
567caller-provided callback function. The callback function is responsible
568for any actions to be taken on the config option, and is free to ignore
569some options. It is not uncommon for the configuration to be parsed
570several times during the run of a git program, with different callbacks
571picking out different variables useful to themselves.</p></div>
572<div class="paragraph"><p>A config callback function takes three parameters:</p></div>
573<div class="ulist"><ul>
574<li>
575<p>
576the name of the parsed variable. This is in canonical "flat" form: the
577 section, subsection, and variable segments will be separated by dots,
578 and the section and variable segments will be all lowercase. E.g.,
579 <tt>core.ignorecase</tt>, <tt>diff.SomeType.textconv</tt>.
580</p>
581</li>
582<li>
583<p>
584the value of the found variable, as a string. If the variable had no
585 value specified, the value will be NULL (typically this means it
586 should be interpreted as boolean true).
587</p>
588</li>
589<li>
590<p>
591a void pointer passed in by the caller of the config API; this can
592 contain callback-specific data
593</p>
594</li>
595</ul></div>
596<div class="paragraph"><p>A config callback should return 0 for success, or -1 if the variable
597could not be parsed properly.</p></div>
598</div>
599<h2 id="_basic_config_querying">Basic Config Querying</h2>
600<div class="sectionbody">
601<div class="paragraph"><p>Most programs will simply want to look up variables in all config files
602that git knows about, using the normal precedence rules. To do this,
603call <tt>git_config</tt> with a callback function and void data pointer.</p></div>
604<div class="paragraph"><p><tt>git_config</tt> will read all config sources in order of increasing
605priority. Thus a callback should typically overwrite previously-seen
606entries with new ones (e.g., if both the user-wide <tt>~/.gitconfig</tt> and
607repo-specific <tt>.git/config</tt> contain <tt>color.ui</tt>, the config machinery
608will first feed the user-wide one to the callback, and then the
609repo-specific one; by overwriting, the higher-priority repo-specific
610value is left at the end).</p></div>
611<div class="paragraph"><p>The <tt>git_config_with_options</tt> function lets the caller examine config
612while adjusting some of the default behavior of <tt>git_config</tt>. It should
613almost never be used by "regular" git code that is looking up
614configuration variables. It is intended for advanced callers like
615<tt>git-config</tt>, which are intentionally tweaking the normal config-lookup
616process. It takes two extra parameters:</p></div>
617<div class="dlist"><dl>
618<dt class="hdlist1">
619<tt>filename</tt>
620</dt>
621<dd>
622<p>
623If this parameter is non-NULL, it specifies the name of a file to
624parse for configuration, rather than looking in the usual files. Regular
625<tt>git_config</tt> defaults to <tt>NULL</tt>.
626</p>
627</dd>
628<dt class="hdlist1">
629<tt>respect_includes</tt>
630</dt>
631<dd>
632<p>
633Specify whether include directives should be followed in parsed files.
634Regular <tt>git_config</tt> defaults to <tt>1</tt>.
635</p>
636</dd>
637</dl></div>
638<div class="paragraph"><p>There is a special version of <tt>git_config</tt> called <tt>git_config_early</tt>.
639This version takes an additional parameter to specify the repository
640config, instead of having it looked up via <tt>git_path</tt>. This is useful
641early in a git program before the repository has been found. Unless
642you&#8217;re working with early setup code, you probably don&#8217;t want to use
643this.</p></div>
644</div>
645<h2 id="_reading_specific_files">Reading Specific Files</h2>
646<div class="sectionbody">
647<div class="paragraph"><p>To read a specific file in git-config format, use
648<tt>git_config_from_file</tt>. This takes the same callback and data parameters
649as <tt>git_config</tt>.</p></div>
650</div>
651<h2 id="_value_parsing_helpers">Value Parsing Helpers</h2>
652<div class="sectionbody">
653<div class="paragraph"><p>To aid in parsing string values, the config API provides callbacks with
654a number of helper functions, including:</p></div>
655<div class="dlist"><dl>
656<dt class="hdlist1">
657<tt>git_config_int</tt>
658</dt>
659<dd>
660<p>
661Parse the string to an integer, including unit factors. Dies on error;
662otherwise, returns the parsed result.
663</p>
664</dd>
665<dt class="hdlist1">
666<tt>git_config_ulong</tt>
667</dt>
668<dd>
669<p>
670Identical to <tt>git_config_int</tt>, but for unsigned longs.
671</p>
672</dd>
673<dt class="hdlist1">
674<tt>git_config_bool</tt>
675</dt>
676<dd>
677<p>
678Parse a string into a boolean value, respecting keywords like "true" and
679"false". Integer values are converted into true/false values (when they
680are non-zero or zero, respectively). Other values cause a die(). If
681parsing is successful, the return value is the result.
682</p>
683</dd>
684<dt class="hdlist1">
685<tt>git_config_bool_or_int</tt>
686</dt>
687<dd>
688<p>
689Same as <tt>git_config_bool</tt>, except that integers are returned as-is, and
690an <tt>is_bool</tt> flag is unset.
691</p>
692</dd>
693<dt class="hdlist1">
694<tt>git_config_maybe_bool</tt>
695</dt>
696<dd>
697<p>
698Same as <tt>git_config_bool</tt>, except that it returns -1 on error rather
699than dying.
700</p>
701</dd>
702<dt class="hdlist1">
703<tt>git_config_string</tt>
704</dt>
705<dd>
706<p>
707Allocates and copies the value string into the <tt>dest</tt> parameter; if no
708string is given, prints an error message and returns -1.
709</p>
710</dd>
711<dt class="hdlist1">
712<tt>git_config_pathname</tt>
713</dt>
714<dd>
715<p>
Junio C Hamano022bd342012-06-07 20:15:35716Similar to <tt>git_config_string</tt>, but expands <tt>~</tt> or <tt>~user</tt> into the
Junio C Hamanoe0238c22012-02-23 22:45:50717user&#8217;s home directory when found at the beginning of the path.
718</p>
719</dd>
720</dl></div>
721</div>
722<h2 id="_include_directives">Include Directives</h2>
723<div class="sectionbody">
724<div class="paragraph"><p>By default, the config parser does not respect include directives.
725However, a caller can use the special <tt>git_config_include</tt> wrapper
726callback to support them. To do so, you simply wrap your "real" callback
727function and data pointer in a <tt>struct config_include_data</tt>, and pass
728the wrapper to the regular config-reading functions. For example:</p></div>
729<div class="listingblock">
730<div class="content">
731<pre><tt>int read_file_with_include(const char *file, config_fn_t fn, void *data)
732{
733 struct config_include_data inc = CONFIG_INCLUDE_INIT;
734 inc.fn = fn;
735 inc.data = data;
736 return git_config_from_file(git_config_include, file, &amp;inc);
737}</tt></pre>
738</div></div>
739<div class="paragraph"><p><tt>git_config</tt> respects includes automatically. The lower-level
740<tt>git_config_from_file</tt> does not.</p></div>
741</div>
742<h2 id="_writing_config_files">Writing Config Files</h2>
743<div class="sectionbody">
744<div class="paragraph"><p>TODO</p></div>
745</div>
746</div>
747<div id="footnotes"><hr /></div>
748<div id="footer">
749<div id="footer-text">
Junio C Hamano719b8a32012-06-08 18:40:53750Last updated 2012-06-08 11:37:18 PDT
Junio C Hamanoe0238c22012-02-23 22:45:50751</div>
752</div>
753</body>
754</html>