From: Mike Frysinger Date: Mon, 15 Feb 2021 12:10:33 +0000 (-0500) Subject: git-rb-all: handle empty trees & dirty trees better X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=65a6ea8481d328dfa05a55d5c0b0adbbcbe76e35;p=home.git git-rb-all: handle empty trees & dirty trees better --- diff --git a/.bin/git-rb-all b/.bin/git-rb-all index 1d9ded3..d2c6737 100755 --- a/.bin/git-rb-all +++ b/.bin/git-rb-all @@ -45,6 +45,12 @@ class Color: BRACKET = _combine(Terminal.BOLD, Terminal.FG_BLUE) +def fatal(msg): + """Show an error |msg| then exit.""" + print(f'{Color.BAD}{PROG}: error: {msg}{Color.NORMAL}', file=sys.stderr) + sys.exit(1) + + def git(args, **kwargs): """Run git.""" kwargs.setdefault('check', True) @@ -105,8 +111,7 @@ def main(argv): # Skip if rebase is in progress. if rebase_inprogress(): - print(f'{Color.BAD}{PROG}: skipping due to active rebase{Color.NORMAL}') - return 1 + fatal('skipping due to active rebase') # Switch to the top dir in case the working dir doesn't exist in every branch. topdir = git(['rev-parse', '--show-toplevel']).stdout.strip() @@ -123,15 +128,21 @@ def main(argv): curr_state = None branch_width = 0 + local_count = 0 for line in state: head, worktreepath, branch, tracking, ahead_behind = line.split('|') branch_width = max(branch_width, len(branch)) if head == '*': curr_state = branch + if not (worktreepath and worktreepath != topdir): + local_count += 1 + # If there are no branches to rebase, go silently. + if not local_count: + return 0 if not curr_state: - print('Unable to resolve current branch', file=sys.stderr) - return 1 + fatal('unable to resolve current branch') + is_dirty = None branches = {} for line in state: head, worktreepath, branch, tracking, ahead_behind = line.split('|') @@ -158,6 +169,13 @@ def main(argv): print('fast forwarded') continue + if is_dirty is None: + output = git(['status', '--porcelain']).stdout + is_dirty = any(x for x in output.splitlines() if '?' not in x[0:2]) + if is_dirty: + print(f'{Color.BAD}unable to rebase: tree is dirty{Color.NORMAL}') + continue + print(f'rebasing [{ahead_behind}] ', end='', flush=True) git(['checkout', '-q', branch]) if opts.catchup: