alshabib
Committed by Gerrit Code Review

adding a simple script to purge topic branches from your local repo.

It works by checking if your branchs' gerrit change id is present in master
if yes it adds the branch to the list of branches to clean.

You must run it with --confirm to delete otherwise only a dry-run will be done
You can also run it with --one-by-one where it will ask you to confirm each branch deletion

Change-Id: Iaabe1a6db72242fd31b14302fb3109e8545a0ad8
#!/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