[PATCH] cli: add options --offset and --limit to notmuch show

2022-10-11 Thread Robin Jarry
notmuch search does not output header values. However, when browsing
through a large email corpus, it can be time saving to be able to
paginate without running notmuch show for each message/thread.

Add --offset and --limit options to notmuch show. This is inspired from
commit 796b629c3b82 ("cli: add options --offset and --limit to notmuch
search").

Update man page, shell completion and add a test case to ensure it works
as expected.

Cc: Tim Culverhouse 
Signed-off-by: Robin Jarry 
---
 completion/notmuch-completion.bash |  2 +-
 completion/zsh/_notmuch|  2 +
 doc/man1/notmuch-show.rst  |  9 
 notmuch-client.h   |  2 +
 notmuch-show.c | 49 +++---
 test/T131-show-limiting.sh | 81 ++
 6 files changed, 138 insertions(+), 7 deletions(-)
 create mode 100755 test/T131-show-limiting.sh

diff --git a/completion/notmuch-completion.bash 
b/completion/notmuch-completion.bash
index 0022b54bff5d..3748846edf83 100644
--- a/completion/notmuch-completion.bash
+++ b/completion/notmuch-completion.bash
@@ -530,7 +530,7 @@ _notmuch_show()
 ! $split &&
 case "${cur}" in
-*)
-   local options="--entire-thread= --format= --exclude= --body= 
--format-version= --part= --verify --decrypt= --include-html 
${_notmuch_shared_options}"
+   local options="--entire-thread= --format= --exclude= --body= 
--format-version= --part= --verify --decrypt= --include-html --limit= --offset= 
${_notmuch_shared_options}"
compopt -o nospace
COMPREPLY=( $(compgen -W "$options" -- ${cur}) )
;;
diff --git a/completion/zsh/_notmuch b/completion/zsh/_notmuch
index e207d90b7202..0bdd7f772a7a 100644
--- a/completion/zsh/_notmuch
+++ b/completion/zsh/_notmuch
@@ -245,6 +245,8 @@ _notmuch_show() {
 '--exclude=[respect excluded tags setting]:exclude tags:(true false)' \
 '--body=[output body]:output body content:(true false)' \
 '--include-html[include text/html parts in the output]' \
+'--limit=[limit the number of displayed results]:limit: ' \
+'--offset=[skip displaying the first N results]:offset: ' \
 '*::search term:_notmuch_search_term'
 }
 
diff --git a/doc/man1/notmuch-show.rst b/doc/man1/notmuch-show.rst
index 2c0a0de6ad16..c13d94de0244 100644
--- a/doc/man1/notmuch-show.rst
+++ b/doc/man1/notmuch-show.rst
@@ -130,6 +130,15 @@ Supported options for **show** include
By default, results will be displayed in reverse chronological
order, (that is, the newest results will be displayed first).
 
+.. option:: --offset=[-]N
+
+   Skip displaying the first N results. With the leading '-', start
+   at the Nth result from the end.
+
+.. option:: --limit=N
+
+   Limit the number of displayed results to N.
+
 .. option:: --verify
 
Compute and report the validity of any MIME cryptographic
diff --git a/notmuch-client.h b/notmuch-client.h
index 21b49908ae24..1a87240d3c21 100644
--- a/notmuch-client.h
+++ b/notmuch-client.h
@@ -77,6 +77,8 @@ typedef struct notmuch_show_params {
 bool output_body;
 int duplicate;
 int part;
+int offset;
+int limit;
 _notmuch_crypto_t crypto;
 bool include_html;
 GMimeStream *out_stream;
diff --git a/notmuch-show.c b/notmuch-show.c
index ee9efa7448d7..ad31e0123268 100644
--- a/notmuch-show.c
+++ b/notmuch-show.c
@@ -1159,6 +1159,18 @@ do_show_threaded (void *ctx,
 notmuch_thread_t *thread;
 notmuch_messages_t *messages;
 notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS;
+int i;
+
+if (params->offset < 0) {
+   unsigned count;
+   notmuch_status_t s = notmuch_query_count_threads (query, &count);
+   if (print_status_query ("notmuch search", query, s))
+   return 1;
+
+   params->offset += count;
+   if (params->offset < 0)
+   params->offset = 0;
+}
 
 status = notmuch_query_search_threads (query, &threads);
 if (print_status_query ("notmuch show", query, status))
@@ -1166,11 +1178,16 @@ do_show_threaded (void *ctx,
 
 sp->begin_list (sp);
 
-for (;
-notmuch_threads_valid (threads);
-notmuch_threads_move_to_next (threads)) {
+for (i = 0;
+notmuch_threads_valid (threads) && (params->limit < 0 || i < 
params->offset + params->limit);
+notmuch_threads_move_to_next (threads), i++) {
thread = notmuch_threads_get (threads);
 
+   if (i < params->offset) {
+   notmuch_thread_destroy (thread);
+   continue;
+   }
+
messages = notmuch_thread_get_toplevel_messages (thread);
 
if (messages == NULL)
@@ -1201,6 +1218,18 @@ do_show_unthreaded (void *ctx,
 notmuch_message_t *message;
 notmuch_status_t status, res = NOTMUCH_STATUS_SUCCESS;
 notmuch_bool_t excluded;
+int i;
+
+if (params->offset < 0) {
+   unsigned count;
+   notmuch_status_t s = notmuch_query_count_messages (query, &count);
+   if (print_status_quer

Re: [PATCH] cli: add options --offset and --limit to notmuch show

2022-10-11 Thread Robin Jarry
Robin Jarry, Oct 12, 2022 at 00:19:
> + if (print_status_query ("notmuch search", query, s))

I just realized that I copy pasted code from notmuch-search.c and did
not updated everything on the way...

I'll hold before sending a v2 if there are other remarks or changes
required.

Cheers all.
___
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org


Re: [PATCH] nmweb: Fix spacing around punctuation in headers

2022-10-11 Thread Jakub Wilk

* David Bremner , 2022-10-11 08:20:

This is completely untested, but hey, what could possibly go wrong?


I've yolo-ed this into production on nmbug.notmuchmail.org. Maybe you 
can poke at it and see if it looks like you expect.


Looks good. Thanks!

--
Jakub Wilk
___
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org


Re: Selection bug

2022-10-11 Thread David Bremner
Justus Winter  writes:

> there is a bug in notmuch emacs that is mildly annoying.  Sometimes when
> I refresh my search buffer, and there are new mails, the topmost
> (i.e. newest) message seems to be selected (i.e. with green background),
> but in fact if i hit enter (or do any other state changing action like
> tagging), notmuch emacs acts on the previously selected message.  There
> is a visual clue to that, the block cursor is still on that previously
> selected message.
>
> Still, I think it is a bug, and because the green background dominates
> the block cursor, I run into this all the time.

Hi Justus;

That should be hl-line-mode, not sure why it's not tracking your
cursor. Can you duplicate the issue in emacs -q? Also, what version of
emacs is this?

d
___
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org


Selection bug

2022-10-11 Thread Justus Winter
Moin,

there is a bug in notmuch emacs that is mildly annoying.  Sometimes when
I refresh my search buffer, and there are new mails, the topmost
(i.e. newest) message seems to be selected (i.e. with green background),
but in fact if i hit enter (or do any other state changing action like
tagging), notmuch emacs acts on the previously selected message.  There
is a visual clue to that, the block cursor is still on that previously
selected message.

Still, I think it is a bug, and because the green background dominates
the block cursor, I run into this all the time.

I'll attach a screenshot that shows the bug.

This is notmuch straight from Debian bookworm.

ii  elpa-notmuch   0.37-1   all  thread-based email index, search 
and tagging (emacs interface)
ii  notmuch0.37-1   amd64thread-based email index, search 
and tagging

Best,
Justus


signature.asc
Description: PGP signature
___
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org


Bug#1021578: notmuch --config='' setup: "g_rename() failed: No such file or directory"

2022-10-11 Thread Jakub Wilk

Package: notmuch
Version: 0.37-1
Severity: minor

I did this by accident[*]:

   $ notmuch --config='' setup
   Welcome to notmuch!
   [...]
   Your full name [Jakub Wilk]:
   Your primary email address [jwilk@localhost]:
   Additional email address [Press 'Enter' if none]:
   Top-level directory of your email archive [/tmp/tmp.GKlsDiiCm1]:
   Tags to apply to all new messages (separated by spaces) [ unread inbox]:
   Tags to exclude when searching messages (separated by spaces) []:
   Error saving configuration to : Failed to rename file “.IRITT1” to “”: 
g_rename() failed: No such file or directory

Can we have a more helpful error message?
Maybe:

   "notmuch --config='' setup" does not make sense, you fool.

Or:

   --config='' is not supported for "notmuch setup".


[*] I had no idea what I was doing. What I really wanted was probably 
"notmuch --config='' new".



-- System Information:
Architecture: i386

Versions of packages notmuch depends on:
ii  libnotmuch5 0.37-1
ii  libc6   2.35-3
ii  libglib2.0-02.74.0-2
ii  libgmime-3.0-0  3.2.13+dfsg-2
ii  libtalloc2  2.3.4-1
ii  zlib1g  1:1.2.11.dfsg-4.1

--
Jakub Wilk

___
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org


Re: [PATCH] nmweb: Fix spacing around punctuation in headers

2022-10-11 Thread David Bremner
Jakub Wilk  writes:

> ---
>  devel/notmuch-web/nmweb.py| 2 +-
>  devel/notmuch-web/templates/show.html | 4 ++--
>  2 files changed, 3 insertions(+), 3 deletions(-)
>
> This is completely untested, but hey, what could possibly go wrong?
>

I've yolo-ed this into production on nmbug.notmuchmail.org. Maybe you
can poke at it and see if it looks like you expect.

d
___
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org


[PATCH] nmweb: Fix spacing around punctuation in headers

2022-10-11 Thread Jakub Wilk
---
 devel/notmuch-web/nmweb.py| 2 +-
 devel/notmuch-web/templates/show.html | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

This is completely untested, but hey, what could possibly go wrong?

diff --git a/devel/notmuch-web/nmweb.py b/devel/notmuch-web/nmweb.py
index 7b555c62..b0d4d5cd 100755
--- a/devel/notmuch-web/nmweb.py
+++ b/devel/notmuch-web/nmweb.py
@@ -125,7 +125,7 @@ def mailto_addrs(msg,header_name):
 return ''
 
   frm = email.utils.getaddresses([hdr])
-  return ','.join(['mailto:%s";>%s ' % ((l, p) if p else (l, l)) 
for (p, l) in frm])
+  return ', '.join(['mailto:%s";>%s' % ((l, p) if p else (l, l)) 
for (p, l) in frm])
 env.globals['mailto_addrs'] = mailto_addrs
 
 def link_msg(msg):
diff --git a/devel/notmuch-web/templates/show.html 
b/devel/notmuch-web/templates/show.html
index 98d36acc..690f5464 100644
--- a/devel/notmuch-web/templates/show.html
+++ b/devel/notmuch-web/templates/show.html
@@ -3,10 +3,10 @@
 {% set headers = ['Subject', 'Date'] %}
 {% set addr_headers = ['To', 'Cc', 'From'] %}
 {% for header in headers: %}
-{{header}}:{{m.header(header)|e}}
+{{header}}: {{m.header(header)|e}}
 {% endfor %}
 {% for header in addr_headers: %}
-{{header}}:{{mailto_addrs(m,header)|safe}}
+{{header}}: {{mailto_addrs(m,header)|safe}}
 {% endfor %}
 
 {% for part in format_message(m,mid): %}{{ part|safe }}{% endfor %}
-- 
2.37.2

___
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-le...@notmuchmail.org