summaryrefslogtreecommitdiffstats
path: root/.travis/labeler.sh
blob: 7863084d90aa8f37333f84c8fb2bfc1eebf39481 (plain)
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/bin/bash

# This is a simple script which should apply labels to unlabelled issues from last 3 days.
# It will soon be deprecated by GitHub Actions so no futher development on it is planned.

# Previously this was using POST to only add labels. But this method seems to be failing with larger number of requests
new_labels() {
	ISSUE="$1"
	URL="https://api.github.com/repos/netdata/netdata/issues/$ISSUE/labels"
	# deduplicate array and add quotes
	SET=( $(for i in "${@:2}"; do [ "$i" != "" ] && echo "\"$i\""; done | sort -u) )
	# implode array to string
	LABELS="${SET[*]}"
	# add commas between quotes (replace spaces)
	LABELS="${LABELS//\" \"/\",\"}"
	# remove duplicate quotes in case parameters were already quoted
	LABELS="${LABELS//\"\"/\"}"
	echo "-------- Assigning labels to #${ISSUE}: ${LABELS} --------"
	curl -H "Authorization: token $GITHUB_TOKEN" -d "{\"labels\":[${LABELS}]}" -X PUT "${URL}" &>/dev/null
}

if [ "$GITHUB_TOKEN" == "" ]; then
	echo "GITHUB_TOKEN is needed"
	exit 1
fi

if ! [ -x "$(command -v hub)" ]; then
	echo "===== Download HUB ====="
	HUB_VERSION=${HUB_VERSION:-"2.5.1"}
	wget "https://github.com/github/hub/releases/download/v${HUB_VERSION}/hub-linux-amd64-${HUB_VERSION}.tgz" -O "/tmp/hub-linux-amd64-${HUB_VERSION}.tgz"
	tar -C /tmp -xvf "/tmp/hub-linux-amd64-${HUB_VERSION}.tgz" &>/dev/null
	export PATH=$PATH:"/tmp/hub-linux-amd64-${HUB_VERSION}/bin"
fi

echo "===== Looking up available labels ====="
LABELS_FILE=/tmp/labels
hub issue labels >$LABELS_FILE

# Change all 'area' labels assigned to PR saving non-area labels.
echo "===== Categorizing PRs ====="
NEW_LABELS=/tmp/new_labels
for PR in $(hub pr list -s all -f "%I%n" -L 10); do
	echo "----- Processing PR #$PR -----"
	echo "" >$NEW_LABELS
	NEW_SET=""
	DIFF_URL="https://github.com/netdata/netdata/pull/$PR.diff"
	for FILE in $(curl -L "${DIFF_URL}" 2>/dev/null | grep "diff --git a/" | cut -d' ' -f3 | sort | uniq); do
		LABEL=""
		case "${FILE}" in
		*".md") AREA="docs" ;;
		*"/collectors/python.d.plugin/"*) AREA="external/python" ;;
		*"/collectors/charts.d.plugin/"*) AREA="external" ;;
		*"/collectors/node.d.plugin/"*) AREA="external" ;;
		*"/.travis"*) AREA="ci" ;;
		*"/.github/*.md"*) AREA="docs" ;;
		*"/.github/"*) AREA="ci" ;;
		*"/build/"*) AREA="packaging" ;;
		*"/contrib/"*) AREA="packaging" ;;
		*"/diagrams/"*) AREA="docs" ;;
		*"/installer/"*) AREA="packaging" ;;
		*"/makeself/"*) AREA="packaging" ;;
		*"/system/"*) AREA="packaging" ;;
		*"/netdata-installer.sh"*) AREA="packaging" ;;
		*) AREA=$(echo "$FILE" | cut -d'/' -f2) ;;
		esac
		LABEL="area/$AREA"
		echo "Selecting $LABEL due to $FILE"
		if grep "$LABEL" "$LABELS_FILE"; then
			echo "$LABEL" >>$NEW_LABELS
			if [[ $LABEL =~ "external" ]]; then
				echo "area/collectors" >>$NEW_LABELS
			fi
		else
			echo "-------- Label '$LABEL' not available --------"
		fi
	done
	NEW_SET=$(sort $NEW_LABELS | uniq)
	if [ ! -z "$NEW_SET" ]; then
		PREV=$(curl -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/repos/netdata/netdata/issues/$PR/labels" 2>/dev/null | jq '.[].name' | grep -v "area")
		new_labels "$PR" ${NEW_SET} "${PREV[*]}"
	fi
done