Merge branch 'sb/misc-cleanups'
authorJunio C Hamano <gitster@pobox.com>
Tue, 10 May 2016 20:40:29 +0000 (13:40 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 10 May 2016 20:40:29 +0000 (13:40 -0700)
* sb/misc-cleanups:
submodule-config: don't shadow `cache`
config.c: drop local variable

1  2 
config.c
submodule-config.c
diff --combined config.c
index 10b5c957ae714e850c9029ac23f88be407db3173,84e437a9b971025957675218e3486442ba14fdd2..262d8d74896819ec90fc017e5e12a68c1b48b2f4
+++ b/config.c
@@@ -24,7 -24,6 +24,7 @@@ struct config_source 
                        size_t pos;
                } buf;
        } u;
 +      const char *origin_type;
        const char *name;
        const char *path;
        int die_on_error;
@@@ -108,7 -107,7 +108,7 @@@ static int handle_path_include(const ch
  
        expanded = expand_user_path(path);
        if (!expanded)
 -              return error("Could not expand include path '%s'", path);
 +              return error("could not expand include path '%s'", path);
        path = expanded;
  
        /*
@@@ -162,7 -161,7 +162,7 @@@ void git_config_push_parameter(const ch
  {
        struct strbuf env = STRBUF_INIT;
        const char *old = getenv(CONFIG_DATA_ENVIRONMENT);
 -      if (old) {
 +      if (old && *old) {
                strbuf_addstr(&env, old);
                strbuf_addch(&env, ' ');
        }
@@@ -472,9 -471,9 +472,9 @@@ static int git_parse_source(config_fn_
                        break;
        }
        if (cf->die_on_error)
 -              die(_("bad config file line %d in %s"), cf->linenr, cf->name);
 +              die(_("bad config line %d in %s %s"), cf->linenr, cf->origin_type, cf->name);
        else
 -              return error(_("bad config file line %d in %s"), cf->linenr, cf->name);
 +              return error(_("bad config line %d in %s %s"), cf->linenr, cf->origin_type, cf->name);
  }
  
  static int parse_unit_factor(const char *end, uintmax_t *val)
@@@ -589,9 -588,9 +589,9 @@@ static void die_bad_number(const char *
        if (!value)
                value = "";
  
 -      if (cf && cf->name)
 -              die(_("bad numeric config value '%s' for '%s' in %s: %s"),
 -                  value, name, cf->name, reason);
 +      if (cf && cf->origin_type && cf->name)
 +              die(_("bad numeric config value '%s' for '%s' in %s %s: %s"),
 +                  value, name, cf->origin_type, cf->name, reason);
        die(_("bad numeric config value '%s' for '%s': %s"), value, name, reason);
  }
  
@@@ -950,7 -949,7 +950,7 @@@ static int git_default_branch_config(co
                else if (!strcmp(value, "always"))
                        autorebase = AUTOREBASE_ALWAYS;
                else
 -                      return error("Malformed value for %s", var);
 +                      return error("malformed value for %s", var);
                return 0;
        }
  
@@@ -976,7 -975,7 +976,7 @@@ static int git_default_push_config(cons
                else if (!strcmp(value, "current"))
                        push_default = PUSH_DEFAULT_CURRENT;
                else {
 -                      error("Malformed value for %s: %s", var, value);
 +                      error("malformed value for %s: %s", var, value);
                        return error("Must be one of nothing, matching, simple, "
                                     "upstream or current.");
                }
@@@ -1062,13 -1061,11 +1062,13 @@@ static int do_config_from(struct config
  }
  
  static int do_config_from_file(config_fn_t fn,
 -              const char *name, const char *path, FILE *f, void *data)
 +              const char *origin_type, const char *name, const char *path, FILE *f,
 +              void *data)
  {
        struct config_source top;
  
        top.u.file = f;
 +      top.origin_type = origin_type;
        top.name = name;
        top.path = path;
        top.die_on_error = 1;
  
  static int git_config_from_stdin(config_fn_t fn, void *data)
  {
 -      return do_config_from_file(fn, "<stdin>", NULL, stdin, data);
 +      return do_config_from_file(fn, "standard input", "", NULL, stdin, data);
  }
  
  int git_config_from_file(config_fn_t fn, const char *filename, void *data)
        f = fopen(filename, "r");
        if (f) {
                flockfile(f);
 -              ret = do_config_from_file(fn, filename, filename, f, data);
 +              ret = do_config_from_file(fn, "file", filename, filename, f, data);
                funlockfile(f);
                fclose(f);
        }
        return ret;
  }
  
 -int git_config_from_buf(config_fn_t fn, const char *name, const char *buf,
 -                      size_t len, void *data)
 +int git_config_from_mem(config_fn_t fn, const char *origin_type,
 +                      const char *name, const char *buf, size_t len, void *data)
  {
        struct config_source top;
  
        top.u.buf.buf = buf;
        top.u.buf.len = len;
        top.u.buf.pos = 0;
 +      top.origin_type = origin_type;
        top.name = name;
        top.path = NULL;
        top.die_on_error = 0;
@@@ -1136,7 -1132,7 +1136,7 @@@ static int git_config_from_blob_sha1(co
                return error("reference '%s' does not point to a blob", name);
        }
  
 -      ret = git_config_from_buf(fn, name, buf, size, data);
 +      ret = git_config_from_mem(fn, "blob", name, buf, size, data);
        free(buf);
  
        return ret;
@@@ -1188,12 -1184,11 +1188,12 @@@ int git_config_system(void
        return !git_env_bool("GIT_CONFIG_NOSYSTEM", 0);
  }
  
 -int git_config_early(config_fn_t fn, void *data, const char *repo_config)
 +static int do_git_config_sequence(config_fn_t fn, void *data)
  {
        int ret = 0, found = 0;
        char *xdg_config = xdg_config_home("config");
        char *user_config = expand_user_path("~/.gitconfig");
 +      char *repo_config = git_pathdup("config");
  
        if (git_config_system() && !access_or_die(git_etc_gitconfig(), R_OK, 0)) {
                ret += git_config_from_file(fn, git_etc_gitconfig(),
  
        free(xdg_config);
        free(user_config);
 +      free(repo_config);
        return ret == 0 ? found : ret;
  }
  
@@@ -1237,6 -1231,8 +1237,6 @@@ int git_config_with_options(config_fn_
                            struct git_config_source *config_source,
                            int respect_includes)
  {
 -      char *repo_config = NULL;
 -      int ret;
        struct config_include_data inc = CONFIG_INCLUDE_INIT;
  
        if (respect_includes) {
        else if (config_source && config_source->blob)
                return git_config_from_blob_ref(fn, config_source->blob, data);
  
 -      repo_config = git_pathdup("config");
 -      ret = git_config_early(fn, data, repo_config);
 -      if (repo_config)
 -              free(repo_config);
 -      return ret;
 +      return do_git_config_sequence(fn, data);
  }
  
  static void git_config_raw(config_fn_t fn, void *data)
@@@ -1309,14 -1309,11 +1309,11 @@@ static struct config_set_element *confi
        struct config_set_element k;
        struct config_set_element *found_entry;
        char *normalized_key;
-       int ret;
        /*
         * `key` may come from the user, so normalize it before using it
         * for querying entries from the hashmap.
         */
-       ret = git_config_parse_key(key, &normalized_key, NULL);
-       if (ret)
+       if (git_config_parse_key(key, &normalized_key, NULL))
                return NULL;
  
        hashmap_entry_init(&k, strhash(normalized_key));
@@@ -1594,30 -1591,6 +1591,30 @@@ int git_config_get_pathname(const char 
        return ret;
  }
  
 +int git_config_get_untracked_cache(void)
 +{
 +      int val = -1;
 +      const char *v;
 +
 +      /* Hack for test programs like test-dump-untracked-cache */
 +      if (ignore_untracked_cache_config)
 +              return -1;
 +
 +      if (!git_config_get_maybe_bool("core.untrackedcache", &val))
 +              return val;
 +
 +      if (!git_config_get_value("core.untrackedcache", &v)) {
 +              if (!strcasecmp(v, "keep"))
 +                      return -1;
 +
 +              error("unknown core.untrackedCache value '%s'; "
 +                    "using 'keep' default value", v);
 +              return -1;
 +      }
 +
 +      return -1; /* default value */
 +}
 +
  NORETURN
  void git_die_config_linenr(const char *key, const char *filename, int linenr)
  {
@@@ -2217,13 -2190,9 +2214,13 @@@ void git_config_set_multivar_in_file(co
                                     const char *key, const char *value,
                                     const char *value_regex, int multi_replace)
  {
 -      if (git_config_set_multivar_in_file_gently(config_filename, key, value,
 -                                                 value_regex, multi_replace) < 0)
 -              die(_("Could not set '%s' to '%s'"), key, value);
 +      if (!git_config_set_multivar_in_file_gently(config_filename, key, value,
 +                                                  value_regex, multi_replace))
 +              return;
 +      if (value)
 +              die(_("could not set '%s' to '%s'"), key, value);
 +      else
 +              die(_("could not unset '%s'"), key);
  }
  
  int git_config_set_multivar_gently(const char *key, const char *value,
@@@ -2404,7 -2373,7 +2401,7 @@@ int git_config_rename_section(const cha
  #undef config_error_nonbool
  int config_error_nonbool(const char *var)
  {
 -      return error("Missing value for '%s'", var);
 +      return error("missing value for '%s'", var);
  }
  
  int parse_config_key(const char *var,
  
        return 0;
  }
 +
 +const char *current_config_origin_type(void)
 +{
 +      return cf && cf->origin_type ? cf->origin_type : "command line";
 +}
 +
 +const char *current_config_name(void)
 +{
 +      return cf && cf->name ? cf->name : "";
 +}
diff --combined submodule-config.c
index 8ac5031ade2e71b2ac1a70a9130b3eef25eebc35,967bba232a523e6e5bf123ef749c54ab81d113a2..debab294d421675cdebb129b257808614f607a09
@@@ -30,7 -30,7 +30,7 @@@ enum lookup_type 
        lookup_path
  };
  
- static struct submodule_cache cache;
+ static struct submodule_cache the_submodule_cache;
  static int is_cache_init;
  
  static int config_path_cmp(const struct submodule_entry *a,
@@@ -59,7 -59,6 +59,7 @@@ static void free_one_config(struct subm
  {
        free((void *) entry->config->path);
        free((void *) entry->config->name);
 +      free((void *) entry->config->update_strategy.command);
        free(entry->config);
  }
  
@@@ -195,8 -194,6 +195,8 @@@ static struct submodule *lookup_or_crea
  
        submodule->path = NULL;
        submodule->url = NULL;
 +      submodule->update_strategy.type = SM_UPDATE_UNSPECIFIED;
 +      submodule->update_strategy.command = NULL;
        submodule->fetch_recurse = RECURSE_SUBMODULES_NONE;
        submodule->ignore = NULL;
  
@@@ -296,7 -293,7 +296,7 @@@ static int parse_config(const char *var
        if (!strcmp(item.buf, "path")) {
                if (!value)
                        ret = config_error_nonbool(var);
 -              else if (!me->overwrite && submodule->path != NULL)
 +              else if (!me->overwrite && submodule->path)
                        warn_multiple_config(me->commit_sha1, submodule->name,
                                        "path");
                else {
        } else if (!strcmp(item.buf, "ignore")) {
                if (!value)
                        ret = config_error_nonbool(var);
 -              else if (!me->overwrite && submodule->ignore != NULL)
 +              else if (!me->overwrite && submodule->ignore)
                        warn_multiple_config(me->commit_sha1, submodule->name,
                                        "ignore");
                else if (strcmp(value, "untracked") &&
        } else if (!strcmp(item.buf, "url")) {
                if (!value) {
                        ret = config_error_nonbool(var);
 -              } else if (!me->overwrite && submodule->url != NULL) {
 +              } else if (!me->overwrite && submodule->url) {
                        warn_multiple_config(me->commit_sha1, submodule->name,
                                        "url");
                } else {
                        free((void *) submodule->url);
                        submodule->url = xstrdup(value);
                }
 +      } else if (!strcmp(item.buf, "update")) {
 +              if (!value)
 +                      ret = config_error_nonbool(var);
 +              else if (!me->overwrite &&
 +                       submodule->update_strategy.type != SM_UPDATE_UNSPECIFIED)
 +                      warn_multiple_config(me->commit_sha1, submodule->name,
 +                                           "update");
 +              else if (parse_submodule_update_strategy(value,
 +                       &submodule->update_strategy) < 0)
 +                              die(_("invalid value for %s"), var);
        }
  
        strbuf_release(&name);
@@@ -405,7 -392,8 +405,7 @@@ static const struct submodule *config_f
                struct hashmap_iter iter;
                struct submodule_entry *entry;
  
 -              hashmap_iter_init(&cache->for_name, &iter);
 -              entry = hashmap_iter_next(&iter);
 +              entry = hashmap_iter_first(&cache->for_name, &iter);
                if (!entry)
                        return NULL;
                return entry->config;
        parameter.commit_sha1 = commit_sha1;
        parameter.gitmodules_sha1 = sha1;
        parameter.overwrite = 0;
 -      git_config_from_buf(parse_config, rev.buf, config, config_size,
 -                      &parameter);
 +      git_config_from_mem(parse_config, "submodule-blob", rev.buf,
 +                      config, config_size, &parameter);
        free(config);
  
        switch (lookup_type) {
@@@ -470,14 -458,14 +470,14 @@@ static void ensure_cache_init(void
        if (is_cache_init)
                return;
  
-       cache_init(&cache);
+       cache_init(&the_submodule_cache);
        is_cache_init = 1;
  }
  
  int parse_submodule_config_option(const char *var, const char *value)
  {
        struct parse_config_parameter parameter;
-       parameter.cache = &cache;
+       parameter.cache = &the_submodule_cache;
        parameter.commit_sha1 = NULL;
        parameter.gitmodules_sha1 = null_sha1;
        parameter.overwrite = 1;
@@@ -490,18 -478,18 +490,18 @@@ const struct submodule *submodule_from_
                const char *name)
  {
        ensure_cache_init();
-       return config_from_name(&cache, commit_sha1, name);
+       return config_from_name(&the_submodule_cache, commit_sha1, name);
  }
  
  const struct submodule *submodule_from_path(const unsigned char *commit_sha1,
                const char *path)
  {
        ensure_cache_init();
-       return config_from_path(&cache, commit_sha1, path);
+       return config_from_path(&the_submodule_cache, commit_sha1, path);
  }
  
  void submodule_free(void)
  {
-       cache_free(&cache);
+       cache_free(&the_submodule_cache);
        is_cache_init = 0;
  }