Skip to content

Instantly share code, notes, and snippets.

@somangshu
Last active August 25, 2022 12:44
Show Gist options
  • Save somangshu/a03500f35c1301b9a7b6561631f724fc to your computer and use it in GitHub Desktop.
Save somangshu/a03500f35c1301b9a7b6561631f724fc to your computer and use it in GitHub Desktop.
Copy labels from one repo to another
# This script uses the GitHub Labels REST API
# https://developer.github.com/v3/issues/labels/
# Provide a personal access token that can
# access the source and target repositories.
# This is how you authorize with the GitHub API.
# https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line
GH_TOKEN="you personal access token"
# If you use GitHub Enterprise, change this to "https://<your_domain>/api/v3&quot;
GH_DOMAIN="https://api.github.com"
# The source repository whose labels to copy.
SRC_GH_USER="appsmithorg"
SRC_GH_REPO="appsmith"
# The target repository to add or update labels.
TGT_GH_USER="appsmithorg"
TGT_GH_REPO="appsmith-docs"
# ---------------------------------------------------------
# Headers used in curl commands
GH_ACCEPT_HEADER="Accept: application/vnd.github.symmetra-preview+json"
GH_AUTH_HEADER="Authorization: Bearer $GH_TOKEN"
# Bash for-loop over JSON array with jq
# https://starkandwayne.com/blog/bash-for-loop-over-json-array-using-jq/
sourceLabelsJson64=$(curl --silent -H "$GH_ACCEPT_HEADER" -H "$GH_AUTH_HEADER" -X GET ${GH_DOMAIN}/repos/${SRC_GH_USER}/${SRC_GH_REPO}/labels?page_size=100 | jq '[ .[] | { "name": .name, "color": .color, "description": .description } ]' | jq -r '.[] | @base64')
# for each label from source repo,
# invoke github api to create or update
# the label in the target repo
for sourceLabelJson64 in $sourceLabelsJson64; do
# base64 decode the json
sourceLabelJson=$(echo ${sourceLabelJson64} | base64 --decode | jq -r '.')
# try to create the label
# POST /repos/:owner/:repo/labels { name, color, description }
# https://developer.github.com/v3/issues/labels/#create-a-label
createLabelResponse=$(echo $sourceLabelJson | curl --silent -X POST -d @- -H "$GH_ACCEPT_HEADER" -H "$GH_AUTH_HEADER" ${GH_DOMAIN}/repos/${TGT_GH_USER}/${TGT_GH_REPO}/labels)
# if creation failed then the response doesn't include an id and jq returns 'null'
createdLabelId=$(echo $createLabelResponse | jq -r '.id')
# if label wasn't created maybe it's because it already exists, try to update it
if [ "$createdLabelId" == "null" ]
then
updateLabelResponse=$(echo $sourceLabelJson | curl --silent -X PATCH -d @- -H "$GH_ACCEPT_HEADER" -H "$GH_AUTH_HEADER" ${GH_DOMAIN}/repos/${TGT_GH_USER}/${TGT_GH_REPO}/labels/$(echo $sourceLabelJson | jq -r '.name | @uri'))
echo "Update label response:\n"$updateLabelResponse"\n"
else
echo "Create label response:\n"$createLabelResponse"\n"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment