[PATCH 10/16] CLI/git: replace enumeration of tags with sexp query.

Subject: [PATCH 10/16] CLI/git: replace enumeration of tags with sexp query.

Date: Sat, 23 Apr 2022 10:38:42 -0300

To: notmuch@notmuchmail.org

Cc:

From: David Bremner


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

_______________________________________________
notmuch mailing list -- notmuch@notmuchmail.org
To unsubscribe send an email to notmuch-leave@notmuchmail.org

Thread: