]> git.proxmox.com Git - libgit2.git/commitdiff
Read and parse the confguration when openingt the config file
authorCarlos Martín Nieto <cmn@elego.de>
Mon, 28 Mar 2011 15:51:18 +0000 (17:51 +0200)
committerCarlos Martín Nieto <cmn@elego.de>
Mon, 28 Mar 2011 15:51:18 +0000 (17:51 +0200)
Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
src/config.c

index 656f64eb0f483eb1d16ee3375766334da8f4913f..e615b032727f9aa36e641c16a1df68d03c8afcca 100644 (file)
 
 #include <ctype.h>
 
-
+/**********************
+ * Forward declarations
+ ***********************/
+static int config_parse(git_config *cfg_file);
+static int parse_variable(git_config *cfg, const char *section_name, const char *line);
 uint32_t config_table_hash(const void *key)
 {
        const char *var_name = (char *)key;
@@ -48,6 +52,7 @@ int config_table_haskey(void *object, const void *key)
 int git_config_open(git_config **cfg_out, const char *path)
 {
        git_config *cfg;
+       int error = GIT_SUCCESS;
 
        assert(cfg_out && path);
 
@@ -58,15 +63,35 @@ int git_config_open(git_config **cfg_out, const char *path)
        memset(cfg, 0x0, sizeof(git_config));
 
        cfg->file_path = git__strdup(path);
-       if (cfg->file_path == NULL)
-               return GIT_ENOMEM;
+       if (cfg->file_path == NULL){
+               error = GIT_ENOMEM;
+               goto cleanup;
+       }
 
        cfg->vars = git_hashtable_alloc(16, config_table_hash, config_table_haskey);
-       if (cfg->vars == NULL)
-               return GIT_ENOMEM;
+       if (cfg->vars == NULL){
+               error = GIT_ENOMEM;
+               goto cleanup;
+       }
 
        *cfg_out = cfg;
-       return GIT_SUCCESS;
+
+       error = gitfo_read_file(&cfg->reader.buffer, cfg->file_path);
+       if(error < GIT_SUCCESS)
+               goto cleanup;
+
+       /* Initialise the reading position */
+       cfg->reader.read_ptr = cfg->reader.buffer.data;
+       return config_parse(cfg);
+
+ cleanup:
+       if(cfg->vars)
+               git_hashtable_free(cfg->vars);
+       if(cfg->file_path)
+               free(cfg->file_path);
+       free(cfg);
+
+       return error;
 }
 
 void git_config_free(git_config *cfg)