-
Notifications
You must be signed in to change notification settings - Fork 1
/
gerrit-sweep
executable file
·61 lines (54 loc) · 1.57 KB
/
gerrit-sweep
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
52
53
54
55
56
57
58
59
60
61
#!/bin/bash
set -e
# Check for --status flag
SHOW_STATUS=false
if [ "$1" = "--status" ]; then
SHOW_STATUS=true
fi
# Check for --delete-abandoned flag
DELETE_ABANDONED=false
if [ "$1" = "--delete-abandoned" ]; then
DELETE_ABANDONED=true
SHOW_STATUS=true
fi
# Gerrit API base URL
GERRIT_API="https://gerrit.wikimedia.org/r"
# Try to get the default branch name (master/main)
DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
if [ -z "$DEFAULT_BRANCH" ]; then
DEFAULT_BRANCH='master'
fi
DEFAULT_BRANCH_CHANGE_IDS="$(git log $DEFAULT_BRANCH | grep Change-Id: )"
KEPT_BRANCHES=()
for BRANCH in $( git branch --format '%(refname:short)' | grep -v "^$DEFAULT_BRANCH$" )
do
ID="$(git log -n1 "$BRANCH" -- | grep Change-Id: | head -n1 | awk '{print $2}')"
if [ -z "$ID" ]; then
continue
fi
if echo "$DEFAULT_BRANCH_CHANGE_IDS" | grep "Change-Id: $ID" > /dev/null; then
git branch -D "$BRANCH"
else
if $SHOW_STATUS; then
CHANGE_STATUS=$(curl -s "$GERRIT_API/changes/$ID" | sed 1d | grep -o '"status":"[^"]*' | head -n 1 | cut -d '"' -f 4)
if [ -z "$CHANGE_STATUS" ]; then
CHANGE_STATUS="NOT FOUND"
fi
if [ "$DELETE_ABANDONED" = true ] && [ "$CHANGE_STATUS" = "ABANDONED" ]; then
git branch -D "$BRANCH" | tr '\n' ' ' && echo "(ABANDONED)"
else
KEPT_BRANCHES+=("$BRANCH ($CHANGE_STATUS)")
fi
else
KEPT_BRANCHES+=("$BRANCH")
fi
fi
done
if [ ${#KEPT_BRANCHES[@]} -gt 5 ]; then
echo "Kept ${#KEPT_BRANCHES[@]} branches"
else
for BRANCH in "${KEPT_BRANCHES[@]}"
do
echo "Kept branch $BRANCH"
done
fi