X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;ds=sidebyside;f=notmuch-git.py;h=ceb86fbc14dfa97db10dfec87732452a648edc0b;hb=HEAD;hp=29f7553127a2f3976268e583673860e658cced09;hpb=e310df70938baf61b849f309f295d0b6c54bd0d3;p=notmuch diff --git a/notmuch-git.py b/notmuch-git.py index 29f75531..ee87bec6 100644 --- a/notmuch-git.py +++ b/notmuch-git.py @@ -368,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 != '': @@ -376,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: @@ -387,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. @@ -619,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. @@ -1047,6 +1075,7 @@ if __name__ == '__main__': 'merge', 'pull', 'push', + 'reset', 'status', ]: func = locals()[command] @@ -1141,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()