summaryrefslogtreecommitdiff
path: root/include/git2
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-03-15 16:39:00 -0700
committerRussell Belfer <rb@github.com>2013-03-15 16:39:00 -0700
commit5540d9477ed143707435324e785336d254b12e47 (patch)
tree4ffaba1990a82cc51ee5169d7d2913ecceef4df2 /include/git2
parenta5f6138407efb6d8866fe8de5aac13454aefcd82 (diff)
downloadlibgit2-5540d9477ed143707435324e785336d254b12e47.tar.gz
Implement global/system file search paths
The goal of this work is to expose the search logic for "global", "system", and "xdg" files through the git_libgit2_opts() interface. Behind the scenes, I changed the logic for finding files to have a notion of a git_strarray that represents a search path and to store a separate search path for each of the three tiers of config file. For each tier, I implemented a function to initialize it to default values (generally based on environment variables), and then general interfaces to get it, set it, reset it, and prepend new directories to it. Next, I exposed these interfaces through the git_libgit2_opts interface, reusing the GIT_CONFIG_LEVEL_SYSTEM, etc., constants for the user to control which search path they were modifying. There are alternative designs for the opts interface / argument ordering, so I'm putting this phase out for discussion. Additionally, I ended up doing a little bit of clean up regarding attr.h and attr_file.h, adding a new attrcache.h so the other two files wouldn't have to be included in so many places.
Diffstat (limited to 'include/git2')
-rw-r--r--include/git2/common.h46
-rw-r--r--include/git2/strarray.h30
2 files changed, 66 insertions, 10 deletions
diff --git a/include/git2/common.h b/include/git2/common.h
index 7066d5ea3..137ffa0a4 100644
--- a/include/git2/common.h
+++ b/include/git2/common.h
@@ -128,7 +128,10 @@ enum {
GIT_OPT_GET_MWINDOW_SIZE,
GIT_OPT_SET_MWINDOW_SIZE,
GIT_OPT_GET_MWINDOW_MAPPED_LIMIT,
- GIT_OPT_SET_MWINDOW_MAPPED_LIMIT
+ GIT_OPT_SET_MWINDOW_MAPPED_LIMIT,
+ GIT_OPT_GET_SEARCH_PATH,
+ GIT_OPT_SET_SEARCH_PATH,
+ GIT_OPT_PREPEND_SEARCH_PATH,
};
/**
@@ -136,17 +139,44 @@ enum {
*
* Available options:
*
- * opts(GIT_OPT_MWINDOW_SIZE, size_t):
- * set the maximum mmap window size
+ * opts(GIT_OPT_GET_MWINDOW_SIZE, size_t *):
+ * Get the maximum mmap window size
*
- * opts(GIT_OPT_MWINDOW_MAPPED_LIMIT, size_t):
- * set the maximum amount of memory that can be mapped at any time
+ * opts(GIT_OPT_SET_MWINDOW_SIZE, size_t):
+ * Set the maximum mmap window size
+ *
+ * opts(GIT_OPT_GET_MWINDOW_MAPPED_LIMIT, size_t *):
+ * Get the maximum memory that will be mapped in total by the library
+ *
+ * opts(GIT_OPT_SET_MWINDOW_MAPPED_LIMIT, size_t):
+ * Set the maximum amount of memory that can be mapped at any time
* by the library
*
- * @param option Option key
- * @param ... value to set the option
+ * opts(GIT_OPT_GET_SEARCH_PATH, const git_strarray **, int level)
+ * Get a strarray of the search path for a given level of config
+ * data. "level" must be one of GIT_CONFIG_LEVEL_SYSTEM,
+ * GIT_CONFIG_LEVEL_GLOBAL, or GIT_CONFIG_LEVEL_XDG. The search
+ * path applies to shared attributes and ignore files, too.
+ *
+ * opts(GIT_OPT_SET_SEARCH_PATH, int level, const git_strarray *)
+ * Set the search path for a given level of config data. Passing
+ * NULL for the git_strarray pointer resets the search path to the
+ * default (which is generally based on environment variables).
+ * "level" must be one of GIT_CONFIG_LEVEL_SYSTEM,
+ * GIT_CONFIG_LEVEL_GLOBAL, or GIT_CONFIG_LEVEL_XDG. The search
+ * path applies to shared attributes and ignore files, too.
+ *
+ * opts(GIT_OPT_PREPEND_SEARCH_PATH, int level, const git_strarray *)
+ * Prepend new directories to the search path for a given level of
+ * config data. "level" must be one of GIT_CONFIG_LEVEL_SYSTEM,
+ * GIT_CONFIG_LEVEL_GLOBAL, or GIT_CONFIG_LEVEL_XDG. The search
+ * path applies to shared attributes and ignore files, too.
+ *
+ * @param option Option key
+ * @param ... value to set the option
+ * @return 0 on success, <0 on failure
*/
-GIT_EXTERN(void) git_libgit2_opts(int option, ...);
+GIT_EXTERN(int) git_libgit2_opts(int option, ...);
/** @} */
GIT_END_DECL
diff --git a/include/git2/strarray.h b/include/git2/strarray.h
index 6ea570c14..df34a5b88 100644
--- a/include/git2/strarray.h
+++ b/include/git2/strarray.h
@@ -43,8 +43,8 @@ GIT_EXTERN(void) git_strarray_free(git_strarray *array);
/**
* Copy a string array object from source to target.
*
- * Note: target is overwritten and hence should be empty,
- * otherwise its contents are leaked.
+ * Note: target is overwritten and hence should be empty, otherwise its
+ * contents are leaked. Call git_strarray_free() if necessary.
*
* @param tgt target
* @param src source
@@ -52,6 +52,32 @@ GIT_EXTERN(void) git_strarray_free(git_strarray *array);
*/
GIT_EXTERN(int) git_strarray_copy(git_strarray *tgt, const git_strarray *src);
+/**
+ * Initialize a string array from a list of strings
+ *
+ * Note: target is overwritten and hence should be empty, otherwise its
+ * contents are leaked. Call git_strarray_free() if necessary.
+ *
+ * @param tgt target
+ * @param count number of strings to follow
+ * @return 0 on success, <0 on allocation failure
+ */
+GIT_EXTERN(int) git_strarray_set(git_strarray *tgt, size_t count, ...);
+
+/**
+ * Insert a strarray into the beginning of another
+ *
+ * In this case, tgt is an existing (initialized) strarray and the result
+ * will be reallocated with all the strings in src inserted before all of
+ * the existing strings in tgt. Strings in src will be strdup'ed, so
+ * you should still `git_strarray_free()` src when you are done with it.
+ *
+ * @param tgt strarray to update
+ * @param src strarray to copy from
+ * @return 0 on success, <0 on allocation failure (tgt will be unchanged)
+ */
+GIT_EXTERN(int) git_strarray_prepend(git_strarray *tgt, const git_strarray *src);
+
/** @} */
GIT_END_DECL