diff options
| author | David Bremner <david@tethera.net> | 2023-04-03 07:22:48 -0300 |
|---|---|---|
| committer | David Bremner <david@tethera.net> | 2024-07-25 17:39:50 +0900 |
| commit | 30740296e7b211047936ade679e4a15e494ee91c (patch) | |
| tree | 323f63f7cea64014f780e3dccf08734670c98bfb /notmuch-git.py | |
| parent | 6b9fccb2e241156ec3f3fcfa334c73df3cb1fb1e (diff) | |
CLI/git: add reset command
Sometimes merging is not what we want with tags; in particular it
tends to keep tags in the local repo that have been removed elsewhere.
This commit provides a new reset command; the reset itself is trivial,
but the work is to provide a safety check that uses the existing
--force and git.safe_fraction machinery.
Diffstat (limited to 'notmuch-git.py')
| -rw-r--r-- | notmuch-git.py | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/notmuch-git.py b/notmuch-git.py index 97073c80..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 != '': @@ -379,7 +379,7 @@ def check_safe_fraction(status): _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 <refspec> 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() |
