config API
==========

The config API gives callers a way to access Git configuration files
(and files which have the same syntax). See linkgit:git-config[1] for a
discussion of the config file syntax.

General Usage
-------------

Config files are parsed linearly, and each variable found is passed to a
caller-provided callback function. The callback function is responsible
for any actions to be taken on the config option, and is free to ignore
some options. It is not uncommon for the configuration to be parsed
several times during the run of a Git program, with different callbacks
picking out different variables useful to themselves.

A config callback function takes three parameters:

- the name of the parsed variable. This is in canonical "flat" form: the
  section, subsection, and variable segments will be separated by dots,
  and the section and variable segments will be all lowercase. E.g.,
  `core.ignorecase`, `diff.SomeType.textconv`.

- the value of the found variable, as a string. If the variable had no
  value specified, the value will be NULL (typically this means it
  should be interpreted as boolean true).

- a void pointer passed in by the caller of the config API; this can
  contain callback-specific data

A config callback should return 0 for success, or -1 if the variable
could not be parsed properly.

Basic Config Querying
---------------------

Most programs will simply want to look up variables in all config files
that Git knows about, using the normal precedence rules. To do this,
call `git_config` with a callback function and void data pointer.

`git_config` will read all config sources in order of increasing
priority. Thus a callback should typically overwrite previously-seen
entries with new ones (e.g., if both the user-wide `~/.gitconfig` and
repo-specific `.git/config` contain `color.ui`, the config machinery
will first feed the user-wide one to the callback, and then the
repo-specific one; by overwriting, the higher-priority repo-specific
value is left at the end).

The `config_with_options` function lets the caller examine config
while adjusting some of the default behavior of `git_config`. It should
almost never be used by "regular" Git code that is looking up
configuration variables. It is intended for advanced callers like
`git-config`, which are intentionally tweaking the normal config-lookup
process. It takes two extra parameters:

`config_source`::
If this parameter is non-NULL, it specifies the source to parse for
configuration, rather than looking in the usual files. See `struct
git_config_source` in `config.h` for details. Regular `git_config` defaults
to `NULL`.

`opts`::
Specify options to adjust the behavior of parsing config files. See `struct
config_options` in `config.h` for details. As an example: regular `git_config`
sets `opts.respect_includes` to `1` by default.

Reading Specific Files
----------------------

To read a specific file in git-config format, use
`git_config_from_file`. This takes the same callback and data parameters
as `git_config`.

Querying For Specific Variables
-------------------------------

For programs wanting to query for specific variables in a non-callback
manner, the config API provides two functions `git_config_get_value`
and `git_config_get_value_multi`. They both read values from an internal
cache generated previously from reading the config files.

`int git_config_get_value(const char *key, const char **value)`::

	Finds the highest-priority value for the configuration variable `key`,
	stores the pointer to it in `value` and returns 0. When the
	configuration variable `key` is not found, returns 1 without touching
	`value`. The caller should not free or modify `value`, as it is owned
	by the cache.

`const struct string_list *git_config_get_value_multi(const char *key)`::

	Finds and returns the value list, sorted in order of increasing priority
	for the configuration variable `key`. When the configuration variable
	`key` is not found, returns NULL. The caller should not free or modify
	the returned pointer, as it is owned by the cache.

`void git_config_clear(void)`::

	Resets and invalidates the config cache.

The config API also provides type specific API functions which do conversion
as well as retrieval for the queried variable, including:

`int git_config_get_int(const char *key, int *dest)`::

	Finds and parses the value to an integer for the configuration variable
	`key`. Dies on error; otherwise, stores the value of the parsed integer in
	`dest` and returns 0. When the configuration variable `key` is not found,
	returns 1 without touching `dest`.

`int git_config_get_ulong(const char *key, unsigned long *dest)`::

	Similar to `git_config_get_int` but for unsigned longs.

`int git_config_get_bool(const char *key, int *dest)`::

	Finds and parses the value into a boolean value, for the configuration
	variable `key` respecting keywords like "true" and "false". Integer
	values are converted into true/false values (when they are non-zero or
	zero, respectively). Other values cause a die(). If parsing is successful,
	stores the value of the parsed result in `dest` and returns 0. When the
	configuration variable `key` is not found, returns 1 without touching
	`dest`.

`int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest)`::

	Similar to `git_config_get_bool`, except that integers are copied as-is,
	and `is_bool` flag is unset.

`int git_config_get_maybe_bool(const char *key, int *dest)`::

	Similar to `git_config_get_bool`, except that it returns -1 on error
	rather than dying.

`int git_config_get_string_const(const char *key, const char **dest)`::

	Allocates and copies the retrieved string into the `dest` parameter for
	the configuration variable `key`; if NULL string is given, prints an
	error message and returns -1. When the configuration variable `key` is
	not found, returns 1 without touching `dest`.

`int git_config_get_string(const char *key, char **dest)`::

	Similar to `git_config_get_string_const`, except that retrieved value
	copied into the `dest` parameter is a mutable string.

`int git_config_get_pathname(const char *key, const char **dest)`::

	Similar to `git_config_get_string`, but expands `~` or `~user` into
	the user's home directory when found at the beginning of the path.

`git_die_config(const char *key, const char *err, ...)`::

	First prints the error message specified by the caller in `err` and then
	dies printing the line number and the file name of the highest priority
	value for the configuration variable `key`.

`void git_die_config_linenr(const char *key, const char *filename, int linenr)`::

	Helper function which formats the die error message according to the
	parameters entered. Used by `git_die_config()`. It can be used by callers
	handling `git_config_get_value_multi()` to print the correct error message
	for the desired value.

See test-config.c for usage examples.

Value Parsing Helpers
---------------------

To aid in parsing string values, the config API provides callbacks with
a number of helper functions, including:

`git_config_int`::
Parse the string to an integer, including unit factors. Dies on error;
otherwise, returns the parsed result.

`git_config_ulong`::
Identical to `git_config_int`, but for unsigned longs.

`git_config_bool`::
Parse a string into a boolean value, respecting keywords like "true" and
"false". Integer values are converted into true/false values (when they
are non-zero or zero, respectively). Other values cause a die(). If
parsing is successful, the return value is the result.

`git_config_bool_or_int`::
Same as `git_config_bool`, except that integers are returned as-is, and
an `is_bool` flag is unset.

`git_parse_maybe_bool`::
Same as `git_config_bool`, except that it returns -1 on error rather
than dying.

`git_config_string`::
Allocates and copies the value string into the `dest` parameter; if no
string is given, prints an error message and returns -1.

`git_config_pathname`::
Similar to `git_config_string`, but expands `~` or `~user` into the
user's home directory when found at the beginning of the path.

Include Directives
------------------

By default, the config parser does not respect include directives.
However, a caller can use the special `git_config_include` wrapper
callback to support them. To do so, you simply wrap your "real" callback
function and data pointer in a `struct config_include_data`, and pass
the wrapper to the regular config-reading functions. For example:

-------------------------------------------
int read_file_with_include(const char *file, config_fn_t fn, void *data)
{
	struct config_include_data inc = CONFIG_INCLUDE_INIT;
	inc.fn = fn;
	inc.data = data;
	return git_config_from_file(git_config_include, file, &inc);
}
-------------------------------------------

`git_config` respects includes automatically. The lower-level
`git_config_from_file` does not.

Custom Configsets
-----------------

A `config_set` can be used to construct an in-memory cache for
config-like files that the caller specifies (i.e., files like `.gitmodules`,
`~/.gitconfig` etc.). For example,

----------------------------------------
struct config_set gm_config;
git_configset_init(&gm_config);
int b;
/* we add config files to the config_set */
git_configset_add_file(&gm_config, ".gitmodules");
git_configset_add_file(&gm_config, ".gitmodules_alt");

if (!git_configset_get_bool(gm_config, "submodule.frotz.ignore", &b)) {
	/* hack hack hack */
}

/* when we are done with the configset */
git_configset_clear(&gm_config);
----------------------------------------

Configset API provides functions for the above mentioned work flow, including:

`void git_configset_init(struct config_set *cs)`::

	Initializes the config_set `cs`.

`int git_configset_add_file(struct config_set *cs, const char *filename)`::

	Parses the file and adds the variable-value pairs to the `config_set`,
	dies if there is an error in parsing the file. Returns 0 on success, or
	-1 if the file does not exist or is inaccessible. The user has to decide
	if he wants to free the incomplete configset or continue using it when
	the function returns -1.

`int git_configset_get_value(struct config_set *cs, const char *key, const char **value)`::

	Finds the highest-priority value for the configuration variable `key`
	and config set `cs`, stores the pointer to it in `value` and returns 0.
	When the configuration variable `key` is not found, returns 1 without
	touching `value`. The caller should not free or modify `value`, as it
	is owned by the cache.

`const struct string_list *git_configset_get_value_multi(struct config_set *cs, const char *key)`::

	Finds and returns the value list, sorted in order of increasing priority
	for the configuration variable `key` and config set `cs`. When the
	configuration variable `key` is not found, returns NULL. The caller
	should not free or modify the returned pointer, as it is owned by the cache.

`void git_configset_clear(struct config_set *cs)`::

	Clears `config_set` structure, removes all saved variable-value pairs.

In addition to above functions, the `config_set` API provides type specific
functions in the vein of `git_config_get_int` and family but with an extra
parameter, pointer to struct `config_set`.
They all behave similarly to the `git_config_get*()` family described in
"Querying For Specific Variables" above.

Writing Config Files
--------------------

Git gives multiple entry points in the Config API to write config values to
files namely `git_config_set_in_file` and `git_config_set`, which write to
a specific config file or to `.git/config` respectively. They both take a
key/value pair as parameter.
In the end they both call `git_config_set_multivar_in_file` which takes four
parameters:

- the name of the file, as a string, to which key/value pairs will be written.

- the name of key, as a string. This is in canonical "flat" form: the section,
  subsection, and variable segments will be separated by dots, and the section
  and variable segments will be all lowercase.
  E.g., `core.ignorecase`, `diff.SomeType.textconv`.

- the value of the variable, as a string. If value is equal to NULL, it will
  remove the matching key from the config file.

- the value regex, as a string. It will disregard key/value pairs where value
  does not match.

- a multi_replace value, as an int. If value is equal to zero, nothing or only
  one matching key/value is replaced, else all matching key/values (regardless
  how many) are removed, before the new pair is written.

It returns 0 on success.

Also, there are functions `git_config_rename_section` and
`git_config_rename_section_in_file` with parameters `old_name` and `new_name`
for renaming or removing sections in the config files. If NULL is passed
through `new_name` parameter, the section will be removed from the config file.
