-
-
Save omegahm/28d87a4e1411c030aa89 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash | |
# Colours picked from https://robinpowered.com/blog/best-practice-system-for-organizing-and-tagging-github-issues/ | |
### | |
# Label definitions | |
### | |
declare -A LABELS | |
# Platform | |
LABELS["ruby"]="BFD4F2" | |
LABELS["rails"]="BFD4F2" | |
# Problems | |
LABELS["bug"]="EE3F46" | |
LABELS["security"]="EE3F46" | |
LABELS["production"]="F45D43" | |
# Mindless | |
LABELS["chore"]="FEF2C0" | |
LABELS["legal"]="FFF2C1" | |
# Experience | |
LABELS["copy"]="FFC274" | |
LABELS["design"]="FFC274" | |
LABELS["ux"]="FFC274" | |
# Environment | |
LABELS["staging"]="FAD8C7" | |
LABELS["test"]="FAD8C7" | |
# Feedback | |
LABELS["discussion"]="CC317C" | |
LABELS["rfc"]="CC317C" | |
LABELS["question"]="CC317C" | |
# Improvements | |
LABELS["enhancement"]="5EBEFF" | |
LABELS["optimizaiton"]="5EBEFF" | |
# Additions | |
LABELS["feature"]="91CA55" | |
# Pending | |
LABELS["in progress"]="FBCA04" | |
LABELS["watchlist"]="FBCA04" | |
# Inactive | |
LABELS["invalid"]="D2DAE1" | |
LABELS["wontfix"]="D2DAE1" | |
LABELS["duplicate"]="D2DAE1" | |
LABELS["on hold"]="D2DAE1" | |
### | |
# Get a token from Github | |
### | |
if [ ! -f ".token" ]; then | |
read -p "Please enter your Github username: " user | |
read -p "Please enter your 6 digit two-factor-authentication code: " otp_code | |
curl -u "$user" -H "X-Github-OTP: $otp_code" -d '{"scopes":["repo", "public_repo"], "note":"Creating Labels"}' "https://api.github.com/authorizations" | jq -r '.token' > .token | |
fi | |
TOKEN=$(cat .token) | |
read -p "Who owns the repo you want labels on?: " owner | |
read -p "What repo do you want labels on?: " repo | |
for K in "${!LABELS[@]}"; do | |
CURL_OUTPUT=$(curl -s -H "Authorization: token $TOKEN" -X POST "https://api.github.com/repos/$owner/$repo/labels" -d "{\"name\":\"$K\", \"color\":\"${LABELS[$K]}\"}") | |
HAS_ERROR=$(echo "$CURL_OUTPUT" | jq -r '.errors') | |
if [ ! -z "$HAS_ERROR" ]; then | |
ERROR=$(echo "$CURL_OUTPUT" | jq -r '.errors[0].code') | |
if [ "$ERROR" == "already_exists" ]; then | |
# We update | |
echo "'$K' already exists. Updating..." | |
CURL_OUTPUT=$(curl -s -H "Authorization: token $TOKEN" -X PATCH "https://api.github.com/repos/$owner/$repo/labels/${K/ /%20}" -d "{\"name\":\"$K\", \"color\":\"${LABELS[$K]}\"}") | |
else | |
echo "Unknown error: $ERROR" | |
echo "Output from curl: " | |
echo "$CURL_OUTPUT" | |
echo "Exiting..." | |
exit; | |
fi | |
else | |
echo "Created '$K'." | |
fi | |
done |
@ChrisTerBeke This script might be full of errors for all I know 😏 It was thrown together rather quickly. What's even better is that I get this:
bash-4.3$ man declare
No manual entry for declare
but as @arianf says, I am running bash < 4.0.
@arianf Yes, if there's an error, and that error isn't already_exists
, then it's a more "serious" error, which this script doesn't handle, thus it exits.
I made some modifications because I was having trouble with the token creation and error notifications, here's my edited version:
https://gist.github.com/Chompas/fb158eb01204d03f783d
Thanks for creating this script. Couple of issues:
- As well as installing bash 4, you may need to install jq - https://stedolan.github.io/jq/download/.
- The script was having trouble retrieving the personal access token from GitHub so I had to manually copy it into the .token file.
All working beautifully now. Thanks again!
I had an issue that caused the script to exit on each creation of a label. It ran without errors when updating. I was able to fix it by replacing line 71 with
HAS_ERROR=$(echo "$CURL_OUTPUT" | jq 'has("errors")')
and then using
if [ "$HAS_ERROR" = true ]; then
on line 73.
I forked it here: https://gist.github.com/MatthiasKunnen/b7c4f812ddc6a8bb217160ab4f048e0c.
Shame it doesn't work for Gitlab! Do you think that would be an easy thing to add?
Looks great, how would that work if you had users who didn't have 2FA enabled?
Also there is an error with this code.
If
$ERROR
is not equal toalready_exists
... the program will exit... prematurely.