Code

Merge branch 'mg/config-symbolic-constants'
authorJunio C Hamano <gitster@pobox.com>
Mon, 23 May 2011 16:59:05 +0000 (09:59 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 23 May 2011 16:59:05 +0000 (09:59 -0700)
* mg/config-symbolic-constants:
  config: Give error message when not changing a multivar
  config: define and document exit codes

Documentation/git-config.txt
builtin/config.c
cache.h
config.c

index 8804de327fd5973ae5d36bff18cfcac3e738763d..e7ecf5d803e14dfa452671cf01e7730dce48b984 100644 (file)
@@ -50,16 +50,18 @@ The default is to assume the config file of the current repository,
 .git/config unless defined otherwise with GIT_DIR and GIT_CONFIG
 (see <<FILES>>).
 
-This command will fail if:
-
-. The config file is invalid,
-. Can not write to the config file,
-. no section was provided,
-. the section or key is invalid,
-. you try to unset an option which does not exist,
-. you try to unset/set an option for which multiple lines match, or
-. you use '--global' option without $HOME being properly set.
-
+This command will fail (with exit code ret) if:
+
+. The config file is invalid (ret=3),
+. can not write to the config file (ret=4),
+. no section or name was provided (ret=2),
+. the section or key is invalid (ret=1),
+. you try to unset an option which does not exist (ret=5),
+. you try to unset/set an option for which multiple lines match (ret=5),
+. you try to use an invalid regexp (ret=6), or
+. you use '--global' option without $HOME being properly set (ret=128).
+
+On success, the command returns the exit code 0.
 
 OPTIONS
 -------
index 3e3c52849773348a568241f678b3e3ee2e8d123a..211e118d575411b712ccf0387db2408708576902 100644 (file)
@@ -436,9 +436,14 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                              NULL, NULL);
        }
        else if (actions == ACTION_SET) {
+               int ret;
                check_argc(argc, 2, 2);
                value = normalize_value(argv[0], argv[1]);
-               return git_config_set(argv[0], value);
+               ret = git_config_set(argv[0], value);
+               if (ret == CONFIG_NOTHING_SET)
+                       error("cannot overwrite multiple values with a single value\n"
+                       "       Use a regexp, --add or --set-all to change %s.", argv[0]);
+               return ret;
        }
        else if (actions == ACTION_SET_ALL) {
                check_argc(argc, 2, 3);
diff --git a/cache.h b/cache.h
index f1c0887d6075212dba22c7feb62316480afb1fa2..28a921dffc144bab15366bbfb0c52ed34a320bed 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -1023,6 +1023,16 @@ extern const char *packed_object_info_detail(struct packed_git *, off_t, unsigne
 /* Dumb servers support */
 extern int update_server_info(int);
 
+/* git_config_parse_key() returns these negated: */
+#define CONFIG_INVALID_KEY 1
+#define CONFIG_NO_SECTION_OR_NAME 2
+/* git_config_set(), git_config_set_multivar() return the above or these: */
+#define CONFIG_NO_LOCK -1
+#define CONFIG_INVALID_FILE 3
+#define CONFIG_NO_WRITE 4
+#define CONFIG_NOTHING_SET 5
+#define CONFIG_INVALID_PATTERN 6
+
 typedef int (*config_fn_t)(const char *, const char *, void *);
 extern int git_default_config(const char *, const char *, void *);
 extern int git_config_from_file(config_fn_t fn, const char *, void *);
index 671c8df2cc4a856b3b32d4ec047298f0e5547878..9d368488893687a7b6986b5ab8eb1154f3ad7df9 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1123,12 +1123,12 @@ int git_config_parse_key(const char *key, char **store_key, int *baselen_)
 
        if (last_dot == NULL || last_dot == key) {
                error("key does not contain a section: %s", key);
-               return -2;
+               return -CONFIG_NO_SECTION_OR_NAME;
        }
 
        if (!last_dot[1]) {
                error("key does not contain variable name: %s", key);
-               return -2;
+               return -CONFIG_NO_SECTION_OR_NAME;
        }
 
        baselen = last_dot - key;
@@ -1165,7 +1165,7 @@ int git_config_parse_key(const char *key, char **store_key, int *baselen_)
 
 out_free_ret_1:
        free(*store_key);
-       return -1;
+       return -CONFIG_INVALID_KEY;
 }
 
 /*
@@ -1221,7 +1221,7 @@ int git_config_set_multivar(const char *key, const char *value,
        if (fd < 0) {
                error("could not lock config file %s: %s", config_filename, strerror(errno));
                free(store.key);
-               ret = -1;
+               ret = CONFIG_NO_LOCK;
                goto out_free;
        }
 
@@ -1235,12 +1235,12 @@ int git_config_set_multivar(const char *key, const char *value,
                if ( ENOENT != errno ) {
                        error("opening %s: %s", config_filename,
                              strerror(errno));
-                       ret = 3; /* same as "invalid config file" */
+                       ret = CONFIG_INVALID_FILE; /* same as "invalid config file" */
                        goto out_free;
                }
                /* if nothing to unset, error out */
                if (value == NULL) {
-                       ret = 5;
+                       ret = CONFIG_NOTHING_SET;
                        goto out_free;
                }
 
@@ -1268,7 +1268,7 @@ int git_config_set_multivar(const char *key, const char *value,
                                        REG_EXTENDED)) {
                                error("invalid pattern: %s", value_regex);
                                free(store.value_regex);
-                               ret = 6;
+                               ret = CONFIG_INVALID_PATTERN;
                                goto out_free;
                        }
                }
@@ -1290,7 +1290,7 @@ int git_config_set_multivar(const char *key, const char *value,
                                regfree(store.value_regex);
                                free(store.value_regex);
                        }
-                       ret = 3;
+                       ret = CONFIG_INVALID_FILE;
                        goto out_free;
                }
 
@@ -1303,7 +1303,7 @@ int git_config_set_multivar(const char *key, const char *value,
                /* if nothing to unset, or too many matches, error out */
                if ((store.seen == 0 && value == NULL) ||
                                (store.seen > 1 && multi_replace == 0)) {
-                       ret = 5;
+                       ret = CONFIG_NOTHING_SET;
                        goto out_free;
                }
 
@@ -1364,7 +1364,7 @@ int git_config_set_multivar(const char *key, const char *value,
 
        if (commit_lock_file(lock) < 0) {
                error("could not commit config file %s", config_filename);
-               ret = 4;
+               ret = CONFIG_NO_WRITE;
                goto out_free;
        }