#!/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 |
This comment has been minimized.
This comment has been minimized.
@omegahm This is fantastic. Are these colors custom, or the ones that GitHub has pre-defined? |
This comment has been minimized.
This comment has been minimized.
Hi, how to run this script on GitHub? :) |
This comment has been minimized.
This comment has been minimized.
@kevenSuttle These are the colours from the above mentioned link. I took the Google Chrome color picker and put it into the bash script. @hobi You'll have to download it as $ chmod +x create_labels.sh
$ ./create_labels.sh from your terminal. The first time it'll prompt you for a username and a 6 digit 2fa code. Then it'll prompt you for a repo-owner and an actual repo to put these labels on. |
This comment has been minimized.
This comment has been minimized.
I'm getting this:
|
This comment has been minimized.
This comment has been minimized.
You're probably running on bash < 4.0. Associative arrays ( Mac OS X comes with bash 3.2 |
This comment has been minimized.
This comment has been minimized.
Also there is an error with this code. if [ "$ERROR" == "already_exists" ]; then
# some code
else
# else code
exit;
fi If |
This comment has been minimized.
This comment has been minimized.
@ChrisTerBeke This script might be full of errors for all I know 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 |
This comment has been minimized.
This comment has been minimized.
I made some modifications because I was having trouble with the token creation and error notifications, here's my edited version: |
This comment has been minimized.
This comment has been minimized.
Thanks for creating this script. Couple of issues:
All working beautifully now. Thanks again! |
This comment has been minimized.
This comment has been minimized.
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. |
This comment has been minimized.
This comment has been minimized.
Shame it doesn't work for Gitlab! Do you think that would be an easy thing to add? |
This comment has been minimized.
This comment has been minimized.
Looks great, how would that work if you had users who didn't have 2FA enabled? |
This comment has been minimized.
The colours have been taken from https://robinpowered.com/blog/best-practice-system-for-organizing-and-tagging-github-issues/
This of course only works if you are using two-factor-authentication (which you are!)
It also requires
jq
for parsing JSON via cURL.