On Thu, Oct 30 2014, Jani Nikula wrote: > Print the message IDs of all messages matching the search terms that > have at least N files associated with them. Briefly tested as working. I commend this patch to the masters of push. Thanks Jani! > --- > doc/man1/notmuch-search.rst | 12 ++++++++---- > notmuch-search.c | 34 ++++++++++++++++++++++++++++++---- > 2 files changed, 38 insertions(+), 8 deletions(-) > > diff --git a/doc/man1/notmuch-search.rst b/doc/man1/notmuch-search.rst > index 90160f21e23c..aeba4bf604f6 100644 > --- a/doc/man1/notmuch-search.rst > +++ b/doc/man1/notmuch-search.rst > @@ -122,10 +122,14 @@ Supported options for **search** include > rather than the number of matching messages. > > ``--duplicate=N`` > - Effective with ``--output=files``, output the Nth filename > - associated with each message matching the query (N is 1-based). > - If N is greater than the number of files associated with the > - message, don't print anything. > + For ``--output=files``, output the Nth filename associated > + with each message matching the query (N is 1-based). If N is > + greater than the number of files associated with the message, > + don't print anything. > + > + For ``--output=messages``, only output message IDs of messages > + matching the search terms that have at least N filenames > + associated with them. > > Note that this option is orthogonal with the **folder:** search > prefix. The prefix matches messages based on filenames. This > diff --git a/notmuch-search.c b/notmuch-search.c > index bc9be4593ecc..2bf876fd5abf 100644 > --- a/notmuch-search.c > +++ b/notmuch-search.c > @@ -215,6 +215,24 @@ do_search_threads (sprinter_t *format, > } > > static int > +_count_filenames (notmuch_message_t *message) > +{ > + notmuch_filenames_t *filenames; > + int i = 0; > + > + filenames = notmuch_message_get_filenames (message); > + > + while (notmuch_filenames_valid (filenames)) { > + notmuch_filenames_move_to_next (filenames); > + i++; > + } > + > + notmuch_filenames_destroy (filenames); > + > + return i; > +} > + > +static int > do_search_messages (sprinter_t *format, > notmuch_query_t *query, > output_t output, > @@ -265,10 +283,13 @@ do_search_messages (sprinter_t *format, > notmuch_filenames_destroy( filenames ); > > } else { /* output == OUTPUT_MESSAGES */ > - format->set_prefix (format, "id"); > - format->string (format, > - notmuch_message_get_message_id (message)); > - format->separator (format); > + /* special case 1 for speed */ > + if (dupe <= 1 || dupe <= _count_filenames (message)) { > + format->set_prefix (format, "id"); > + format->string (format, > + notmuch_message_get_message_id (message)); > + format->separator (format); > + } > } > > notmuch_message_destroy (message); > @@ -387,6 +408,11 @@ notmuch_search_command (notmuch_config_t *config, int argc, char *argv[]) > if (opt_index < 0) > return EXIT_FAILURE; > > + if (output != OUTPUT_FILES && output != OUTPUT_MESSAGES && dupe != -1) { > + fprintf (stderr, "Error: --duplicate=N is only supported with --output=files and --output=messages.\n"); > + return EXIT_FAILURE; > + } > + > switch (format_sel) { > case NOTMUCH_FORMAT_TEXT: > format = sprinter_text_create (config, stdout); > -- > 2.1.1