#!/usr/bin/env python from subprocess import check_output import sys def get_merged_branches_by_change_id(): '''a list of merged branches, by change id excluding support branches and master''' raw_changeIds = check_output('git log origin/master | grep -i change-id | awk {\' print $2 \'}', shell=True) changeIds = [b.strip() for b in raw_changeIds.split('\n') if b.strip()] raw_branches = check_output('git branch -a', shell=True) branches = [b.strip() for b in raw_branches.split('\n') if b.strip() and not b.startswith('*') and \ not b.strip().startswith('onos') and not b.strip().startswith('remotes') and b.strip() != 'master'] to_delete = [] for branch in branches: raw_local_change_ids = check_output('git show %s | grep -i change-id | awk {\' print $2 \'}' % branch, shell=True) local_change_ids = [ b.strip() for b in raw_local_change_ids.split('\n') if b.strip() ] for local_change_id in local_change_ids: if local_change_id in changeIds and branch not in to_delete: to_delete.append(branch) return to_delete def delete_branch(branch): return check_output('git branch -D %s' % branch, shell=True).strip() if __name__ == '__main__': dry_run = '--confirm' not in sys.argv one_by_one = '--one-by-one' in sys.argv to_delete = get_merged_branches_by_change_id() if len(to_delete) == 0: print "Nothing to clean" sys.exit(0) for branch in to_delete: if dry_run: print branch else: if one_by_one: print 'Do you want to delete branch %s [y/N]' % branch ans = raw_input() if ans == 'y' or ans == 'Y': print delete_branch(branch) else: print delete_branch(branch) if dry_run: print '*****************************************************************' print 'Did not actually delete anything yet, pass in --confirm to delete' print