Merge branch 'ta/config-set-2'
authorJunio C Hamano <gitster@pobox.com>
Thu, 11 Sep 2014 17:33:26 +0000 (10:33 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 11 Sep 2014 17:33:26 +0000 (10:33 -0700)
Update git_config() users with callback functions for a very narrow
scope with calls to config-set API that lets us query a single
variable.

* ta/config-set-2:
builtin/apply.c: replace `git_config()` with `git_config_get_string_const()`
merge-recursive.c: replace `git_config()` with `git_config_get_int()`
ll-merge.c: refactor `read_merge_config()` to use `git_config_string()`
fast-import.c: replace `git_config()` with `git_config_get_*()` family
branch.c: replace `git_config()` with `git_config_get_string()
alias.c: replace `git_config()` with `git_config_get_string()`
imap-send.c: replace `git_config()` with `git_config_get_*()` family
pager.c: replace `git_config()` with `git_config_get_value()`
builtin/gc.c: replace `git_config()` with `git_config_get_*()` family
rerere.c: replace `git_config()` with `git_config_get_*()` family
fetchpack.c: replace `git_config()` with `git_config_get_*()` family
archive.c: replace `git_config()` with `git_config_get_bool()` family
read-cache.c: replace `git_config()` with `git_config_get_*()` family
http-backend.c: replace `git_config()` with `git_config_get_bool()` family
daemon.c: replace `git_config()` with `git_config_get_bool()` family

1  2 
builtin/apply.c
imap-send.c
read-cache.c
diff --combined builtin/apply.c
index 6b7c764918cff18957f67a2e345c0610e459859d,b97a55d3a7c540306f86221d56a280dff7ee095a..f204cca5d2df50d8ecb01944927fb756ac387b5e
@@@ -1075,7 -1075,7 +1075,7 @@@ static int gitdiff_index(const char *li
  
        line = ptr + 2;
        ptr = strchr(line, ' ');
 -      eol = strchr(line, '\n');
 +      eol = strchrnul(line, '\n');
  
        if (!ptr || eol < ptr)
                ptr = eol;
@@@ -1920,66 -1920,6 +1920,66 @@@ static int parse_binary(char *buffer, u
        return used;
  }
  
 +static void prefix_one(char **name)
 +{
 +      char *old_name = *name;
 +      if (!old_name)
 +              return;
 +      *name = xstrdup(prefix_filename(prefix, prefix_length, *name));
 +      free(old_name);
 +}
 +
 +static void prefix_patch(struct patch *p)
 +{
 +      if (!prefix || p->is_toplevel_relative)
 +              return;
 +      prefix_one(&p->new_name);
 +      prefix_one(&p->old_name);
 +}
 +
 +/*
 + * include/exclude
 + */
 +
 +static struct string_list limit_by_name;
 +static int has_include;
 +static void add_name_limit(const char *name, int exclude)
 +{
 +      struct string_list_item *it;
 +
 +      it = string_list_append(&limit_by_name, name);
 +      it->util = exclude ? NULL : (void *) 1;
 +}
 +
 +static int use_patch(struct patch *p)
 +{
 +      const char *pathname = p->new_name ? p->new_name : p->old_name;
 +      int i;
 +
 +      /* Paths outside are not touched regardless of "--include" */
 +      if (0 < prefix_length) {
 +              int pathlen = strlen(pathname);
 +              if (pathlen <= prefix_length ||
 +                  memcmp(prefix, pathname, prefix_length))
 +                      return 0;
 +      }
 +
 +      /* See if it matches any of exclude/include rule */
 +      for (i = 0; i < limit_by_name.nr; i++) {
 +              struct string_list_item *it = &limit_by_name.items[i];
 +              if (!wildmatch(it->string, pathname, 0, NULL))
 +                      return (it->util != NULL);
 +      }
 +
 +      /*
 +       * If we had any include, a path that does not match any rule is
 +       * not used.  Otherwise, we saw bunch of exclude rules (or none)
 +       * and such a path is used.
 +       */
 +      return !has_include;
 +}
 +
 +
  /*
   * Read the patch text in "buffer" that extends for "size" bytes; stop
   * reading after seeing a single patch (i.e. changes to a single file).
@@@ -1995,14 -1935,9 +1995,14 @@@ static int parse_chunk(char *buffer, un
        if (offset < 0)
                return offset;
  
 -      patch->ws_rule = whitespace_rule(patch->new_name
 -                                       ? patch->new_name
 -                                       : patch->old_name);
 +      prefix_patch(patch);
 +
 +      if (!use_patch(patch))
 +              patch->ws_rule = 0;
 +      else
 +              patch->ws_rule = whitespace_rule(patch->new_name
 +                                               ? patch->new_name
 +                                               : patch->old_name);
  
        patchsize = parse_single_patch(buffer + offset + hdrsize,
                                       size - offset - hdrsize, patch);
@@@ -4192,6 -4127,64 +4192,6 @@@ static int write_out_results(struct pat
  
  static struct lock_file lock_file;
  
 -static struct string_list limit_by_name;
 -static int has_include;
 -static void add_name_limit(const char *name, int exclude)
 -{
 -      struct string_list_item *it;
 -
 -      it = string_list_append(&limit_by_name, name);
 -      it->util = exclude ? NULL : (void *) 1;
 -}
 -
 -static int use_patch(struct patch *p)
 -{
 -      const char *pathname = p->new_name ? p->new_name : p->old_name;
 -      int i;
 -
 -      /* Paths outside are not touched regardless of "--include" */
 -      if (0 < prefix_length) {
 -              int pathlen = strlen(pathname);
 -              if (pathlen <= prefix_length ||
 -                  memcmp(prefix, pathname, prefix_length))
 -                      return 0;
 -      }
 -
 -      /* See if it matches any of exclude/include rule */
 -      for (i = 0; i < limit_by_name.nr; i++) {
 -              struct string_list_item *it = &limit_by_name.items[i];
 -              if (!wildmatch(it->string, pathname, 0, NULL))
 -                      return (it->util != NULL);
 -      }
 -
 -      /*
 -       * If we had any include, a path that does not match any rule is
 -       * not used.  Otherwise, we saw bunch of exclude rules (or none)
 -       * and such a path is used.
 -       */
 -      return !has_include;
 -}
 -
 -
 -static void prefix_one(char **name)
 -{
 -      char *old_name = *name;
 -      if (!old_name)
 -              return;
 -      *name = xstrdup(prefix_filename(prefix, prefix_length, *name));
 -      free(old_name);
 -}
 -
 -static void prefix_patches(struct patch *p)
 -{
 -      if (!prefix || p->is_toplevel_relative)
 -              return;
 -      for ( ; p; p = p->next) {
 -              prefix_one(&p->new_name);
 -              prefix_one(&p->old_name);
 -      }
 -}
 -
  #define INACCURATE_EOF        (1<<0)
  #define RECOUNT               (1<<1)
  
@@@ -4217,6 -4210,8 +4217,6 @@@ static int apply_patch(int fd, const ch
                        break;
                if (apply_in_reverse)
                        reverse_patches(patch);
 -              if (prefix)
 -                      prefix_patches(patch);
                if (use_patch(patch)) {
                        patch_stats(patch);
                        *listp = patch;
        return 0;
  }
  
- static int git_apply_config(const char *var, const char *value, void *cb)
+ static void git_apply_config(void)
  {
-       if (!strcmp(var, "apply.whitespace"))
-               return git_config_string(&apply_default_whitespace, var, value);
-       else if (!strcmp(var, "apply.ignorewhitespace"))
-               return git_config_string(&apply_default_ignorewhitespace, var, value);
-       return git_default_config(var, value, cb);
+       git_config_get_string_const("apply.whitespace", &apply_default_whitespace);
+       git_config_get_string_const("apply.ignorewhitespace", &apply_default_ignorewhitespace);
+       git_config(git_default_config, NULL);
  }
  
  static int option_parse_exclude(const struct option *opt,
@@@ -4428,7 -4421,7 +4426,7 @@@ int cmd_apply(int argc, const char **ar
  
        prefix = prefix_;
        prefix_length = prefix ? strlen(prefix) : 0;
-       git_config(git_apply_config, NULL);
+       git_apply_config();
        if (apply_default_whitespace)
                parse_whitespace_option(apply_default_whitespace);
        if (apply_default_ignorewhitespace)
diff --combined imap-send.c
index 87f9bb18f6983a99499f170cef1f319f6c63d6f1,618d75b1492491fbc9b27cbba5c56ffe87848276..614b744106d95a52eec5fa1e23564b303c77295b
@@@ -128,6 -128,7 +128,6 @@@ struct imap_cmd_cb 
        char *data;
        int dlen;
        int uid;
 -      unsigned create:1, trycreate:1;
  };
  
  struct imap_cmd {
@@@ -492,9 -493,9 +492,9 @@@ static int nfsnprintf(char *buf, int bl
        return ret;
  }
  
 -static struct imap_cmd *v_issue_imap_cmd(struct imap_store *ctx,
 -                                       struct imap_cmd_cb *cb,
 -                                       const char *fmt, va_list ap)
 +static struct imap_cmd *issue_imap_cmd(struct imap_store *ctx,
 +                                     struct imap_cmd_cb *cb,
 +                                     const char *fmt, va_list ap)
  {
        struct imap *imap = ctx->imap;
        struct imap_cmd *cmd;
        return cmd;
  }
  
 -__attribute__((format (printf, 3, 4)))
 -static struct imap_cmd *issue_imap_cmd(struct imap_store *ctx,
 -                                     struct imap_cmd_cb *cb,
 -                                     const char *fmt, ...)
 -{
 -      struct imap_cmd *ret;
 -      va_list ap;
 -
 -      va_start(ap, fmt);
 -      ret = v_issue_imap_cmd(ctx, cb, fmt, ap);
 -      va_end(ap);
 -      return ret;
 -}
 -
  __attribute__((format (printf, 3, 4)))
  static int imap_exec(struct imap_store *ctx, struct imap_cmd_cb *cb,
                     const char *fmt, ...)
        struct imap_cmd *cmdp;
  
        va_start(ap, fmt);
 -      cmdp = v_issue_imap_cmd(ctx, cb, fmt, ap);
 +      cmdp = issue_imap_cmd(ctx, cb, fmt, ap);
        va_end(ap);
        if (!cmdp)
                return RESP_BAD;
@@@ -581,7 -596,7 +581,7 @@@ static int imap_exec_m(struct imap_stor
        struct imap_cmd *cmdp;
  
        va_start(ap, fmt);
 -      cmdp = v_issue_imap_cmd(ctx, cb, fmt, ap);
 +      cmdp = issue_imap_cmd(ctx, cb, fmt, ap);
        va_end(ap);
        if (!cmdp)
                return DRV_STORE_BAD;
@@@ -699,8 -714,8 +699,8 @@@ static int parse_response_code(struct i
  static int get_cmd_result(struct imap_store *ctx, struct imap_cmd *tcmd)
  {
        struct imap *imap = ctx->imap;
 -      struct imap_cmd *cmdp, **pcmdp, *ncmdp;
 -      char *cmd, *arg, *arg1, *p;
 +      struct imap_cmd *cmdp, **pcmdp;
 +      char *cmd, *arg, *arg1;
        int n, resp, resp2, tag;
  
        for (;;) {
                        if (!strcmp("OK", arg))
                                resp = DRV_OK;
                        else {
 -                              if (!strcmp("NO", arg)) {
 -                                      if (cmdp->cb.create && cmd && (cmdp->cb.trycreate || !memcmp(cmd, "[TRYCREATE]", 11))) { /* SELECT, APPEND or UID COPY */
 -                                              p = strchr(cmdp->cmd, '"');
 -                                              if (!issue_imap_cmd(ctx, NULL, "CREATE \"%.*s\"", (int)(strchr(p + 1, '"') - p + 1), p)) {
 -                                                      resp = RESP_BAD;
 -                                                      goto normal;
 -                                              }
 -                                              /* not waiting here violates the spec, but a server that does not
 -                                                 grok this nonetheless violates it too. */
 -                                              cmdp->cb.create = 0;
 -                                              if (!(ncmdp = issue_imap_cmd(ctx, &cmdp->cb, "%s", cmdp->cmd))) {
 -                                                      resp = RESP_BAD;
 -                                                      goto normal;
 -                                              }
 -                                              free(cmdp->cmd);
 -                                              free(cmdp);
 -                                              if (!tcmd)
 -                                                      return 0;       /* ignored */
 -                                              if (cmdp == tcmd)
 -                                                      tcmd = ncmdp;
 -                                              continue;
 -                                      }
 +                              if (!strcmp("NO", arg))
                                        resp = RESP_NO;
 -                              else /*if (!strcmp("BAD", arg))*/
 +                              else /*if (!strcmp("BAD", arg))*/
                                        resp = RESP_BAD;
                                fprintf(stderr, "IMAP command '%s' returned response (%s) - %s\n",
                                         memcmp(cmdp->cmd, "LOGIN", 5) ?
                        }
                        if ((resp2 = parse_response_code(ctx, &cmdp->cb, cmd)) > resp)
                                resp = resp2;
 -              normal:
                        if (cmdp->cb.done)
                                cmdp->cb.done(ctx, cmdp, resp);
                        free(cmdp->cb.data);
@@@ -907,7 -944,7 +907,7 @@@ static int auth_cram_md5(struct imap_st
        return 0;
  }
  
 -static struct imap_store *imap_open_store(struct imap_server_conf *srvc)
 +static struct imap_store *imap_open_store(struct imap_server_conf *srvc, char *folder)
  {
        struct credential cred = CREDENTIAL_INIT;
        struct imap_store *ctx;
                credential_approve(&cred);
        credential_clear(&cred);
  
 +      /* check the target mailbox exists */
 +      ctx->name = folder;
 +      switch (imap_exec(ctx, NULL, "EXAMINE \"%s\"", ctx->name)) {
 +      case RESP_OK:
 +              /* ok */
 +              break;
 +      case RESP_BAD:
 +              fprintf(stderr, "IMAP error: could not check mailbox\n");
 +              goto out;
 +      case RESP_NO:
 +              if (imap_exec(ctx, NULL, "CREATE \"%s\"", ctx->name) == RESP_OK) {
 +                      imap_info("Created missing mailbox\n");
 +              } else {
 +                      fprintf(stderr, "IMAP error: could not create missing mailbox\n");
 +                      goto out;
 +              }
 +              break;
 +      }
 +
        ctx->prefix = "";
        return ctx;
  
@@@ -1146,7 -1164,6 +1146,7 @@@ bail
                credential_reject(&cred);
        credential_clear(&cred);
  
 + out:
        imap_close_store(ctx);
        return NULL;
  }
@@@ -1202,6 -1219,7 +1202,6 @@@ static int imap_store_msg(struct imap_s
  
        box = ctx->name;
        prefix = !strcmp(box, "INBOX") ? "" : ctx->prefix;
 -      cb.create = 0;
        ret = imap_exec_m(ctx, &cb, "APPEND \"%s%s\" ", prefix, box);
        imap->caps = imap->rcaps;
        if (ret != DRV_OK)
@@@ -1308,43 -1326,35 +1308,35 @@@ static int split_msg(struct strbuf *all
  
  static char *imap_folder;
  
- static int git_imap_config(const char *key, const char *val, void *cb)
+ static void git_imap_config(void)
  {
-       if (!skip_prefix(key, "imap.", &key))
-               return 0;
+       const char *val = NULL;
+       git_config_get_bool("imap.sslverify", &server.ssl_verify);
+       git_config_get_bool("imap.preformattedhtml", &server.use_html);
+       git_config_get_string("imap.folder", &imap_folder);
  
-       /* check booleans first, and barf on others */
-       if (!strcmp("sslverify", key))
-               server.ssl_verify = git_config_bool(key, val);
-       else if (!strcmp("preformattedhtml", key))
-               server.use_html = git_config_bool(key, val);
-       else if (!val)
-               return config_error_nonbool(key);
-       if (!strcmp("folder", key)) {
-               imap_folder = xstrdup(val);
-       } else if (!strcmp("host", key)) {
-               if (starts_with(val, "imap:"))
-                       val += 5;
-               else if (starts_with(val, "imaps:")) {
-                       val += 6;
-                       server.use_ssl = 1;
+       if (!git_config_get_value("imap.host", &val)) {
+               if (!val) {
+                       git_die_config("imap.host", "Missing value for 'imap.host'");
+               } else {
+                       if (starts_with(val, "imap:"))
+                               val += 5;
+                       else if (starts_with(val, "imaps:")) {
+                               val += 6;
+                               server.use_ssl = 1;
+                       }
+                       if (starts_with(val, "//"))
+                               val += 2;
+                       server.host = xstrdup(val);
                }
-               if (starts_with(val, "//"))
-                       val += 2;
-               server.host = xstrdup(val);
-       } else if (!strcmp("user", key))
-               server.user = xstrdup(val);
-       else if (!strcmp("pass", key))
-               server.pass = xstrdup(val);
-       else if (!strcmp("port", key))
-               server.port = git_config_int(key, val);
-       else if (!strcmp("tunnel", key))
-               server.tunnel = xstrdup(val);
-       else if (!strcmp("authmethod", key))
-               server.auth_method = xstrdup(val);
+       }
  
-       return 0;
+       git_config_get_string("imap.user", &server.user);
+       git_config_get_string("imap.pass", &server.pass);
+       git_config_get_int("imap.port", &server.port);
+       git_config_get_string("imap.tunnel", &server.tunnel);
+       git_config_get_string("imap.authmethod", &server.auth_method);
  }
  
  int main(int argc, char **argv)
                usage(imap_send_usage);
  
        setup_git_directory_gently(&nongit_ok);
-       git_config(git_imap_config, NULL);
+       git_imap_config();
  
        if (!server.port)
                server.port = server.use_ssl ? 993 : 143;
        }
  
        /* write it to the imap server */
 -      ctx = imap_open_store(&server);
 +      ctx = imap_open_store(&server, imap_folder);
        if (!ctx) {
                fprintf(stderr, "failed to open store\n");
                return 1;
        }
  
        fprintf(stderr, "sending %d message%s\n", total, (total != 1) ? "s" : "");
 -      ctx->name = imap_folder;
        while (1) {
                unsigned percent = n * 100 / total;
  
diff --combined read-cache.c
index 6f0057fe66a59e1239703ee4458de200304f727a,acb132d8bf596061f10fb5743ec7e71da8e8d633..b5917e0c0743af3c831f9571e19e269e8a1f6014
@@@ -1064,14 -1064,6 +1064,14 @@@ static struct cache_entry *refresh_cach
                return ce;
        }
  
 +      if (has_symlink_leading_path(ce->name, ce_namelen(ce))) {
 +              if (ignore_missing)
 +                      return ce;
 +              if (err)
 +                      *err = ENOENT;
 +              return NULL;
 +      }
 +
        if (lstat(ce->name, &st) < 0) {
                if (ignore_missing && errno == ENOENT)
                        return ce;
@@@ -1246,24 -1238,16 +1246,16 @@@ static struct cache_entry *refresh_cach
  
  #define INDEX_FORMAT_DEFAULT 3
  
- static int index_format_config(const char *var, const char *value, void *cb)
- {
-       unsigned int *version = cb;
-       if (!strcmp(var, "index.version")) {
-               *version = git_config_int(var, value);
-               return 0;
-       }
-       return 1;
- }
  static unsigned int get_index_format_default(void)
  {
        char *envversion = getenv("GIT_INDEX_VERSION");
        char *endp;
+       int value;
        unsigned int version = INDEX_FORMAT_DEFAULT;
  
        if (!envversion) {
-               git_config(index_format_config, &version);
+               if (!git_config_get_int("index.version", &value))
+                       version = value;
                if (version < INDEX_FORMAT_LB || INDEX_FORMAT_UB < version) {
                        warning(_("index.version set, but the value is invalid.\n"
                                  "Using version %i"), INDEX_FORMAT_DEFAULT);