/* * 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_sys_git_config_backend_h__ #define INCLUDE_sys_git_config_backend_h__ #include "git2/common.h" #include "git2/types.h" #include "git2/config.h" /** * @file git2/sys/config.h * @brief Git config backend routines * @defgroup git_backend Git custom backend APIs * @ingroup Git * @{ */ GIT_BEGIN_DECL /** * Every iterator must have this struct as its first element, so the * API can talk to it. You'd define your iterator as * * struct my_iterator { * git_config_iterator parent; * ... * } * * and assign `iter->parent.backend` to your `git_config_backend`. */ struct git_config_iterator { git_config_backend *backend; unsigned int flags; /** * Return the current entry and advance the iterator. The * memory belongs to the library. */ int GIT_CALLBACK(next)(git_config_entry **entry, git_config_iterator *iter); /** * Free the iterator */ void GIT_CALLBACK(free)(git_config_iterator *iter); }; /** * Generic backend that implements the interface to * access a configuration file */ struct git_config_backend { unsigned int version; /** True if this backend is for a snapshot */ int readonly; struct git_config *cfg; /* Open means open the file/database and parse if necessary */ int GIT_CALLBACK(open)(struct git_config_backend *, git_config_level_t level, const git_repository *repo); int GIT_CALLBACK(get)(struct git_config_backend *, const char *key, git_config_entry **entry); int GIT_CALLBACK(set)(struct git_config_backend *, const char *key, const char *value); int GIT_CALLBACK(set_multivar)(git_config_backend *cfg, const char *name, const char *regexp, const char *value); int GIT_CALLBACK(del)(struct git_config_backend *, const char *key); int GIT_CALLBACK(del_multivar)(struct git_config_backend *, const char *key, const char *regexp); int GIT_CALLBACK(iterator)(git_config_iterator **, struct git_config_backend *); /** Produce a read-only version of this backend */ int GIT_CALLBACK(snapshot)(struct git_config_backend **, struct git_config_backend *); /** * Lock this backend. * * Prevent any writes to the data store backing this * backend. Any updates must not be visible to any other * readers. */ int GIT_CALLBACK(lock)(struct git_config_backend *); /** * Unlock the data store backing this backend. If success is * true, the changes should be committed, otherwise rolled * back. */ int GIT_CALLBACK(unlock)(struct git_config_backend *, int success); void GIT_CALLBACK(free)(struct git_config_backend *); }; #define GIT_CONFIG_BACKEND_VERSION 1 #define GIT_CONFIG_BACKEND_INIT {GIT_CONFIG_BACKEND_VERSION} /** * Initializes a `git_config_backend` with default values. Equivalent to * creating an instance with GIT_CONFIG_BACKEND_INIT. * * @param backend the `git_config_backend` struct to initialize. * @param version Version of struct; pass `GIT_CONFIG_BACKEND_VERSION` * @return Zero on success; -1 on failure. */ GIT_EXTERN(int) git_config_init_backend( git_config_backend *backend, unsigned int version); /** * Add a generic config file instance to an existing config * * 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 file the configuration file (backend) to add * @param level the priority level of the backend * @param repo optional repository to allow parsing of * conditional includes * @param force if a config file already exists for the given * priority level, replace it * @return 0 on success, GIT_EEXISTS when adding more than one file * for a given priority level (and force_replace set to 0), or error code */ GIT_EXTERN(int) git_config_add_backend( git_config *cfg, git_config_backend *file, git_config_level_t level, const git_repository *repo, int force); /** @} */ GIT_END_DECL #endif