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)
# 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()
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('|')
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: