/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */
#ifndef INCLUDE_git_config_h__
#define INCLUDE_git_config_h__

#include "common.h"
#include "types.h"
#include "buffer.h"

/**
 * @file git2/config.h
 * @brief Git config management routines
 * @defgroup git_config Git config management routines
 * @ingroup Git
 * @{
 */
GIT_BEGIN_DECL

/**
 * Priority level of a config file.
 * These priority levels correspond to the natural escalation logic
 * (from higher to lower) when searching for config entries in git.git.
 *
 * git_config_open_default() and git_repository_config() honor those
 * priority levels as well.
 */
typedef enum {
	/** System-wide on Windows, for compatibility with portable git */
	GIT_CONFIG_LEVEL_PROGRAMDATA = 1,

	/** System-wide configuration file; /etc/gitconfig on Linux systems */
	GIT_CONFIG_LEVEL_SYSTEM = 2,

	/** XDG compatible configuration file; typically ~/.config/git/config */
	GIT_CONFIG_LEVEL_XDG = 3,

	/** User-specific configuration file (also called Global configuration
	 * file); typically ~/.gitconfig
	 */
	GIT_CONFIG_LEVEL_GLOBAL = 4,

	/** Repository specific configuration file; $WORK_DIR/.git/config on
	 * non-bare repos
	 */
	GIT_CONFIG_LEVEL_LOCAL = 5,

	/** Application specific configuration file; freely defined by applications
	 */
	GIT_CONFIG_LEVEL_APP = 6,

	/** Represents the highest level available config file (i.e. the most
	 * specific config file available that actually is loaded)
	 */
	GIT_CONFIG_HIGHEST_LEVEL = -1,
} git_config_level_t;

/**
 * An entry in a configuration file
 */
typedef struct git_config_entry {
	const char *name; /**< Name of the entry (normalised) */
	const char *value; /**< String value of the entry */
	git_config_level_t level; /**< Which config file this was found in */
	void (*free)(struct git_config_entry *entry); /**< Free function for this entry */
	void *payload; /**< Opaque value for the free function. Do not read or write */
} git_config_entry;

/**
 * Free a config entry
 */
GIT_EXTERN(void) git_config_entry_free(git_config_entry *);

typedef int  (*git_config_foreach_cb)(const git_config_entry *, void *);
typedef struct git_config_iterator git_config_iterator;

/**
 * Config var type
 */
typedef enum {
	GIT_CVAR_FALSE = 0,
	GIT_CVAR_TRUE = 1,
	GIT_CVAR_INT32,
	GIT_CVAR_STRING
} git_cvar_t;

/**
 * Mapping from config variables to values.
 */
typedef struct {
	git_cvar_t cvar_type;
	const char *str_match;
	int map_value;
} git_cvar_map;

/**
 * Locate the path to the global configuration file
 *
 * The user or global configuration file is usually
 * located in `$HOME/.gitconfig`.
 *
 * This method will try to guess the full path to that
 * file, if the file exists. The returned path
 * may be used on any `git_config` call to load the
 * global configuration file.
 *
 * This method will not guess the path to the xdg compatible
 * config file (.config/git/config).
 *
 * @param out Pointer to a user-allocated git_buf in which to store the path
 * @return 0 if a global configuration file has been found. Its path will be stored in `out`.
 */
GIT_EXTERN(int) git_config_find_global(git_buf *out);

/**
 * Locate the path to the global xdg compatible configuration file
 *
 * The xdg compatible configuration file is usually
 * located in `$HOME/.config/git/config`.
 *
 * This method will try to guess the full path to that
 * file, if the file exists. The returned path
 * may be used on any `git_config` call to load the
 * xdg compatible configuration file.
 *
 * @param out Pointer to a user-allocated git_buf in which to store the path
 * @return 0 if a xdg compatible configuration file has been
 *	found. Its path will be stored in `out`.
 */
GIT_EXTERN(int) git_config_find_xdg(git_buf *out);

/**
 * Locate the path to the system configuration file
 *
 * If /etc/gitconfig doesn't exist, it will look for
 * %PROGRAMFILES%\Git\etc\gitconfig.
 *
 * @param out Pointer to a user-allocated git_buf in which to store the path
 * @return 0 if a system configuration file has been
 *	found. Its path will be stored in `out`.
 */
GIT_EXTERN(int) git_config_find_system(git_buf *out);

/**
 * Locate the path to the configuration file in ProgramData
 *
 * Look for the file in %PROGRAMDATA%\Git\config used by portable git.
 *
 * @param out Pointer to a user-allocated git_buf in which to store the path
 * @return 0 if a ProgramData configuration file has been
 *	found. Its path will be stored in `out`.
 */
GIT_EXTERN(int) git_config_find_programdata(git_buf *out);

/**
 * Open the global, XDG and system configuration files
 *
 * Utility wrapper that finds the global, XDG and system configuration files
 * and opens them into a single prioritized config object that can be
 * used when accessing default config data outside a repository.
 *
 * @param out Pointer to store the config instance
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_open_default(git_config **out);

/**
 * Allocate a new configuration object
 *
 * This object is empty, so you have to add a file to it before you
 * can do anything with it.
 *
 * @param out pointer to the new configuration
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_new(git_config **out);

/**
 * Add an on-disk config file instance to an existing config
 *
 * The on-disk file pointed at by `path` will be opened and
 * parsed; it's expected to be a native Git config file following
 * the default Git config syntax (see man git-config).
 *
 * If the file does not exist, the file will still be added and it
 * will be created the first time we write to it.
 *
 * Note that the configuration object will free the file
 * automatically.
 *
 * Further queries on this config object will access each
 * of the config file instances in order (instances with
 * a higher priority level will be accessed first).
 *
 * @param cfg the configuration to add the file to
 * @param path path to the configuration file to add
 * @param level the priority level of the backend
 * @param force replace config file at the given priority level
 * @return 0 on success, GIT_EEXISTS when adding more than one file
 *  for a given priority level (and force_replace set to 0),
 *  GIT_ENOTFOUND when the file doesn't exist or error code
 */
GIT_EXTERN(int) git_config_add_file_ondisk(
	git_config *cfg,
	const char *path,
	git_config_level_t level,
	int force);

/**
 * Create a new config instance containing a single on-disk file
 *
 * This method is a simple utility wrapper for the following sequence
 * of calls:
 *	- git_config_new
 *	- git_config_add_file_ondisk
 *
 * @param out The configuration instance to create
 * @param path Path to the on-disk file to open
 * @return 0 on success, or an error code
 */
GIT_EXTERN(int) git_config_open_ondisk(git_config **out, const char *path);

/**
 * Build a single-level focused config object from a multi-level one.
 *
 * The returned config object can be used to perform get/set/delete operations
 * on a single specific level.
 *
 * Getting several times the same level from the same parent multi-level config
 * will return different config instances, but containing the same config_file
 * instance.
 *
 * @param out The configuration instance to create
 * @param parent Multi-level config to search for the given level
 * @param level Configuration level to search for
 * @return 0, GIT_ENOTFOUND if the passed level cannot be found in the
 * multi-level parent config, or an error code
 */
GIT_EXTERN(int) git_config_open_level(
	git_config **out,
	const git_config *parent,
	git_config_level_t level);

/**
 * Open the global/XDG configuration file according to git's rules
 *
 * Git allows you to store your global configuration at
 * `$HOME/.config` or `$XDG_CONFIG_HOME/git/config`. For backwards
 * compatability, the XDG file shouldn't be used unless the use has
 * created it explicitly. With this function you'll open the correct
 * one to write to.
 *
 * @param out pointer in which to store the config object
 * @param config the config object in which to look
 */
GIT_EXTERN(int) git_config_open_global(git_config **out, git_config *config);

/**
 * Create a snapshot of the configuration
 *
 * Create a snapshot of the current state of a configuration, which
 * allows you to look into a consistent view of the configuration for
 * looking up complex values (e.g. a remote, submodule).
 *
 * The string returned when querying such a config object is valid
 * until it is freed.
 *
 * @param out pointer in which to store the snapshot config object
 * @param config configuration to snapshot
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_snapshot(git_config **out, git_config *config);

/**
 * Free the configuration and its associated memory and files
 *
 * @param cfg the configuration to free
 */
GIT_EXTERN(void) git_config_free(git_config *cfg);

/**
 * Get the git_config_entry of a config variable.
 *
 * Free the git_config_entry after use with `git_config_entry_free()`.
 *
 * @param out pointer to the variable git_config_entry
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_get_entry(
	git_config_entry **out,
	const git_config *cfg,
	const char *name);

/**
 * Get the value of an integer config variable.
 *
 * All config files will be looked into, in the order of their
 * defined level. A higher level means a higher priority. The
 * first occurrence of the variable will be returned here.
 *
 * @param out pointer to the variable where the value should be stored
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_get_int32(int32_t *out, const git_config *cfg, const char *name);

/**
 * Get the value of a long integer config variable.
 *
 * All config files will be looked into, in the order of their
 * defined level. A higher level means a higher priority. The
 * first occurrence of the variable will be returned here.
 *
 * @param out pointer to the variable where the value should be stored
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_get_int64(int64_t *out, const git_config *cfg, const char *name);

/**
 * Get the value of a boolean config variable.
 *
 * This function uses the usual C convention of 0 being false and
 * anything else true.
 *
 * All config files will be looked into, in the order of their
 * defined level. A higher level means a higher priority. The
 * first occurrence of the variable will be returned here.
 *
 * @param out pointer to the variable where the value should be stored
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_get_bool(int *out, const git_config *cfg, const char *name);

/**
 * Get the value of a path config variable.
 *
 * A leading '~' will be expanded to the global search path (which
 * defaults to the user's home directory but can be overridden via
 * `git_libgit2_opts()`.
 *
 * All config files will be looked into, in the order of their
 * defined level. A higher level means a higher priority. The
 * first occurrence of the variable will be returned here.
 *
 * @param out the buffer in which to store the result
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_get_path(git_buf *out, const git_config *cfg, const char *name);

/**
 * Get the value of a string config variable.
 *
 * This function can only be used on snapshot config objects. The
 * string is owned by the config and should not be freed by the
 * user. The pointer will be valid until the config is freed.
 *
 * All config files will be looked into, in the order of their
 * defined level. A higher level means a higher priority. The
 * first occurrence of the variable will be returned here.
 *
 * @param out pointer to the string
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_get_string(const char **out, const git_config *cfg, const char *name);

/**
 * Get the value of a string config variable.
 *
 * The value of the config will be copied into the buffer.
 *
 * All config files will be looked into, in the order of their
 * defined level. A higher level means a higher priority. The
 * first occurrence of the variable will be returned here.
 *
 * @param out buffer in which to store the string
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_get_string_buf(git_buf *out, const git_config *cfg, const char *name);

/**
 * Get each value of a multivar in a foreach callback
 *
 * The callback will be called on each variable found
 *
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @param regexp regular expression to filter which variables we're
 * interested in. Use NULL to indicate all
 * @param callback the function to be called on each value of the variable
 * @param payload opaque pointer to pass to the callback
 */
GIT_EXTERN(int) git_config_get_multivar_foreach(const git_config *cfg, const char *name, const char *regexp, git_config_foreach_cb callback, void *payload);

/**
 * Get each value of a multivar
 *
 * @param out pointer to store the iterator
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @param regexp regular expression to filter which variables we're
 * interested in. Use NULL to indicate all
 */
GIT_EXTERN(int) git_config_multivar_iterator_new(git_config_iterator **out, const git_config *cfg, const char *name, const char *regexp);

/**
 * Return the current entry and advance the iterator
 *
 * The pointers returned by this function are valid until the iterator
 * is freed.
 *
 * @param entry pointer to store the entry
 * @param iter the iterator
 * @return 0 or an error code. GIT_ITEROVER if the iteration has completed
 */
GIT_EXTERN(int) git_config_next(git_config_entry **entry, git_config_iterator *iter);

/**
 * Free a config iterator
 *
 * @param iter the iterator to free
 */
GIT_EXTERN(void) git_config_iterator_free(git_config_iterator *iter);

/**
 * Set the value of an integer config variable in the config file
 * with the highest level (usually the local one).
 *
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @param value Integer value for the variable
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_set_int32(git_config *cfg, const char *name, int32_t value);

/**
 * Set the value of a long integer config variable in the config file
 * with the highest level (usually the local one).
 *
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @param value Long integer value for the variable
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_set_int64(git_config *cfg, const char *name, int64_t value);

/**
 * Set the value of a boolean config variable in the config file
 * with the highest level (usually the local one).
 *
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @param value the value to store
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value);

/**
 * Set the value of a string config variable in the config file
 * with the highest level (usually the local one).
 *
 * A copy of the string is made and the user is free to use it
 * afterwards.
 *
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @param value the string to store.
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const char *value);

/**
 * Set a multivar in the local config file.
 *
 * @param cfg where to look for the variable
 * @param name the variable's name
 * @param regexp a regular expression to indicate which values to replace
 * @param value the new value.
 */
GIT_EXTERN(int) git_config_set_multivar(git_config *cfg, const char *name, const char *regexp, const char *value);

/**
 * Delete a config variable from the config file
 * with the highest level (usually the local one).
 *
 * @param cfg the configuration
 * @param name the variable to delete
 */
GIT_EXTERN(int) git_config_delete_entry(git_config *cfg, const char *name);

/**
 * Deletes one or several entries from a multivar in the local config file.
 *
 * @param cfg where to look for the variables
 * @param name the variable's name
 * @param regexp a regular expression to indicate which values to delete
 *
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_delete_multivar(git_config *cfg, const char *name, const char *regexp);

/**
 * Perform an operation on each config variable.
 *
 * The callback receives the normalized name and value of each variable
 * in the config backend, and the data pointer passed to this function.
 * If the callback returns a non-zero value, the function stops iterating
 * and returns that value to the caller.
 *
 * The pointers passed to the callback are only valid as long as the
 * iteration is ongoing.
 *
 * @param cfg where to get the variables from
 * @param callback the function to call on each variable
 * @param payload the data to pass to the callback
 * @return 0 on success, non-zero callback return value, or error code
 */
GIT_EXTERN(int) git_config_foreach(
	const git_config *cfg,
	git_config_foreach_cb callback,
	void *payload);

/**
 * Iterate over all the config variables
 *
 * Use `git_config_next` to advance the iteration and
 * `git_config_iterator_free` when done.
 *
 * @param out pointer to store the iterator
 * @param cfg where to ge the variables from
 */
GIT_EXTERN(int) git_config_iterator_new(git_config_iterator **out, const git_config *cfg);

/**
 * Iterate over all the config variables whose name matches a pattern
 *
 * Use `git_config_next` to advance the iteration and
 * `git_config_iterator_free` when done.
 *
 * @param out pointer to store the iterator
 * @param cfg where to ge the variables from
 * @param regexp regular expression to match the names
 */
GIT_EXTERN(int) git_config_iterator_glob_new(git_config_iterator **out, const git_config *cfg, const char *regexp);

/**
 * Perform an operation on each config variable matching a regular expression.
 *
 * This behaviors like `git_config_foreach` with an additional filter of a
 * regular expression that filters which config keys are passed to the
 * callback.
 *
 * The pointers passed to the callback are only valid as long as the
 * iteration is ongoing.
 *
 * @param cfg where to get the variables from
 * @param regexp regular expression to match against config names
 * @param callback the function to call on each variable
 * @param payload the data to pass to the callback
 * @return 0 or the return value of the callback which didn't return 0
 */
GIT_EXTERN(int) git_config_foreach_match(
	const git_config *cfg,
	const char *regexp,
	git_config_foreach_cb callback,
	void *payload);

/**
 * Query the value of a config variable and return it mapped to
 * an integer constant.
 *
 * This is a helper method to easily map different possible values
 * to a variable to integer constants that easily identify them.
 *
 * A mapping array looks as follows:
 *
 *	git_cvar_map autocrlf_mapping[] = {
 *		{GIT_CVAR_FALSE, NULL, GIT_AUTO_CRLF_FALSE},
 *		{GIT_CVAR_TRUE, NULL, GIT_AUTO_CRLF_TRUE},
 *		{GIT_CVAR_STRING, "input", GIT_AUTO_CRLF_INPUT},
 *		{GIT_CVAR_STRING, "default", GIT_AUTO_CRLF_DEFAULT}};
 *
 * On any "false" value for the variable (e.g. "false", "FALSE", "no"), the
 * mapping will store `GIT_AUTO_CRLF_FALSE` in the `out` parameter.
 *
 * The same thing applies for any "true" value such as "true", "yes" or "1", storing
 * the `GIT_AUTO_CRLF_TRUE` variable.
 *
 * Otherwise, if the value matches the string "input" (with case insensitive comparison),
 * the given constant will be stored in `out`, and likewise for "default".
 *
 * If not a single match can be made to store in `out`, an error code will be
 * returned.
 *
 * @param out place to store the result of the mapping
 * @param cfg config file to get the variables from
 * @param name name of the config variable to lookup
 * @param maps array of `git_cvar_map` objects specifying the possible mappings
 * @param map_n number of mapping objects in `maps`
 * @return 0 on success, error code otherwise
 */
GIT_EXTERN(int) git_config_get_mapped(
	int *out,
	const git_config *cfg,
	const char *name,
	const git_cvar_map *maps,
	size_t map_n);

/**
 * Maps a string value to an integer constant
 *
 * @param out place to store the result of the parsing
 * @param maps array of `git_cvar_map` objects specifying the possible mappings
 * @param map_n number of mapping objects in `maps`
 * @param value value to parse
 */
GIT_EXTERN(int) git_config_lookup_map_value(
	int *out,
	const git_cvar_map *maps,
	size_t map_n,
	const char *value);

/**
 * Parse a string value as a bool.
 *
 * Valid values for true are: 'true', 'yes', 'on', 1 or any
 *  number different from 0
 * Valid values for false are: 'false', 'no', 'off', 0
 *
 * @param out place to store the result of the parsing
 * @param value value to parse
 */
GIT_EXTERN(int) git_config_parse_bool(int *out, const char *value);

/**
 * Parse a string value as an int32.
 *
 * An optional value suffix of 'k', 'm', or 'g' will
 * cause the value to be multiplied by 1024, 1048576,
 * or 1073741824 prior to output.
 *
 * @param out place to store the result of the parsing
 * @param value value to parse
 */
GIT_EXTERN(int) git_config_parse_int32(int32_t *out, const char *value);

/**
 * Parse a string value as an int64.
 *
 * An optional value suffix of 'k', 'm', or 'g' will
 * cause the value to be multiplied by 1024, 1048576,
 * or 1073741824 prior to output.
 *
 * @param out place to store the result of the parsing
 * @param value value to parse
 */
GIT_EXTERN(int) git_config_parse_int64(int64_t *out, const char *value);

/**
 * Parse a string value as a path.
 *
 * A leading '~' will be expanded to the global search path (which
 * defaults to the user's home directory but can be overridden via
 * `git_libgit2_opts()`.
 *
 * If the value does not begin with a tilde, the input will be
 * returned.
 *
 * @param out placae to store the result of parsing
 * @param value the path to evaluate
 */
GIT_EXTERN(int) git_config_parse_path(git_buf *out, const char *value);

/**
 * Perform an operation on each config variable in given config backend
 * matching a regular expression.
 *
 * This behaviors like `git_config_foreach_match` except instead of all config
 * entries it just enumerates through the given backend entry.
 *
 * @param backend where to get the variables from
 * @param regexp regular expression to match against config names (can be NULL)
 * @param callback the function to call on each variable
 * @param payload the data to pass to the callback
 */
GIT_EXTERN(int) git_config_backend_foreach_match(
	git_config_backend *backend,
	const char *regexp,
	git_config_foreach_cb callback,
	void *payload);


/**
 * Lock the backend with the highest priority
 *
 * Locking disallows anybody else from writing to that backend. Any
 * updates made after locking will not be visible to a reader until
 * the file is unlocked.
 *
 * You can apply the changes by calling `git_transaction_commit()`
 * before freeing the transaction. Either of these actions will unlock
 * the config.
 *
 * @param tx the resulting transaction, use this to commit or undo the
 * changes
 * @param cfg the configuration in which to lock
 * @return 0 or an error code
 */
GIT_EXTERN(int) git_config_lock(git_transaction **tx, git_config *cfg);

/** @} */
GIT_END_DECL
#endif
