]> git.ipfire.org Git - thirdparty/git.git/blobdiff - config.c
Use symbolic name SHORT_NAME_AMBIGUOUS as error return value
[thirdparty/git.git] / config.c
index 34584f62b40ef256d1d0f75e2ee16ed30b1c11fa..8355224bb16442d47c413aef3552b5d94c34b919 100644 (file)
--- a/config.c
+++ b/config.c
@@ -409,8 +409,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 +456,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 +475,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 +494,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 +535,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);