X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=notmuch-git.py;h=ceb86fbc14dfa97db10dfec87732452a648edc0b;hb=HEAD;hp=57098aae7821e5ddb5e1543d6e6c58d2c3d9a0bd;hpb=891af1d457a174e12943baf111175af14bb4bb53;p=notmuch diff --git a/notmuch-git.py b/notmuch-git.py index 57098aae..ee87bec6 100644 --- a/notmuch-git.py +++ b/notmuch-git.py @@ -31,7 +31,6 @@ import locale as _locale import logging as _logging import os as _os import re as _re -import shutil as _shutil import subprocess as _subprocess import sys as _sys import tempfile as _tempfile @@ -248,7 +247,7 @@ def count_messages(prefix=None): stdout=_subprocess.PIPE, wait=True) if status != 0: _LOG.error("failed to run notmuch config") - sys.exit(1) + _sys.exit(1) return int(stdout.rstrip()) def get_tags(prefix=None): @@ -369,7 +368,7 @@ class CachedIndex: _git(args=['read-tree', self.current_treeish], wait=True) -def check_safe_fraction(status): +def _check_fraction(change): safe = 0.1 conf = _notmuch_config_get ('git.safe_fraction') if conf and conf != '': @@ -377,10 +376,10 @@ def check_safe_fraction(status): total = count_messages (TAG_PREFIX) if total == 0: - _LOG.error('No existing tags with given prefix, stopping.'.format(safe)) + _LOG.error('No existing tags with given prefix, stopping.') _LOG.error('Use --force to override.') exit(1) - change = len(status['added'])+len(status['deleted']) + fraction = change/total _LOG.debug('total messages {:d}, change: {:d}, fraction: {:f}'.format(total,change,fraction)) if fraction > safe: @@ -388,6 +387,25 @@ def check_safe_fraction(status): _LOG.error('Use --force to override or reconfigure git.safe_fraction.') exit(1) +def check_safe_fraction(status): + + change = len(status['added'])+len(status['deleted']) + _check_fraction(change) + +def check_diff_fraction(): + + # check number of directories (i.e. messages) changed. + change_set = set() + + with _git(args=['diff', '--name-only', 'HEAD', '@{upstream}'], + stdout=_subprocess.PIPE) as git: + for path in git.stdout: + change_set.add(_os.path.dirname(path)) + + change=len(change_set) + _check_fraction(change) + + def commit(treeish='HEAD', message=None, force=False): """ Commit prefix-matching tags from the notmuch database to Git. @@ -620,6 +638,15 @@ def push(repository=None, refspecs=None): _git(args=args, wait=True) +def reset(force=False): + """ + reset the local git branch to match the remote one + """ + if not force: + check_diff_fraction() + + _git(args=["reset","--soft","origin/master"],wait=True) + def status(): """ Show pending updates in notmuch or git repo. @@ -1048,6 +1075,7 @@ if __name__ == '__main__': 'merge', 'pull', 'push', + 'reset', 'status', ]: func = locals()[command] @@ -1142,6 +1170,10 @@ if __name__ == '__main__': 'Refspec (usually a branch name) to push. See ' 'the entry in the OPTIONS section of ' 'git-push(1) for other possibilities.')) + elif command == 'reset': + subparser.add_argument( + '-f', '--force', action='store_true', + help='reset a large fraction of tags.') args = parser.parse_args()