From: David Bremner <david@tethera.net>
To: notmuch@notmuchmail.org
Subject: [PATCH 10/16] CLI/git: replace enumeration of tags with sexp query.
Date: Sat, 23 Apr 2022 10:38:42 -0300 [thread overview]
Message-ID: <20220423133848.3852688-11-david@tethera.net> (raw)
In-Reply-To: <20220423133848.3852688-1-david@tethera.net>
Unlike the (current) infix query parser provided by Xapian, the
notmuch specific sexp query parser supports prefixed wildcard queries,
so use those. In addition to being somewhat faster, this avoids
needing to escape all of the user's tags to pass via the shell.
---
notmuch-git.in | 23 ++++++++++++++++-------
test/T850-git.sh | 6 +++++-
2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/notmuch-git.in b/notmuch-git.in
index 8b397080..d8b7e45b 100755
--- a/notmuch-git.in
+++ b/notmuch-git.in
@@ -258,16 +258,17 @@ def _get_remote():
stdout=_subprocess.PIPE, wait=True)
return remote.strip()
+def _tag_query(prefix=None):
+ if prefix is None:
+ prefix = TAG_PREFIX
+ return '(tag (starts-with "{:s}"))'.format(prefix.replace('"','\\\"'))
def get_tags(prefix=None):
"Get a list of tags with a given prefix."
- if prefix is None:
- prefix = TAG_PREFIX
(status, stdout, stderr) = _spawn(
- args=['notmuch', 'search', '--output=tags', '*'],
+ args=['notmuch', 'search', '--query=sexp', '--output=tags', _tag_query(prefix)],
stdout=_subprocess.PIPE, wait=True)
- return [tag for tag in stdout.splitlines() if tag.startswith(prefix)]
-
+ return [tag for tag in stdout.splitlines()]
def archive(treeish='HEAD', args=()):
"""
@@ -623,13 +624,12 @@ def get_status():
def _index_tags():
"Write notmuch tags to the nmbug.index."
path = _os.path.join(NMBGIT, 'nmbug.index')
- query = ' '.join('tag:"{tag}"'.format(tag=tag) for tag in get_tags())
prefix = '+{0}'.format(_ENCODED_TAG_PREFIX)
_git(
args=['read-tree', '--empty'],
additional_env={'GIT_INDEX_FILE': path}, wait=True)
with _spawn(
- args=['notmuch', 'dump', '--format=batch-tag', '--', query],
+ args=['notmuch', 'dump', '--format=batch-tag', '--query=sexp', '--', _tag_query()],
stdout=_subprocess.PIPE) as notmuch:
with _git(
args=['update-index', '--index-info'],
@@ -872,6 +872,15 @@ if __name__ == '__main__':
level = getattr(_logging, args.log_level.upper())
_LOG.setLevel(level)
+ (status, stdout, stderr) = _spawn(
+ args=['notmuch', 'config', 'get', 'built_with.sexp_queries'],
+ stdout=_subprocess.PIPE, wait=True)
+ if status != 0:
+ _LOG.error("failed to run notmuch")
+ sys.exit(1)
+ if stdout != "true\n":
+ _LOG.error("notmuch git needs sexp query support")
+
if not getattr(args, 'func', None):
parser.print_usage()
_sys.exit(1)
diff --git a/test/T850-git.sh b/test/T850-git.sh
index 408a6337..4bf29b20 100755
--- a/test/T850-git.sh
+++ b/test/T850-git.sh
@@ -7,6 +7,11 @@ add_git_repos () {
notmuch git -C tags.git -p '' clone remote.git
}
+if [ $NOTMUCH_HAVE_SFSEXP -ne 1 ]; then
+ printf "Skipping due to missing sfsexp library\n"
+ test_done
+fi
+
add_email_corpus
add_git_repos
@@ -20,7 +25,6 @@ notmuch search --output=messages '*' | sort > EXPECTED
test_expect_equal_file_nonempty EXPECTED OUTPUT
test_begin_subtest "commit, with quoted tag"
-test_subtest_known_broken
notmuch git -C clone2.git -p '' clone tags.git
git -C clone2.git ls-tree -r --name-only HEAD | grep /inbox > BEFORE
notmuch tag '+"quoted tag"' '*'
--
2.35.2
next prev parent reply other threads:[~2022-04-23 13:44 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-23 13:38 WIP: promote nmbug to user sync tool David Bremner
2022-04-23 13:38 ` [PATCH 01/16] nmbug: promote to user tool "notmuch-git" David Bremner
2022-04-23 13:38 ` [PATCH 02/16] notmuch-git: add --git-dir argument David Bremner
2022-04-23 13:38 ` [PATCH 03/16] notmuch-git: add --tag-prefix argument David Bremner
2022-04-23 13:38 ` [PATCH 04/16] test: initial tests for notmuch-git David Bremner
2022-04-23 13:38 ` [PATCH 05/16] nmbug: Add an 'init' command David Bremner
2022-04-23 13:38 ` [PATCH 06/16] CLI/git: suppress warnings about initial branch name David Bremner
2022-04-23 13:38 ` [PATCH 07/16] test: use "notmuch git init" for tests David Bremner
2022-04-23 13:38 ` [PATCH 08/16] CLI/git: make existance of config branch optional on clone David Bremner
2022-04-23 13:38 ` [PATCH 09/16] test/git: add known broken test for tag with quotes David Bremner
2022-04-23 13:38 ` David Bremner [this message]
2022-04-23 13:38 ` [PATCH 11/16] CLI/git: add @timed decorator, time a few functions David Bremner
2022-04-23 13:38 ` [PATCH 12/16] CLI/git: rename private index file David Bremner
2022-04-23 13:38 ` [PATCH 13/16] CLI/git: create PrivateIndex class David Bremner
2022-04-23 13:38 ` [PATCH 14/16] CLI/git: create CachedIndex class David Bremner
2022-04-23 13:38 ` [PATCH 15/16] debian: install notmuch-git David Bremner
2022-04-23 13:38 ` [PATCH 16/16] WIP: start manual page for notmuch-git David Bremner
2022-04-23 18:49 ` WIP: promote nmbug to user sync tool David Bremner
2022-04-30 17:33 ` Sean Whitton
2022-05-08 0:01 ` David Bremner
2022-05-20 23:05 ` Sean Whitton
2022-05-29 11:00 ` David Bremner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220423133848.3852688-11-david@tethera.net \
--to=david@tethera.net \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).