X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=config.c;h=992e9884079a1edd5e42a6481ef5c40ac27edfed;hb=1e80e0449248edb77b0fb9853f4a3404a599e207;hp=5d237c862d4c7d0e3c62565849df7b87e4bf78a6;hpb=8fc66df237afce0b4318657f166b3583831949f3;p=git.git diff --git a/config.c b/config.c index 5d237c86..992e9884 100644 --- a/config.c +++ b/config.c @@ -11,6 +11,7 @@ #define MAXNAME (256) static FILE *config_file; +static const char *config_file_name; static int config_linenr; static int get_next_char(void) { @@ -143,7 +144,7 @@ static int get_base_var(char *name) return -1; if (c == ']') return baselen; - if (!isalnum(c)) + if (!isalnum(c) && c != '.') return -1; if (baselen > MAXNAME / 2) return -1; @@ -186,7 +187,7 @@ static int git_parse_file(config_fn_t fn) if (get_value(fn, var, baselen+1) < 0) break; } - die("bad config file line %d", config_linenr); + die("bad config file line %d in %s", config_linenr, config_file_name); } int git_config_int(const char *name, const char *value) @@ -197,7 +198,7 @@ int git_config_int(const char *name, const char *value) if (!*end) return val; } - die("bad config value for '%s'", name); + die("bad config value for '%s' in %s", name, config_file_name); } int git_config_bool(const char *name, const char *value) @@ -236,8 +237,8 @@ int git_default_config(const char *var, const char *value) return 0; } - if (!strcmp(var, "diff.renamelimit")) { - diff_rename_limit_default = git_config_int(var, value); + if (!strcmp(var, "i18n.commitencoding")) { + strncpy(git_commit_encoding, value, sizeof(git_commit_encoding)); return 0; } @@ -245,21 +246,28 @@ int git_default_config(const char *var, const char *value) return 0; } -int git_config(config_fn_t fn) +int git_config_from_file(config_fn_t fn, const char *filename) { int ret; - FILE *f = fopen(git_path("config"), "r"); + FILE *f = fopen(filename, "r"); ret = -1; if (f) { config_file = f; + config_file_name = filename; config_linenr = 1; ret = git_parse_file(fn); fclose(f); + config_file_name = NULL; } return ret; } +int git_config(config_fn_t fn) +{ + return git_config_from_file(fn, git_path("config")); +} + /* * Find all the stuff for git_config_set() below. */ @@ -403,35 +411,37 @@ int git_config_set_multivar(const char* key, const char* value, int i; struct stat st; int fd; - char* config_file = strdup(git_path("config")); + char* config_filename = strdup(git_path("config")); char* lock_file = strdup(git_path("config.lock")); - - store.multi_replace = multi_replace; + const char* last_dot = strrchr(key, '.'); /* * Since "key" actually contains the section name and the real * key name separated by a dot, we have to know where the dot is. */ - for (store.baselen = 0; - key[store.baselen] != '.' && key[store.baselen]; - store.baselen++); - if (!key[store.baselen] || !key[store.baselen+1]) { + + if (last_dot == NULL) { fprintf(stderr, "key does not contain a section: %s\n", key); return 2; } + store.baselen = last_dot - key; + + store.multi_replace = multi_replace; /* * Validate the key and while at it, lower case it for matching. */ store.key = (char*)malloc(strlen(key)+1); for (i = 0; key[i]; i++) - if (i != store.baselen && (!isalnum(key[i]) || - (i == store.baselen+1 && !isalpha(key[i])))) { + if (i != store.baselen && + ((!isalnum(key[i]) && key[i] != '.') || + (i == store.baselen+1 && !isalpha(key[i])))) { fprintf(stderr, "invalid key: %s\n", key); free(store.key); return 1; } else store.key[i] = tolower(key[i]); + store.key[i] = 0; /* * The lock_file serves a purpose in addition to locking: the new @@ -447,13 +457,7 @@ 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_file, &st)) { - static const char contents[] = - "#\n" - "# This is the config file\n" - "#\n" - "\n"; - + if (stat(config_filename, &st)) { free(store.key); /* if nothing to unset, error out */ @@ -464,8 +468,6 @@ 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{ @@ -485,7 +487,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; @@ -526,7 +528,7 @@ int git_config_set_multivar(const char* key, const char* value, return 5; } - in_fd = open(config_file, O_RDONLY, 0666); + in_fd = open(config_filename, O_RDONLY, 0666); contents = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, in_fd, 0); close(in_fd); @@ -567,12 +569,12 @@ int git_config_set_multivar(const char* key, const char* value, st.st_size - copy_begin); munmap(contents, st.st_size); - unlink(config_file); + unlink(config_filename); } close(fd); - if (rename(lock_file, config_file) < 0) { + if (rename(lock_file, config_filename) < 0) { fprintf(stderr, "Could not rename the lock file?\n"); return 4; }