fastlane-plugin-waldo 1.6.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 930bf4de096a32ef717f5f4e9a488cf85e13ec1a8c58058ace10ebf583948302
4
- data.tar.gz: 1d044beebccaaf38e426370990f046fd3fbc59d08d657bccfa8321cf757fa733
3
+ metadata.gz: 2fe9bf2266ddb25b5f97e60900275c9619e8dedd8723e1ac14bbb6c37939ae2a
4
+ data.tar.gz: dae94679633cfcafc9a71bf5e683ed9097af91619df4443d00b6bf879b927089
5
5
  SHA512:
6
- metadata.gz: df074478d0982a2851bc5d2e936859d5843735002dfb505bd12c60a3e5db091618894db725d0734a23540b4106ff254134534b42e2a3f003301429bd4fd52cb2
7
- data.tar.gz: 533d8fae7a307686e93af2908bc11d3e858f8b6f8cd7ef1136e97851873e425103bf7a85015ce455989685147d7222075289cfe82e724fa8e3762bf54e61e2c9
6
+ metadata.gz: e93282d73cf4d764db41e40727265447b1b5feb7830bda0b2d7d4643826595a748f186336efa3cf5f30a890e637054a042283f78edd865e8c5cb569608b1db27
7
+ data.tar.gz: e22adde22bef309cd6cb43ed6b9bd58b80f3ff43785c0c28cfa04b1bf70d5d111f78dea00b104df6bea3105b8023854fcbf101570cd0e5e520dd1c3b4f104efa
data/README.md CHANGED
@@ -22,26 +22,6 @@ which allows you to upload an iOS or Android build to Waldo for processing.
22
22
  To get started, first obtain an upload token from Waldo for your app. These are
23
23
  used to authenticate with the Waldo backend on each call.
24
24
 
25
- ### Uploading an iOS Device Build
26
-
27
- Build a new IPA for your app. If you use `gym` (aka `build_ios_app`) to build
28
- your IPA, `waldo` will automatically find and upload the generated IPA.
29
-
30
- ```ruby
31
- gym(export_method: 'development') # or 'ad-hoc'
32
- waldo(upload_token: '0123456789abcdef0123456789abcdef')
33
- ```
34
-
35
- > **Note:** You _must_ specify the Waldo upload token.
36
-
37
- If you do _not_ use `gym` to build your IPA, you will need to explicitly
38
- specify the IPA path to `waldo`:
39
-
40
- ```ruby
41
- waldo(ipa_path: '/path/to/YourApp.ipa',
42
- upload_token: '0123456789abcdef0123456789abcdef')
43
- ```
44
-
45
25
  ### Uploading an iOS Simulator Build
46
26
 
47
27
  Create a new simulator build for your app.
@@ -58,19 +38,53 @@ gym(configuration: 'Release',
58
38
  destination: 'generic/platform=iOS Simulator')
59
39
  ```
60
40
 
61
- You can then find your app relative to the derived data path in the
62
- `./Build/Products/Release-iphonesimulator` directory.
41
+ You can then find your app (and associated symbols) relative to the derived
42
+ data path:
43
+
44
+ ```ruby
45
+ app_path = File.join(derived_data_path,
46
+ 'Build',
47
+ 'Products',
48
+ 'ReleaseSim-iphonesimulator',
49
+ 'YourApp.app')
50
+ ```
63
51
 
64
52
  Regardless of how you create the actual simulator build for your app, the
65
53
  upload itself is very simple:
66
54
 
67
55
  ```ruby
68
- waldo(app_path: '/path/to/YourApp.app',
69
- upload_token: '0123456789abcdef0123456789abcdef')
56
+ waldo(upload_token: '0123456789abcdef0123456789abcdef',
57
+ app_path: '/path/to/YourApp.app',
58
+ include_symbols: true)
59
+ ```
60
+
61
+ > **Note:** You _must_ specify _both_ the Waldo upload token _and_ the path of
62
+ > the `.app`. The `include_symbols` parameter is optional but we highly
63
+ > recommend supplying it.
64
+
65
+ ### Uploading an iOS Device Build
66
+
67
+ Build a new IPA for your app. If you use `gym` (aka `build_ios_app`) to build
68
+ your IPA, `waldo` will automatically find and upload the generated IPA.
69
+
70
+ ```ruby
71
+ gym(export_method: 'ad-hoc') # or 'development'
72
+
73
+ waldo(upload_token: '0123456789abcdef0123456789abcdef',
74
+ dsym_path: lane_context[SharedValues::DSYM_OUTPUT_PATH])
70
75
  ```
71
76
 
72
- > **Note:** You _must_ specify _both_ the path of the `.app` _and_ the Waldo
73
- > upload token.
77
+ > **Note:** You _must_ specify the Waldo upload token. The `dsym_path`
78
+ > parameter is optional but we highly recommend supplying it.
79
+
80
+ If you do _not_ use `gym` to build your IPA, you will need to explicitly
81
+ specify the IPA path to `waldo`:
82
+
83
+ ```ruby
84
+ waldo(upload_token: '0123456789abcdef0123456789abcdef',
85
+ ipa_path: '/path/to/YourApp.ipa',
86
+ dsym_path: '/path/to/YourApp.app.dSYM.zip')
87
+ ```
74
88
 
75
89
  ### Uploading an Android Build
76
90
 
@@ -80,6 +94,7 @@ will automatically find and upload the generated APK.
80
94
  ```ruby
81
95
  gradle(task: 'assemble',
82
96
  build_type: 'Release')
97
+
83
98
  waldo(upload_token: '0123456789abcdef0123456789abcdef')
84
99
  ```
85
100
 
@@ -89,8 +104,8 @@ If you do _not_ use `gradle` to build your APK, you will need to explicitly
89
104
  specify the APK path to `waldo`:
90
105
 
91
106
  ```ruby
92
- waldo(apk_path: '/path/to/YourApp.apk',
93
- upload_token: '0123456789abcdef0123456789abcdef')
107
+ waldo(upload_token: '0123456789abcdef0123456789abcdef',
108
+ apk_path: '/path/to/YourApp.apk')
94
109
  ```
95
110
 
96
111
  ## Issues and Feedback
@@ -4,13 +4,10 @@ module Fastlane
4
4
  def self.run(params)
5
5
  mparams = Helper::WaldoHelper.filter_parameters(params)
6
6
 
7
- return unless Helper::WaldoHelper.validate_parameters(mparams)
8
-
9
7
  FastlaneCore::PrintTable.print_values(config: mparams,
10
8
  title: "Summary for waldo #{Fastlane::Waldo::VERSION.to_s}")
11
9
 
12
- Helper::WaldoHelper.upload_build
13
- Helper::WaldoHelper.upload_symbols
10
+ Helper::WaldoHelper.upload_build_with_symbols(mparams)
14
11
  end
15
12
 
16
13
  def self.authors
@@ -0,0 +1,672 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -eu -o pipefail
4
+
5
+ waldo_api_build_endpoint=${WALDO_API_BUILD_ENDPOINT:-https://api.waldo.io/versions}
6
+ waldo_api_error_endpoint=${WALDO_API_ERROR_ENDPOINT:-https://api.waldo.io/uploadError}
7
+ waldo_api_symbols_endpoint=${WALDO_API_SYMBOLS_ENDPOINT:-https://api.waldo.io/versions/__ID__/symbols}
8
+ waldo_user_agent_override=${WALDO_USER_AGENT_OVERRIDE:-}
9
+
10
+ waldo_cli_version="1.6.6"
11
+
12
+ waldo_build_flavor=""
13
+ waldo_build_path=""
14
+ waldo_build_payload_path=""
15
+ waldo_build_suffix=""
16
+ waldo_build_upload_id=""
17
+ waldo_extra_args="--show-error --silent"
18
+ waldo_history=""
19
+ waldo_history_error=""
20
+ waldo_include_symbols=false
21
+ waldo_platform=""
22
+ waldo_symbols_path=""
23
+ waldo_symbols_payload_path=""
24
+ waldo_symbols_suffix=""
25
+ waldo_upload_token=""
26
+ waldo_variant_name=""
27
+ waldo_working_path=""
28
+
29
+ function abs_path() {
30
+ local _rel_path=$1
31
+
32
+ [[ -n $_rel_path ]] || _rel_path="."
33
+
34
+ case "$_rel_path" in
35
+ .) pwd ;;
36
+ ..) (unset CDPATH && cd .. &>/dev/null && pwd) ;;
37
+ /*) echo $_rel_path ;;
38
+ *) local _dirname=$(dirname "$_rel_path")
39
+
40
+ _dirname=$(unset CDPATH && cd "$_dirname" &>/dev/null && pwd)
41
+
42
+ if [[ -n $_dirname ]]; then
43
+ echo ${_dirname}/$(basename "$_rel_path")
44
+ else
45
+ echo $_rel_path
46
+ fi
47
+ ;;
48
+ esac
49
+ }
50
+
51
+ function check_build_path() {
52
+ [[ -n $waldo_build_path ]] || fail_usage "Missing required argument: ‘path’"
53
+
54
+ waldo_build_path=$(abs_path "$waldo_build_path")
55
+ waldo_build_suffix=${waldo_build_path##*.}
56
+
57
+ case $waldo_build_suffix in
58
+ apk) waldo_build_flavor="Android" ;;
59
+ app|ipa) waldo_build_flavor="iOS" ;;
60
+ *) fail "File extension of build at ‘${waldo_build_path}’ is not recognized" ;;
61
+ esac
62
+ }
63
+
64
+ function check_build_status() {
65
+ local _response=$1
66
+
67
+ local _status_regex='"status":([0-9]+)'
68
+
69
+ if [[ $_response =~ $_status_regex ]]; then
70
+ local _status=${BASH_REMATCH[1]}
71
+
72
+ if (( $_status == 401 )); then
73
+ fail "Upload token is invalid or missing!"
74
+ elif (( $_status < 200 || $_status > 299 )); then
75
+ fail "Unable to upload build to Waldo, HTTP status: $_status"
76
+ fi
77
+ fi
78
+
79
+ local _id_regex='"id":"(appv-[0-9a-f]+)"'
80
+
81
+ if [[ $_response =~ $_id_regex ]]; then
82
+ waldo_build_upload_id=${BASH_REMATCH[1]}
83
+ fi
84
+ }
85
+
86
+ function check_history() {
87
+ if [[ -z $(which base64) ]]; then
88
+ waldo_history_error="noBase64CommandFound"
89
+ elif [[ -z $(which git) ]]; then
90
+ waldo_history_error="noGitCommandFound"
91
+ elif [[ -z $(which grep) ]]; then
92
+ waldo_history_error="noGrepCommandFound"
93
+ elif [[ -z $(which sed) ]]; then
94
+ waldo_history_error="noSedCommandFound"
95
+ elif [[ -z $(which tr) ]]; then
96
+ waldo_history_error="noTrCommandFound"
97
+ elif ! git rev-parse >& /dev/null; then
98
+ waldo_history_error="notGitRepository"
99
+ else
100
+ waldo_history=$(get_history)
101
+ fi
102
+ }
103
+
104
+ function check_platform() {
105
+ if [[ -z $(which curl) ]]; then
106
+ fail "No ‘curl’ command found"
107
+ fi
108
+ }
109
+
110
+ function check_symbols_path() {
111
+ case $waldo_build_suffix in
112
+ app)
113
+ if [[ -z $waldo_symbols_path && $waldo_include_symbols == true ]]; then
114
+ waldo_symbols_path=$(find_symbols_path)
115
+ fi
116
+ ;;
117
+ ipa) ;;
118
+ *) waldo_symbols_path="" ;; # not applicable
119
+ esac
120
+
121
+ [[ -n $waldo_symbols_path ]] || return 0
122
+
123
+ waldo_symbols_path=$(abs_path "$waldo_symbols_path")
124
+ waldo_symbols_suffix=${waldo_symbols_path##*.}
125
+
126
+ case $waldo_symbols_suffix in
127
+ dSYM|xcarchive|zip) ;; # OK
128
+ *) fail "File extension of symbols at ‘${waldo_symbols_path}’ is not recognized" ;;
129
+ esac
130
+ }
131
+
132
+ function check_symbols_status() {
133
+ local _response=$1
134
+
135
+ local _status_regex='"status":([0-9]+)'
136
+
137
+ if [[ $_response =~ $_status_regex ]]; then
138
+ local _status=${BASH_REMATCH[1]}
139
+
140
+ if (( $_status == 401 )); then
141
+ fail "Upload token is invalid or missing!"
142
+ elif (( $_status < 200 || $_status > 299 )); then
143
+ fail "Unable to upload symbols to Waldo, HTTP status: $_status"
144
+ fi
145
+ fi
146
+ }
147
+
148
+ function check_upload_token() {
149
+ [[ -n $waldo_upload_token ]] || waldo_upload_token=${WALDO_UPLOAD_TOKEN:-}
150
+ [[ -n $waldo_upload_token ]] || fail_usage "Missing required option: ‘--upload_token’"
151
+ }
152
+
153
+ function check_variant_name() {
154
+ [[ -n $waldo_variant_name ]] || waldo_variant_name=${WALDO_VARIANT_NAME:-}
155
+ }
156
+
157
+ function convert_sha() {
158
+ local _full_sha=$1
159
+ local _full_name=$(git name-rev --refs='heads/*' --name-only "$_full_sha")
160
+ local _abbr_sha=${_full_sha:0:7}
161
+ local _abbr_name=$_full_name
162
+ local _prefix="remotes/origin/"
163
+
164
+ if [[ ${_full_name:0:${#_prefix}} == $_prefix ]]; then
165
+ _abbr_name=${_full_name#$_prefix}
166
+ else
167
+ _abbr_name="local:${_full_name}"
168
+ fi
169
+
170
+ echo "${_abbr_sha}-${_abbr_name}"
171
+ }
172
+
173
+ function convert_shas() {
174
+ local _list=
175
+
176
+ while (( $# )); do
177
+ local _item=$(convert_sha "$1")
178
+
179
+ _list+=",\"${_item}\""
180
+
181
+ shift
182
+ done
183
+
184
+ echo ${_list#?}
185
+ }
186
+
187
+ function create_build_payload() {
188
+ local _parent_path=$(dirname "$waldo_build_path")
189
+ local _build_name=$(basename "$waldo_build_path")
190
+
191
+ case $waldo_build_suffix in
192
+ app)
193
+ ([[ -d $waldo_build_path && -r $waldo_build_path ]]) \
194
+ || fail "Unable to read build at ‘${waldo_build_path}’"
195
+
196
+ if [[ -z $(which zip) ]]; then
197
+ fail "No ‘zip’ command found"
198
+ fi
199
+
200
+ waldo_build_payload_path="$waldo_working_path"/"$_build_name".zip
201
+
202
+ (cd "$_parent_path" &>/dev/null && zip -qry "$waldo_build_payload_path" "$_build_name") || return
203
+ ;;
204
+
205
+ *)
206
+ ([[ -f $waldo_build_path && -r $waldo_build_path ]]) \
207
+ || fail "Unable to read build at ‘${waldo_build_path}’"
208
+
209
+ waldo_build_payload_path=$waldo_build_path
210
+ ;;
211
+ esac
212
+ }
213
+
214
+ function create_symbols_payload() {
215
+ [[ -n $waldo_symbols_path ]] || return 0
216
+
217
+ local _parent_path=$(dirname "$waldo_symbols_path")
218
+ local _symbols_name=$(basename "$waldo_symbols_path")
219
+
220
+ case $waldo_symbols_suffix in
221
+ dSYM)
222
+ ([[ -d $waldo_symbols_path && -r $waldo_symbols_path ]]) \
223
+ || fail "Unable to read symbols at ‘${waldo_symbols_path}’"
224
+
225
+ if [[ -z $(which zip) ]]; then
226
+ fail "No ‘zip’ command found"
227
+ fi
228
+
229
+ waldo_symbols_payload_path="$waldo_working_path"/"$_symbols_name".zip
230
+
231
+ (cd "$_parent_path" &>/dev/null && zip -qry "$waldo_symbols_payload_path" "$_symbols_name") || return
232
+ ;;
233
+
234
+ xcarchive)
235
+ ([[ -d $waldo_symbols_path && -r $waldo_symbols_path ]]) \
236
+ || fail "Unable to read symbols at ‘${waldo_symbols_path}’"
237
+
238
+ if [[ -z $(which zip) ]]; then
239
+ fail "No ‘zip’ command found"
240
+ fi
241
+
242
+ local _tmp_symbols_path="$waldo_working_path"/"$_symbols_name"
243
+
244
+ mkdir -p "$_tmp_symbols_path"
245
+
246
+ cp -r "$waldo_symbols_path"/BCSymbolMaps "$_tmp_symbols_path"
247
+ cp -r "$waldo_symbols_path"/dSYMs "$_tmp_symbols_path"
248
+
249
+ waldo_symbols_payload_path="$_tmp_symbols_path".zip
250
+
251
+ (cd "$waldo_working_path" &>/dev/null && zip -qry "$waldo_symbols_payload_path" "$_symbols_name") || return
252
+ ;;
253
+
254
+ *)
255
+ ([[ -f $waldo_symbols_path && -r $waldo_symbols_path ]]) \
256
+ || fail "Unable to read symbols at ‘${waldo_symbols_path}’"
257
+
258
+ waldo_symbols_payload_path=$waldo_symbols_path
259
+ ;;
260
+ esac
261
+ }
262
+
263
+ function create_working_path() {
264
+ waldo_working_path=/tmp/WaldoCLI-$$
265
+
266
+ rm -rf "$waldo_working_path"
267
+ mkdir -p "$waldo_working_path"
268
+ }
269
+
270
+ function curl_upload_build() {
271
+ local _output_path="$1"
272
+ local _authorization=$(get_authorization)
273
+ local _content_type=$(get_build_content_type)
274
+ local _user_agent=$(get_user_agent)
275
+ local _url=$(make_build_url)
276
+
277
+ curl $waldo_extra_args \
278
+ --data-binary @"$waldo_build_payload_path" \
279
+ --header "Authorization: $_authorization" \
280
+ --header "Content-Type: $_content_type" \
281
+ --header "User-Agent: $_user_agent" \
282
+ --output "$_output_path" \
283
+ "$_url"
284
+
285
+ local _curl_status=$?
286
+
287
+ if (( $_curl_status != 0 )); then
288
+ fail "Unable to upload build to Waldo, curl error: ${_curl_status}, url: ${_url}"
289
+ fi
290
+ }
291
+
292
+ function curl_upload_error() {
293
+ local _message=$(json_escape "$1")
294
+ local _ci=$(get_ci)
295
+ local _authorization=$(get_authorization)
296
+ local _content_type=$(get_error_content_type)
297
+ local _user_agent=$(get_user_agent)
298
+ local _url=$(make_error_url)
299
+
300
+ curl --silent \
301
+ --data "{\"message\":\"${_message}\",\"ci\":\"${_ci}\"}" \
302
+ --header "Authorization: $_authorization" \
303
+ --header "Content-Type: $_content_type" \
304
+ --header "User-Agent: $_user_agent" \
305
+ "$_url" &>/dev/null
306
+ }
307
+
308
+ function curl_upload_symbols() {
309
+ local _output_path="$1"
310
+ local _authorization=$(get_authorization)
311
+ local _content_type=$(get_symbols_content_type)
312
+ local _user_agent=$(get_user_agent)
313
+ local _url=$(make_symbols_url)
314
+
315
+ curl $waldo_extra_args \
316
+ --data-binary @"$waldo_symbols_payload_path" \
317
+ --header "Authorization: $_authorization" \
318
+ --header "Content-Type: $_content_type" \
319
+ --header "User-Agent: $_user_agent" \
320
+ --output "$_output_path" \
321
+ "$_url"
322
+
323
+ local _curl_status=$?
324
+
325
+ if (( $_curl_status != 0 )); then
326
+ fail "Unable to upload symbols to Waldo, curl error: ${_curl_status}, url: ${_url}"
327
+ fi
328
+ }
329
+
330
+ function delete_working_path() {
331
+ if [[ -n $waldo_working_path ]]; then
332
+ rm -rf "$waldo_working_path"
333
+ fi
334
+ }
335
+
336
+ function display_summary() {
337
+ echo ""
338
+ echo "Build path: $(summarize "$waldo_build_path")"
339
+ echo "Symbols path: $(summarize "$waldo_symbols_path")"
340
+ echo "Variant name: $(summarize "$waldo_variant_name")"
341
+ echo "Upload token: $(summarize_secure "$waldo_upload_token")"
342
+ echo ""
343
+
344
+ if [[ $waldo_extra_args == "--verbose" ]]; then
345
+ echo "Build payload path: $(summarize "$waldo_build_payload_path")"
346
+ echo "Symbols payload path: $(summarize "$waldo_symbols_payload_path")"
347
+ echo ""
348
+ fi
349
+ }
350
+
351
+ function display_usage() {
352
+ cat <<EOF
353
+
354
+ OVERVIEW: Upload build to Waldo
355
+
356
+ USAGE: waldo [options] <build-path> [<symbols-path>]
357
+
358
+ OPTIONS:
359
+
360
+ --help Display available options
361
+ --include_symbols Include symbols with the build upload
362
+ --upload_token <value> Waldo upload token (overrides WALDO_UPLOAD_TOKEN)
363
+ --variant_name <value> Waldo variant name (overrides WALDO_VARIANT_NAME)
364
+ --verbose Display extra verbiage
365
+ EOF
366
+ }
367
+
368
+ function display_version() {
369
+ waldo_platform=$(get_platform)
370
+
371
+ echo "Waldo CLI $waldo_cli_version ($waldo_platform)"
372
+ }
373
+
374
+ function fail() {
375
+ local _message="waldo: $1"
376
+
377
+ if [[ -n $waldo_upload_token ]]; then
378
+ curl_upload_error "$1"
379
+
380
+ local _curl_status=$?
381
+
382
+ if (( $_curl_status == 0)); then
383
+ _message+=" -- Waldo team has been informed"
384
+ fi
385
+ fi
386
+
387
+ echo "" # flush stdout
388
+ echo "$_message" 1>&2
389
+ exit 1
390
+ }
391
+
392
+ function fail_usage() {
393
+ [[ -z $waldo_upload_token ]] || curl_upload_error "$1"
394
+
395
+ echo "" # flush stdout
396
+ echo "waldo: $1" 1>&2
397
+ display_usage
398
+ exit 1
399
+ }
400
+
401
+ function find_symbols_path() {
402
+ if [[ -e ${waldo_build_path}.dSYM.zip ]]; then
403
+ echo "${waldo_build_path}.dSYM.zip"
404
+ elif [[ -e ${waldo_build_path}.dSYM ]]; then
405
+ echo "${waldo_build_path}.dSYM"
406
+ fi
407
+ }
408
+
409
+ function get_authorization() {
410
+ echo "Upload-Token $waldo_upload_token"
411
+ }
412
+
413
+ function get_build_content_type() {
414
+ case $waldo_build_suffix in
415
+ app) echo "application/zip" ;;
416
+ *) echo "application/octet-stream" ;;
417
+ esac
418
+ }
419
+
420
+ function get_ci() {
421
+ if [[ -n ${APPCENTER_BUILD_ID:-} ]]; then
422
+ echo "App Center"
423
+ elif [[ ${BITRISE_IO:-false} == true ]]; then
424
+ echo "Bitrise"
425
+ elif [[ -n ${BUDDYBUILD_BUILD_ID:-} ]]; then
426
+ echo "buddybuild"
427
+ elif [[ ${CIRCLECI:-false} == true ]]; then
428
+ echo "CircleCI"
429
+ elif [[ ${GITHUB_ACTIONS:-false} == true ]]; then
430
+ echo "GitHub Actions"
431
+ elif [[ ${TRAVIS:-false} == true ]]; then
432
+ echo "Travis CI"
433
+ else
434
+ echo "CLI"
435
+ fi
436
+ }
437
+
438
+ function get_error_content_type() {
439
+ echo "application/json"
440
+ }
441
+
442
+ function get_history() {
443
+ local _shas=$(git log --format='%H' --skip=$(get_skip_count) -50)
444
+ local _history=$(convert_shas $_shas)
445
+
446
+ echo "[${_history}]" | websafe_base64_encode
447
+ }
448
+
449
+ function get_platform() {
450
+ local _os_name=$(uname -s)
451
+
452
+ case $_os_name in
453
+ Darwin) echo "macOS" ;;
454
+ *) echo "$_os_name" ;;
455
+ esac
456
+ }
457
+
458
+ function get_skip_count() {
459
+ if [[ ${GITHUB_ACTIONS:-false} == true && ${GITHUB_EVENT_NAME:-} == "pull_request" ]]; then
460
+ echo "1"
461
+ else
462
+ echo "0"
463
+ fi
464
+ }
465
+
466
+ function get_symbols_content_type() {
467
+ echo "application/zip"
468
+ }
469
+
470
+ function get_user_agent() {
471
+ if [[ -n $waldo_user_agent_override ]]; then
472
+ echo "$waldo_user_agent_override"
473
+ else
474
+ echo "Waldo $(get_ci)/${waldo_build_flavor} v${waldo_cli_version}"
475
+ fi
476
+ }
477
+
478
+ function json_escape() {
479
+ local _result=${1//\\/\\\\} # \
480
+
481
+ _result=${_result//\//\\\/} # /
482
+ _result=${_result//\'/\\\'} # '
483
+ _result=${_result//\"/\\\"} # "
484
+
485
+ echo "$_result"
486
+ }
487
+
488
+ function make_build_url() {
489
+ local _query=
490
+
491
+ if [[ -n $waldo_history ]]; then
492
+ _query+="&history=$waldo_history"
493
+ fi
494
+
495
+ if [[ -n $waldo_history_error ]]; then
496
+ _query+="&historyError=$waldo_history_error"
497
+ fi
498
+
499
+ if [[ -n $waldo_variant_name ]]; then
500
+ _query+="&variantName=$waldo_variant_name"
501
+ fi
502
+
503
+ if [[ -n $_query ]]; then
504
+ echo "${waldo_api_build_endpoint}?${_query:1}"
505
+ else
506
+ echo "${waldo_api_build_endpoint}"
507
+ fi
508
+ }
509
+
510
+ function make_error_url() {
511
+ echo "${waldo_api_error_endpoint}"
512
+ }
513
+
514
+ function make_symbols_url() {
515
+ echo "${waldo_api_symbols_endpoint/__ID__/$waldo_build_upload_id}"
516
+ }
517
+
518
+ function summarize() {
519
+ local _value=$1
520
+
521
+ if [[ -n $_value ]]; then
522
+ echo "‘${_value}’"
523
+ else
524
+ echo "(none)"
525
+ fi
526
+ }
527
+
528
+ function summarize_secure() {
529
+ local _value=$1
530
+
531
+ if [[ $waldo_extra_args != "--verbose" ]]; then
532
+ local _prefix=${_value:0:6}
533
+ local _suffix_len=$(( ${#_value} - ${#_prefix} ))
534
+ local _secure='********************************'
535
+
536
+ _value="${_prefix}${_secure:0:$_suffix_len}"
537
+ fi
538
+
539
+ summarize "$_value"
540
+ }
541
+
542
+ function upload_build() {
543
+ local _build_name=$(basename "$waldo_build_path")
544
+
545
+ local _response_path=$waldo_working_path/build_response.json
546
+
547
+ echo "Uploading build to Waldo"
548
+
549
+ [[ $waldo_extra_args == "--verbose" ]] && echo ""
550
+
551
+ curl_upload_build "$_response_path"
552
+
553
+ local _curl_status=$?
554
+ local _response=$(cat "$_response_path" 2>/dev/null)
555
+
556
+ if [[ $waldo_extra_args == "--verbose" ]]; then
557
+ echo "$_response"
558
+ echo ""
559
+ fi
560
+
561
+ check_build_status "$_response"
562
+
563
+ if (( $_curl_status == 0 )); then
564
+ echo "Build ‘${_build_name}’ successfully uploaded to Waldo!"
565
+ fi
566
+ }
567
+
568
+ function upload_symbols() {
569
+ [[ -n $waldo_symbols_path ]] || return 0
570
+
571
+ local _symbols_name=$(basename "$waldo_symbols_path")
572
+
573
+ local _response_path=$waldo_working_path/symbols_response.json
574
+
575
+ echo "Uploading symbols to Waldo"
576
+
577
+ [[ $waldo_extra_args == "--verbose" ]] && echo ""
578
+
579
+ curl_upload_symbols "$_response_path"
580
+
581
+ local _curl_status=$?
582
+ local _response=$(cat "$_response_path" 2>/dev/null)
583
+
584
+ if [[ $waldo_extra_args == "--verbose" ]]; then
585
+ echo "$_response"
586
+ echo ""
587
+ fi
588
+
589
+ check_symbols_status "$_response"
590
+
591
+ if (( $_curl_status == 0 )); then
592
+ echo "Symbols in ‘${_symbols_name}’ successfully uploaded to Waldo!"
593
+ fi
594
+ }
595
+
596
+ function websafe_base64_encode() {
597
+ base64 | tr -d '\n' | tr '/+' '_-' | sed 's/=/%3D/g'
598
+ }
599
+
600
+ display_version
601
+
602
+ while (( $# )); do
603
+ case $1 in
604
+ --help)
605
+ display_usage
606
+ exit
607
+ ;;
608
+
609
+ --include_symbols)
610
+ waldo_include_symbols=true
611
+ ;;
612
+
613
+ --upload_token)
614
+ if (( $# < 2 )) || [[ -z $2 || ${2:0:1} == "-" ]]; then
615
+ fail_usage "Missing required value for option: ‘${1}’"
616
+ else
617
+ waldo_upload_token=$2
618
+ shift
619
+ fi
620
+ ;;
621
+
622
+ --variant_name)
623
+ if (( $# < 2 )) || [[ -z $2 || ${2:0:1} == "-" ]]; then
624
+ fail_usage "Missing required value for option: ‘${1}’"
625
+ else
626
+ waldo_variant_name=$2
627
+ shift
628
+ fi
629
+ ;;
630
+
631
+ --verbose)
632
+ waldo_extra_args="--verbose"
633
+ ;;
634
+
635
+ -*)
636
+ fail_usage "Unknown option: ‘${1}’"
637
+ ;;
638
+
639
+ *)
640
+ if [[ -z $waldo_build_path ]]; then
641
+ waldo_build_path=$1
642
+ elif [[ -z $waldo_symbols_path ]]; then
643
+ waldo_symbols_path=$1
644
+ else
645
+ fail_usage "Unknown argument: ‘${1}’"
646
+ fi
647
+ ;;
648
+ esac
649
+
650
+ shift
651
+ done
652
+
653
+ check_platform || exit
654
+ check_build_path || exit
655
+ check_symbols_path || exit
656
+ check_history || exit
657
+ check_upload_token || exit
658
+ check_variant_name || exit
659
+
660
+ create_working_path || exit
661
+
662
+ create_build_payload || exit
663
+ create_symbols_payload || exit
664
+
665
+ display_summary
666
+
667
+ upload_build || exit
668
+ upload_symbols || exit
669
+
670
+ delete_working_path # failure is OK
671
+
672
+ exit