clean-branches.py
2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/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