aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2022-07-15 10:23:21 -0400
committerDavid Bremner <david@tethera.net>2022-07-16 20:27:40 -0400
commitf599b8873f4fc748ae1befdac776b543e61045d7 (patch)
treeebdc658786b615322c66dfd17394702882bdc5af
parentbd4347499f6ddab1af0967d596ad97996eea74f8 (diff)
CLI/git: opportunistically use bindings to check for known messages
If the bindings are installed, use them to avoid one exec of notmuch search per message.
-rw-r--r--notmuch-git.py33
1 files changed, 28 insertions, 5 deletions
diff --git a/notmuch-git.py b/notmuch-git.py
index 4d9887c8..ceb86fbc 100644
--- a/notmuch-git.py
+++ b/notmuch-git.py
@@ -698,6 +698,32 @@ def _is_unmerged(ref='@{upstream}'):
stdout=_subprocess.PIPE, wait=True)
return base != fetch_head
+class DatabaseCache:
+ def __init__(self):
+ try:
+ from notmuch2 import Database
+ self._notmuch = Database()
+ except ImportError:
+ self._notmuch = None
+ self._known = {}
+
+ def known(self,id):
+ if id in self._known:
+ return self._known[id];
+
+ if self._notmuch:
+ try:
+ _ = self._notmuch.find(id)
+ self._known[id] = True
+ except LookupError:
+ self._known[id] = False
+ else:
+ (_, stdout, stderr) = _spawn(
+ args=['notmuch', 'search', '--output=files', 'id:{0}'.format(id)],
+ stdout=_subprocess.PIPE,
+ wait=True)
+ self._known[id] = stdout != None
+ return self._known[id]
@timed
def get_status():
@@ -705,14 +731,11 @@ def get_status():
'deleted': {},
'missing': {},
}
+ db = DatabaseCache()
with PrivateIndex(repo=NOTMUCH_GIT_DIR, prefix=TAG_PREFIX) as index:
maybe_deleted = index.diff(filter='D')
for id, tags in maybe_deleted.items():
- (_, stdout, stderr) = _spawn(
- args=['notmuch', 'search', '--output=files', 'id:{0}'.format(id)],
- stdout=_subprocess.PIPE,
- wait=True)
- if stdout:
+ if db.known(id):
status['deleted'][id] = tags
else:
status['missing'][id] = tags