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 " 
128+ releaseNotes+=$' \r \n\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}" $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 " $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 " $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 " $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 " " Content-Type: application/octet-stream" " $filename " $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