Code

Merge branch 'hm/maint-imap-send-crlf' into maint
authorJunio C Hamano <gitster@pobox.com>
Wed, 3 Mar 2010 06:55:03 +0000 (22:55 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Mar 2010 06:55:03 +0000 (22:55 -0800)
* hm/maint-imap-send-crlf:
  git-imap-send: Convert LF to CRLF before storing patch to draft box

1  2 
imap-send.c

diff --combined imap-send.c
index ba72fa4b6e2fcebc74e611ed1ca200a37b9f339d,3527b56d5d18988d7b84a8c498e1ca18aa806613..5631930bc3462c5d85d29e7e840f1cf24cd7111b
@@@ -91,7 -91,6 +91,6 @@@ struct msg_data 
        char *data;
        int len;
        unsigned char flags;
-       unsigned int crlf:1;
  };
  
  static const char imap_send_usage[] = "git imap-send < <mbox>";
@@@ -965,13 -964,17 +964,13 @@@ static struct store *imap_open_store(st
        /* open connection to IMAP server */
  
        if (srvc->tunnel) {
 -              const char *argv[4];
 +              const char *argv[] = { srvc->tunnel, NULL };
                struct child_process tunnel = {0};
  
                imap_info("Starting tunnel '%s'... ", srvc->tunnel);
  
 -              argv[0] = "sh";
 -              argv[1] = "-c";
 -              argv[2] = srvc->tunnel;
 -              argv[3] = NULL;
 -
                tunnel.argv = argv;
 +              tunnel.use_shell = 1;
                tunnel.in = -1;
                tunnel.out = -1;
                if (start_command(&tunnel))
@@@ -1162,6 -1165,44 +1161,44 @@@ static int imap_make_flags(int flags, c
        return d;
  }
  
+ static void lf_to_crlf(struct msg_data *msg)
+ {
+       char *new;
+       int i, j, lfnum = 0;
+       if (msg->data[0] == '\n')
+               lfnum++;
+       for (i = 1; i < msg->len; i++) {
+               if (msg->data[i - 1] != '\r' && msg->data[i] == '\n')
+                       lfnum++;
+       }
+       new = xmalloc(msg->len + lfnum);
+       if (msg->data[0] == '\n') {
+               new[0] = '\r';
+               new[1] = '\n';
+               i = 1;
+               j = 2;
+       } else {
+               new[0] = msg->data[0];
+               i = 1;
+               j = 1;
+       }
+       for ( ; i < msg->len; i++) {
+               if (msg->data[i] != '\n') {
+                       new[j++] = msg->data[i];
+                       continue;
+               }
+               if (msg->data[i - 1] != '\r')
+                       new[j++] = '\r';
+               /* otherwise it already had CR before */
+               new[j++] = '\n';
+       }
+       msg->len += lfnum;
+       free(msg->data);
+       msg->data = new;
+ }
  static int imap_store_msg(struct store *gctx, struct msg_data *data)
  {
        struct imap_store *ctx = (struct imap_store *)gctx;
        int ret, d;
        char flagstr[128];
  
+       lf_to_crlf(data);
        memset(&cb, 0, sizeof(cb));
  
        cb.dlen = data->len;
@@@ -1331,16 -1373,11 +1369,16 @@@ static int git_imap_config(const char *
        if (strncmp(key, imap_key, sizeof imap_key - 1))
                return 0;
  
 -      if (!val)
 -              return config_error_nonbool(key);
 -
        key += sizeof imap_key - 1;
  
 +      /* 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)) {
                server.port = git_config_int(key, val);
        else if (!strcmp("tunnel", key))
                server.tunnel = xstrdup(val);
 -      else 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);
        return 0;
  }