X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=notmuch-git.py;h=badf900054e64fe9c4e237b2b7c67b40cd1177c2;hb=f67d7c9e7a2d110e54609e572c35804f0172ba11;hp=ce3c07bb4b63f1cdb50149d8190e36e98d6d0e1b;hpb=14ac68ae112437fd25d7e76f8c78523a01d83804;p=notmuch diff --git a/notmuch-git.py b/notmuch-git.py index ce3c07bb..badf9000 100644 --- a/notmuch-git.py +++ b/notmuch-git.py @@ -18,13 +18,6 @@ """ Manage notmuch tags with Git - -Environment variables: - -* NMBGIT specifies the location of the git repository used by nmbug. - If not specified $HOME/.nmbug is used. -* NMBPREFIX specifies the prefix in the notmuch database for tags of - interest to nmbug. If not specified 'notmuch::' is used. """ from __future__ import print_function @@ -50,7 +43,7 @@ _LOG = _logging.getLogger('nmbug') _LOG.setLevel(_logging.WARNING) _LOG.addHandler(_logging.StreamHandler()) -NMBGIT = None +NOTMUCH_GIT_DIR = None TAG_PREFIX = None _HEX_ESCAPE_REGEX = _re.compile('%[0-9A-F]{2}') @@ -198,7 +191,7 @@ def _spawn(args, input=None, additional_env=None, wait=False, stdin=None, def _git(args, **kwargs): - args = ['git', '--git-dir', NMBGIT] + list(args) + args = ['git', '--git-dir', NOTMUCH_GIT_DIR] + list(args) return _spawn(args=args, **kwargs) @@ -226,16 +219,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=()): """ @@ -266,7 +260,7 @@ def clone(repository): with _tempfile.TemporaryDirectory(prefix='nmbug-clone.') as workdir: _spawn( args=[ - 'git', 'clone', '--no-checkout', '--separate-git-dir', NMBGIT, + 'git', 'clone', '--no-checkout', '--separate-git-dir', NOTMUCH_GIT_DIR, repository, workdir], wait=True) _git(args=['config', '--unset', 'core.worktree'], wait=True, expect=(0, 5)) @@ -358,7 +352,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', NMBGIT, '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) @@ -366,7 +361,7 @@ def init(remote=None): args=[ 'commit', '--allow-empty', '-m', 'Start a new nmbug repository' ], - additional_env={'GIT_WORK_TREE': NMBGIT}, + additional_env={'GIT_WORK_TREE': NOTMUCH_GIT_DIR}, wait=True) @@ -589,14 +584,13 @@ 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()) + path = _os.path.join(NOTMUCH_GIT_DIR, 'nmbug.index') 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'], @@ -696,6 +690,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 @@ -708,7 +710,7 @@ if __name__ == '__main__': help='Git repository to operate on.') parser.add_argument( '-p', '--tag-prefix', metavar='PREFIX', - default = _os.getenv('NMBPREFIX', 'notmuch::'), + default = _os.getenv('NOTMUCH_GIT_PREFIX', 'notmuch::'), help='Prefix of tags to operate on.') parser.add_argument( '-l', '--log-level', @@ -821,13 +823,13 @@ if __name__ == '__main__': args = parser.parse_args() if args.git_dir: - NMBGIT = args.git_dir + NOTMUCH_GIT_DIR = args.git_dir else: - NMBGIT = _os.path.expanduser( - _os.getenv('NMBGIT', _os.path.join('~', '.nmbug'))) - _NMBGIT = _os.path.join(NMBGIT, '.git') - if _os.path.isdir(_NMBGIT): - NMBGIT = _NMBGIT + NOTMUCH_GIT_DIR = _os.path.expanduser( + _os.getenv('NOTMUCH_GIT_DIR', _os.path.join('~', '.nmbug'))) + _NOTMUCH_GIT_DIR = _os.path.join(NOTMUCH_GIT_DIR, '.git') + if _os.path.isdir(_NOTMUCH_GIT_DIR): + NOTMUCH_GIT_DIR = _NOTMUCH_GIT_DIR TAG_PREFIX = args.tag_prefix _ENCODED_TAG_PREFIX = _hex_quote(TAG_PREFIX, safe='+@=,') # quote ':' @@ -836,6 +838,14 @@ if __name__ == '__main__': level = getattr(_logging, args.log_level.upper()) _LOG.setLevel(level) + # for test suite + 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)