Merge branch 'lt/logopt' into next
[gitweb.git] / config.c
index 34584f62b40ef256d1d0f75e2ee16ed30b1c11fa..95ec34923d3fcf4d2a8fa16cbab9a5cbfe8e4f6f 100644 (file)
--- a/config.c
+++ b/config.c
@@ -222,11 +222,21 @@ int git_default_config(const char *var, const char *value)
                return 0;
        }
 
+       if (!strcmp(var, "core.ignorestat")) {
+               assume_unchanged = git_config_bool(var, value);
+               return 0;
+       }
+
        if (!strcmp(var, "core.symrefsonly")) {
                only_use_symrefs = git_config_bool(var, value);
                return 0;
        }
 
+       if (!strcmp(var, "core.warnambiguousrefs")) {
+               warn_ambiguous_refs = git_config_bool(var, value);
+               return 0;
+       }
+
        if (!strcmp(var, "user.name")) {
                strncpy(git_default_name, value, sizeof(git_default_name));
                return 0;
@@ -409,8 +419,7 @@ int git_config_set_multivar(const char* key, const char* value,
        const char* value_regex, int multi_replace)
 {
        int i;
-       struct stat st;
-       int fd;
+       int fd, in_fd;
        char* config_filename = strdup(git_path("config"));
        char* lock_file = strdup(git_path("config.lock"));
        const char* last_dot = strrchr(key, '.');
@@ -457,15 +466,17 @@ int git_config_set_multivar(const char* key, const char* value,
        /*
         * If .git/config does not exist yet, write a minimal version.
         */
-       if (stat(config_filename, &st)) {
-               static const char contents[] =
-                       "#\n"
-                       "# This is the config file\n"
-                       "#\n"
-                       "\n";
-
+       in_fd = open(config_filename, O_RDONLY);
+       if ( in_fd < 0 ) {
                free(store.key);
 
+               if ( ENOENT != errno ) {
+                       error("opening %s: %s", config_filename,
+                             strerror(errno));
+                       close(fd);
+                       unlink(lock_file);
+                       return 3; /* same as "invalid config file" */
+               }
                /* if nothing to unset, error out */
                if (value == NULL) {
                        close(fd);
@@ -474,12 +485,10 @@ int git_config_set_multivar(const char* key, const char* value,
                }
 
                store.key = (char*)key;
-
-               write(fd, contents, sizeof(contents)-1);
                store_write_section(fd, key);
                store_write_pair(fd, key, value);
        } else{
-               int in_fd;
+               struct stat st;
                char* contents;
                int i, copy_begin, copy_end, new_line = 0;
 
@@ -495,7 +504,7 @@ int git_config_set_multivar(const char* key, const char* value,
                        store.value_regex = (regex_t*)malloc(sizeof(regex_t));
                        if (regcomp(store.value_regex, value_regex,
                                        REG_EXTENDED)) {
-                               fprintf(stderr, "Invalid pattern: %s",
+                               fprintf(stderr, "Invalid pattern: %s\n",
                                        value_regex);
                                free(store.value_regex);
                                return 6;
@@ -536,7 +545,7 @@ int git_config_set_multivar(const char* key, const char* value,
                        return 5;
                }
 
-               in_fd = open(config_filename, O_RDONLY, 0666);
+               fstat(in_fd, &st);
                contents = mmap(NULL, st.st_size, PROT_READ,
                        MAP_PRIVATE, in_fd, 0);
                close(in_fd);