core.prefersymlinkrefs: use symlinks for .git/HEAD
[gitweb.git] / config.c
index 7dbdce1966b3c5e462e377b34ce8a11dd9668c0a..87fb22041ec4b068cf1072689bc8309d8804ae1e 100644 (file)
--- a/config.c
+++ b/config.c
@@ -60,6 +60,12 @@ static char *parse_value(void)
                        space = 1;
                        continue;
                }
+               if (!quote) {
+                       if (c == ';' || c == '#') {
+                               comment = 1;
+                               continue;
+                       }
+               }
                if (space) {
                        if (len)
                                value[len++] = ' ';
@@ -93,12 +99,6 @@ static char *parse_value(void)
                        quote = 1-quote;
                        continue;
                }
-               if (!quote) {
-                       if (c == ';' || c == '#') {
-                               comment = 1;
-                               continue;
-                       }
-               }
                value[len++] = c;
        }
 }
@@ -227,8 +227,13 @@ int git_default_config(const char *var, const char *value)
                return 0;
        }
 
-       if (!strcmp(var, "core.symrefsonly")) {
-               only_use_symrefs = git_config_bool(var, value);
+       if (!strcmp(var, "core.prefersymlinkrefs")) {
+               prefer_symlink_refs = git_config_bool(var, value);
+               return 0;
+       }
+
+       if (!strcmp(var, "core.warnambiguousrefs")) {
+               warn_ambiguous_refs = git_config_bool(var, value);
                return 0;
        }
 
@@ -247,7 +252,7 @@ int git_default_config(const char *var, const char *value)
                return 0;
        }
 
-       /* Add other config variables here.. */
+       /* Add other config variables here and to Documentation/config.txt. */
        return 0;
 }
 
@@ -330,8 +335,9 @@ static int store_aux(const char* key, const char* value)
                        store.offset[store.seen] = ftell(config_file);
                        store.state = KEY_SEEN;
                        store.seen++;
-               } else if(!strncmp(key, store.key, store.baselen))
-                       store.state = SECTION_SEEN;
+               } else if (strrchr(key, '.') - key == store.baselen &&
+                             !strncmp(key, store.key, store.baselen))
+                                       store.state = SECTION_SEEN;
        }
        return 0;
 }
@@ -415,6 +421,7 @@ int git_config_set_multivar(const char* key, const char* value,
 {
        int i;
        int fd, in_fd;
+       int ret;
        char* config_filename = strdup(git_path("config"));
        char* lock_file = strdup(git_path("config.lock"));
        const char* last_dot = strrchr(key, '.');
@@ -424,9 +431,10 @@ int git_config_set_multivar(const char* key, const char* value,
         * key name separated by a dot, we have to know where the dot is.
         */
 
-       if (last_dot == NULL) { 
+       if (last_dot == NULL) {
                fprintf(stderr, "key does not contain a section: %s\n", key);
-               return 2;
+               ret = 2;
+               goto out_free;
        }
        store.baselen = last_dot - key;
 
@@ -442,7 +450,8 @@ int git_config_set_multivar(const char* key, const char* value,
                                 (i == store.baselen+1 && !isalpha(key[i])))) {
                        fprintf(stderr, "invalid key: %s\n", key);
                        free(store.key);
-                       return 1;
+                       ret = 1;
+                       goto out_free;
                } else
                        store.key[i] = tolower(key[i]);
        store.key[i] = 0;
@@ -455,7 +464,8 @@ int git_config_set_multivar(const char* key, const char* value,
        if (fd < 0) {
                fprintf(stderr, "could not lock config file\n");
                free(store.key);
-               return -1;
+               ret = -1;
+               goto out_free;
        }
 
        /*
@@ -470,13 +480,15 @@ int git_config_set_multivar(const char* key, const char* value,
                              strerror(errno));
                        close(fd);
                        unlink(lock_file);
-                       return 3; /* same as "invalid config file" */
+                       ret = 3; /* same as "invalid config file" */
+                       goto out_free;
                }
                /* if nothing to unset, error out */
                if (value == NULL) {
                        close(fd);
                        unlink(lock_file);
-                       return 5;
+                       ret = 5;
+                       goto out_free;
                }
 
                store.key = (char*)key;
@@ -502,7 +514,8 @@ int git_config_set_multivar(const char* key, const char* value,
                                fprintf(stderr, "Invalid pattern: %s\n",
                                        value_regex);
                                free(store.value_regex);
-                               return 6;
+                               ret = 6;
+                               goto out_free;
                        }
                }
 
@@ -523,7 +536,8 @@ int git_config_set_multivar(const char* key, const char* value,
                                regfree(store.value_regex);
                                free(store.value_regex);
                        }
-                       return 3;
+                       ret = 3;
+                       goto out_free;
                }
 
                free(store.key);
@@ -537,7 +551,8 @@ int git_config_set_multivar(const char* key, const char* value,
                                (store.seen > 1 && multi_replace == 0)) {
                        close(fd);
                        unlink(lock_file);
-                       return 5;
+                       ret = 5;
+                       goto out_free;
                }
 
                fstat(in_fd, &st);
@@ -588,10 +603,18 @@ int git_config_set_multivar(const char* key, const char* value,
 
        if (rename(lock_file, config_filename) < 0) {
                fprintf(stderr, "Could not rename the lock file?\n");
-               return 4;
+               ret = 4;
+               goto out_free;
        }
 
-       return 0;
+       ret = 0;
+
+out_free:
+       if (config_filename)
+               free(config_filename);
+       if (lock_file)
+               free(lock_file);
+       return ret;
 }