1
1
#! /bin/bash
2
2
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
+
3
9
set -e
4
10
5
11
# Cmdline options
@@ -77,6 +83,7 @@ shopt -u nocasematch
77
83
# other lines: converted to bullets
78
84
# empty lines ignored
79
85
# if '* ' found as a first char pair, it's converted to '- ' to keep bulleting unified
86
+ echo
80
87
echo Preparing release notes
81
88
echo -----------------------
82
89
echo " Tag's message:"
@@ -89,85 +96,124 @@ if [ $arrLen > 3 ]; then
89
96
ind=3
90
97
while [ $ind -lt $arrLen ]; do
91
98
if [ $ind -eq 3 ]; then
92
- releaseNotes=" #### ${msgArray[ind]} \\ n"
99
+ releaseNotes=" #### ${msgArray[ind]} "
100
+ releaseNotes+=$' \r\n '
93
101
else
94
102
oneLine=" $( echo -e " ${msgArray[ind]} " | sed -e ' s/^[[:space:]]*//' ) "
95
103
96
104
if [ ${# oneLine} -gt 0 ]; then
97
105
if [ " ${oneLine: 0: 2} " == " * " ]; then oneLine=$( echo ${oneLine/ \* / -} ) ; fi
98
106
if [ " ${oneLine: 0: 2} " != " - " ]; then releaseNotes+=" - " ; fi
99
- releaseNotes+=" $oneLine \\ n"
107
+ releaseNotes+=" $oneLine "
108
+ releaseNotes+=$' \r\n '
100
109
101
110
# debug output
102
111
echo " ${oneLine} "
103
112
fi
104
113
fi
105
114
let ind=$ind +1
106
115
done
107
- echo " <tag's message end>"
108
116
else
109
- releaseNotes=" #### Release of $varTagName \\ n"
117
+ releaseNotes=" #### Release of $varTagName "
118
+ releaseNotes+=$' \r\n '
110
119
111
120
# debug output
112
121
echo " Release of $varTagName "
113
122
fi
114
123
115
124
# - list of commits (commits.txt must exit in the output dir)
116
125
commitFile=$varAssetsDir /commits.txt
117
- if [ -e " $commitFile " ]; then
126
+ if [ -s " $commitFile " ]; then
118
127
119
- releaseNotes+=" \ \ n##### Commits\\ n "
128
+ releaseNotes+=$' \r \n ##### Commits\r\n '
120
129
121
- # debug output
122
130
echo
123
131
echo " Commits:"
124
132
125
133
IFS=$' \n '
126
134
for next in ` cat $commitFile `
127
135
do
128
136
IFS=' ' 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 "
130
139
131
- # debug output
132
- echo " - [ $commitId ](https://github.com/ $varRepoSlug /commit/ $commitId ) $commitMsg "
140
+ releaseNotes+= " $commitLine "
141
+ releaseNotes+= $' \r\n '
133
142
done
134
143
rm -f $commitFile
135
144
fi
136
145
137
- releaseNotes=$( perl -pe ' s/\r?\n/\\n/' <<< ${releaseNotes} )
138
-
139
146
# 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)
142
154
HTTP_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
+
143
157
HTTP_BODY=$( echo $HTTP_RESPONSE | sed -e ' s/HTTPSTATUS\:.*//g' )
144
158
HTTP_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 "
146
160
147
161
# if the release exists, append/update recent files to its assets vector
148
162
if [ $HTTP_STATUS -eq 200 ]; then
149
163
releaseId=$( echo $HTTP_BODY | jq -r ' .id' )
150
164
echo " - $varTagName release found (id $releaseId )"
151
165
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)
153
169
releaseNotesGH=$( echo $HTTP_BODY | jq -r ' .body' )
154
- releaseNotes=" $releaseNotesGH \\ n$releaseNotes "
155
170
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:"
157
191
158
192
curlData=" {\" 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"
160
196
197
+ curl --data " $curlData " https://api.github.com/repos/$varRepoSlug /releases/$releaseId ? access_token=$varAccessToken
161
198
if [ $? -ne 0 ]; then echo " FAILED: $? => aborting" ; exit 1; fi
162
199
200
+ echo " - $varTagName release record successfully updated"
201
+
163
202
# ... or create a new release record
164
203
else
204
+ releaseNotes=$( json_escape " $releaseNotes " )
205
+ releaseNotes=${releaseNotes: 1:- 1}
206
+
207
+ echo " - release $varTagName not found, creating a new record:"
208
+
165
209
curlData=" {\" tag_name\" : \" $varTagName \" ,\" target_commitish\" : \" master\" ,\" name\" : \" v$varTagName \" ,\" body\" : \" $releaseNotes \" ,\" draft\" : false,\" prerelease\" : $varPrerelease }"
210
+ echo " <data.begin>$curlData <data.end>"
211
+
166
212
# echo "DEBUG: curl --data \"${curlData}\" https://api.github.com/repos/${varRepoSlug}/releases?access_token=$varAccessToken | jq -r '.id'"
167
213
releaseId=$( 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
-
170
214
if [ $? -ne 0 ]; then echo " FAILED: $? => aborting" ; exit 1; fi
215
+
216
+ echo " - $varTagName release record successfully created (id $releaseId )"
171
217
fi
172
218
173
219
# Assets defined by dir contents
@@ -180,19 +226,19 @@ if [ ! -z $varAssetsDir ]; then
180
226
done
181
227
fi
182
228
183
- echo
184
- echo varAssets: $varAssets
185
-
186
229
# Upload additional assets
187
230
if [ ! -z $varAssets ]; then
188
231
echo
189
232
echo " Uploading assets:"
190
233
echo " -----------------"
234
+ echo " Files to upload:"
235
+ echo " $varAssets "
236
+ echo
191
237
192
238
curlAuth=" Authorization: token $varAccessToken "
193
239
for filename in $( echo $varAssets | tr " ;" " \n" )
194
240
do
195
- echo " - ${filename} ... "
241
+ echo " - ${filename} : "
196
242
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 )
197
243
198
244
if [ $? -ne 0 ]; then echo " FAILED: $? => aborting" ; exit 1; fi
@@ -203,8 +249,3 @@ if [ ! -z $varAssets ]; then
203
249
204
250
done
205
251
fi
206
-
207
- echo
208
- echo
209
-
210
-
0 commit comments