Merge branch 'sb/misc-cleanups' into HEAD
authorJunio C Hamano <gitster@pobox.com>
Wed, 18 May 2016 21:40:15 +0000 (14:40 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 May 2016 21:40:15 +0000 (14:40 -0700)
* sb/misc-cleanups:
submodule-config: don't shadow `cache`
config.c: drop local variable
credential-cache, send_request: close fd when done
bundle: don't leak an fd in case of early return
abbrev_sha1_in_line: don't leak memory
notes: don't leak memory in git_config_get_notes_strategy

1  2 
builtin/notes.c
config.c
submodule-config.c
wt-status.c
diff --combined builtin/notes.c
index ed6f2222f4bf9c54535a7a23971c7749ca8d05d5,afcfa8f52205ef841499489f7f103e7ce907b83e..6fd058de9272631a3d5135ccbbd79bf1b4ff135c
@@@ -286,11 -286,11 +286,11 @@@ static int notes_copy_from_stdin(int fo
                if (!c)
                        return 0;
        } else {
 -              init_notes(NULL, NULL, NULL, 0);
 +              init_notes(NULL, NULL, NULL, NOTES_INIT_WRITABLE);
                t = &default_notes_tree;
        }
  
 -      while (strbuf_getline(&buf, stdin, '\n') != EOF) {
 +      while (strbuf_getline_lf(&buf, stdin) != EOF) {
                unsigned char from_obj[20], to_obj[20];
                struct strbuf **split;
                int err;
        return ret;
  }
  
 -static struct notes_tree *init_notes_check(const char *subcommand)
 +static struct notes_tree *init_notes_check(const char *subcommand,
 +                                         int flags)
  {
        struct notes_tree *t;
 -      init_notes(NULL, NULL, NULL, 0);
 +      const char *ref;
 +      init_notes(NULL, NULL, NULL, flags);
        t = &default_notes_tree;
  
 -      if (!starts_with(t->ref, "refs/notes/"))
 +      ref = (flags & NOTES_INIT_WRITABLE) ? t->update_ref : t->ref;
 +      if (!starts_with(ref, "refs/notes/"))
                die("Refusing to %s notes in %s (outside of refs/notes/)",
 -                  subcommand, t->ref);
 +                  subcommand, ref);
        return t;
  }
  
@@@ -363,7 -360,7 +363,7 @@@ static int list(int argc, const char **
                usage_with_options(git_notes_list_usage, options);
        }
  
 -      t = init_notes_check("list");
 +      t = init_notes_check("list", 0);
        if (argc) {
                if (get_sha1(argv[0], object))
                        die(_("Failed to resolve '%s' as a valid ref."), argv[0]);
@@@ -423,7 -420,7 +423,7 @@@ static int add(int argc, const char **a
        if (get_sha1(object_ref, object))
                die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
 -      t = init_notes_check("add");
 +      t = init_notes_check("add", NOTES_INIT_WRITABLE);
        note = get_note(t, object);
  
        if (note) {
@@@ -514,7 -511,7 +514,7 @@@ static int copy(int argc, const char **
        if (get_sha1(object_ref, object))
                die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
 -      t = init_notes_check("copy");
 +      t = init_notes_check("copy", NOTES_INIT_WRITABLE);
        note = get_note(t, object);
  
        if (note) {
@@@ -592,7 -589,7 +592,7 @@@ static int append_edit(int argc, const 
        if (get_sha1(object_ref, object))
                die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
 -      t = init_notes_check(argv[0]);
 +      t = init_notes_check(argv[0], NOTES_INIT_WRITABLE);
        note = get_note(t, object);
  
        prepare_note_data(object, &d, edit ? note : NULL);
@@@ -655,7 -652,7 +655,7 @@@ static int show(int argc, const char **
        if (get_sha1(object_ref, object))
                die(_("Failed to resolve '%s' as a valid ref."), object_ref);
  
 -      t = init_notes_check("show");
 +      t = init_notes_check("show", 0);
        note = get_note(t, object);
  
        if (!note)
@@@ -744,13 -741,14 +744,14 @@@ static int merge_commit(struct notes_me
  static int git_config_get_notes_strategy(const char *key,
                                         enum notes_merge_strategy *strategy)
  {
-       const char *value;
+       char *value;
  
-       if (git_config_get_string_const(key, &value))
+       if (git_config_get_string(key, &value))
                return 1;
        if (parse_notes_merge_strategy(value, strategy))
                git_die_config(key, "unknown notes merge strategy %s", value);
  
+       free(value);
        return 0;
  }
  
@@@ -809,10 -807,10 +810,10 @@@ static int merge(int argc, const char *
  
        o.local_ref = default_notes_ref();
        strbuf_addstr(&remote_ref, argv[0]);
 -      expand_notes_ref(&remote_ref);
 +      expand_loose_notes_ref(&remote_ref);
        o.remote_ref = remote_ref.buf;
  
 -      t = init_notes_check("merge");
 +      t = init_notes_check("merge", NOTES_INIT_WRITABLE);
  
        if (strategy) {
                if (parse_notes_merge_strategy(strategy, &o.strategy)) {
@@@ -904,7 -902,7 +905,7 @@@ static int remove_cmd(int argc, const c
        argc = parse_options(argc, argv, prefix, options,
                             git_notes_remove_usage, 0);
  
 -      t = init_notes_check("remove");
 +      t = init_notes_check("remove", NOTES_INIT_WRITABLE);
  
        if (!argc && !from_stdin) {
                retval = remove_one_note(t, "HEAD", flag);
@@@ -946,7 -944,7 +947,7 @@@ static int prune(int argc, const char *
                usage_with_options(git_notes_prune_usage, options);
        }
  
 -      t = init_notes_check("prune");
 +      t = init_notes_check("prune", NOTES_INIT_WRITABLE);
  
        prune_notes(t, (verbose ? NOTES_PRUNE_VERBOSE : 0) |
                (show_only ? NOTES_PRUNE_VERBOSE|NOTES_PRUNE_DRYRUN : 0) );
diff --combined config.c
index 47b2ce1d5a753f11bb1876e709e6a7324aa47e54,84e437a9b971025957675218e3486442ba14fdd2..4c9b447d76e77cc61e55cfd78ec50878f162a989
+++ 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;
  
        /*
@@@ -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 8476e0fa0f89c968e95182fd44211c0018a4b1f8,967bba232a523e6e5bf123ef749c54ab81d113a2..7f67ec0c6a826cca0ba80ce5990d5f0f3a0dcaa6
@@@ -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,
@@@ -392,7 -392,8 +392,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) {
@@@ -457,14 -458,14 +457,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;
@@@ -477,18 -478,18 +477,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;
  }
diff --combined wt-status.c
index ef7486474a1eafb7d5d1344323cd6abf012c31db,9f4be333d451b01ea2d40d17e41f887a300afee2..1ea2ebe4c00d23885515ac48f43844fdb03f70b9
@@@ -988,7 -988,7 +988,7 @@@ static char *read_line_from_git_path(co
                strbuf_release(&buf);
                return NULL;
        }
 -      strbuf_getline(&buf, fp, '\n');
 +      strbuf_getline_lf(&buf, fp);
        if (!fclose(fp)) {
                return strbuf_detach(&buf, NULL);
        } else {
@@@ -1063,9 -1063,7 +1063,7 @@@ static void abbrev_sha1_in_line(struct 
                                strbuf_addf(line, "%s", split[i]->buf);
                }
        }
-       for (i = 0; split[i]; i++)
-               strbuf_release(split[i]);
+       strbuf_list_free(split);
  }
  
  static void read_rebase_todolist(const char *fname, struct string_list *lines)
        if (!f)
                die_errno("Could not open file %s for reading",
                          git_path("%s", fname));
 -      while (!strbuf_getline(&line, f, '\n')) {
 +      while (!strbuf_getline_lf(&line, f)) {
                if (line.len && line.buf[0] == comment_line_char)
                        continue;
                strbuf_trim(&line);
@@@ -1677,10 -1675,10 +1675,10 @@@ static void wt_shortstatus_print_tracki
                color_fprintf(s->fp, header_color, LABEL(N_("behind ")));
                color_fprintf(s->fp, branch_color_remote, "%d", num_theirs);
        } else if (!num_theirs) {
 -              color_fprintf(s->fp, header_color, LABEL(N_(("ahead "))));
 +              color_fprintf(s->fp, header_color, LABEL(N_("ahead ")));
                color_fprintf(s->fp, branch_color_local, "%d", num_ours);
        } else {
 -              color_fprintf(s->fp, header_color, LABEL(N_(("ahead "))));
 +              color_fprintf(s->fp, header_color, LABEL(N_("ahead ")));
                color_fprintf(s->fp, branch_color_local, "%d", num_ours);
                color_fprintf(s->fp, header_color, ", %s", LABEL(N_("behind ")));
                color_fprintf(s->fp, branch_color_remote, "%d", num_theirs);