Re: [RFC PATCH 5/5] show: Simplify new text formatter code
authorDmitry Kurochkin <dmitry.kurochkin@gmail.com>
Tue, 24 Jan 2012 01:49:52 +0000 (05:49 +0400)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:43:06 +0000 (09:43 -0800)
bc/fd56549f891cfd0dfc9def64db1a1dae949c7d [new file with mode: 0644]

diff --git a/bc/fd56549f891cfd0dfc9def64db1a1dae949c7d b/bc/fd56549f891cfd0dfc9def64db1a1dae949c7d
new file mode 100644 (file)
index 0000000..bc9c631
--- /dev/null
@@ -0,0 +1,383 @@
+Return-Path: <dmitry.kurochkin@gmail.com>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id B36E1429E54\r
+       for <notmuch@notmuchmail.org>; Mon, 23 Jan 2012 17:51:00 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.799\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.799 tagged_above=-999 required=5\r
+       tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1,\r
+       FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id Gr+qhg5Y68Bz for <notmuch@notmuchmail.org>;\r
+       Mon, 23 Jan 2012 17:50:59 -0800 (PST)\r
+Received: from mail-bk0-f53.google.com (mail-bk0-f53.google.com\r
+       [209.85.214.53]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id 4DA2F429E21\r
+       for <notmuch@notmuchmail.org>; Mon, 23 Jan 2012 17:50:59 -0800 (PST)\r
+Received: by bkbzt19 with SMTP id zt19so1896327bkb.26\r
+       for <notmuch@notmuchmail.org>; Mon, 23 Jan 2012 17:50:58 -0800 (PST)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;\r
+       h=from:to:subject:in-reply-to:references:user-agent:date:message-id\r
+       :mime-version:content-type;\r
+       bh=5jWYBeucQbpa1RlAUVSLOpewmKI3iKEDiVT2MHb0onc=;\r
+       b=b7SAjdHeh0bZwnBTLEFaSl86EhZ0bArnRkzoO4wRCHCpWLB4m0F6XvT5TWTSPcbLBP\r
+       usjUjAHcK+xRvgtURHDU/eLdheIHExrSyUvdloEBqHq4kzoxjxifKxG9sshEyR61VV2O\r
+       8Oey3txhvCCwkBMOO6cCSiW9Kqj/yD7Jz7CWw=\r
+Received: by 10.204.153.15 with SMTP id i15mr4054374bkw.43.1327369857902;\r
+       Mon, 23 Jan 2012 17:50:57 -0800 (PST)\r
+Received: from localhost ([91.144.186.21])\r
+       by mx.google.com with ESMTPS id ez5sm22032505bkc.15.2012.01.23.17.50.56\r
+       (version=TLSv1/SSLv3 cipher=OTHER);\r
+       Mon, 23 Jan 2012 17:50:57 -0800 (PST)\r
+From: Dmitry Kurochkin <dmitry.kurochkin@gmail.com>\r
+To: Austin Clements <amdragon@MIT.EDU>, notmuch@notmuchmail.org\r
+Subject: Re: [RFC PATCH 5/5] show: Simplify new text formatter code\r
+In-Reply-To: <1326332973-30225-6-git-send-email-amdragon@mit.edu>\r
+References: <1326332973-30225-1-git-send-email-amdragon@mit.edu>\r
+       <1326332973-30225-6-git-send-email-amdragon@mit.edu>\r
+User-Agent: Notmuch/0.11+100~gd650abf (http://notmuchmail.org) Emacs/23.3.1\r
+       (x86_64-pc-linux-gnu)\r
+Date: Tue, 24 Jan 2012 05:49:52 +0400\r
+Message-ID: <87lioxna2n.fsf@gmail.com>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain; charset=us-ascii\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Tue, 24 Jan 2012 01:51:00 -0000\r
+\r
+On Wed, 11 Jan 2012 20:49:33 -0500, Austin Clements <amdragon@MIT.EDU> wrote:\r
+> This makes the text formatter take advantage of the new code\r
+> structure.  The previously duplicated header logic is now unified,\r
+> several things that we used to compute repeatedly across different\r
+> callbacks are now computed once, and the code is generally simplified.\r
+> \r
+> Unifying the header logic causes this to format some dates slightly\r
+> differently, so the two affected test cases are updated.\r
+\r
+Thanks for these patches, Austin.  They are a definite improvement for\r
+notmuch show code.  I hope it would soon get pushed to master.  And I\r
+hope more patches would follow :)\r
+\r
+Few minor comments below.\r
+\r
+> ---\r
+>  notmuch-show.c     |   84 ++++++++++++----------------------------------------\r
+>  test/crypto        |    2 +-\r
+>  test/thread-naming |   16 +++++-----\r
+>  3 files changed, 28 insertions(+), 74 deletions(-)\r
+> \r
+> diff --git a/notmuch-show.c b/notmuch-show.c\r
+> index 3241965..1689222 100644\r
+> --- a/notmuch-show.c\r
+> +++ b/notmuch-show.c\r
+> @@ -175,67 +175,42 @@ format_part_text (const void *ctx, mime_node_t *node,\r
+>      GMimeObject *meta = node->envelope_part ?\r
+>      GMIME_OBJECT (node->envelope_part) : node->part;\r
+>      GMimeContentType *content_type = g_mime_object_get_content_type (meta);\r
+> +    GMimeContentDisposition *disposition =\r
+> +    g_mime_object_get_content_disposition (meta);\r
+> +    notmuch_bool_t attachment = disposition &&\r
+> +    strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0;\r
+\r
+If I did not miss anything, attachment is used only as following:\r
+\r
+  attachment ? "attachment" : "part"\r
+\r
+Please make it const char[] and set to "attachment" or "part".\r
+\r
+> +    notmuch_bool_t leaf = GMIME_IS_PART (node->part);\r
+\r
+Please add const where possible to local variables (e.g. attachment, leaf).\r
+\r
+>      int i;\r
+>  \r
+>      if (node->envelope_file) {\r
+>      notmuch_message_t *message = node->envelope_file;\r
+> -    const char *headers[] = {\r
+> -        "Subject", "From", "To", "Cc", "Bcc", "Date"\r
+> -    };\r
+> -    const char *name, *value;\r
+> -    unsigned int i;\r
+>  \r
+> -    printf ("\fmessage{ ");\r
+> -    printf ("id:%s depth:%d match:%d filename:%s\n",\r
+> +    printf ("\fmessage{ id:%s depth:%d match:%d filename:%s\n",\r
+>              notmuch_message_get_message_id (message),\r
+>              indent,\r
+>              notmuch_message_get_flag (message, NOTMUCH_MESSAGE_FLAG_MATCH),\r
+>              notmuch_message_get_filename (message));\r
+> -\r
+> -    printf ("\fheader{\n");\r
+> -\r
+> -    printf ("%s\n", _get_one_line_summary (ctx, message));\r
+> -\r
+> -    for (i = 0; i < ARRAY_SIZE (headers); i++) {\r
+> -        name = headers[i];\r
+> -        value = notmuch_message_get_header (message, name);\r
+> -        if (value && strlen (value))\r
+> -            printf ("%s: %s\n", name, value);\r
+> -    }\r
+> -    printf ("\fheader}\n");\r
+\r
+Yay!  Only one header-printing code left :)\r
+\r
+>      } else {\r
+> -    GMimeContentDisposition *disposition = g_mime_object_get_content_disposition (meta);\r
+>      const char *cid = g_mime_object_get_content_id (meta);\r
+> +    const char *filename = leaf ?\r
+> +        g_mime_part_get_filename (GMIME_PART (node->part)) : NULL;\r
+>  \r
+> -    if (disposition &&\r
+> -        strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
+> -    {\r
+> -        printf ("\fattachment{ ID: %d", node->part_num);\r
+> -\r
+> -    } else {\r
+> -\r
+> -        printf ("\fpart{ ID: %d", node->part_num);\r
+> -    }\r
+> -\r
+> -    if (GMIME_IS_PART (node->part))\r
+> -    {\r
+> -        const char *filename = g_mime_part_get_filename (GMIME_PART (node->part));\r
+> -        if (filename)\r
+> -            printf (", Filename: %s", filename);\r
+> -    }\r
+> -\r
+> +    printf ("\f%s{ ID: %d", attachment ? "attachment" : "part", node->part_num);\r
+> +    if (filename)\r
+\r
+I always forget about it, can we declare variables inside if condition\r
+like in C++?  I.e.:\r
+\r
+  if (const char *filename = leaf ? g_mime_part_get_filename (GMIME_PART (node->part)) : NULL)\r
+\r
+If yes, I would prefer to use this style where possible.\r
+\r
+> +        printf (", Filename: %s", filename);\r
+>      if (cid)\r
+>          printf (", Content-id: %s", cid);\r
+> -\r
+\r
+I would revert blank line changes.  But I do not insist :)\r
+\r
+>      printf (", Content-type: %s\n", g_mime_content_type_to_string (content_type));\r
+>      }\r
+>  \r
+> -    if (node->envelope_part) {\r
+> +    if (GMIME_IS_MESSAGE (node->part)) {\r
+\r
+This condition is repeated at least twice.  Please consider moving the\r
+message variable below to the top level and using it in the conditions.\r
+\r
+Regards,\r
+  Dmitry\r
+\r
+>      GMimeMessage *message = GMIME_MESSAGE (node->part);\r
+>      InternetAddressList *recipients;\r
+>      const char *recipients_string;\r
+>  \r
+>      printf ("\fheader{\n");\r
+> +    if (node->envelope_file)\r
+> +        printf ("%s\n", _get_one_line_summary (ctx, node->envelope_file));\r
+>      printf ("Subject: %s\n", g_mime_message_get_subject (message));\r
+>      printf ("From: %s\n", g_mime_message_get_sender (message));\r
+>      recipients = g_mime_message_get_recipients (message, GMIME_RECIPIENT_TYPE_TO);\r
+> @@ -248,9 +223,11 @@ format_part_text (const void *ctx, mime_node_t *node,\r
+>          printf ("Cc: %s\n", recipients_string);\r
+>      printf ("Date: %s\n", g_mime_message_get_date_as_string (message));\r
+>      printf ("\fheader}\n");\r
+> +\r
+> +    printf ("\fbody{\n");\r
+>      }\r
+>  \r
+> -    if (!node->envelope_file) {\r
+> +    if (leaf) {\r
+>      if (g_mime_content_type_is_type (content_type, "text", "*") &&\r
+>          !g_mime_content_type_is_type (content_type, "text", "html"))\r
+>      {\r
+> @@ -258,24 +235,12 @@ format_part_text (const void *ctx, mime_node_t *node,\r
+>          g_mime_stream_file_set_owner (GMIME_STREAM_FILE (stream_stdout), FALSE);\r
+>          show_text_part_content (node->part, stream_stdout);\r
+>          g_object_unref(stream_stdout);\r
+> -    }\r
+> -    else if (g_mime_content_type_is_type (content_type, "multipart", "*") ||\r
+> -             g_mime_content_type_is_type (content_type, "message", "rfc822"))\r
+> -    {\r
+> -        /* Do nothing for multipart since its content will be printed\r
+> -         * when recursing. */\r
+> -    }\r
+> -    else\r
+> -    {\r
+> +    } else {\r
+>          printf ("Non-text part: %s\n",\r
+>                  g_mime_content_type_to_string (content_type));\r
+>      }\r
+>      }\r
+>  \r
+> -    if (GMIME_IS_MESSAGE (node->part)) {\r
+> -    printf ("\fbody{\n");\r
+> -    }\r
+> -\r
+>      for (i = 0; i < node->nchildren; i++)\r
+>      format_part_text (ctx, mime_node_child (node, i), indent, params);\r
+>  \r
+> @@ -286,18 +251,7 @@ format_part_text (const void *ctx, mime_node_t *node,\r
+>      if (node->envelope_file) {\r
+>      printf ("\fmessage}\n");\r
+>      } else {\r
+> -    GMimeContentDisposition *disposition;\r
+> -\r
+> -    disposition = g_mime_object_get_content_disposition (meta);\r
+> -    if (disposition &&\r
+> -        strcmp (disposition->disposition, GMIME_DISPOSITION_ATTACHMENT) == 0)\r
+> -    {\r
+> -        printf ("\fattachment}\n");\r
+> -    }\r
+> -    else\r
+> -    {\r
+> -        printf ("\fpart}\n");\r
+> -    }\r
+> +    printf ("\f%s}\n", attachment ? "attachment" : "part");\r
+>      }\r
+>  }\r
+>  \r
+> diff --git a/test/crypto b/test/crypto\r
+> index 0af4aa8..6723ef8 100755\r
+> --- a/test/crypto\r
+> +++ b/test/crypto\r
+> @@ -157,7 +157,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2000-01-01) (encrypted inbox)\r
+>  Subject: test encrypted message 001\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: test_suite@notmuchmail.org\r
+> -Date: 01 Jan 2000 12:00:00 -0000\r
+> +Date: Sat, 01 Jan 2000 12:00:00 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: multipart/encrypted\r
+> diff --git a/test/thread-naming b/test/thread-naming\r
+> index 41b97d9..b7c96f2 100755\r
+> --- a/test/thread-naming\r
+> +++ b/test/thread-naming\r
+> @@ -71,7 +71,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-05) (unread)\r
+>  Subject: thread-naming: Initial thread subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Fri, 05 Jan 2001 15:43:56 -0000\r
+> +Date: Fri, 05 Jan 2001 15:43:56 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> @@ -85,7 +85,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-06) (inbox unread)\r
+>  Subject: thread-naming: Older changed subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Sat, 06 Jan 2001 15:43:56 -0000\r
+> +Date: Sat, 06 Jan 2001 15:43:56 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> @@ -99,7 +99,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-07) (inbox unread)\r
+>  Subject: thread-naming: Newer changed subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Sun, 07 Jan 2001 15:43:56 -0000\r
+> +Date: Sun, 07 Jan 2001 15:43:56 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> @@ -113,7 +113,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-08) (unread)\r
+>  Subject: thread-naming: Final thread subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Mon, 08 Jan 2001 15:43:56 -0000\r
+> +Date: Mon, 08 Jan 2001 15:43:56 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> @@ -127,7 +127,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-09) (inbox unread)\r
+>  Subject: Re: thread-naming: Initial thread subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Tue, 09 Jan 2001 15:43:45 -0000\r
+> +Date: Tue, 09 Jan 2001 15:43:45 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> @@ -141,7 +141,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-10) (inbox unread)\r
+>  Subject: Aw: thread-naming: Initial thread subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Wed, 10 Jan 2001 15:43:45 -0000\r
+> +Date: Wed, 10 Jan 2001 15:43:45 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> @@ -155,7 +155,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-11) (inbox unread)\r
+>  Subject: Vs: thread-naming: Initial thread subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Thu, 11 Jan 2001 15:43:45 -0000\r
+> +Date: Thu, 11 Jan 2001 15:43:45 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> @@ -169,7 +169,7 @@ Notmuch Test Suite <test_suite@notmuchmail.org> (2001-01-12) (inbox unread)\r
+>  Subject: Sv: thread-naming: Initial thread subject\r
+>  From: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+>  To: Notmuch Test Suite <test_suite@notmuchmail.org>\r
+> -Date: Fri, 12 Jan 2001 15:43:45 -0000\r
+> +Date: Fri, 12 Jan 2001 15:43:45 +0000\r
+>  \f\r
+header}\r
+>  \f\r
+body{\r
+>  \f\r
+part{ ID: 1, Content-type: text/plain\r
+> -- \r
+> 1.7.7.3\r
+> \r
+> _______________________________________________\r
+> notmuch mailing list\r
+> notmuch@notmuchmail.org\r
+> http://notmuchmail.org/mailman/listinfo/notmuch\r