aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/github-release.sh
blob: b8f6dbad50c36c715fc203f3a94372fe78d8dade (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env sh
#
# Author: Hsieh Chin Fan (typebrook) <typebrook@gmail.com>
# License: MIT
# https://gist.github.com/typebrook/4947769e266173303d8848f496e272c9
#
# Originally created by stefanbuck
# fork from: https://gist.github.com/stefanbuck/ce788fee19ab6eb0b4447a85fc99f447
#
# --
# This script manages a release note or its asset with GitHub API v3.
# It accepts the following parameters:
#
# * repo
# * tag
# * type (asset or edit)
# * filename
# * github_api_token
# * action (optional, could be upload, overwrite, rename, delete, default to be upload)
# * extra  (optional, new filename for action 'rename')
#
# Example:
#
# # Upload a file as asset. If there is a asset with the same filename, then overwrite it.
# github-release.sh github_api_token=TOKEN repo=stefanbuck/playground tag=v0.1.0 type=asset filename=./build.zip overwrite=true
#
# # Edit a release note with file content
# github-release.sh github_api_token=TOKEN repo=stefanbuck/playground tag=v0.1.0 type=edit filename=note

# Check dependencies.
set -e

# 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/$repo"
GH_TAGS="$GH_REPO/releases/tags/$tag"
AUTH="Authorization: token $github_api_token"

if [ "$tag" = 'LATEST' ]; then
  GH_TAGS="$GH_REPO/releases/latest"
fi
if [ "$type" = '' ]; then
  sed -E -n -e ' /^$/ q; /# --/,$ s/^# *//p' "$0"
  exit 0
fi

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

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

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

post_asset() {
  # Upload asset
  echo "Uploading asset... "
  # Construct url
  GH_ASSET="https://uploads.github.com/repos/$repo/releases/$release_id/assets?name=$(basename $1)"

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

rename_asset() {
  echo "Renaming asset($1) from $2 to $3"
  curl -X PATCH -H "$AUTH" -H "Content-Type: application/json" \
    --data "{\"name\":\"$3\"}" "$GH_REPO/releases/assets/$1"
}

delete_asset() {
  echo "Deleting asset($1)... "
  curl -X "DELETE" -H "$AUTH" "$GH_REPO/releases/assets/$1"
}

upload_asset() {
  # Get ID of the asset based on given filename.
  # If exists, delete it.
  eval $(echo "$response" | grep -C2 "\"name\": \"$(basename $filename)\"" | grep -m 1 "id.:" | grep -w id | tr : = | tr -cd '[[:alnum:]]=' | sed 's/id/asset_id/')
  if [ "$asset_id" = ""  ]; then
    echo "No need to overwrite asset"
    post_asset $filename
  else
    if [ "$action" = "overwrite" ]; then
      new_asset_id=$(post_asset "bak_$filename" | sed -E 's/^\{[^{]+"id":([0-9]+).+$/\1/')
      [ "$new_asset_id" = "" ] && exit 1 || delete_asset "$asset_id"

      rename_asset "$new_asset_id" "bak_$filename" "$filename"
    elif [ "$action" = "rename" ]; then
      rename_asset "$asset_id" "$filename" "$extra"
    elif [ "$action" = "delete" ]; then
      delete_asset "$asset_id"
      exit 0
    else
      echo "File already exists on tag $tag"
      echo "If you want to overwrite it, set action=overwrite"
      exit 1
    fi
  fi
}

edit_release() {
  GH_RELEASE="$GH_REPO/releases/$release_id"
  body=$(cat <<EOF
{
  "tag_name": "$tag",
  "target_commitish": "master",
  "name": "daily-taiwan-pbf",
  "body": "$(cat $filename | sed 's/"/\\"/g; $! s/$/\\n/' | tr -d '\n')",
  "draft": false,
  "prerelease": false
}
EOF
  )
  curl -X PATCH -H "$AUTH" -H "Content-Type: application/json" -d "$body" $GH_RELEASE
}

case $type in
  asset) upload_asset;;
  edit) edit_release;;
  *) echo "type should be 'asset' or 'edit'";;
esac