#!/usr/bin/env bash
#
# Author: Stefan Buck
# License: MIT
# https://gist.github.com/stefanbuck/ce788fee19ab6eb0b4447a85fc99f447
#
#
# This script accepts the following parameters:
#
# * owner
# * repo
# * tag
# * filename
# * github_api_token
#
# Script to upload a release asset using the GitHub API v3.
#
# Example:
#
# upload-github-release-asset.sh github_api_token=TOKEN owner=stefanbuck repo=playground tag=v0.1.0 filename=./build.zip
#

# Check dependencies.
set -ex
xargs=$(which gxargs || which xargs)

# Validate settings.
[ "${TRACE}" ] && set -x

CONFIG=$@

for line in ${CONFIG}; do
  eval "${line}"
done

# Define variables.
GH_API="https://api.github.com"
GH_REPO="${GH_API}/repos/${owner}/${repo}"
GH_RELEASES="${GH_REPO}/releases"
GH_TAGS="${GH_REPO}/releases/tags/${tag}"
AUTH="Authorization: token ${github_api_token}"
WGET_ARGS="--content-disposition --auth-no-challenge --no-cookie"
CURL_ARGS="-LJO#"

if [[ "${tag}" == 'LATEST' ]]; then
  GH_TAGS="${GH_REPO}/releases/latest"
fi

# Validate token.
curl -o /dev/null -sH "${AUTH}" ${GH_REPO} || { echo "Error: Invalid repo, token or network issue!";  exit 1; }

curl -H "${AUTH}" "${GH_RELEASES}" -d "{
    \"tag_name\": \"${tag}\",
    \"target_commitish\": \"master\",
    \"name\": \"Canari ${tag}\",
    \"body\": \"**Change log:**\",
    \"draft\": false,
    \"prerelease\": false
}" || { echo "Error: Unable to create tagged release";  exit 1; }

# Read asset tags.
response=$(curl -sH "${AUTH}" ${GH_TAGS})

# Get ID of the asset based on given filename.
eval $(echo "${response}" | grep -m 1 "id.:" | grep -w id | tr : = | tr -cd '[[:alnum:]]=')
[ "${id}" ] || { echo "Error: Failed to get release id for tag: ${tag}"; echo "${response}" | awk 'length($0)<100' >&2; exit 1; }

# Upload asset
echo "Uploading asset... "

# Construct url
GH_ASSET="https://uploads.github.com/repos/${owner}/${repo}/releases/${id}/assets?name=$(basename ${filename})"

curl --data-binary @"${filename}" -H "${AUTH}" -H "Content-Type: application/octet-stream" ${GH_ASSET}
