builtin-fsck: reports missing parent commits
[gitweb.git] / config.c
index 857deb6c85091057f663d2eb7143f3717bd82687..b82907cb857c9f745a2afa7abe786ee0c7ae1ff8 100644 (file)
--- a/config.c
+++ b/config.c
@@ -309,6 +309,14 @@ int git_config_bool(const char *name, const char *value)
        return git_config_int(name, value) != 0;
 }
 
+int git_config_string(const char **dest, const char *var, const char *value)
+{
+       if (!value)
+               return config_error_nonbool(var);
+       *dest = xstrdup(value);
+       return 0;
+}
+
 int git_default_config(const char *var, const char *value)
 {
        /* This needs a better name */
@@ -408,49 +416,42 @@ int git_default_config(const char *var, const char *value)
        }
 
        if (!strcmp(var, "user.name")) {
+               if (!value)
+                       return config_error_nonbool(var);
                strlcpy(git_default_name, value, sizeof(git_default_name));
                return 0;
        }
 
        if (!strcmp(var, "user.email")) {
+               if (!value)
+                       return config_error_nonbool(var);
                strlcpy(git_default_email, value, sizeof(git_default_email));
                return 0;
        }
 
-       if (!strcmp(var, "i18n.commitencoding")) {
-               git_commit_encoding = xstrdup(value);
-               return 0;
-       }
-
-       if (!strcmp(var, "i18n.logoutputencoding")) {
-               git_log_output_encoding = xstrdup(value);
-               return 0;
-       }
+       if (!strcmp(var, "i18n.commitencoding"))
+               return git_config_string(&git_commit_encoding, var, value);
 
+       if (!strcmp(var, "i18n.logoutputencoding"))
+               return git_config_string(&git_log_output_encoding, var, value);
 
        if (!strcmp(var, "pager.color") || !strcmp(var, "color.pager")) {
                pager_use_color = git_config_bool(var,value);
                return 0;
        }
 
-       if (!strcmp(var, "core.pager")) {
-               pager_program = xstrdup(value);
-               return 0;
-       }
+       if (!strcmp(var, "core.pager"))
+               return git_config_string(&pager_program, var, value);
 
-       if (!strcmp(var, "core.editor")) {
-               editor_program = xstrdup(value);
-               return 0;
-       }
+       if (!strcmp(var, "core.editor"))
+               return git_config_string(&editor_program, var, value);
 
-       if (!strcmp(var, "core.excludesfile")) {
-               if (!value)
-                       die("core.excludesfile without value");
-               excludes_file = xstrdup(value);
-               return 0;
-       }
+       if (!strcmp(var, "core.excludesfile"))
+               return git_config_string(&excludes_file, var, value);
 
        if (!strcmp(var, "core.whitespace")) {
+               if (!value)
+                       return config_error_nonbool(var);
                whitespace_rule_cfg = parse_whitespace_rule(value);
                return 0;
        }
@@ -701,12 +702,17 @@ static ssize_t find_beginning_of_line(const char* contents, size_t size,
        size_t equal_offset = size, bracket_offset = size;
        ssize_t offset;
 
+contline:
        for (offset = offset_-2; offset > 0
                        && contents[offset] != '\n'; offset--)
                switch (contents[offset]) {
                        case '=': equal_offset = offset; break;
                        case ']': bracket_offset = offset; break;
                }
+       if (offset > 0 && contents[offset-1] == '\\') {
+               offset_ = offset;
+               goto contline;
+       }
        if (bracket_offset < equal_offset) {
                *found_bracket = 1;
                offset = bracket_offset+1;
@@ -955,14 +961,12 @@ int git_config_set_multivar(const char* key, const char* value,
                munmap(contents, contents_sz);
        }
 
-       if (close(fd) || commit_lock_file(lock) < 0) {
+       if (commit_lock_file(lock) < 0) {
                fprintf(stderr, "Cannot commit config file!\n");
                ret = 4;
                goto out_free;
        }
 
-       /* fd is closed, so don't try to close it below. */
-       fd = -1;
        /*
         * lock is committed, so don't try to roll it back below.
         * NOTE: Since lockfile.c keeps a linked list of all created
@@ -973,8 +977,6 @@ int git_config_set_multivar(const char* key, const char* value,
        ret = 0;
 
 out_free:
-       if (0 <= fd)
-               close(fd);
        if (lock)
                rollback_lock_file(lock);
        free(config_filename);
@@ -1072,9 +1074,18 @@ int git_config_rename_section(const char *old_name, const char *new_name)
        }
        fclose(config_file);
  unlock_and_out:
-       if (close(out_fd) || commit_lock_file(lock) < 0)
+       if (commit_lock_file(lock) < 0)
                        ret = error("Cannot commit config file!");
  out:
        free(config_filename);
        return ret;
 }
+
+/*
+ * Call this to report error for your variable that should not
+ * get a boolean value (i.e. "[my] var" means "true").
+ */
+int config_error_nonbool(const char *var)
+{
+       return error("Missing value for '%s'", var);
+}