Merge branch 'rs/child-process-init'
[git] / config.c
1 /*
2  * GIT - The information manager from hell
3  *
4  * Copyright (C) Linus Torvalds, 2005
5  * Copyright (C) Johannes Schindelin, 2005
6  *
7  */
8 #include "cache.h"
9 #include "exec_cmd.h"
10 #include "strbuf.h"
11 #include "quote.h"
12 #include "hashmap.h"
13 #include "string-list.h"
14
15 struct config_source {
16         struct config_source *prev;
17         union {
18                 FILE *file;
19                 struct config_buf {
20                         const char *buf;
21                         size_t len;
22                         size_t pos;
23                 } buf;
24         } u;
25         const char *name;
26         const char *path;
27         int die_on_error;
28         int linenr;
29         int eof;
30         struct strbuf value;
31         struct strbuf var;
32
33         int (*do_fgetc)(struct config_source *c);
34         int (*do_ungetc)(int c, struct config_source *conf);
35         long (*do_ftell)(struct config_source *c);
36 };
37
38 static struct config_source *cf;
39
40 static int zlib_compression_seen;
41
42 /*
43  * Default config_set that contains key-value pairs from the usual set of config
44  * config files (i.e repo specific .git/config, user wide ~/.gitconfig, XDG
45  * config file and the global /etc/gitconfig)
46  */
47 static struct config_set the_config_set;
48
49 static int config_file_fgetc(struct config_source *conf)
50 {
51         return fgetc(conf->u.file);
52 }
53
54 static int config_file_ungetc(int c, struct config_source *conf)
55 {
56         return ungetc(c, conf->u.file);
57 }
58
59 static long config_file_ftell(struct config_source *conf)
60 {
61         return ftell(conf->u.file);
62 }
63
64
65 static int config_buf_fgetc(struct config_source *conf)
66 {
67         if (conf->u.buf.pos < conf->u.buf.len)
68                 return conf->u.buf.buf[conf->u.buf.pos++];
69
70         return EOF;
71 }
72
73 static int config_buf_ungetc(int c, struct config_source *conf)
74 {
75         if (conf->u.buf.pos > 0)
76                 return conf->u.buf.buf[--conf->u.buf.pos];
77
78         return EOF;
79 }
80
81 static long config_buf_ftell(struct config_source *conf)
82 {
83         return conf->u.buf.pos;
84 }
85
86 #define MAX_INCLUDE_DEPTH 10
87 static const char include_depth_advice[] =
88 "exceeded maximum include depth (%d) while including\n"
89 "       %s\n"
90 "from\n"
91 "       %s\n"
92 "Do you have circular includes?";
93 static int handle_path_include(const char *path, struct config_include_data *inc)
94 {
95         int ret = 0;
96         struct strbuf buf = STRBUF_INIT;
97         char *expanded;
98
99         if (!path)
100                 return config_error_nonbool("include.path");
101
102         expanded = expand_user_path(path);
103         if (!expanded)
104                 return error("Could not expand include path '%s'", path);
105         path = expanded;
106
107         /*
108          * Use an absolute path as-is, but interpret relative paths
109          * based on the including config file.
110          */
111         if (!is_absolute_path(path)) {
112                 char *slash;
113
114                 if (!cf || !cf->path)
115                         return error("relative config includes must come from files");
116
117                 slash = find_last_dir_sep(cf->path);
118                 if (slash)
119                         strbuf_add(&buf, cf->path, slash - cf->path + 1);
120                 strbuf_addstr(&buf, path);
121                 path = buf.buf;
122         }
123
124         if (!access_or_die(path, R_OK, 0)) {
125                 if (++inc->depth > MAX_INCLUDE_DEPTH)
126                         die(include_depth_advice, MAX_INCLUDE_DEPTH, path,
127                             cf && cf->name ? cf->name : "the command line");
128                 ret = git_config_from_file(git_config_include, path, inc);
129                 inc->depth--;
130         }
131         strbuf_release(&buf);
132         free(expanded);
133         return ret;
134 }
135
136 int git_config_include(const char *var, const char *value, void *data)
137 {
138         struct config_include_data *inc = data;
139         const char *type;
140         int ret;
141
142         /*
143          * Pass along all values, including "include" directives; this makes it
144          * possible to query information on the includes themselves.
145          */
146         ret = inc->fn(var, value, inc->data);
147         if (ret < 0)
148                 return ret;
149
150         if (!skip_prefix(var, "include.", &type))
151                 return ret;
152
153         if (!strcmp(type, "path"))
154                 ret = handle_path_include(value, inc);
155         return ret;
156 }
157
158 void git_config_push_parameter(const char *text)
159 {
160         struct strbuf env = STRBUF_INIT;
161         const char *old = getenv(CONFIG_DATA_ENVIRONMENT);
162         if (old) {
163                 strbuf_addstr(&env, old);
164                 strbuf_addch(&env, ' ');
165         }
166         sq_quote_buf(&env, text);
167         setenv(CONFIG_DATA_ENVIRONMENT, env.buf, 1);
168         strbuf_release(&env);
169 }
170
171 int git_config_parse_parameter(const char *text,
172                                config_fn_t fn, void *data)
173 {
174         const char *value;
175         struct strbuf **pair;
176
177         pair = strbuf_split_str(text, '=', 2);
178         if (!pair[0])
179                 return error("bogus config parameter: %s", text);
180
181         if (pair[0]->len && pair[0]->buf[pair[0]->len - 1] == '=') {
182                 strbuf_setlen(pair[0], pair[0]->len - 1);
183                 value = pair[1] ? pair[1]->buf : "";
184         } else {
185                 value = NULL;
186         }
187
188         strbuf_trim(pair[0]);
189         if (!pair[0]->len) {
190                 strbuf_list_free(pair);
191                 return error("bogus config parameter: %s", text);
192         }
193         strbuf_tolower(pair[0]);
194         if (fn(pair[0]->buf, value, data) < 0) {
195                 strbuf_list_free(pair);
196                 return -1;
197         }
198         strbuf_list_free(pair);
199         return 0;
200 }
201
202 int git_config_from_parameters(config_fn_t fn, void *data)
203 {
204         const char *env = getenv(CONFIG_DATA_ENVIRONMENT);
205         char *envw;
206         const char **argv = NULL;
207         int nr = 0, alloc = 0;
208         int i;
209
210         if (!env)
211                 return 0;
212         /* sq_dequote will write over it */
213         envw = xstrdup(env);
214
215         if (sq_dequote_to_argv(envw, &argv, &nr, &alloc) < 0) {
216                 free(envw);
217                 return error("bogus format in " CONFIG_DATA_ENVIRONMENT);
218         }
219
220         for (i = 0; i < nr; i++) {
221                 if (git_config_parse_parameter(argv[i], fn, data) < 0) {
222                         free(argv);
223                         free(envw);
224                         return -1;
225                 }
226         }
227
228         free(argv);
229         free(envw);
230         return nr > 0;
231 }
232
233 static int get_next_char(void)
234 {
235         int c = cf->do_fgetc(cf);
236
237         if (c == '\r') {
238                 /* DOS like systems */
239                 c = cf->do_fgetc(cf);
240                 if (c != '\n') {
241                         cf->do_ungetc(c, cf);
242                         c = '\r';
243                 }
244         }
245         if (c == '\n')
246                 cf->linenr++;
247         if (c == EOF) {
248                 cf->eof = 1;
249                 cf->linenr++;
250                 c = '\n';
251         }
252         return c;
253 }
254
255 static char *parse_value(void)
256 {
257         int quote = 0, comment = 0, space = 0;
258
259         strbuf_reset(&cf->value);
260         for (;;) {
261                 int c = get_next_char();
262                 if (c == '\n') {
263                         if (quote) {
264                                 cf->linenr--;
265                                 return NULL;
266                         }
267                         return cf->value.buf;
268                 }
269                 if (comment)
270                         continue;
271                 if (isspace(c) && !quote) {
272                         if (cf->value.len)
273                                 space++;
274                         continue;
275                 }
276                 if (!quote) {
277                         if (c == ';' || c == '#') {
278                                 comment = 1;
279                                 continue;
280                         }
281                 }
282                 for (; space; space--)
283                         strbuf_addch(&cf->value, ' ');
284                 if (c == '\\') {
285                         c = get_next_char();
286                         switch (c) {
287                         case '\n':
288                                 continue;
289                         case 't':
290                                 c = '\t';
291                                 break;
292                         case 'b':
293                                 c = '\b';
294                                 break;
295                         case 'n':
296                                 c = '\n';
297                                 break;
298                         /* Some characters escape as themselves */
299                         case '\\': case '"':
300                                 break;
301                         /* Reject unknown escape sequences */
302                         default:
303                                 return NULL;
304                         }
305                         strbuf_addch(&cf->value, c);
306                         continue;
307                 }
308                 if (c == '"') {
309                         quote = 1-quote;
310                         continue;
311                 }
312                 strbuf_addch(&cf->value, c);
313         }
314 }
315
316 static inline int iskeychar(int c)
317 {
318         return isalnum(c) || c == '-';
319 }
320
321 static int get_value(config_fn_t fn, void *data, struct strbuf *name)
322 {
323         int c;
324         char *value;
325         int ret;
326
327         /* Get the full name */
328         for (;;) {
329                 c = get_next_char();
330                 if (cf->eof)
331                         break;
332                 if (!iskeychar(c))
333                         break;
334                 strbuf_addch(name, tolower(c));
335         }
336
337         while (c == ' ' || c == '\t')
338                 c = get_next_char();
339
340         value = NULL;
341         if (c != '\n') {
342                 if (c != '=')
343                         return -1;
344                 value = parse_value();
345                 if (!value)
346                         return -1;
347         }
348         /*
349          * We already consumed the \n, but we need linenr to point to
350          * the line we just parsed during the call to fn to get
351          * accurate line number in error messages.
352          */
353         cf->linenr--;
354         ret = fn(name->buf, value, data);
355         cf->linenr++;
356         return ret;
357 }
358
359 static int get_extended_base_var(struct strbuf *name, int c)
360 {
361         do {
362                 if (c == '\n')
363                         goto error_incomplete_line;
364                 c = get_next_char();
365         } while (isspace(c));
366
367         /* We require the format to be '[base "extension"]' */
368         if (c != '"')
369                 return -1;
370         strbuf_addch(name, '.');
371
372         for (;;) {
373                 int c = get_next_char();
374                 if (c == '\n')
375                         goto error_incomplete_line;
376                 if (c == '"')
377                         break;
378                 if (c == '\\') {
379                         c = get_next_char();
380                         if (c == '\n')
381                                 goto error_incomplete_line;
382                 }
383                 strbuf_addch(name, c);
384         }
385
386         /* Final ']' */
387         if (get_next_char() != ']')
388                 return -1;
389         return 0;
390 error_incomplete_line:
391         cf->linenr--;
392         return -1;
393 }
394
395 static int get_base_var(struct strbuf *name)
396 {
397         for (;;) {
398                 int c = get_next_char();
399                 if (cf->eof)
400                         return -1;
401                 if (c == ']')
402                         return 0;
403                 if (isspace(c))
404                         return get_extended_base_var(name, c);
405                 if (!iskeychar(c) && c != '.')
406                         return -1;
407                 strbuf_addch(name, tolower(c));
408         }
409 }
410
411 static int git_parse_source(config_fn_t fn, void *data)
412 {
413         int comment = 0;
414         int baselen = 0;
415         struct strbuf *var = &cf->var;
416
417         /* U+FEFF Byte Order Mark in UTF8 */
418         static const unsigned char *utf8_bom = (unsigned char *) "\xef\xbb\xbf";
419         const unsigned char *bomptr = utf8_bom;
420
421         for (;;) {
422                 int c = get_next_char();
423                 if (bomptr && *bomptr) {
424                         /* We are at the file beginning; skip UTF8-encoded BOM
425                          * if present. Sane editors won't put this in on their
426                          * own, but e.g. Windows Notepad will do it happily. */
427                         if ((unsigned char) c == *bomptr) {
428                                 bomptr++;
429                                 continue;
430                         } else {
431                                 /* Do not tolerate partial BOM. */
432                                 if (bomptr != utf8_bom)
433                                         break;
434                                 /* No BOM at file beginning. Cool. */
435                                 bomptr = NULL;
436                         }
437                 }
438                 if (c == '\n') {
439                         if (cf->eof)
440                                 return 0;
441                         comment = 0;
442                         continue;
443                 }
444                 if (comment || isspace(c))
445                         continue;
446                 if (c == '#' || c == ';') {
447                         comment = 1;
448                         continue;
449                 }
450                 if (c == '[') {
451                         /* Reset prior to determining a new stem */
452                         strbuf_reset(var);
453                         if (get_base_var(var) < 0 || var->len < 1)
454                                 break;
455                         strbuf_addch(var, '.');
456                         baselen = var->len;
457                         continue;
458                 }
459                 if (!isalpha(c))
460                         break;
461                 /*
462                  * Truncate the var name back to the section header
463                  * stem prior to grabbing the suffix part of the name
464                  * and the value.
465                  */
466                 strbuf_setlen(var, baselen);
467                 strbuf_addch(var, tolower(c));
468                 if (get_value(fn, data, var) < 0)
469                         break;
470         }
471         if (cf->die_on_error)
472                 die(_("bad config file line %d in %s"), cf->linenr, cf->name);
473         else
474                 return error(_("bad config file line %d in %s"), cf->linenr, cf->name);
475 }
476
477 static int parse_unit_factor(const char *end, uintmax_t *val)
478 {
479         if (!*end)
480                 return 1;
481         else if (!strcasecmp(end, "k")) {
482                 *val *= 1024;
483                 return 1;
484         }
485         else if (!strcasecmp(end, "m")) {
486                 *val *= 1024 * 1024;
487                 return 1;
488         }
489         else if (!strcasecmp(end, "g")) {
490                 *val *= 1024 * 1024 * 1024;
491                 return 1;
492         }
493         return 0;
494 }
495
496 static int git_parse_signed(const char *value, intmax_t *ret, intmax_t max)
497 {
498         if (value && *value) {
499                 char *end;
500                 intmax_t val;
501                 uintmax_t uval;
502                 uintmax_t factor = 1;
503
504                 errno = 0;
505                 val = strtoimax(value, &end, 0);
506                 if (errno == ERANGE)
507                         return 0;
508                 if (!parse_unit_factor(end, &factor)) {
509                         errno = EINVAL;
510                         return 0;
511                 }
512                 uval = abs(val);
513                 uval *= factor;
514                 if (uval > max || abs(val) > uval) {
515                         errno = ERANGE;
516                         return 0;
517                 }
518                 val *= factor;
519                 *ret = val;
520                 return 1;
521         }
522         errno = EINVAL;
523         return 0;
524 }
525
526 static int git_parse_unsigned(const char *value, uintmax_t *ret, uintmax_t max)
527 {
528         if (value && *value) {
529                 char *end;
530                 uintmax_t val;
531                 uintmax_t oldval;
532
533                 errno = 0;
534                 val = strtoumax(value, &end, 0);
535                 if (errno == ERANGE)
536                         return 0;
537                 oldval = val;
538                 if (!parse_unit_factor(end, &val)) {
539                         errno = EINVAL;
540                         return 0;
541                 }
542                 if (val > max || oldval > val) {
543                         errno = ERANGE;
544                         return 0;
545                 }
546                 *ret = val;
547                 return 1;
548         }
549         errno = EINVAL;
550         return 0;
551 }
552
553 static int git_parse_int(const char *value, int *ret)
554 {
555         intmax_t tmp;
556         if (!git_parse_signed(value, &tmp, maximum_signed_value_of_type(int)))
557                 return 0;
558         *ret = tmp;
559         return 1;
560 }
561
562 static int git_parse_int64(const char *value, int64_t *ret)
563 {
564         intmax_t tmp;
565         if (!git_parse_signed(value, &tmp, maximum_signed_value_of_type(int64_t)))
566                 return 0;
567         *ret = tmp;
568         return 1;
569 }
570
571 int git_parse_ulong(const char *value, unsigned long *ret)
572 {
573         uintmax_t tmp;
574         if (!git_parse_unsigned(value, &tmp, maximum_unsigned_value_of_type(long)))
575                 return 0;
576         *ret = tmp;
577         return 1;
578 }
579
580 NORETURN
581 static void die_bad_number(const char *name, const char *value)
582 {
583         const char *reason = errno == ERANGE ?
584                              "out of range" :
585                              "invalid unit";
586         if (!value)
587                 value = "";
588
589         if (cf && cf->name)
590                 die(_("bad numeric config value '%s' for '%s' in %s: %s"),
591                     value, name, cf->name, reason);
592         die(_("bad numeric config value '%s' for '%s': %s"), value, name, reason);
593 }
594
595 int git_config_int(const char *name, const char *value)
596 {
597         int ret;
598         if (!git_parse_int(value, &ret))
599                 die_bad_number(name, value);
600         return ret;
601 }
602
603 int64_t git_config_int64(const char *name, const char *value)
604 {
605         int64_t ret;
606         if (!git_parse_int64(value, &ret))
607                 die_bad_number(name, value);
608         return ret;
609 }
610
611 unsigned long git_config_ulong(const char *name, const char *value)
612 {
613         unsigned long ret;
614         if (!git_parse_ulong(value, &ret))
615                 die_bad_number(name, value);
616         return ret;
617 }
618
619 static int git_config_maybe_bool_text(const char *name, const char *value)
620 {
621         if (!value)
622                 return 1;
623         if (!*value)
624                 return 0;
625         if (!strcasecmp(value, "true")
626             || !strcasecmp(value, "yes")
627             || !strcasecmp(value, "on"))
628                 return 1;
629         if (!strcasecmp(value, "false")
630             || !strcasecmp(value, "no")
631             || !strcasecmp(value, "off"))
632                 return 0;
633         return -1;
634 }
635
636 int git_config_maybe_bool(const char *name, const char *value)
637 {
638         int v = git_config_maybe_bool_text(name, value);
639         if (0 <= v)
640                 return v;
641         if (git_parse_int(value, &v))
642                 return !!v;
643         return -1;
644 }
645
646 int git_config_bool_or_int(const char *name, const char *value, int *is_bool)
647 {
648         int v = git_config_maybe_bool_text(name, value);
649         if (0 <= v) {
650                 *is_bool = 1;
651                 return v;
652         }
653         *is_bool = 0;
654         return git_config_int(name, value);
655 }
656
657 int git_config_bool(const char *name, const char *value)
658 {
659         int discard;
660         return !!git_config_bool_or_int(name, value, &discard);
661 }
662
663 int git_config_string(const char **dest, const char *var, const char *value)
664 {
665         if (!value)
666                 return config_error_nonbool(var);
667         *dest = xstrdup(value);
668         return 0;
669 }
670
671 int git_config_pathname(const char **dest, const char *var, const char *value)
672 {
673         if (!value)
674                 return config_error_nonbool(var);
675         *dest = expand_user_path(value);
676         if (!*dest)
677                 die(_("failed to expand user dir in: '%s'"), value);
678         return 0;
679 }
680
681 static int git_default_core_config(const char *var, const char *value)
682 {
683         /* This needs a better name */
684         if (!strcmp(var, "core.filemode")) {
685                 trust_executable_bit = git_config_bool(var, value);
686                 return 0;
687         }
688         if (!strcmp(var, "core.trustctime")) {
689                 trust_ctime = git_config_bool(var, value);
690                 return 0;
691         }
692         if (!strcmp(var, "core.checkstat")) {
693                 if (!strcasecmp(value, "default"))
694                         check_stat = 1;
695                 else if (!strcasecmp(value, "minimal"))
696                         check_stat = 0;
697         }
698
699         if (!strcmp(var, "core.quotepath")) {
700                 quote_path_fully = git_config_bool(var, value);
701                 return 0;
702         }
703
704         if (!strcmp(var, "core.symlinks")) {
705                 has_symlinks = git_config_bool(var, value);
706                 return 0;
707         }
708
709         if (!strcmp(var, "core.ignorecase")) {
710                 ignore_case = git_config_bool(var, value);
711                 return 0;
712         }
713
714         if (!strcmp(var, "core.attributesfile"))
715                 return git_config_pathname(&git_attributes_file, var, value);
716
717         if (!strcmp(var, "core.bare")) {
718                 is_bare_repository_cfg = git_config_bool(var, value);
719                 return 0;
720         }
721
722         if (!strcmp(var, "core.ignorestat")) {
723                 assume_unchanged = git_config_bool(var, value);
724                 return 0;
725         }
726
727         if (!strcmp(var, "core.prefersymlinkrefs")) {
728                 prefer_symlink_refs = git_config_bool(var, value);
729                 return 0;
730         }
731
732         if (!strcmp(var, "core.logallrefupdates")) {
733                 log_all_ref_updates = git_config_bool(var, value);
734                 return 0;
735         }
736
737         if (!strcmp(var, "core.warnambiguousrefs")) {
738                 warn_ambiguous_refs = git_config_bool(var, value);
739                 return 0;
740         }
741
742         if (!strcmp(var, "core.abbrev")) {
743                 int abbrev = git_config_int(var, value);
744                 if (abbrev < minimum_abbrev || abbrev > 40)
745                         return -1;
746                 default_abbrev = abbrev;
747                 return 0;
748         }
749
750         if (!strcmp(var, "core.loosecompression")) {
751                 int level = git_config_int(var, value);
752                 if (level == -1)
753                         level = Z_DEFAULT_COMPRESSION;
754                 else if (level < 0 || level > Z_BEST_COMPRESSION)
755                         die(_("bad zlib compression level %d"), level);
756                 zlib_compression_level = level;
757                 zlib_compression_seen = 1;
758                 return 0;
759         }
760
761         if (!strcmp(var, "core.compression")) {
762                 int level = git_config_int(var, value);
763                 if (level == -1)
764                         level = Z_DEFAULT_COMPRESSION;
765                 else if (level < 0 || level > Z_BEST_COMPRESSION)
766                         die(_("bad zlib compression level %d"), level);
767                 core_compression_level = level;
768                 core_compression_seen = 1;
769                 if (!zlib_compression_seen)
770                         zlib_compression_level = level;
771                 return 0;
772         }
773
774         if (!strcmp(var, "core.packedgitwindowsize")) {
775                 int pgsz_x2 = getpagesize() * 2;
776                 packed_git_window_size = git_config_ulong(var, value);
777
778                 /* This value must be multiple of (pagesize * 2) */
779                 packed_git_window_size /= pgsz_x2;
780                 if (packed_git_window_size < 1)
781                         packed_git_window_size = 1;
782                 packed_git_window_size *= pgsz_x2;
783                 return 0;
784         }
785
786         if (!strcmp(var, "core.bigfilethreshold")) {
787                 big_file_threshold = git_config_ulong(var, value);
788                 return 0;
789         }
790
791         if (!strcmp(var, "core.packedgitlimit")) {
792                 packed_git_limit = git_config_ulong(var, value);
793                 return 0;
794         }
795
796         if (!strcmp(var, "core.deltabasecachelimit")) {
797                 delta_base_cache_limit = git_config_ulong(var, value);
798                 return 0;
799         }
800
801         if (!strcmp(var, "core.autocrlf")) {
802                 if (value && !strcasecmp(value, "input")) {
803                         if (core_eol == EOL_CRLF)
804                                 return error("core.autocrlf=input conflicts with core.eol=crlf");
805                         auto_crlf = AUTO_CRLF_INPUT;
806                         return 0;
807                 }
808                 auto_crlf = git_config_bool(var, value);
809                 return 0;
810         }
811
812         if (!strcmp(var, "core.safecrlf")) {
813                 if (value && !strcasecmp(value, "warn")) {
814                         safe_crlf = SAFE_CRLF_WARN;
815                         return 0;
816                 }
817                 safe_crlf = git_config_bool(var, value);
818                 return 0;
819         }
820
821         if (!strcmp(var, "core.eol")) {
822                 if (value && !strcasecmp(value, "lf"))
823                         core_eol = EOL_LF;
824                 else if (value && !strcasecmp(value, "crlf"))
825                         core_eol = EOL_CRLF;
826                 else if (value && !strcasecmp(value, "native"))
827                         core_eol = EOL_NATIVE;
828                 else
829                         core_eol = EOL_UNSET;
830                 if (core_eol == EOL_CRLF && auto_crlf == AUTO_CRLF_INPUT)
831                         return error("core.autocrlf=input conflicts with core.eol=crlf");
832                 return 0;
833         }
834
835         if (!strcmp(var, "core.notesref")) {
836                 notes_ref_name = xstrdup(value);
837                 return 0;
838         }
839
840         if (!strcmp(var, "core.pager"))
841                 return git_config_string(&pager_program, var, value);
842
843         if (!strcmp(var, "core.editor"))
844                 return git_config_string(&editor_program, var, value);
845
846         if (!strcmp(var, "core.commentchar")) {
847                 if (!value)
848                         return config_error_nonbool(var);
849                 else if (!strcasecmp(value, "auto"))
850                         auto_comment_line_char = 1;
851                 else if (value[0] && !value[1]) {
852                         comment_line_char = value[0];
853                         auto_comment_line_char = 0;
854                 } else
855                         return error("core.commentChar should only be one character");
856                 return 0;
857         }
858
859         if (!strcmp(var, "core.askpass"))
860                 return git_config_string(&askpass_program, var, value);
861
862         if (!strcmp(var, "core.excludesfile"))
863                 return git_config_pathname(&excludes_file, var, value);
864
865         if (!strcmp(var, "core.whitespace")) {
866                 if (!value)
867                         return config_error_nonbool(var);
868                 whitespace_rule_cfg = parse_whitespace_rule(value);
869                 return 0;
870         }
871
872         if (!strcmp(var, "core.fsyncobjectfiles")) {
873                 fsync_object_files = git_config_bool(var, value);
874                 return 0;
875         }
876
877         if (!strcmp(var, "core.preloadindex")) {
878                 core_preload_index = git_config_bool(var, value);
879                 return 0;
880         }
881
882         if (!strcmp(var, "core.createobject")) {
883                 if (!strcmp(value, "rename"))
884                         object_creation_mode = OBJECT_CREATION_USES_RENAMES;
885                 else if (!strcmp(value, "link"))
886                         object_creation_mode = OBJECT_CREATION_USES_HARDLINKS;
887                 else
888                         die(_("invalid mode for object creation: %s"), value);
889                 return 0;
890         }
891
892         if (!strcmp(var, "core.sparsecheckout")) {
893                 core_apply_sparse_checkout = git_config_bool(var, value);
894                 return 0;
895         }
896
897         if (!strcmp(var, "core.precomposeunicode")) {
898                 precomposed_unicode = git_config_bool(var, value);
899                 return 0;
900         }
901
902         /* Add other config variables here and to Documentation/config.txt. */
903         return 0;
904 }
905
906 static int git_default_i18n_config(const char *var, const char *value)
907 {
908         if (!strcmp(var, "i18n.commitencoding"))
909                 return git_config_string(&git_commit_encoding, var, value);
910
911         if (!strcmp(var, "i18n.logoutputencoding"))
912                 return git_config_string(&git_log_output_encoding, var, value);
913
914         /* Add other config variables here and to Documentation/config.txt. */
915         return 0;
916 }
917
918 static int git_default_branch_config(const char *var, const char *value)
919 {
920         if (!strcmp(var, "branch.autosetupmerge")) {
921                 if (value && !strcasecmp(value, "always")) {
922                         git_branch_track = BRANCH_TRACK_ALWAYS;
923                         return 0;
924                 }
925                 git_branch_track = git_config_bool(var, value);
926                 return 0;
927         }
928         if (!strcmp(var, "branch.autosetuprebase")) {
929                 if (!value)
930                         return config_error_nonbool(var);
931                 else if (!strcmp(value, "never"))
932                         autorebase = AUTOREBASE_NEVER;
933                 else if (!strcmp(value, "local"))
934                         autorebase = AUTOREBASE_LOCAL;
935                 else if (!strcmp(value, "remote"))
936                         autorebase = AUTOREBASE_REMOTE;
937                 else if (!strcmp(value, "always"))
938                         autorebase = AUTOREBASE_ALWAYS;
939                 else
940                         return error("Malformed value for %s", var);
941                 return 0;
942         }
943
944         /* Add other config variables here and to Documentation/config.txt. */
945         return 0;
946 }
947
948 static int git_default_push_config(const char *var, const char *value)
949 {
950         if (!strcmp(var, "push.default")) {
951                 if (!value)
952                         return config_error_nonbool(var);
953                 else if (!strcmp(value, "nothing"))
954                         push_default = PUSH_DEFAULT_NOTHING;
955                 else if (!strcmp(value, "matching"))
956                         push_default = PUSH_DEFAULT_MATCHING;
957                 else if (!strcmp(value, "simple"))
958                         push_default = PUSH_DEFAULT_SIMPLE;
959                 else if (!strcmp(value, "upstream"))
960                         push_default = PUSH_DEFAULT_UPSTREAM;
961                 else if (!strcmp(value, "tracking")) /* deprecated */
962                         push_default = PUSH_DEFAULT_UPSTREAM;
963                 else if (!strcmp(value, "current"))
964                         push_default = PUSH_DEFAULT_CURRENT;
965                 else {
966                         error("Malformed value for %s: %s", var, value);
967                         return error("Must be one of nothing, matching, simple, "
968                                      "upstream or current.");
969                 }
970                 return 0;
971         }
972
973         /* Add other config variables here and to Documentation/config.txt. */
974         return 0;
975 }
976
977 static int git_default_mailmap_config(const char *var, const char *value)
978 {
979         if (!strcmp(var, "mailmap.file"))
980                 return git_config_pathname(&git_mailmap_file, var, value);
981         if (!strcmp(var, "mailmap.blob"))
982                 return git_config_string(&git_mailmap_blob, var, value);
983
984         /* Add other config variables here and to Documentation/config.txt. */
985         return 0;
986 }
987
988 int git_default_config(const char *var, const char *value, void *dummy)
989 {
990         if (starts_with(var, "core."))
991                 return git_default_core_config(var, value);
992
993         if (starts_with(var, "user."))
994                 return git_ident_config(var, value, dummy);
995
996         if (starts_with(var, "i18n."))
997                 return git_default_i18n_config(var, value);
998
999         if (starts_with(var, "branch."))
1000                 return git_default_branch_config(var, value);
1001
1002         if (starts_with(var, "push."))
1003                 return git_default_push_config(var, value);
1004
1005         if (starts_with(var, "mailmap."))
1006                 return git_default_mailmap_config(var, value);
1007
1008         if (starts_with(var, "advice."))
1009                 return git_default_advice_config(var, value);
1010
1011         if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) {
1012                 pager_use_color = git_config_bool(var,value);
1013                 return 0;
1014         }
1015
1016         if (!strcmp(var, "pack.packsizelimit")) {
1017                 pack_size_limit_cfg = git_config_ulong(var, value);
1018                 return 0;
1019         }
1020         /* Add other config variables here and to Documentation/config.txt. */
1021         return 0;
1022 }
1023
1024 /*
1025  * All source specific fields in the union, die_on_error, name and the callbacks
1026  * fgetc, ungetc, ftell of top need to be initialized before calling
1027  * this function.
1028  */
1029 static int do_config_from(struct config_source *top, config_fn_t fn, void *data)
1030 {
1031         int ret;
1032
1033         /* push config-file parsing state stack */
1034         top->prev = cf;
1035         top->linenr = 1;
1036         top->eof = 0;
1037         strbuf_init(&top->value, 1024);
1038         strbuf_init(&top->var, 1024);
1039         cf = top;
1040
1041         ret = git_parse_source(fn, data);
1042
1043         /* pop config-file parsing state stack */
1044         strbuf_release(&top->value);
1045         strbuf_release(&top->var);
1046         cf = top->prev;
1047
1048         return ret;
1049 }
1050
1051 static int do_config_from_file(config_fn_t fn,
1052                 const char *name, const char *path, FILE *f, void *data)
1053 {
1054         struct config_source top;
1055
1056         top.u.file = f;
1057         top.name = name;
1058         top.path = path;
1059         top.die_on_error = 1;
1060         top.do_fgetc = config_file_fgetc;
1061         top.do_ungetc = config_file_ungetc;
1062         top.do_ftell = config_file_ftell;
1063
1064         return do_config_from(&top, fn, data);
1065 }
1066
1067 static int git_config_from_stdin(config_fn_t fn, void *data)
1068 {
1069         return do_config_from_file(fn, "<stdin>", NULL, stdin, data);
1070 }
1071
1072 int git_config_from_file(config_fn_t fn, const char *filename, void *data)
1073 {
1074         int ret = -1;
1075         FILE *f;
1076
1077         f = fopen(filename, "r");
1078         if (f) {
1079                 ret = do_config_from_file(fn, filename, filename, f, data);
1080                 fclose(f);
1081         }
1082         return ret;
1083 }
1084
1085 int git_config_from_buf(config_fn_t fn, const char *name, const char *buf,
1086                         size_t len, void *data)
1087 {
1088         struct config_source top;
1089
1090         top.u.buf.buf = buf;
1091         top.u.buf.len = len;
1092         top.u.buf.pos = 0;
1093         top.name = name;
1094         top.path = NULL;
1095         top.die_on_error = 0;
1096         top.do_fgetc = config_buf_fgetc;
1097         top.do_ungetc = config_buf_ungetc;
1098         top.do_ftell = config_buf_ftell;
1099
1100         return do_config_from(&top, fn, data);
1101 }
1102
1103 static int git_config_from_blob_sha1(config_fn_t fn,
1104                                      const char *name,
1105                                      const unsigned char *sha1,
1106                                      void *data)
1107 {
1108         enum object_type type;
1109         char *buf;
1110         unsigned long size;
1111         int ret;
1112
1113         buf = read_sha1_file(sha1, &type, &size);
1114         if (!buf)
1115                 return error("unable to load config blob object '%s'", name);
1116         if (type != OBJ_BLOB) {
1117                 free(buf);
1118                 return error("reference '%s' does not point to a blob", name);
1119         }
1120
1121         ret = git_config_from_buf(fn, name, buf, size, data);
1122         free(buf);
1123
1124         return ret;
1125 }
1126
1127 static int git_config_from_blob_ref(config_fn_t fn,
1128                                     const char *name,
1129                                     void *data)
1130 {
1131         unsigned char sha1[20];
1132
1133         if (get_sha1(name, sha1) < 0)
1134                 return error("unable to resolve config blob '%s'", name);
1135         return git_config_from_blob_sha1(fn, name, sha1, data);
1136 }
1137
1138 const char *git_etc_gitconfig(void)
1139 {
1140         static const char *system_wide;
1141         if (!system_wide)
1142                 system_wide = system_path(ETC_GITCONFIG);
1143         return system_wide;
1144 }
1145
1146 int git_env_bool(const char *k, int def)
1147 {
1148         const char *v = getenv(k);
1149         return v ? git_config_bool(k, v) : def;
1150 }
1151
1152 int git_config_system(void)
1153 {
1154         return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0);
1155 }
1156
1157 int git_config_early(config_fn_t fn, void *data, const char *repo_config)
1158 {
1159         int ret = 0, found = 0;
1160         char *xdg_config = NULL;
1161         char *user_config = NULL;
1162
1163         home_config_paths(&user_config, &xdg_config, "config");
1164
1165         if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
1166                 ret += git_config_from_file(fn, git_etc_gitconfig(),
1167                                             data);
1168                 found += 1;
1169         }
1170
1171         if (xdg_config && !access_or_die(xdg_config, R_OK, ACCESS_EACCES_OK)) {
1172                 ret += git_config_from_file(fn, xdg_config, data);
1173                 found += 1;
1174         }
1175
1176         if (user_config && !access_or_die(user_config, R_OK, ACCESS_EACCES_OK)) {
1177                 ret += git_config_from_file(fn, user_config, data);
1178                 found += 1;
1179         }
1180
1181         if (repo_config && !access_or_die(repo_config, R_OK, 0)) {
1182                 ret += git_config_from_file(fn, repo_config, data);
1183                 found += 1;
1184         }
1185
1186         switch (git_config_from_parameters(fn, data)) {
1187         case -1: /* error */
1188                 die(_("unable to parse command-line config"));
1189                 break;
1190         case 0: /* found nothing */
1191                 break;
1192         default: /* found at least one item */
1193                 found++;
1194                 break;
1195         }
1196
1197         free(xdg_config);
1198         free(user_config);
1199         return ret == 0 ? found : ret;
1200 }
1201
1202 int git_config_with_options(config_fn_t fn, void *data,
1203                             struct git_config_source *config_source,
1204                             int respect_includes)
1205 {
1206         char *repo_config = NULL;
1207         int ret;
1208         struct config_include_data inc = CONFIG_INCLUDE_INIT;
1209
1210         if (respect_includes) {
1211                 inc.fn = fn;
1212                 inc.data = data;
1213                 fn = git_config_include;
1214                 data = &inc;
1215         }
1216
1217         /*
1218          * If we have a specific filename, use it. Otherwise, follow the
1219          * regular lookup sequence.
1220          */
1221         if (config_source && config_source->use_stdin)
1222                 return git_config_from_stdin(fn, data);
1223         else if (config_source && config_source->file)
1224                 return git_config_from_file(fn, config_source->file, data);
1225         else if (config_source && config_source->blob)
1226                 return git_config_from_blob_ref(fn, config_source->blob, data);
1227
1228         repo_config = git_pathdup("config");
1229         ret = git_config_early(fn, data, repo_config);
1230         if (repo_config)
1231                 free(repo_config);
1232         return ret;
1233 }
1234
1235 static void git_config_raw(config_fn_t fn, void *data)
1236 {
1237         if (git_config_with_options(fn, data, NULL, 1) < 0)
1238                 /*
1239                  * git_config_with_options() normally returns only
1240                  * positive values, as most errors are fatal, and
1241                  * non-fatal potential errors are guarded by "if"
1242                  * statements that are entered only when no error is
1243                  * possible.
1244                  *
1245                  * If we ever encounter a non-fatal error, it means
1246                  * something went really wrong and we should stop
1247                  * immediately.
1248                  */
1249                 die(_("unknown error occured while reading the configuration files"));
1250 }
1251
1252 static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
1253 {
1254         int i, value_index;
1255         struct string_list *values;
1256         struct config_set_element *entry;
1257         struct configset_list *list = &cs->list;
1258         struct key_value_info *kv_info;
1259
1260         for (i = 0; i < list->nr; i++) {
1261                 entry = list->items[i].e;
1262                 value_index = list->items[i].value_index;
1263                 values = &entry->value_list;
1264                 if (fn(entry->key, values->items[value_index].string, data) < 0) {
1265                         kv_info = values->items[value_index].util;
1266                         git_die_config_linenr(entry->key, kv_info->filename, kv_info->linenr);
1267                 }
1268         }
1269 }
1270
1271 static void git_config_check_init(void);
1272
1273 void git_config(config_fn_t fn, void *data)
1274 {
1275         git_config_check_init();
1276         configset_iter(&the_config_set, fn, data);
1277 }
1278
1279 static struct config_set_element *configset_find_element(struct config_set *cs, const char *key)
1280 {
1281         struct config_set_element k;
1282         struct config_set_element *found_entry;
1283         char *normalized_key;
1284         int ret;
1285         /*
1286          * `key` may come from the user, so normalize it before using it
1287          * for querying entries from the hashmap.
1288          */
1289         ret = git_config_parse_key(key, &normalized_key, NULL);
1290
1291         if (ret)
1292                 return NULL;
1293
1294         hashmap_entry_init(&k, strhash(normalized_key));
1295         k.key = normalized_key;
1296         found_entry = hashmap_get(&cs->config_hash, &k, NULL);
1297         free(normalized_key);
1298         return found_entry;
1299 }
1300
1301 static int configset_add_value(struct config_set *cs, const char *key, const char *value)
1302 {
1303         struct config_set_element *e;
1304         struct string_list_item *si;
1305         struct configset_list_item *l_item;
1306         struct key_value_info *kv_info = xmalloc(sizeof(*kv_info));
1307
1308         e = configset_find_element(cs, key);
1309         /*
1310          * Since the keys are being fed by git_config*() callback mechanism, they
1311          * are already normalized. So simply add them without any further munging.
1312          */
1313         if (!e) {
1314                 e = xmalloc(sizeof(*e));
1315                 hashmap_entry_init(e, strhash(key));
1316                 e->key = xstrdup(key);
1317                 string_list_init(&e->value_list, 1);
1318                 hashmap_add(&cs->config_hash, e);
1319         }
1320         si = string_list_append_nodup(&e->value_list, value ? xstrdup(value) : NULL);
1321
1322         ALLOC_GROW(cs->list.items, cs->list.nr + 1, cs->list.alloc);
1323         l_item = &cs->list.items[cs->list.nr++];
1324         l_item->e = e;
1325         l_item->value_index = e->value_list.nr - 1;
1326
1327         if (cf) {
1328                 kv_info->filename = strintern(cf->name);
1329                 kv_info->linenr = cf->linenr;
1330         } else {
1331                 /* for values read from `git_config_from_parameters()` */
1332                 kv_info->filename = NULL;
1333                 kv_info->linenr = -1;
1334         }
1335         si->util = kv_info;
1336
1337         return 0;
1338 }
1339
1340 static int config_set_element_cmp(const struct config_set_element *e1,
1341                                  const struct config_set_element *e2, const void *unused)
1342 {
1343         return strcmp(e1->key, e2->key);
1344 }
1345
1346 void git_configset_init(struct config_set *cs)
1347 {
1348         hashmap_init(&cs->config_hash, (hashmap_cmp_fn)config_set_element_cmp, 0);
1349         cs->hash_initialized = 1;
1350         cs->list.nr = 0;
1351         cs->list.alloc = 0;
1352         cs->list.items = NULL;
1353 }
1354
1355 void git_configset_clear(struct config_set *cs)
1356 {
1357         struct config_set_element *entry;
1358         struct hashmap_iter iter;
1359         if (!cs->hash_initialized)
1360                 return;
1361
1362         hashmap_iter_init(&cs->config_hash, &iter);
1363         while ((entry = hashmap_iter_next(&iter))) {
1364                 free(entry->key);
1365                 string_list_clear(&entry->value_list, 1);
1366         }
1367         hashmap_free(&cs->config_hash, 1);
1368         cs->hash_initialized = 0;
1369         free(cs->list.items);
1370         cs->list.nr = 0;
1371         cs->list.alloc = 0;
1372         cs->list.items = NULL;
1373 }
1374
1375 static int config_set_callback(const char *key, const char *value, void *cb)
1376 {
1377         struct config_set *cs = cb;
1378         configset_add_value(cs, key, value);
1379         return 0;
1380 }
1381
1382 int git_configset_add_file(struct config_set *cs, const char *filename)
1383 {
1384         return git_config_from_file(config_set_callback, filename, cs);
1385 }
1386
1387 int git_configset_get_value(struct config_set *cs, const char *key, const char **value)
1388 {
1389         const struct string_list *values = NULL;
1390         /*
1391          * Follows "last one wins" semantic, i.e., if there are multiple matches for the
1392          * queried key in the files of the configset, the value returned will be the last
1393          * value in the value list for that key.
1394          */
1395         values = git_configset_get_value_multi(cs, key);
1396
1397         if (!values)
1398                 return 1;
1399         assert(values->nr > 0);
1400         *value = values->items[values->nr - 1].string;
1401         return 0;
1402 }
1403
1404 const struct string_list *git_configset_get_value_multi(struct config_set *cs, const char *key)
1405 {
1406         struct config_set_element *e = configset_find_element(cs, key);
1407         return e ? &e->value_list : NULL;
1408 }
1409
1410 int git_configset_get_string_const(struct config_set *cs, const char *key, const char **dest)
1411 {
1412         const char *value;
1413         if (!git_configset_get_value(cs, key, &value))
1414                 return git_config_string(dest, key, value);
1415         else
1416                 return 1;
1417 }
1418
1419 int git_configset_get_string(struct config_set *cs, const char *key, char **dest)
1420 {
1421         return git_configset_get_string_const(cs, key, (const char **)dest);
1422 }
1423
1424 int git_configset_get_int(struct config_set *cs, const char *key, int *dest)
1425 {
1426         const char *value;
1427         if (!git_configset_get_value(cs, key, &value)) {
1428                 *dest = git_config_int(key, value);
1429                 return 0;
1430         } else
1431                 return 1;
1432 }
1433
1434 int git_configset_get_ulong(struct config_set *cs, const char *key, unsigned long *dest)
1435 {
1436         const char *value;
1437         if (!git_configset_get_value(cs, key, &value)) {
1438                 *dest = git_config_ulong(key, value);
1439                 return 0;
1440         } else
1441                 return 1;
1442 }
1443
1444 int git_configset_get_bool(struct config_set *cs, const char *key, int *dest)
1445 {
1446         const char *value;
1447         if (!git_configset_get_value(cs, key, &value)) {
1448                 *dest = git_config_bool(key, value);
1449                 return 0;
1450         } else
1451                 return 1;
1452 }
1453
1454 int git_configset_get_bool_or_int(struct config_set *cs, const char *key,
1455                                 int *is_bool, int *dest)
1456 {
1457         const char *value;
1458         if (!git_configset_get_value(cs, key, &value)) {
1459                 *dest = git_config_bool_or_int(key, value, is_bool);
1460                 return 0;
1461         } else
1462                 return 1;
1463 }
1464
1465 int git_configset_get_maybe_bool(struct config_set *cs, const char *key, int *dest)
1466 {
1467         const char *value;
1468         if (!git_configset_get_value(cs, key, &value)) {
1469                 *dest = git_config_maybe_bool(key, value);
1470                 if (*dest == -1)
1471                         return -1;
1472                 return 0;
1473         } else
1474                 return 1;
1475 }
1476
1477 int git_configset_get_pathname(struct config_set *cs, const char *key, const char **dest)
1478 {
1479         const char *value;
1480         if (!git_configset_get_value(cs, key, &value))
1481                 return git_config_pathname(dest, key, value);
1482         else
1483                 return 1;
1484 }
1485
1486 static void git_config_check_init(void)
1487 {
1488         if (the_config_set.hash_initialized)
1489                 return;
1490         git_configset_init(&the_config_set);
1491         git_config_raw(config_set_callback, &the_config_set);
1492 }
1493
1494 void git_config_clear(void)
1495 {
1496         if (!the_config_set.hash_initialized)
1497                 return;
1498         git_configset_clear(&the_config_set);
1499 }
1500
1501 int git_config_get_value(const char *key, const char **value)
1502 {
1503         git_config_check_init();
1504         return git_configset_get_value(&the_config_set, key, value);
1505 }
1506
1507 const struct string_list *git_config_get_value_multi(const char *key)
1508 {
1509         git_config_check_init();
1510         return git_configset_get_value_multi(&the_config_set, key);
1511 }
1512
1513 int git_config_get_string_const(const char *key, const char **dest)
1514 {
1515         int ret;
1516         git_config_check_init();
1517         ret = git_configset_get_string_const(&the_config_set, key, dest);
1518         if (ret < 0)
1519                 git_die_config(key, NULL);
1520         return ret;
1521 }
1522
1523 int git_config_get_string(const char *key, char **dest)
1524 {
1525         git_config_check_init();
1526         return git_config_get_string_const(key, (const char **)dest);
1527 }
1528
1529 int git_config_get_int(const char *key, int *dest)
1530 {
1531         git_config_check_init();
1532         return git_configset_get_int(&the_config_set, key, dest);
1533 }
1534
1535 int git_config_get_ulong(const char *key, unsigned long *dest)
1536 {
1537         git_config_check_init();
1538         return git_configset_get_ulong(&the_config_set, key, dest);
1539 }
1540
1541 int git_config_get_bool(const char *key, int *dest)
1542 {
1543         git_config_check_init();
1544         return git_configset_get_bool(&the_config_set, key, dest);
1545 }
1546
1547 int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest)
1548 {
1549         git_config_check_init();
1550         return git_configset_get_bool_or_int(&the_config_set, key, is_bool, dest);
1551 }
1552
1553 int git_config_get_maybe_bool(const char *key, int *dest)
1554 {
1555         git_config_check_init();
1556         return git_configset_get_maybe_bool(&the_config_set, key, dest);
1557 }
1558
1559 int git_config_get_pathname(const char *key, const char **dest)
1560 {
1561         int ret;
1562         git_config_check_init();
1563         ret = git_configset_get_pathname(&the_config_set, key, dest);
1564         if (ret < 0)
1565                 git_die_config(key, NULL);
1566         return ret;
1567 }
1568
1569 NORETURN
1570 void git_die_config_linenr(const char *key, const char *filename, int linenr)
1571 {
1572         if (!filename)
1573                 die(_("unable to parse '%s' from command-line config"), key);
1574         else
1575                 die(_("bad config variable '%s' in file '%s' at line %d"),
1576                     key, filename, linenr);
1577 }
1578
1579 NORETURN __attribute__((format(printf, 2, 3)))
1580 void git_die_config(const char *key, const char *err, ...)
1581 {
1582         const struct string_list *values;
1583         struct key_value_info *kv_info;
1584
1585         if (err) {
1586                 va_list params;
1587                 va_start(params, err);
1588                 vreportf("error: ", err, params);
1589                 va_end(params);
1590         }
1591         values = git_config_get_value_multi(key);
1592         kv_info = values->items[values->nr - 1].util;
1593         git_die_config_linenr(key, kv_info->filename, kv_info->linenr);
1594 }
1595
1596 /*
1597  * Find all the stuff for git_config_set() below.
1598  */
1599
1600 static struct {
1601         int baselen;
1602         char *key;
1603         int do_not_match;
1604         regex_t *value_regex;
1605         int multi_replace;
1606         size_t *offset;
1607         unsigned int offset_alloc;
1608         enum { START, SECTION_SEEN, SECTION_END_SEEN, KEY_SEEN } state;
1609         int seen;
1610 } store;
1611
1612 static int matches(const char *key, const char *value)
1613 {
1614         return !strcmp(key, store.key) &&
1615                 (store.value_regex == NULL ||
1616                  (store.do_not_match ^
1617                   !regexec(store.value_regex, value, 0, NULL, 0)));
1618 }
1619
1620 static int store_aux(const char *key, const char *value, void *cb)
1621 {
1622         const char *ep;
1623         size_t section_len;
1624
1625         switch (store.state) {
1626         case KEY_SEEN:
1627                 if (matches(key, value)) {
1628                         if (store.seen == 1 && store.multi_replace == 0) {
1629                                 warning(_("%s has multiple values"), key);
1630                         }
1631
1632                         ALLOC_GROW(store.offset, store.seen + 1,
1633                                    store.offset_alloc);
1634
1635                         store.offset[store.seen] = cf->do_ftell(cf);
1636                         store.seen++;
1637                 }
1638                 break;
1639         case SECTION_SEEN:
1640                 /*
1641                  * What we are looking for is in store.key (both
1642                  * section and var), and its section part is baselen
1643                  * long.  We found key (again, both section and var).
1644                  * We would want to know if this key is in the same
1645                  * section as what we are looking for.  We already
1646                  * know we are in the same section as what should
1647                  * hold store.key.
1648                  */
1649                 ep = strrchr(key, '.');
1650                 section_len = ep - key;
1651
1652                 if ((section_len != store.baselen) ||
1653                     memcmp(key, store.key, section_len+1)) {
1654                         store.state = SECTION_END_SEEN;
1655                         break;
1656                 }
1657
1658                 /*
1659                  * Do not increment matches: this is no match, but we
1660                  * just made sure we are in the desired section.
1661                  */
1662                 ALLOC_GROW(store.offset, store.seen + 1,
1663                            store.offset_alloc);
1664                 store.offset[store.seen] = cf->do_ftell(cf);
1665                 /* fallthru */
1666         case SECTION_END_SEEN:
1667         case START:
1668                 if (matches(key, value)) {
1669                         ALLOC_GROW(store.offset, store.seen + 1,
1670                                    store.offset_alloc);
1671                         store.offset[store.seen] = cf->do_ftell(cf);
1672                         store.state = KEY_SEEN;
1673                         store.seen++;
1674                 } else {
1675                         if (strrchr(key, '.') - key == store.baselen &&
1676                               !strncmp(key, store.key, store.baselen)) {
1677                                         store.state = SECTION_SEEN;
1678                                         ALLOC_GROW(store.offset,
1679                                                    store.seen + 1,
1680                                                    store.offset_alloc);
1681                                         store.offset[store.seen] = cf->do_ftell(cf);
1682                         }
1683                 }
1684         }
1685         return 0;
1686 }
1687
1688 static int write_error(const char *filename)
1689 {
1690         error("failed to write new configuration file %s", filename);
1691
1692         /* Same error code as "failed to rename". */
1693         return 4;
1694 }
1695
1696 static int store_write_section(int fd, const char *key)
1697 {
1698         const char *dot;
1699         int i, success;
1700         struct strbuf sb = STRBUF_INIT;
1701
1702         dot = memchr(key, '.', store.baselen);
1703         if (dot) {
1704                 strbuf_addf(&sb, "[%.*s \"", (int)(dot - key), key);
1705                 for (i = dot - key + 1; i < store.baselen; i++) {
1706                         if (key[i] == '"' || key[i] == '\\')
1707                                 strbuf_addch(&sb, '\\');
1708                         strbuf_addch(&sb, key[i]);
1709                 }
1710                 strbuf_addstr(&sb, "\"]\n");
1711         } else {
1712                 strbuf_addf(&sb, "[%.*s]\n", store.baselen, key);
1713         }
1714
1715         success = write_in_full(fd, sb.buf, sb.len) == sb.len;
1716         strbuf_release(&sb);
1717
1718         return success;
1719 }
1720
1721 static int store_write_pair(int fd, const char *key, const char *value)
1722 {
1723         int i, success;
1724         int length = strlen(key + store.baselen + 1);
1725         const char *quote = "";
1726         struct strbuf sb = STRBUF_INIT;
1727
1728         /*
1729          * Check to see if the value needs to be surrounded with a dq pair.
1730          * Note that problematic characters are always backslash-quoted; this
1731          * check is about not losing leading or trailing SP and strings that
1732          * follow beginning-of-comment characters (i.e. ';' and '#') by the
1733          * configuration parser.
1734          */
1735         if (value[0] == ' ')
1736                 quote = "\"";
1737         for (i = 0; value[i]; i++)
1738                 if (value[i] == ';' || value[i] == '#')
1739                         quote = "\"";
1740         if (i && value[i - 1] == ' ')
1741                 quote = "\"";
1742
1743         strbuf_addf(&sb, "\t%.*s = %s",
1744                     length, key + store.baselen + 1, quote);
1745
1746         for (i = 0; value[i]; i++)
1747                 switch (value[i]) {
1748                 case '\n':
1749                         strbuf_addstr(&sb, "\\n");
1750                         break;
1751                 case '\t':
1752                         strbuf_addstr(&sb, "\\t");
1753                         break;
1754                 case '"':
1755                 case '\\':
1756                         strbuf_addch(&sb, '\\');
1757                 default:
1758                         strbuf_addch(&sb, value[i]);
1759                         break;
1760                 }
1761         strbuf_addf(&sb, "%s\n", quote);
1762
1763         success = write_in_full(fd, sb.buf, sb.len) == sb.len;
1764         strbuf_release(&sb);
1765
1766         return success;
1767 }
1768
1769 static ssize_t find_beginning_of_line(const char *contents, size_t size,
1770         size_t offset_, int *found_bracket)
1771 {
1772         size_t equal_offset = size, bracket_offset = size;
1773         ssize_t offset;
1774
1775 contline:
1776         for (offset = offset_-2; offset > 0
1777                         && contents[offset] != '\n'; offset--)
1778                 switch (contents[offset]) {
1779                         case '=': equal_offset = offset; break;
1780                         case ']': bracket_offset = offset; break;
1781                 }
1782         if (offset > 0 && contents[offset-1] == '\\') {
1783                 offset_ = offset;
1784                 goto contline;
1785         }
1786         if (bracket_offset < equal_offset) {
1787                 *found_bracket = 1;
1788                 offset = bracket_offset+1;
1789         } else
1790                 offset++;
1791
1792         return offset;
1793 }
1794
1795 int git_config_set_in_file(const char *config_filename,
1796                         const char *key, const char *value)
1797 {
1798         return git_config_set_multivar_in_file(config_filename, key, value, NULL, 0);
1799 }
1800
1801 int git_config_set(const char *key, const char *value)
1802 {
1803         return git_config_set_multivar(key, value, NULL, 0);
1804 }
1805
1806 /*
1807  * Auxiliary function to sanity-check and split the key into the section
1808  * identifier and variable name.
1809  *
1810  * Returns 0 on success, -1 when there is an invalid character in the key and
1811  * -2 if there is no section name in the key.
1812  *
1813  * store_key - pointer to char* which will hold a copy of the key with
1814  *             lowercase section and variable name
1815  * baselen - pointer to int which will hold the length of the
1816  *           section + subsection part, can be NULL
1817  */
1818 int git_config_parse_key(const char *key, char **store_key, int *baselen_)
1819 {
1820         int i, dot, baselen;
1821         const char *last_dot = strrchr(key, '.');
1822
1823         /*
1824          * Since "key" actually contains the section name and the real
1825          * key name separated by a dot, we have to know where the dot is.
1826          */
1827
1828         if (last_dot == NULL || last_dot == key) {
1829                 error("key does not contain a section: %s", key);
1830                 return -CONFIG_NO_SECTION_OR_NAME;
1831         }
1832
1833         if (!last_dot[1]) {
1834                 error("key does not contain variable name: %s", key);
1835                 return -CONFIG_NO_SECTION_OR_NAME;
1836         }
1837
1838         baselen = last_dot - key;
1839         if (baselen_)
1840                 *baselen_ = baselen;
1841
1842         /*
1843          * Validate the key and while at it, lower case it for matching.
1844          */
1845         *store_key = xmalloc(strlen(key) + 1);
1846
1847         dot = 0;
1848         for (i = 0; key[i]; i++) {
1849                 unsigned char c = key[i];
1850                 if (c == '.')
1851                         dot = 1;
1852                 /* Leave the extended basename untouched.. */
1853                 if (!dot || i > baselen) {
1854                         if (!iskeychar(c) ||
1855                             (i == baselen + 1 && !isalpha(c))) {
1856                                 error("invalid key: %s", key);
1857                                 goto out_free_ret_1;
1858                         }
1859                         c = tolower(c);
1860                 } else if (c == '\n') {
1861                         error("invalid key (newline): %s", key);
1862                         goto out_free_ret_1;
1863                 }
1864                 (*store_key)[i] = c;
1865         }
1866         (*store_key)[i] = 0;
1867
1868         return 0;
1869
1870 out_free_ret_1:
1871         free(*store_key);
1872         *store_key = NULL;
1873         return -CONFIG_INVALID_KEY;
1874 }
1875
1876 /*
1877  * If value==NULL, unset in (remove from) config,
1878  * if value_regex!=NULL, disregard key/value pairs where value does not match.
1879  * if multi_replace==0, nothing, or only one matching key/value is replaced,
1880  *     else all matching key/values (regardless how many) are removed,
1881  *     before the new pair is written.
1882  *
1883  * Returns 0 on success.
1884  *
1885  * This function does this:
1886  *
1887  * - it locks the config file by creating ".git/config.lock"
1888  *
1889  * - it then parses the config using store_aux() as validator to find
1890  *   the position on the key/value pair to replace. If it is to be unset,
1891  *   it must be found exactly once.
1892  *
1893  * - the config file is mmap()ed and the part before the match (if any) is
1894  *   written to the lock file, then the changed part and the rest.
1895  *
1896  * - the config file is removed and the lock file rename()d to it.
1897  *
1898  */
1899 int git_config_set_multivar_in_file(const char *config_filename,
1900                                 const char *key, const char *value,
1901                                 const char *value_regex, int multi_replace)
1902 {
1903         int fd = -1, in_fd;
1904         int ret;
1905         struct lock_file *lock = NULL;
1906         char *filename_buf = NULL;
1907
1908         /* parse-key returns negative; flip the sign to feed exit(3) */
1909         ret = 0 - git_config_parse_key(key, &store.key, &store.baselen);
1910         if (ret)
1911                 goto out_free;
1912
1913         store.multi_replace = multi_replace;
1914
1915         if (!config_filename)
1916                 config_filename = filename_buf = git_pathdup("config");
1917
1918         /*
1919          * The lock serves a purpose in addition to locking: the new
1920          * contents of .git/config will be written into it.
1921          */
1922         lock = xcalloc(1, sizeof(struct lock_file));
1923         fd = hold_lock_file_for_update(lock, config_filename, 0);
1924         if (fd < 0) {
1925                 error("could not lock config file %s: %s", config_filename, strerror(errno));
1926                 free(store.key);
1927                 ret = CONFIG_NO_LOCK;
1928                 goto out_free;
1929         }
1930
1931         /*
1932          * If .git/config does not exist yet, write a minimal version.
1933          */
1934         in_fd = open(config_filename, O_RDONLY);
1935         if ( in_fd < 0 ) {
1936                 free(store.key);
1937
1938                 if ( ENOENT != errno ) {
1939                         error("opening %s: %s", config_filename,
1940                               strerror(errno));
1941                         ret = CONFIG_INVALID_FILE; /* same as "invalid config file" */
1942                         goto out_free;
1943                 }
1944                 /* if nothing to unset, error out */
1945                 if (value == NULL) {
1946                         ret = CONFIG_NOTHING_SET;
1947                         goto out_free;
1948                 }
1949
1950                 store.key = (char *)key;
1951                 if (!store_write_section(fd, key) ||
1952                     !store_write_pair(fd, key, value))
1953                         goto write_err_out;
1954         } else {
1955                 struct stat st;
1956                 char *contents;
1957                 size_t contents_sz, copy_begin, copy_end;
1958                 int i, new_line = 0;
1959
1960                 if (value_regex == NULL)
1961                         store.value_regex = NULL;
1962                 else {
1963                         if (value_regex[0] == '!') {
1964                                 store.do_not_match = 1;
1965                                 value_regex++;
1966                         } else
1967                                 store.do_not_match = 0;
1968
1969                         store.value_regex = (regex_t*)xmalloc(sizeof(regex_t));
1970                         if (regcomp(store.value_regex, value_regex,
1971                                         REG_EXTENDED)) {
1972                                 error("invalid pattern: %s", value_regex);
1973                                 free(store.value_regex);
1974                                 ret = CONFIG_INVALID_PATTERN;
1975                                 goto out_free;
1976                         }
1977                 }
1978
1979                 ALLOC_GROW(store.offset, 1, store.offset_alloc);
1980                 store.offset[0] = 0;
1981                 store.state = START;
1982                 store.seen = 0;
1983
1984                 /*
1985                  * After this, store.offset will contain the *end* offset
1986                  * of the last match, or remain at 0 if no match was found.
1987                  * As a side effect, we make sure to transform only a valid
1988                  * existing config file.
1989                  */
1990                 if (git_config_from_file(store_aux, config_filename, NULL)) {
1991                         error("invalid config file %s", config_filename);
1992                         free(store.key);
1993                         if (store.value_regex != NULL) {
1994                                 regfree(store.value_regex);
1995                                 free(store.value_regex);
1996                         }
1997                         ret = CONFIG_INVALID_FILE;
1998                         goto out_free;
1999                 }
2000
2001                 free(store.key);
2002                 if (store.value_regex != NULL) {
2003                         regfree(store.value_regex);
2004                         free(store.value_regex);
2005                 }
2006
2007                 /* if nothing to unset, or too many matches, error out */
2008                 if ((store.seen == 0 && value == NULL) ||
2009                                 (store.seen > 1 && multi_replace == 0)) {
2010                         ret = CONFIG_NOTHING_SET;
2011                         goto out_free;
2012                 }
2013
2014                 fstat(in_fd, &st);
2015                 contents_sz = xsize_t(st.st_size);
2016                 contents = xmmap(NULL, contents_sz, PROT_READ,
2017                         MAP_PRIVATE, in_fd, 0);
2018                 close(in_fd);
2019
2020                 if (chmod(lock->filename, st.st_mode & 07777) < 0) {
2021                         error("chmod on %s failed: %s",
2022                                 lock->filename, strerror(errno));
2023                         ret = CONFIG_NO_WRITE;
2024                         goto out_free;
2025                 }
2026
2027                 if (store.seen == 0)
2028                         store.seen = 1;
2029
2030                 for (i = 0, copy_begin = 0; i < store.seen; i++) {
2031                         if (store.offset[i] == 0) {
2032                                 store.offset[i] = copy_end = contents_sz;
2033                         } else if (store.state != KEY_SEEN) {
2034                                 copy_end = store.offset[i];
2035                         } else
2036                                 copy_end = find_beginning_of_line(
2037                                         contents, contents_sz,
2038                                         store.offset[i]-2, &new_line);
2039
2040                         if (copy_end > 0 && contents[copy_end-1] != '\n')
2041                                 new_line = 1;
2042
2043                         /* write the first part of the config */
2044                         if (copy_end > copy_begin) {
2045                                 if (write_in_full(fd, contents + copy_begin,
2046                                                   copy_end - copy_begin) <
2047                                     copy_end - copy_begin)
2048                                         goto write_err_out;
2049                                 if (new_line &&
2050                                     write_str_in_full(fd, "\n") != 1)
2051                                         goto write_err_out;
2052                         }
2053                         copy_begin = store.offset[i];
2054                 }
2055
2056                 /* write the pair (value == NULL means unset) */
2057                 if (value != NULL) {
2058                         if (store.state == START) {
2059                                 if (!store_write_section(fd, key))
2060                                         goto write_err_out;
2061                         }
2062                         if (!store_write_pair(fd, key, value))
2063                                 goto write_err_out;
2064                 }
2065
2066                 /* write the rest of the config */
2067                 if (copy_begin < contents_sz)
2068                         if (write_in_full(fd, contents + copy_begin,
2069                                           contents_sz - copy_begin) <
2070                             contents_sz - copy_begin)
2071                                 goto write_err_out;
2072
2073                 munmap(contents, contents_sz);
2074         }
2075
2076         if (commit_lock_file(lock) < 0) {
2077                 error("could not commit config file %s", config_filename);
2078                 ret = CONFIG_NO_WRITE;
2079                 goto out_free;
2080         }
2081
2082         /*
2083          * lock is committed, so don't try to roll it back below.
2084          * NOTE: Since lockfile.c keeps a linked list of all created
2085          * lock_file structures, it isn't safe to free(lock).  It's
2086          * better to just leave it hanging around.
2087          */
2088         lock = NULL;
2089         ret = 0;
2090
2091         /* Invalidate the config cache */
2092         git_config_clear();
2093
2094 out_free:
2095         if (lock)
2096                 rollback_lock_file(lock);
2097         free(filename_buf);
2098         return ret;
2099
2100 write_err_out:
2101         ret = write_error(lock->filename);
2102         goto out_free;
2103
2104 }
2105
2106 int git_config_set_multivar(const char *key, const char *value,
2107                         const char *value_regex, int multi_replace)
2108 {
2109         return git_config_set_multivar_in_file(NULL, key, value, value_regex,
2110                                                multi_replace);
2111 }
2112
2113 static int section_name_match (const char *buf, const char *name)
2114 {
2115         int i = 0, j = 0, dot = 0;
2116         if (buf[i] != '[')
2117                 return 0;
2118         for (i = 1; buf[i] && buf[i] != ']'; i++) {
2119                 if (!dot && isspace(buf[i])) {
2120                         dot = 1;
2121                         if (name[j++] != '.')
2122                                 break;
2123                         for (i++; isspace(buf[i]); i++)
2124                                 ; /* do nothing */
2125                         if (buf[i] != '"')
2126                                 break;
2127                         continue;
2128                 }
2129                 if (buf[i] == '\\' && dot)
2130                         i++;
2131                 else if (buf[i] == '"' && dot) {
2132                         for (i++; isspace(buf[i]); i++)
2133                                 ; /* do_nothing */
2134                         break;
2135                 }
2136                 if (buf[i] != name[j++])
2137                         break;
2138         }
2139         if (buf[i] == ']' && name[j] == 0) {
2140                 /*
2141                  * We match, now just find the right length offset by
2142                  * gobbling up any whitespace after it, as well
2143                  */
2144                 i++;
2145                 for (; buf[i] && isspace(buf[i]); i++)
2146                         ; /* do nothing */
2147                 return i;
2148         }
2149         return 0;
2150 }
2151
2152 static int section_name_is_ok(const char *name)
2153 {
2154         /* Empty section names are bogus. */
2155         if (!*name)
2156                 return 0;
2157
2158         /*
2159          * Before a dot, we must be alphanumeric or dash. After the first dot,
2160          * anything goes, so we can stop checking.
2161          */
2162         for (; *name && *name != '.'; name++)
2163                 if (*name != '-' && !isalnum(*name))
2164                         return 0;
2165         return 1;
2166 }
2167
2168 /* if new_name == NULL, the section is removed instead */
2169 int git_config_rename_section_in_file(const char *config_filename,
2170                                       const char *old_name, const char *new_name)
2171 {
2172         int ret = 0, remove = 0;
2173         char *filename_buf = NULL;
2174         struct lock_file *lock;
2175         int out_fd;
2176         char buf[1024];
2177         FILE *config_file;
2178         struct stat st;
2179
2180         if (new_name && !section_name_is_ok(new_name)) {
2181                 ret = error("invalid section name: %s", new_name);
2182                 goto out;
2183         }
2184
2185         if (!config_filename)
2186                 config_filename = filename_buf = git_pathdup("config");
2187
2188         lock = xcalloc(1, sizeof(struct lock_file));
2189         out_fd = hold_lock_file_for_update(lock, config_filename, 0);
2190         if (out_fd < 0) {
2191                 ret = error("could not lock config file %s", config_filename);
2192                 goto out;
2193         }
2194
2195         if (!(config_file = fopen(config_filename, "rb"))) {
2196                 /* no config file means nothing to rename, no error */
2197                 goto unlock_and_out;
2198         }
2199
2200         fstat(fileno(config_file), &st);
2201
2202         if (chmod(lock->filename, st.st_mode & 07777) < 0) {
2203                 ret = error("chmod on %s failed: %s",
2204                                 lock->filename, strerror(errno));
2205                 goto out;
2206         }
2207
2208         while (fgets(buf, sizeof(buf), config_file)) {
2209                 int i;
2210                 int length;
2211                 char *output = buf;
2212                 for (i = 0; buf[i] && isspace(buf[i]); i++)
2213                         ; /* do nothing */
2214                 if (buf[i] == '[') {
2215                         /* it's a section */
2216                         int offset = section_name_match(&buf[i], old_name);
2217                         if (offset > 0) {
2218                                 ret++;
2219                                 if (new_name == NULL) {
2220                                         remove = 1;
2221                                         continue;
2222                                 }
2223                                 store.baselen = strlen(new_name);
2224                                 if (!store_write_section(out_fd, new_name)) {
2225                                         ret = write_error(lock->filename);
2226                                         goto out;
2227                                 }
2228                                 /*
2229                                  * We wrote out the new section, with
2230                                  * a newline, now skip the old
2231                                  * section's length
2232                                  */
2233                                 output += offset + i;
2234                                 if (strlen(output) > 0) {
2235                                         /*
2236                                          * More content means there's
2237                                          * a declaration to put on the
2238                                          * next line; indent with a
2239                                          * tab
2240                                          */
2241                                         output -= 1;
2242                                         output[0] = '\t';
2243                                 }
2244                         }
2245                         remove = 0;
2246                 }
2247                 if (remove)
2248                         continue;
2249                 length = strlen(output);
2250                 if (write_in_full(out_fd, output, length) != length) {
2251                         ret = write_error(lock->filename);
2252                         goto out;
2253                 }
2254         }
2255         fclose(config_file);
2256 unlock_and_out:
2257         if (commit_lock_file(lock) < 0)
2258                 ret = error("could not commit config file %s", config_filename);
2259 out:
2260         free(filename_buf);
2261         return ret;
2262 }
2263
2264 int git_config_rename_section(const char *old_name, const char *new_name)
2265 {
2266         return git_config_rename_section_in_file(NULL, old_name, new_name);
2267 }
2268
2269 /*
2270  * Call this to report error for your variable that should not
2271  * get a boolean value (i.e. "[my] var" means "true").
2272  */
2273 #undef config_error_nonbool
2274 int config_error_nonbool(const char *var)
2275 {
2276         return error("Missing value for '%s'", var);
2277 }
2278
2279 int parse_config_key(const char *var,
2280                      const char *section,
2281                      const char **subsection, int *subsection_len,
2282                      const char **key)
2283 {
2284         int section_len = strlen(section);
2285         const char *dot;
2286
2287         /* Does it start with "section." ? */
2288         if (!starts_with(var, section) || var[section_len] != '.')
2289                 return -1;
2290
2291         /*
2292          * Find the key; we don't know yet if we have a subsection, but we must
2293          * parse backwards from the end, since the subsection may have dots in
2294          * it, too.
2295          */
2296         dot = strrchr(var, '.');
2297         *key = dot + 1;
2298
2299         /* Did we have a subsection at all? */
2300         if (dot == var + section_len) {
2301                 *subsection = NULL;
2302                 *subsection_len = 0;
2303         }
2304         else {
2305                 *subsection = var + section_len + 1;
2306                 *subsection_len = dot - *subsection;
2307         }
2308
2309         return 0;
2310 }