[PATCH] implement search --format=sanitized_text + emacs UI to use it

Austin Clements amdragon at mit.edu
Fri May 6 16:55:26 PDT 2011


Perhaps text summary output should *always* do this.  The text summary
format is meant half for user consumption and half for emacs
consumption and allowing newlines that don't indicate the end of a
summary line seems bad for *both* use cases.

On Fri, May 6, 2011 at 7:17 PM, Florian Friesdorf <flo at chaoflow.net> wrote:
> Sanitize "Subject:" and "Author:" fields to not contain control
> characters for sanitized_text format.
>
> When a Subject field contains encoded CRLF sequences, these sequences
> would appear unfiltered in the output of notmuch search. This confused
> the notmuch emacs interface leading to "Unexpected Output"
> messages. This is now fixed by replacing all characters with ASCII
> code less than 32 with a question mark for the sanitized_text
> format. The emacs UI uses this format.
>
> Thank you to Andreas Amann <a.amann at ucc.ie>, who wrote the initial
> patch, I just turned it into a new format.
>
> missing:
> - man page update
> - test, (works for me)
> - investigate initialization warning:
> CC -O2 notmuch-search.o
> notmuch-search.c:98:1: warning: missing initializer
> notmuch-search.c:98:1: warning: (near initialization for
> 'format_sanitized_text.results_null')
> ---
>  emacs/notmuch.el |    3 +-
>  notmuch-search.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 60 insertions(+), 1 deletions(-)
>
> diff --git a/emacs/notmuch.el b/emacs/notmuch.el
> index 1d683f8..9d7c212 100644
> --- a/emacs/notmuch.el
> +++ b/emacs/notmuch.el
> @@ -879,7 +879,8 @@ The optional parameters are used as follows:
>                     (if oldest-first
>                         "--sort=oldest-first"
>                       "--sort=newest-first")
> -                    query)))
> +                     "--format=sanitized_text"
> +                     query)))
>          (set-process-sentinel proc 'notmuch-search-process-sentinel)
>          (set-process-filter proc 'notmuch-search-process-filter))))
>     (run-hooks 'notmuch-search-hook)))
> diff --git a/notmuch-search.c b/notmuch-search.c
> index 5e39511..d59dc44 100644
> --- a/notmuch-search.c
> +++ b/notmuch-search.c
> @@ -78,6 +78,26 @@ static const search_format_t format_text = {
>  };
>
>  static void
> +format_thread_sanitized_text (const void *ctx,
> +                             const char *thread_id,
> +                             const time_t date,
> +                             const int matched,
> +                             const int total,
> +                             const char *authors,
> +                             const char *subject);
> +static const search_format_t format_sanitized_text = {
> +    "",
> +       "",
> +           format_item_id_text,
> +           format_thread_sanitized_text,
> +           " (",
> +               "%s", " ",
> +           ")", "\n",
> +       "",
> +    "",
> +};
> +
> +static void
>  format_item_id_json (const void *ctx,
>                     const char *item_type,
>                     const char *item_id);
> @@ -129,6 +149,42 @@ format_thread_text (const void *ctx,
>            subject);
>  }
>
> +static char *
> +sanitize_string(const void *ctx, const char *str)
> +{
> +    char *out, *loop;
> +
> +    loop = out = talloc_strdup (ctx, str);
> +
> +    for(;*loop;loop++){
> +       if ((unsigned char)(*loop) < 32)
> +           *loop = '?';
> +    }
> +    return out;
> +}
> +
> +static void
> +format_thread_sanitized_text (const void *ctx,
> +                             const char *thread_id,
> +                             const time_t date,
> +                             const int matched,
> +                             const int total,
> +                             const char *authors,
> +                             const char *subject)
> +{
> +    void *ctx_quote = talloc_new (ctx);
> +
> +    printf ("thread:%s %12s [%d/%d] %s; %s",
> +           thread_id,
> +           notmuch_time_relative_date (ctx, date),
> +           matched,
> +           total,
> +           sanitize_string(ctx_quote, authors),
> +           sanitize_string(ctx_quote, subject));
> +
> +    talloc_free (ctx_quote);
> +}
> +
>  static void
>  format_item_id_json (const void *ctx,
>                     unused (const char *item_type),
> @@ -378,6 +434,8 @@ notmuch_search_command (void *ctx, int argc, char *argv[])
>            opt = argv[i] + sizeof ("--format=") - 1;
>            if (strcmp (opt, "text") == 0) {
>                format = &format_text;
> +           } else if (strcmp (opt, "sanitized_text") == 0) {
> +               format = &format_sanitized_text;
>            } else if (strcmp (opt, "json") == 0) {
>                format = &format_json;
>            } else {
> --
> 1.7.5.1
>
> _______________________________________________
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
>


More information about the notmuch mailing list