From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp12.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms5.migadu.com with LMTPS id KKKxGmVFgWLNGAAAbAwnHQ (envelope-from ) for ; Sun, 15 May 2022 20:24:37 +0200 Received: from aspmx1.migadu.com ([2001:41d0:2:bcc0::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp12.migadu.com with LMTPS id MCuUGmVFgWLJKAAAauVa8A (envelope-from ) for ; Sun, 15 May 2022 20:24:37 +0200 Received: from mail.notmuchmail.org (yantan.tethera.net [135.181.149.255]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 1848B11BD8 for ; Sun, 15 May 2022 20:24:37 +0200 (CEST) Received: from yantan.tethera.net (localhost [127.0.0.1]) by mail.notmuchmail.org (Postfix) with ESMTP id 765C95F74E; Sun, 15 May 2022 18:17:21 +0000 (UTC) Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197]) by mail.notmuchmail.org (Postfix) with ESMTP id 717525F6D1 for ; Sun, 15 May 2022 18:17:18 +0000 (UTC) Received: by fethera.tethera.net (Postfix, from userid 1001) id 9F68A5FC0D; Sun, 15 May 2022 14:17:17 -0400 (EDT) Received: (nullmailer pid 57829 invoked by uid 1000); Sun, 15 May 2022 18:17:13 -0000 From: David Bremner To: notmuch@notmuchmail.org Subject: [PATCH 10/17] CLI/git: replace enumeration of tags with sexp query. Date: Sun, 15 May 2022 15:14:15 -0300 Message-Id: <20220515181421.57088-11-david@tethera.net> X-Mailer: git-send-email 2.35.2 In-Reply-To: <20220515181421.57088-1-david@tethera.net> References: <20220515181421.57088-1-david@tethera.net> MIME-Version: 1.0 Message-ID-Hash: XJBZVCRF5YBK3A4JTSD7T22JE4NE2HOX X-Message-ID-Hash: XJBZVCRF5YBK3A4JTSD7T22JE4NE2HOX X-MailFrom: bremner@tethera.net X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-notmuch.notmuchmail.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.3 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Migadu-Flow: FLOW_IN X-Migadu-To: larch@yhetil.org X-Migadu-Country: DE ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=yhetil.org; s=key1; t=1652639077; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-owner:list-unsubscribe:list-subscribe:list-post; bh=Z5bBJrTOswENFeH8gnN6aNO/OqXYH6Rsv5/DqDR88bg=; b=C2gV4aKS89/uA4wFX5dXXgV0VhEVu0MaTdHDajSsrK3Ps3RSN4wVnmAVgCRYjE0ZIsn5pN uRQ/FM09ti5SMdohhNkwreSEPejnOlNBZQkj0nMxiDcEMh0fmNHuI6MVkaF+/LpVtLaVe9 qscJTDNmOOlcBBITRNicuE7Yqzh+3IdYmAAHugNo8UDmxIKIV30SryZhVt6trkZcFZEPQ8 147PcWlmerStHpTukYOistg5nDLGPPY5JVgmrmR4N3sqDaGko7eL4DMp4nv46rFzH5npic FBBcTqgvlE/uPiekq3xTR4aIpTm/a7MNoHLRmMcPc7TXVkMeqjsnHGzCGOPArg== ARC-Seal: i=1; s=key1; d=yhetil.org; t=1652639077; a=rsa-sha256; cv=none; b=J0GwqUlRT05rqQ46hYv/vWHUNcogno8yKfWqPZTltonD96ZazvD0D4iUU52u5hFyaB32jW vz+Ch9hSBRoRhOVYqDUVp8VL1B1ZWJkAPoqxDryziSQjtW+W1G4qz4B/Pb5QL0r6M5XLcs oLJpOubmvbxw3LbBI1GKSl3KJGufXlOqqyqgz9ai3HCLIZGWd9V6mbMTXyj7iN1yEzTwLv s0dgJy6sM+BtxA8crOVycwuINJ0t8lcSu40iE9F4llj5Sn6pnVIVfWbh5E7w+FaJZ0GeT7 r9M+Bc5m5jwTpYX10XOA3EHAB2DkCiO8vZ0GNkY+siItF+8MRdsOWj+NM5jQJA== ARC-Authentication-Results: i=1; aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 135.181.149.255 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Spam-Score: 6.05 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of notmuch-bounces@notmuchmail.org designates 135.181.149.255 as permitted sender) smtp.mailfrom=notmuch-bounces@notmuchmail.org X-Migadu-Queue-Id: 1848B11BD8 X-Spam-Score: 6.05 X-Migadu-Scanner: scn1.migadu.com X-TUID: hQfgSxAzbCwm 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 | 26 +++++++++++++++++++------- test/T850-git.sh | 6 +++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/notmuch-git.in b/notmuch-git.in index 78e4b140..1d2dcd53 100755 --- a/notmuch-git.in +++ b/notmuch-git.in @@ -221,16 +221,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=()): """ @@ -586,13 +587,12 @@ def get_status(): def _index_tags(): "Write notmuch tags to the nmbug.index." path = _os.path.join(NOTMUCH_GIT_DIR, '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'], @@ -692,6 +692,14 @@ def _help(parser, command=None): else: parser.parse_args(['--help']) +def _notmuch_config_get(key): + (status, stdout, stderr) = _spawn( + args=['notmuch', 'config', 'get', key], + stdout=_subprocess.PIPE, wait=True) + if status != 0: + _LOG.error("failed to run notmuch config") + sys.exit(1) + return stdout.rstrip() if __name__ == '__main__': import argparse @@ -839,6 +847,10 @@ if __name__ == '__main__': for var in ['NOTMUCH_GIT_DIR', 'NOTMUCH_GIT_PREFIX', 'NOTMUCH_PROFILE', 'NOTMUCH_CONFIG' ]: _LOG.debug('env {:s} = {:s}'.format(var, _os.getenv(var,'%None%'))) + if _notmuch_config_get('built_with.sexp_queries') != 'true': + _LOG.error("notmuch git needs sexp query support") + sys.exit(1) + 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 2badc52d..72091b56 100755 --- a/test/T850-git.sh +++ b/test/T850-git.sh @@ -2,6 +2,11 @@ test_description='"notmuch git" to save and restore tags' . $(dirname "$0")/test-lib.sh || exit 1 +if [ $NOTMUCH_HAVE_SFSEXP -ne 1 ]; then + printf "Skipping due to missing sfsexp library\n" + test_done +fi + add_email_corpus git config --global user.email notmuch@example.org @@ -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