@ -141,7 +141,7 @@ def remove_empty_branches(branch_tree):
print ( git . run ( ' branch ' , ' -d ' , branch ) )
print ( git . run ( ' branch ' , ' -d ' , branch ) )
def rebase_branch ( branch , parent , start_hash ):
def rebase_branch ( branch , parent , start_hash , no_squash ):
logging . debug ( ' considering %s ( %s ) -> %s ( %s ) : %s ' ,
logging . debug ( ' considering %s ( %s ) -> %s ( %s ) : %s ' ,
branch , git . hash_one ( branch ) , parent , git . hash_one ( parent ) ,
branch , git . hash_one ( branch ) , parent , git . hash_one ( parent ) ,
start_hash )
start_hash )
@ -162,8 +162,18 @@ def rebase_branch(branch, parent, start_hash):
if git . hash_one ( parent ) != start_hash :
if git . hash_one ( parent ) != start_hash :
# Try a plain rebase first
# Try a plain rebase first
print ( ' Rebasing: ' , branch )
print ( ' Rebasing: ' , branch )
rebase_ret = git . rebase ( parent , start_hash , branch , abort = True )
rebase_ret = git . rebase ( parent , start_hash , branch , abort = not no_squash )
if not rebase_ret . success :
if not rebase_ret . success :
if no_squash :
print ( textwrap . dedent ( """ \
Your working copy is in mid - rebase . Either :
* completely resolve like a normal git - rebase ; OR
* abort the rebase and mark this branch as dormant :
git config branch . % s . dormant true
And then run ` git rebase - update ` again to resume .
""" % branch))
return False
# TODO(iannucci): Find collapsible branches in a smarter way?
# TODO(iannucci): Find collapsible branches in a smarter way?
print ( " Failed! Attempting to squash " , branch , " ... " , end = ' ' )
print ( " Failed! Attempting to squash " , branch , " ... " , end = ' ' )
sys . stdout . flush ( )
sys . stdout . flush ( )
@ -235,6 +245,9 @@ def main(args=None):
' if none specified. ' )
' if none specified. ' )
parser . add_argument ( ' --keep-empty ' , ' -e ' , action = ' store_true ' ,
parser . add_argument ( ' --keep-empty ' , ' -e ' , action = ' store_true ' ,
help = ' Do not automatically delete empty branches. ' )
help = ' Do not automatically delete empty branches. ' )
parser . add_argument (
' --no-squash ' , action = ' store_true ' ,
help = ' Will not try to squash branches when rebasing fails. ' )
opts = parser . parse_args ( args )
opts = parser . parse_args ( args )
if opts . verbose : # pragma: no cover
if opts . verbose : # pragma: no cover
@ -295,7 +308,7 @@ def main(args=None):
if git . is_dormant ( branch ) :
if git . is_dormant ( branch ) :
print ( ' Skipping dormant branch ' , branch )
print ( ' Skipping dormant branch ' , branch )
else :
else :
ret = rebase_branch ( branch , parent , merge_base [ branch ] )
ret = rebase_branch ( branch , parent , merge_base [ branch ] , opts . no_squash )
if not ret :
if not ret :
retcode = 1
retcode = 1