Commit cfef5fb779ceba60cdd04f323b88373181c0fa8d

Vicent Marti 2011-06-29T15:09:21

config: `foreach` now returns variable values too

diff --git a/include/git2/config.h b/include/git2/config.h
index feac112..05ff309 100644
--- a/include/git2/config.h
+++ b/include/git2/config.h
@@ -48,7 +48,7 @@ struct git_config_file {
 	int (*open)(struct git_config_file *);
 	int (*get)(struct git_config_file *, const char *key, const char **value);
 	int (*set)(struct git_config_file *, const char *key, const char *value);
-	int (*foreach)(struct git_config_file *, int (*fn)(const char *, void *), void *data);
+	int (*foreach)(struct git_config_file *, int (*fn)(const char *, const char *, void *), void *data);
 	void (*free)(struct git_config_file *);
 };
 
@@ -254,19 +254,22 @@ GIT_EXTERN(int) git_config_set_bool(git_config *cfg, const char *name, int value
 GIT_EXTERN(int) git_config_set_string(git_config *cfg, const char *name, const char *value);
 
 /**
- * Perform an operation on each config variable.
+ * Perform an operation on each config variable
  *
- * The callback is passed a pointer to a config variable name and the
- * data pointer passed to this function. As soon as one of the
- * callback functions returns something other than 0, this function
- * returns that value.
+ * The callback receives the normalized name and value of each variable
+ * in the config backend, and the data pointer passed to this function.
+ * As soon as one of the callback functions returns something other than 0,
+ * this function returns that value.
  *
  * @param cfg where to get the variables from
  * @param callback the function to call on each variable
  * @param data the data to pass to the callback
  * @return GIT_SUCCESS or the return value of the callback which didn't return 0
  */
-GIT_EXTERN(int) git_config_foreach(git_config *cfg, int (*callback)(const char *, void *data), void *data);
+GIT_EXTERN(int) git_config_foreach(
+	git_config *cfg,
+	int (*callback)(const char *var_name, const char *value, void *payload),
+	void *payload);
 
 /** @} */
 GIT_END_DECL
diff --git a/src/config.c b/src/config.c
index cc31bda..a2202d7 100644
--- a/src/config.c
+++ b/src/config.c
@@ -151,7 +151,7 @@ int git_config_add_file(git_config *cfg, git_config_file *file, int priority)
  * Loop over all the variables
  */
 
-int git_config_foreach(git_config *cfg, int (*fn)(const char *, void *), void *data)
+int git_config_foreach(git_config *cfg, int (*fn)(const char *, const char *, void *), void *data)
 {
 	int ret = GIT_SUCCESS;
 	unsigned int i;
diff --git a/src/config_file.c b/src/config_file.c
index 2966f11..b017787 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -310,7 +310,7 @@ static void backend_free(git_config_file *_backend)
 	free(backend);
 }
 
-static int file_foreach(git_config_file *backend, int (*fn)(const char *, void *), void *data)
+static int file_foreach(git_config_file *backend, int (*fn)(const char *, const char *, void *), void *data)
 {
 	int ret = GIT_SUCCESS;
 	cvar_t *var;
@@ -323,7 +323,7 @@ static int file_foreach(git_config_file *backend, int (*fn)(const char *, void *
 		if (ret < GIT_SUCCESS)
 			return ret;
 
-		ret = fn(normalized, data);
+		ret = fn(normalized, var->value, data);
 		free(normalized);
 		if (ret)
 			break;