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 >