mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
CLI/{count, dump, reindex, reply, show}: enable sexp queries
The change in each case is to call notmuch_query_create_with_syntax, relying on the already inherited shared options. As a bonus we get improved error handling from the new query creation API. The remaining subcommand is 'tag', which is a bit trickier.
This commit is contained in:
parent
a2e7af5b69
commit
2944d59133
10 changed files with 123 additions and 24 deletions
|
@ -74,10 +74,12 @@ print_count (notmuch_database_t *notmuch, const char *query_str,
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
notmuch_status_t status;
|
notmuch_status_t status;
|
||||||
|
|
||||||
query = notmuch_query_create (notmuch, query_str);
|
status = notmuch_query_create_with_syntax (notmuch, query_str,
|
||||||
if (query == NULL) {
|
shared_option_query_syntax (),
|
||||||
fprintf (stderr, "Out of memory\n");
|
&query);
|
||||||
return -1;
|
if (print_status_database ("notmuch count", notmuch, status)) {
|
||||||
|
ret = -1;
|
||||||
|
goto DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (notmuch_config_values_start (exclude_tags);
|
for (notmuch_config_values_start (exclude_tags);
|
||||||
|
|
|
@ -232,11 +232,12 @@ database_dump_file (notmuch_database_t *notmuch, gzFile output,
|
||||||
if (! query_str)
|
if (! query_str)
|
||||||
query_str = "";
|
query_str = "";
|
||||||
|
|
||||||
query = notmuch_query_create (notmuch, query_str);
|
status = notmuch_query_create_with_syntax (notmuch, query_str,
|
||||||
if (query == NULL) {
|
shared_option_query_syntax (),
|
||||||
fprintf (stderr, "Out of memory\n");
|
&query);
|
||||||
|
if (print_status_database ("notmuch dump", notmuch, status))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
|
||||||
/* Don't ask xapian to sort by Message-ID. Xapian optimizes returning the
|
/* Don't ask xapian to sort by Message-ID. Xapian optimizes returning the
|
||||||
* first results quickly at the expense of total time.
|
* first results quickly at the expense of total time.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -49,11 +49,11 @@ reindex_query (notmuch_database_t *notmuch, const char *query_string,
|
||||||
|
|
||||||
notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
|
notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
|
||||||
|
|
||||||
query = notmuch_query_create (notmuch, query_string);
|
status = notmuch_query_create_with_syntax (notmuch, query_string,
|
||||||
if (query == NULL) {
|
shared_option_query_syntax (),
|
||||||
fprintf (stderr, "Out of memory.\n");
|
&query);
|
||||||
|
if (print_status_database ("notmuch reindex", notmuch, status))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
|
||||||
|
|
||||||
/* reindexing is not interested in any special sort order */
|
/* reindexing is not interested in any special sort order */
|
||||||
notmuch_query_set_sort (query, NOTMUCH_SORT_UNSORTED);
|
notmuch_query_set_sort (query, NOTMUCH_SORT_UNSORTED);
|
||||||
|
|
|
@ -719,6 +719,7 @@ notmuch_reply_command (notmuch_database_t *notmuch, int argc, char *argv[])
|
||||||
};
|
};
|
||||||
int format = FORMAT_DEFAULT;
|
int format = FORMAT_DEFAULT;
|
||||||
int reply_all = true;
|
int reply_all = true;
|
||||||
|
notmuch_status_t status;
|
||||||
|
|
||||||
notmuch_opt_desc_t options[] = {
|
notmuch_opt_desc_t options[] = {
|
||||||
{ .opt_keyword = &format, .name = "format", .keywords =
|
{ .opt_keyword = &format, .name = "format", .keywords =
|
||||||
|
@ -761,11 +762,11 @@ notmuch_reply_command (notmuch_database_t *notmuch, int argc, char *argv[])
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
query = notmuch_query_create (notmuch, query_string);
|
status = notmuch_query_create_with_syntax (notmuch, query_string,
|
||||||
if (query == NULL) {
|
shared_option_query_syntax (),
|
||||||
fprintf (stderr, "Out of memory\n");
|
&query);
|
||||||
|
if (print_status_database ("notmuch reply", notmuch, status))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
|
||||||
|
|
||||||
if (do_reply (notmuch, query, ¶ms, format, reply_all) != 0)
|
if (do_reply (notmuch, query, ¶ms, format, reply_all) != 0)
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
|
|
|
@ -1364,11 +1364,11 @@ notmuch_show_command (notmuch_database_t *notmuch, int argc, char *argv[])
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
query = notmuch_query_create (notmuch, query_string);
|
status = notmuch_query_create_with_syntax (notmuch, query_string,
|
||||||
if (query == NULL) {
|
shared_option_query_syntax (),
|
||||||
fprintf (stderr, "Out of memory\n");
|
&query);
|
||||||
|
if (print_status_database ("notmuch show", notmuch, status))
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
|
||||||
|
|
||||||
notmuch_query_set_sort (query, sort);
|
notmuch_query_set_sort (query, sort);
|
||||||
|
|
||||||
|
|
|
@ -154,4 +154,28 @@ print("4: {} messages".format(query.count_messages()))
|
||||||
EOF
|
EOF
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
|
if [ $NOTMUCH_HAVE_SFSEXP -eq 1 ]; then
|
||||||
|
|
||||||
|
test_begin_subtest "and of exact terms (query=sexp)"
|
||||||
|
output=$(notmuch count --query=sexp '(and "wonderful" "wizard")')
|
||||||
|
test_expect_equal "$output" 1
|
||||||
|
|
||||||
|
test_begin_subtest "or of exact terms (query=sexp)"
|
||||||
|
output=$(notmuch count --query=sexp '(or "php" "wizard")')
|
||||||
|
test_expect_equal "$output" 2
|
||||||
|
|
||||||
|
test_begin_subtest "starts-with, case-insensitive (query=sexp)"
|
||||||
|
output=$(notmuch count --query=sexp '(starts-with FreeB)')
|
||||||
|
test_expect_equal "$output" 5
|
||||||
|
|
||||||
|
test_begin_subtest "query that matches no messages (query=sexp)"
|
||||||
|
count=$(notmuch count --query=sexp '(and (from keithp) (to keithp))')
|
||||||
|
test_expect_equal 0 "$count"
|
||||||
|
|
||||||
|
test_begin_subtest "Compound subquery (query=sexp)"
|
||||||
|
output=$(notmuch count --query=sexp '(thread (of (from keithp) (subject Maildir)))')
|
||||||
|
test_expect_equal "$output" 7
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
|
@ -2,15 +2,14 @@
|
||||||
test_description="\"notmuch reply\" in several variations"
|
test_description="\"notmuch reply\" in several variations"
|
||||||
. $(dirname "$0")/test-lib.sh || exit 1
|
. $(dirname "$0")/test-lib.sh || exit 1
|
||||||
|
|
||||||
test_begin_subtest "Basic reply"
|
|
||||||
add_message '[from]="Sender <sender@example.com>"' \
|
add_message '[from]="Sender <sender@example.com>"' \
|
||||||
[to]=test_suite@notmuchmail.org \
|
[to]=test_suite@notmuchmail.org \
|
||||||
[subject]=notmuch-reply-test \
|
[subject]=notmuch-reply-test \
|
||||||
'[date]="Tue, 05 Jan 2010 15:43:56 -0000"' \
|
'[date]="Tue, 05 Jan 2010 15:43:56 -0000"' \
|
||||||
'[body]="basic reply test"'
|
'[body]="basic reply test"'
|
||||||
|
|
||||||
output=$(notmuch reply id:${gen_msg_id} 2>&1 && echo OK)
|
cat <<EOF > basic.expected
|
||||||
test_expect_equal "$output" "From: Notmuch Test Suite <test_suite@notmuchmail.org>
|
From: Notmuch Test Suite <test_suite@notmuchmail.org>
|
||||||
Subject: Re: notmuch-reply-test
|
Subject: Re: notmuch-reply-test
|
||||||
To: Sender <sender@example.com>
|
To: Sender <sender@example.com>
|
||||||
In-Reply-To: <${gen_msg_id}>
|
In-Reply-To: <${gen_msg_id}>
|
||||||
|
@ -18,7 +17,19 @@ References: <${gen_msg_id}>
|
||||||
|
|
||||||
On Tue, 05 Jan 2010 15:43:56 -0000, Sender <sender@example.com> wrote:
|
On Tue, 05 Jan 2010 15:43:56 -0000, Sender <sender@example.com> wrote:
|
||||||
> basic reply test
|
> basic reply test
|
||||||
OK"
|
OK
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_begin_subtest "Basic reply"
|
||||||
|
notmuch reply id:${gen_msg_id} >OUTPUT 2>&1 && echo OK >> OUTPUT
|
||||||
|
test_expect_equal_file basic.expected OUTPUT
|
||||||
|
|
||||||
|
if [ $NOTMUCH_HAVE_SFSEXP -eq 1 ]; then
|
||||||
|
|
||||||
|
test_begin_subtest "Basic reply (query=sexp)"
|
||||||
|
notmuch reply --query=sexp "(id ${gen_msg_id})" >OUTPUT 2>&1 && echo OK >> OUTPUT
|
||||||
|
test_expect_equal_file basic.expected OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
test_begin_subtest "Multiple recipients"
|
test_begin_subtest "Multiple recipients"
|
||||||
add_message '[from]="Sender <sender@example.com>"' \
|
add_message '[from]="Sender <sender@example.com>"' \
|
||||||
|
|
|
@ -117,6 +117,19 @@ test_begin_subtest "dump -- from:cworth"
|
||||||
notmuch dump -- from:cworth > dump-dash-cworth.actual
|
notmuch dump -- from:cworth > dump-dash-cworth.actual
|
||||||
test_expect_equal_file dump-cworth.expected dump-dash-cworth.actual
|
test_expect_equal_file dump-cworth.expected dump-dash-cworth.actual
|
||||||
|
|
||||||
|
|
||||||
|
if [ $NOTMUCH_HAVE_SFSEXP -eq 1 ]; then
|
||||||
|
|
||||||
|
test_begin_subtest "dump --query=sexp -- '(from cworth)'"
|
||||||
|
notmuch dump --query=sexp -- '(from cworth)' > dump-dash-cworth.actual2
|
||||||
|
test_expect_equal_file_nonempty dump-cworth.expected dump-dash-cworth.actual2
|
||||||
|
|
||||||
|
test_begin_subtest "dump --query=sexp --output=outfile '(from cworth)'"
|
||||||
|
notmuch dump --output=dump-outfile-cworth.actual2 --query=sexp '(from cworth)'
|
||||||
|
test_expect_equal_file dump-cworth.expected dump-outfile-cworth.actual2
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
test_begin_subtest "dump --output=outfile from:cworth"
|
test_begin_subtest "dump --output=outfile from:cworth"
|
||||||
notmuch dump --output=dump-outfile-cworth.actual from:cworth
|
notmuch dump --output=dump-outfile-cworth.actual from:cworth
|
||||||
test_expect_equal_file dump-cworth.expected dump-outfile-cworth.actual
|
test_expect_equal_file dump-cworth.expected dump-outfile-cworth.actual
|
||||||
|
|
|
@ -3,6 +3,13 @@ test_description='"notmuch show"'
|
||||||
|
|
||||||
. $(dirname "$0")/test-lib.sh || exit 1
|
. $(dirname "$0")/test-lib.sh || exit 1
|
||||||
|
|
||||||
|
test_query_syntax () {
|
||||||
|
test_begin_subtest "sexpr query: $1"
|
||||||
|
sexp=$(notmuch show --format=json --query=sexp "$1")
|
||||||
|
infix=$(notmuch show --format=json "$2")
|
||||||
|
test_expect_equal_json "$sexp" "$infix"
|
||||||
|
}
|
||||||
|
|
||||||
add_email_corpus
|
add_email_corpus
|
||||||
|
|
||||||
test_begin_subtest "exit code for show invalid query"
|
test_begin_subtest "exit code for show invalid query"
|
||||||
|
@ -27,4 +34,15 @@ notmuch show --entire-thread=true --sort=newest-first $QUERY > EXPECTED
|
||||||
notmuch show --entire-thread=true --sort=oldest-first $QUERY > OUTPUT
|
notmuch show --entire-thread=true --sort=oldest-first $QUERY > OUTPUT
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
|
|
||||||
|
if [ $NOTMUCH_HAVE_SFSEXP -eq 1 ]; then
|
||||||
|
|
||||||
|
test_query_syntax '(and "wonderful" "wizard")' 'wonderful and wizard'
|
||||||
|
test_query_syntax '(or "php" "wizard")' 'php or wizard'
|
||||||
|
test_query_syntax 'wizard' 'wizard'
|
||||||
|
test_query_syntax 'Wizard' 'Wizard'
|
||||||
|
test_query_syntax '(attachment notmuch-help.patch)' 'attachment:notmuch-help.patch'
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
|
@ -4,6 +4,21 @@ test_description='reindexing messages'
|
||||||
|
|
||||||
add_email_corpus
|
add_email_corpus
|
||||||
|
|
||||||
|
|
||||||
|
if [ $NOTMUCH_HAVE_SFSEXP -eq 1 ]; then
|
||||||
|
|
||||||
|
count=$(notmuch count --lastmod '*' | cut -f 3)
|
||||||
|
for query in '()' '(not)' '(and)' '(or ())' '(or (not))' '(or (and))' \
|
||||||
|
'(or (and) (or) (not (and)))'; do
|
||||||
|
test_begin_subtest "reindex all messages: $query"
|
||||||
|
notmuch reindex --query=sexp "$query"
|
||||||
|
output=$(notmuch count --lastmod '*' | cut -f 3)
|
||||||
|
count=$((count + 1))
|
||||||
|
test_expect_equal "$output" "$count"
|
||||||
|
done
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
notmuch tag +usertag1 '*'
|
notmuch tag +usertag1 '*'
|
||||||
|
|
||||||
notmuch search '*' 2>1 | notmuch_search_sanitize > initial-threads
|
notmuch search '*' 2>1 | notmuch_search_sanitize > initial-threads
|
||||||
|
@ -41,6 +56,7 @@ notmuch dump > OUTPUT
|
||||||
notmuch tag -attachment2 -encrypted2 -signed2 '*'
|
notmuch tag -attachment2 -encrypted2 -signed2 '*'
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
|
||||||
|
backup_database
|
||||||
test_begin_subtest 'reindex moves a message between threads'
|
test_begin_subtest 'reindex moves a message between threads'
|
||||||
notmuch search --output=threads id:87iqd9rn3l.fsf@vertex.dottedmag > EXPECTED
|
notmuch search --output=threads id:87iqd9rn3l.fsf@vertex.dottedmag > EXPECTED
|
||||||
# re-parent
|
# re-parent
|
||||||
|
@ -48,7 +64,9 @@ sed -i 's/1258471718-6781-1-git-send-email-dottedmag@dottedmag.net/87iqd9rn3l.fs
|
||||||
notmuch reindex id:1258471718-6781-2-git-send-email-dottedmag@dottedmag.net
|
notmuch reindex id:1258471718-6781-2-git-send-email-dottedmag@dottedmag.net
|
||||||
notmuch search --output=threads id:1258471718-6781-2-git-send-email-dottedmag@dottedmag.net > OUTPUT
|
notmuch search --output=threads id:1258471718-6781-2-git-send-email-dottedmag@dottedmag.net > OUTPUT
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
restore_database
|
||||||
|
|
||||||
|
backup_database
|
||||||
test_begin_subtest 'reindex detects removal of all files'
|
test_begin_subtest 'reindex detects removal of all files'
|
||||||
notmuch search --output=messages not id:20091117232137.GA7669@griffis1.net> EXPECTED
|
notmuch search --output=messages not id:20091117232137.GA7669@griffis1.net> EXPECTED
|
||||||
# remove both copies
|
# remove both copies
|
||||||
|
@ -56,6 +74,17 @@ mv $MAIL_DIR/cur/51:2,* duplicate-message-2.eml
|
||||||
notmuch reindex id:20091117232137.GA7669@griffis1.net
|
notmuch reindex id:20091117232137.GA7669@griffis1.net
|
||||||
notmuch search --output=messages '*' > OUTPUT
|
notmuch search --output=messages '*' > OUTPUT
|
||||||
test_expect_equal_file EXPECTED OUTPUT
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
restore_database
|
||||||
|
|
||||||
|
backup_database
|
||||||
|
test_begin_subtest 'reindex detects removal of all files'
|
||||||
|
notmuch search --output=messages not id:20091117232137.GA7669@griffis1.net> EXPECTED
|
||||||
|
# remove both copies
|
||||||
|
mv $MAIL_DIR/cur/51:2,* duplicate-message-2.eml
|
||||||
|
notmuch reindex id:20091117232137.GA7669@griffis1.net
|
||||||
|
notmuch search --output=messages '*' > OUTPUT
|
||||||
|
test_expect_equal_file EXPECTED OUTPUT
|
||||||
|
restore_database
|
||||||
|
|
||||||
test_begin_subtest "reindex preserves properties"
|
test_begin_subtest "reindex preserves properties"
|
||||||
cat <<EOF > prop-dump
|
cat <<EOF > prop-dump
|
||||||
|
|
Loading…
Reference in a new issue