11#! /bin/bash
22
3+
4+ json_escape () {
5+ printf ' %s' " $1 " | python -c ' import json,sys; print(json.dumps(sys.stdin.read()))'
6+ # printf '%s' "$1" | php -r 'echo json_encode(file_get_contents("php://stdin"));'
7+ }
8+
39set -e
410
511# Cmdline options
@@ -77,6 +83,7 @@ shopt -u nocasematch
7783# other lines: converted to bullets
7884# empty lines ignored
7985# if '* ' found as a first char pair, it's converted to '- ' to keep bulleting unified
86+ echo
8087echo Preparing release notes
8188echo -----------------------
8289echo " Tag's message:"
@@ -89,85 +96,124 @@ if [ $arrLen > 3 ]; then
8996ind=3
9097while [ $ind -lt $arrLen ]; do
9198if [ $ind -eq 3 ]; then
92- releaseNotes=" #### ${msgArray[ind]} \\ n"
99+ releaseNotes=" #### ${msgArray[ind]} "
100+ releaseNotes+=$' \r\n '
93101else
94102oneLine=" $( echo -e " ${msgArray[ind]} " | sed -e ' s/^[[:space:]]*//' ) "
95103
96104if [ ${# oneLine} -gt 0 ]; then
97105if [ " ${oneLine: 0: 2} " == " * " ]; then oneLine=$( echo ${oneLine/ \* / -} ) ; fi
98106if [ " ${oneLine: 0: 2} " != " - " ]; then releaseNotes+=" - " ; fi
99- releaseNotes+=" $oneLine \\ n"
107+ releaseNotes+=" $oneLine "
108+ releaseNotes+=$' \r\n '
100109
101110# debug output
102111echo " ${oneLine} "
103112fi
104113fi
105114let ind=$ind +1
106115done
107- echo " <tag's message end>"
108116else
109- releaseNotes=" #### Release of $varTagName \\ n"
117+ releaseNotes=" #### Release of $varTagName "
118+ releaseNotes+=$' \r\n '
110119
111120# debug output
112121echo " Release of $varTagName "
113122fi
114123
115124# - list of commits (commits.txt must exit in the output dir)
116125commitFile=$varAssetsDir /commits.txt
117- if [ -e " $commitFile " ]; then
126+ if [ -s " $commitFile " ]; then
118127
119- releaseNotes+=" \ \ n##### Commits\\ n "
128+ releaseNotes+=$' \r \n ##### Commits\r\n '
120129
121- # debug output
122130echo
123131echo " Commits:"
124132
125133IFS=$' \n '
126134for next in ` cat $commitFile `
127135do
128136IFS=' ' read -r commitId commitMsg <<< " $next"
129- releaseNotes+=" - [$commitId ](https://github.com/$varRepoSlug /commit/$commitId ) $commitMsg \\ n"
137+ commitLine=" - [$commitId ](https://github.com/$varRepoSlug /commit/$commitId ) $commitMsg "
138+ echo " $commitLine "
130139
131- # debug output
132- echo " - [ $commitId ](https://github.com/ $varRepoSlug /commit/ $commitId ) $commitMsg "
140+ releaseNotes+= " $commitLine "
141+ releaseNotes+= $' \r\n '
133142done
134143rm -f $commitFile
135144fi
136145
137- releaseNotes=$( perl -pe ' s/\r?\n/\\n/' <<< ${releaseNotes} )
138-
139146# Check possibly existing release for current tag
140- echo " Checking for possible releases of current tag $varTagName ..."
141- # (eg build invoked by Create New Release GHUI button -> GH default release pack created immediatelly including default assests)
147+ echo
148+ echo " Processing GitHub release record for $varTagName :"
149+ echo " -------------------------------------------------"
150+
151+ echo " - check $varTagName possible existence..."
152+
153+ # (eg build invoked by Create New Release GHUI button -> GH default release pack created immediately including default assests)
142154HTTP_RESPONSE=$( curl -L --silent --write-out " HTTPSTATUS:%{http_code}" https://api.github.com/repos/$varRepoSlug /releases/tags/$varTagName ? access_token=$varAccessToken )
155+ if [ $? -ne 0 ]; then echo " FAILED: $? => aborting" ; exit 1; fi
156+
143157HTTP_BODY=$( echo $HTTP_RESPONSE | sed -e ' s/HTTPSTATUS\:.*//g' )
144158HTTP_STATUS=$( echo $HTTP_RESPONSE | tr -d ' \n' | sed -e ' s/.*HTTPSTATUS://' )
145- echo " HTTP server response code : $HTTP_STATUS "
159+ echo " ---> GitHub server HTTP response: $HTTP_STATUS "
146160
147161# if the release exists, append/update recent files to its assets vector
148162if [ $HTTP_STATUS -eq 200 ]; then
149163releaseId=$( echo $HTTP_BODY | jq -r ' .id' )
150164echo " - $varTagName release found (id $releaseId )"
151165
152- # merge release notes and overwrite pre-release flag. all other attributes remain unchanged
166+ # Merge release notes and overwrite pre-release flag. all other attributes remain unchanged:
167+
168+ # 1. take existing notes from server (added by release creator)
153169releaseNotesGH=$( echo $HTTP_BODY | jq -r ' .body' )
154- releaseNotes=" $releaseNotesGH \\ n$releaseNotes "
155170
156- echo " ... updating release notes and pre-release flag"
171+ # - strip possibly trailing CR
172+ if [ " ${releaseNotesGH: -1} " == $' \r ' ]; then
173+ releaseNotesTemp=" ${releaseNotesGH: 0:- 1} "
174+ else
175+ releaseNotesTemp=" $releaseNotesGH "
176+ fi
177+ # - add CRLF to make relnotes consistent for JSON encoding
178+ releaseNotesTemp+=$' \r\n '
179+
180+ # 2. #append generated relnotes (usually commit oneliners)
181+ releaseNotes=" $releaseNotesTemp$releaseNotes "
182+
183+ # 3. JSON-encode whole string for GH API transfer
184+ releaseNotes=$( json_escape " $releaseNotes " )
185+
186+ # 4. remove extra quotes returned by python (dummy but whatever)
187+ releaseNotes=${releaseNotes: 1:- 1}
188+
189+ # Update current GH release record
190+ echo " - updating release notes and pre-release flag:"
157191
158192curlData=" {\" body\" : \" $releaseNotes \" ,\" prerelease\" : $varPrerelease }"
159- curl --data " $curlData " https://api.github.com/repos/$varRepoSlug /releases/$releaseId ? access_token=$varAccessToken
193+ echo " <data.begin>$curlData <data.end>"
194+ echo
195+ # echo "DEBUG: curl --data \"$curlData\" https://api.github.com/repos/$varRepoSlug/releases/$releaseId?access_token=$varAccessToken"
160196
197+ curl --data " $curlData " https://api.github.com/repos/$varRepoSlug /releases/$releaseId ? access_token=$varAccessToken
161198if [ $? -ne 0 ]; then echo " FAILED: $? => aborting" ; exit 1; fi
162199
200+ echo " - $varTagName release record successfully updated"
201+
163202# ... or create a new release record
164203else
204+ releaseNotes=$( json_escape " $releaseNotes " )
205+ releaseNotes=${releaseNotes: 1:- 1}
206+
207+ echo " - release $varTagName not found, creating a new record:"
208+
165209curlData=" {\" tag_name\" : \" $varTagName \" ,\" target_commitish\" : \" master\" ,\" name\" : \" v$varTagName \" ,\" body\" : \" $releaseNotes \" ,\" draft\" : false,\" prerelease\" : $varPrerelease }"
210+ echo " <data.begin>$curlData <data.end>"
211+
166212# echo "DEBUG: curl --data \"${curlData}\" https://api.github.com/repos/${varRepoSlug}/releases?access_token=$varAccessToken | jq -r '.id'"
167213releaseId=$( curl --data " $curlData " https://api.github.com/repos/$varRepoSlug /releases? access_token=$varAccessToken | jq -r ' .id' )
168- echo " - new release created for $varTagName (id $releaseId )"
169-
170214if [ $? -ne 0 ]; then echo " FAILED: $? => aborting" ; exit 1; fi
215+
216+ echo " - $varTagName release record successfully created (id $releaseId )"
171217fi
172218
173219# Assets defined by dir contents
@@ -180,19 +226,19 @@ if [ ! -z $varAssetsDir ]; then
180226done
181227fi
182228
183- echo
184- echo varAssets: $varAssets
185-
186229# Upload additional assets
187230if [ ! -z $varAssets ]; then
188231echo
189232echo " Uploading assets:"
190233echo " -----------------"
234+ echo " Files to upload:"
235+ echo " $varAssets "
236+ echo
191237
192238curlAuth=" Authorization: token $varAccessToken "
193239for filename in $( echo $varAssets | tr " ;" " \n" )
194240do
195- echo " - ${filename} ... "
241+ echo " - ${filename} : "
196242 curl -X POST -sH " $curlAuth " -H " Content-Type: application/octet-stream" --data-binary @" $filename " https://uploads.github.com/repos/$varRepoSlug /releases/$releaseId /assets? name=$( basename $filename )
197243
198244 if [ $? -ne 0 ]; then echo " FAILED: $? => aborting" ; exit 1; fi
@@ -203,8 +249,3 @@ if [ ! -z $varAssets ]; then
203249
204250done
205251fi
206-
207- echo
208- echo
209-
210-
0 commit comments