X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=notmuch-git.py;h=6ea50fe8f4ebeef450040bf31c66fca43eed5f7b;hb=5ef56fe8126006351008c4016ea34d97c7cdcd9f;hp=f3ad6927c6fcc9855f04ebd6fc8438886450c19b;hpb=b0105841638e3681e51577128b0a990ae7f815dc;p=notmuch diff --git a/notmuch-git.py b/notmuch-git.py index f3ad6927..6ea50fe8 100644 --- a/notmuch-git.py +++ b/notmuch-git.py @@ -89,6 +89,20 @@ def _xapian_unquote(string): return string +def timed(fn): + """Timer decorator""" + from time import perf_counter + + def inner(*args, **kwargs): + start_time = perf_counter() + rval = fn(*args, **kwargs) + end_time = perf_counter() + _LOG.info('{0}: {1:.8f}s elapsed'.format(fn.__name__, end_time - start_time)) + return rval + + return inner + + class SubprocessError(RuntimeError): "A subprocess exited with a nonzero status" def __init__(self, args, status, stdout=None, stderr=None): @@ -219,16 +233,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=()): """ @@ -320,6 +335,7 @@ def commit(treeish='HEAD', message=None): _git(args=['read-tree', treeish], wait=True) raise +@timed def _update_index(status): with _git( args=['update-index', '--index-info'], @@ -351,7 +367,8 @@ def init(remote=None): This wraps 'git init' with a few extra steps to support subsequent status and commit commands. """ - _spawn(args=['git', '--git-dir', NOTMUCH_GIT_DIR, 'init', '--bare'], wait=True) + _spawn(args=['git', '--git-dir', NOTMUCH_GIT_DIR, 'init', + '--initial-branch=master', '--quiet', '--bare'], wait=True) _git(args=['config', 'core.logallrefupdates', 'true'], wait=True) # create an empty blob (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391) _git(args=['hash-object', '-w', '--stdin'], input='', wait=True) @@ -559,6 +576,7 @@ def _is_unmerged(ref='@{upstream}'): return base != fetch_head +@timed def get_status(): status = { 'deleted': {}, @@ -579,17 +597,16 @@ def get_status(): _os.remove(index) return status - +@timed 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'], @@ -629,6 +646,7 @@ def _index_tags_for_message(id, status, tags): yield '{mode} {hash}\t{path}\n'.format(mode=mode, hash=hash, path=path) +@timed def _diff_index(index, filter): """ Get an {id: {tag, ...}} dict for a given filter. @@ -689,6 +707,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 @@ -833,6 +859,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)