mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-22 10:58:10 +01:00
CLI/git: replace enumeration of tags with sexp query.
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.
This commit is contained in:
parent
b355973abc
commit
f67d7c9e7a
2 changed files with 24 additions and 8 deletions
|
@ -219,16 +219,17 @@ def _get_remote():
|
||||||
stdout=_subprocess.PIPE, wait=True)
|
stdout=_subprocess.PIPE, wait=True)
|
||||||
return remote.strip()
|
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):
|
def get_tags(prefix=None):
|
||||||
"Get a list of tags with a given prefix."
|
"Get a list of tags with a given prefix."
|
||||||
if prefix is None:
|
|
||||||
prefix = TAG_PREFIX
|
|
||||||
(status, stdout, stderr) = _spawn(
|
(status, stdout, stderr) = _spawn(
|
||||||
args=['notmuch', 'search', '--output=tags', '*'],
|
args=['notmuch', 'search', '--query=sexp', '--output=tags', _tag_query(prefix)],
|
||||||
stdout=_subprocess.PIPE, wait=True)
|
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=()):
|
def archive(treeish='HEAD', args=()):
|
||||||
"""
|
"""
|
||||||
|
@ -584,13 +585,12 @@ def get_status():
|
||||||
def _index_tags():
|
def _index_tags():
|
||||||
"Write notmuch tags to the nmbug.index."
|
"Write notmuch tags to the nmbug.index."
|
||||||
path = _os.path.join(NOTMUCH_GIT_DIR, '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)
|
prefix = '+{0}'.format(_ENCODED_TAG_PREFIX)
|
||||||
_git(
|
_git(
|
||||||
args=['read-tree', '--empty'],
|
args=['read-tree', '--empty'],
|
||||||
additional_env={'GIT_INDEX_FILE': path}, wait=True)
|
additional_env={'GIT_INDEX_FILE': path}, wait=True)
|
||||||
with _spawn(
|
with _spawn(
|
||||||
args=['notmuch', 'dump', '--format=batch-tag', '--', query],
|
args=['notmuch', 'dump', '--format=batch-tag', '--query=sexp', '--', _tag_query()],
|
||||||
stdout=_subprocess.PIPE) as notmuch:
|
stdout=_subprocess.PIPE) as notmuch:
|
||||||
with _git(
|
with _git(
|
||||||
args=['update-index', '--index-info'],
|
args=['update-index', '--index-info'],
|
||||||
|
@ -690,6 +690,14 @@ def _help(parser, command=None):
|
||||||
else:
|
else:
|
||||||
parser.parse_args(['--help'])
|
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__':
|
if __name__ == '__main__':
|
||||||
import argparse
|
import argparse
|
||||||
|
@ -834,6 +842,10 @@ if __name__ == '__main__':
|
||||||
for var in ['NOTMUCH_GIT_DIR', 'NOTMUCH_GIT_PREFIX', 'NOTMUCH_PROFILE', 'NOTMUCH_CONFIG' ]:
|
for var in ['NOTMUCH_GIT_DIR', 'NOTMUCH_GIT_PREFIX', 'NOTMUCH_PROFILE', 'NOTMUCH_CONFIG' ]:
|
||||||
_LOG.debug('env {:s} = {:s}'.format(var, _os.getenv(var,'%None%')))
|
_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):
|
if not getattr(args, 'func', None):
|
||||||
parser.print_usage()
|
parser.print_usage()
|
||||||
_sys.exit(1)
|
_sys.exit(1)
|
||||||
|
|
|
@ -2,6 +2,11 @@
|
||||||
test_description='"notmuch git" to save and restore tags'
|
test_description='"notmuch git" to save and restore tags'
|
||||||
. $(dirname "$0")/test-lib.sh || exit 1
|
. $(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
|
add_email_corpus
|
||||||
|
|
||||||
git config --global user.email notmuch@example.org
|
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_expect_equal_file_nonempty EXPECTED OUTPUT
|
||||||
|
|
||||||
test_begin_subtest "commit, with quoted tag"
|
test_begin_subtest "commit, with quoted tag"
|
||||||
test_subtest_known_broken
|
|
||||||
notmuch git -C clone2.git -p '' clone tags.git
|
notmuch git -C clone2.git -p '' clone tags.git
|
||||||
git -C clone2.git ls-tree -r --name-only HEAD | grep /inbox > BEFORE
|
git -C clone2.git ls-tree -r --name-only HEAD | grep /inbox > BEFORE
|
||||||
notmuch tag '+"quoted tag"' '*'
|
notmuch tag '+"quoted tag"' '*'
|
||||||
|
|
Loading…
Reference in a new issue