docs: add a basic description of the config API
This wasn't documented at all; this is pretty bare-bones, but it should at least give new git hackers a basic idea of how the reading side works. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jeff King committed
Feb 6, 2012 at 04:53 UTC
9c3c22e2bf6cf05297556936666c8578e160c366
1 file changed
+101
Documentation/technical/api-config.txt
new
+101
@@ -0,0 +1,101 @@
1
+config API
2
+==========
3
+
4
+The config API gives callers a way to access git configuration files
5
+(and files which have the same syntax). See linkgit:git-config[1] for a
6
+discussion of the config file syntax.
7
+
8
+General Usage
9
+-------------
10
+
11
+Config files are parsed linearly, and each variable found is passed to a
12
+caller-provided callback function. The callback function is responsible
13
+for any actions to be taken on the config option, and is free to ignore
14
+some options (it is not uncommon for the configuration to be parsed
15
+several times during the run of a git program, with different callbacks
16
+picking out different variables useful to themselves).
17
+
18
+A config callback function takes three parameters:
19
+
20
+- the name of the parsed variable. This is in canonical "flat" form: the
21
+ section, subsection, and variable segments will be separated by dots,
22
+ and the section and variable segments will be all lowercase. E.g.,
23
+ `core.ignorecase`, `diff.SomeType.textconv`.
24
+
25
+- the value of the found variable, as a string. If the variable had no
26
+ value specified, the value will be NULL (typically this means it
27
+ should be interpreted as boolean true).
28
+
29
+- a void pointer passed in by the caller of the config API; this can
30
+ contain callback-specific data
31
+
32
+A config callback should return 0 for success, or -1 if the variable
33
+could not be parsed properly.
34
+
35
+Basic Config Querying
36
+---------------------
37
+
38
+Most programs will simply want to look up variables in all config files
39
+that git knows about, using the normal precedence rules. To do this,
40
+call `git_config` with a callback function and void data pointer.
41
+
42
+`git_config` will read all config sources in order of increasing
43
+priority. Thus a callback should typically overwrite previously-seen
44
+entries with new ones (e.g., if both the user-wide `~/.gitconfig` and
45
+repo-specific `.git/config` contain `color.ui`, the config machinery
46
+will first feed the user-wide one to the callback, and then the
47
+repo-specific one; by overwriting, the higher-priority repo-specific
48
+value is left at the end).
49
+
50
+There is a special version of `git_config` called `git_config_early`
51
+that takes an additional parameter to specify the repository config.
52
+This should be used early in a git program when the repository location
53
+has not yet been determined (and calling the usual lazy-evaluation
54
+lookup rules would yield an incorrect location).
55
+
56
+Reading Specific Files
57
+----------------------
58
+
59
+To read a specific file in git-config format, use
60
+`git_config_from_file`. This takes the same callback and data parameters
61
+as `git_config`.
62
+
63
+Value Parsing Helpers
64
+---------------------
65
+
66
+To aid in parsing string values, the config API provides callbacks with
67
+a number of helper functions, including:
68
+
69
+`git_config_int`::
70
+Parse the string to an integer, including unit factors. Dies on error;
71
+otherwise, returns the parsed result.
72
+
73
+`git_config_ulong`::
74
+Identical to `git_config_int`, but for unsigned longs.
75
+
76
+`git_config_bool`::
77
+Parse a string into a boolean value, respecting keywords like "true" and
78
+"false". Integer values are converted into true/false values (when they
79
+are non-zero or zero, respectively). Other values cause a die(). If
80
+parsing is successful, the return value is the result.
81
+
82
+`git_config_bool_or_int`::
83
+Same as `git_config_bool`, except that integers are returned as-is, and
84
+an `is_bool` flag is unset.
85
+
86
+`git_config_maybe_bool`::
87
+Same as `git_config_bool`, except that it returns -1 on error rather
88
+than dying.
89
+
90
+`git_config_string`::
91
+Allocates and copies the value string into the `dest` parameter; if no
92
+string is given, prints an error message and returns -1.
93
+
94
+`git_config_pathname`::
95
+Similar to `git_config_string`, but expands `~` or `~user` into the
96
+user's home directory when found at the beginning of the path.
97
+
98
+Writing Config Files
99
+--------------------
100
+
101
+TODO