aboutsummaryrefslogtreecommitdiff
path: root/notmuch-git.py
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2023-04-03 07:22:48 -0300
committerDavid Bremner <david@tethera.net>2024-07-25 17:39:50 +0900
commit30740296e7b211047936ade679e4a15e494ee91c (patch)
tree323f63f7cea64014f780e3dccf08734670c98bfb /notmuch-git.py
parent6b9fccb2e241156ec3f3fcfa334c73df3cb1fb1e (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.py37
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()