I'm trying to patch mutt so that I can see each message's labels. The
gmail imap extension I want to use is described here:

http://code.google.com/apis/gmail/imap/#x-gm-labels

It seems like it would be easiest to just put the labels in the x-label
field. I started digging into the mutt code to implement this and
encountered some issues. The patch I've included does make the labels
appear in the message index if I include %y in the index_format setting,
but some seem to be encoded. I tried to figure out if I need to use
rfc2047_decode or something, but I haven't gotten anything to work so
far. Worse still, it segfaults when changing from the inbox to some (not
all) other imap folders.

Can anyone give me some suggestions? Am I going about this the
completely wrong way?
diff -udprP mutt-1.5.21/imap/message.c mutt-1.5.21-patched/imap/message.c
--- mutt-1.5.21/imap/message.c  2010-08-24 09:34:21.000000000 -0700
+++ mutt-1.5.21-patched/imap/message.c  2012-01-29 00:05:29.000000000 -0700
@@ -242,7 +242,7 @@ int imap_read_headers (IMAP_DATA* idata,
       char *cmd;
 
       fetchlast = msgend + 1;
-      safe_asprintf (&cmd, "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE 
%s)",
+      safe_asprintf (&cmd, "FETCH %d:%d (UID FLAGS INTERNALDATE RFC822.SIZE 
X-GM-LABELS %s)",
                      msgno + 1, fetchlast, hdrreq);
       imap_cmd_start (idata, cmd);
       FREE (&cmd);
@@ -320,6 +320,7 @@ int imap_read_headers (IMAP_DATA* idata,
         0, 0);
       /* content built as a side-effect of mutt_read_rfc822_header */
       ctx->hdrs[idx]->content->length = h.content_length;
+      ctx->hdrs[idx]->env->x_label = h.data->labels;
       ctx->size += h.content_length;
 
 #if USE_HCACHE
@@ -1128,6 +1129,7 @@ static int msg_fetch_header (CONTEXT* ct
 static int msg_parse_fetch (IMAP_HEADER *h, char *s)
 {
   char tmp[SHORT_STRING];
+  char buffer[LONG_STRING];
   char *ptmp;
 
   if (!s)
@@ -1137,6 +1139,22 @@ static int msg_parse_fetch (IMAP_HEADER
   {
     SKIPWS (s);
 
+    if (ascii_strncasecmp ("X-GM-LABELS", s, 11) == 0)
+    {
+        s += 11;
+        SKIPWS (s);
+        ptmp = buffer;
+        s++; /* skip ( */
+        while (*s && *s != ')')
+            *ptmp++ = *s++;
+        if (*s != ')')
+            return -1;
+        s++; /* skip ) */
+        *ptmp = 0;
+        h->data->labels = buffer;
+        SKIPWS (s);
+    }
+
     if (ascii_strncasecmp ("FLAGS", s, 5) == 0)
     {
       if ((s = msg_parse_flags (h, s)) == NULL)
diff -udprP mutt-1.5.21/imap/message.h mutt-1.5.21-patched/imap/message.h
--- mutt-1.5.21/imap/message.h  2009-01-05 12:20:53.000000000 -0700
+++ mutt-1.5.21-patched/imap/message.h  2012-01-28 21:51:44.000000000 -0700
@@ -37,6 +37,8 @@ typedef struct imap_header_data
   unsigned int parsed : 1;
 
   unsigned int uid;    /* 32-bit Message UID */
+  char *labels;
+
   LIST *keywords;
 } IMAP_HEADER_DATA;
 

Reply via email to