fastlane 2.9.0 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/cert/lib/cert/options.rb +11 -1
- data/cert/lib/cert/runner.rb +11 -3
- data/credentials_manager/lib/credentials_manager/account_manager.rb +1 -1
- data/credentials_manager/lib/credentials_manager/appfile_config.rb +2 -2
- data/fastlane/README.md +1 -1
- data/fastlane/lib/assets/completions/completion.bash +3 -1
- data/fastlane/lib/assets/completions/completion.sh +4 -1
- data/fastlane/lib/assets/completions/completion.zsh +2 -0
- data/fastlane/lib/fastlane/actions/actions_helper.rb +2 -2
- data/fastlane/lib/fastlane/actions/clipboard.rb +1 -1
- data/fastlane/lib/fastlane/actions/deploygate.rb +2 -2
- data/fastlane/lib/fastlane/actions/ipa.rb +2 -2
- data/fastlane/lib/fastlane/actions/sonar.rb +10 -3
- data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +1 -1
- data/fastlane/lib/fastlane/actions/xcodebuild.rb +23 -6
- data/fastlane/lib/fastlane/documentation/docs_generator.rb +1 -1
- data/fastlane/lib/fastlane/fast_file.rb +2 -2
- data/fastlane/lib/fastlane/lane_manager.rb +5 -2
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +2 -0
- data/fastlane/lib/fastlane/runner.rb +1 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +1 -1
- data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +2 -2
- data/fastlane_core/lib/fastlane_core/print_table.rb +6 -0
- data/frameit/lib/frameit/strings_parser.rb +1 -1
- data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +3 -0
- data/gym/lib/gym/generators/build_command_generator.rb +1 -0
- data/gym/lib/gym/options.rb +6 -1
- data/pem/README.md +1 -1
- data/scan/lib/scan/options.rb +14 -2
- data/scan/lib/scan/test_command_generator.rb +3 -2
- data/screengrab/lib/screengrab/options.rb +11 -1
- data/screengrab/lib/screengrab/runner.rb +48 -23
- data/sigh/lib/assets/resign.sh +75 -37
- data/sigh/lib/sigh/runner.rb +29 -9
- data/snapshot/lib/assets/SnapshotHelper.swift +4 -0
- data/snapshot/lib/assets/SnapshotHelper2-3.swift +4 -0
- data/snapshot/lib/snapshot/dependency_checker.rb +1 -1
- data/snapshot/lib/snapshot/options.rb +6 -0
- data/snapshot/lib/snapshot/runner.rb +15 -0
- data/spaceship/lib/spaceship/client.rb +1 -1
- data/spaceship/lib/spaceship/portal/certificate.rb +2 -1
- data/spaceship/lib/spaceship/portal/device.rb +3 -1
- data/spaceship/lib/spaceship/portal/portal_client.rb +2 -2
- data/spaceship/lib/spaceship/portal/provisioning_profile.rb +4 -2
- metadata +2 -2
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/bin/bash --login
|
2
|
+
# shellcheck disable=SC2155
|
3
|
+
# shellcheck disable=SC1090
|
2
4
|
|
3
5
|
# Originally from, https://stackoverflow.com/questions/33041109
|
4
6
|
# Modified to work in RVM and non RVM environments
|
@@ -21,6 +23,7 @@
|
|
21
23
|
# -----
|
22
24
|
|
23
25
|
which rvm > /dev/null
|
26
|
+
# shellcheck disable=SC2181
|
24
27
|
if [[ $? -eq 0 ]]; then
|
25
28
|
echo "RVM detected, forcing to use system ruby"
|
26
29
|
# This allows you to use rvm in a script. Otherwise you get a BS
|
@@ -71,6 +71,7 @@ module Gym
|
|
71
71
|
pipe << " --no-color" if Helper.colors_disabled?
|
72
72
|
pipe << " --formatter " if formatter
|
73
73
|
pipe << formatter if formatter
|
74
|
+
pipe << "--utf" if Gym.config[:xcpretty_utf]
|
74
75
|
report_output_junit = Gym.config[:xcpretty_report_junit]
|
75
76
|
report_output_html = Gym.config[:xcpretty_report_html]
|
76
77
|
report_output_json = Gym.config[:xcpretty_report_json]
|
data/gym/lib/gym/options.rb
CHANGED
@@ -248,7 +248,12 @@ module Gym
|
|
248
248
|
optional: true,
|
249
249
|
verify_block: proc do |value|
|
250
250
|
UI.user_error!("Report output location not found at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
251
|
-
end)
|
251
|
+
end),
|
252
|
+
FastlaneCore::ConfigItem.new(key: :xcpretty_utf,
|
253
|
+
env_name: "XCPRETTY_UTF",
|
254
|
+
description: "Have xcpretty use unicode encoding when reporting builds",
|
255
|
+
optional: true,
|
256
|
+
is_string: false)
|
252
257
|
]
|
253
258
|
end
|
254
259
|
end
|
data/pem/README.md
CHANGED
@@ -114,7 +114,7 @@ To get a list of available options run:
|
|
114
114
|
### Note about empty `p12` passwords and Keychain Access.app
|
115
115
|
|
116
116
|
`pem` will produce a valid `p12` without specifying a password, or using the empty-string as the password.
|
117
|
-
While the file is valid, Mac
|
117
|
+
While the file is valid, the Mac's Keychain Access will not allow you to open the file without specifying a passphrase.
|
118
118
|
|
119
119
|
Instead, you may verify the file is valid using OpenSSL:
|
120
120
|
|
data/scan/lib/scan/options.rb
CHANGED
@@ -63,11 +63,23 @@ module Scan
|
|
63
63
|
FastlaneCore::ConfigItem.new(key: :code_coverage,
|
64
64
|
description: "Should generate code coverage (Xcode 7 only)?",
|
65
65
|
is_string: false,
|
66
|
-
|
66
|
+
optional: true),
|
67
67
|
FastlaneCore::ConfigItem.new(key: :address_sanitizer,
|
68
68
|
description: "Should turn on the address sanitizer?",
|
69
69
|
is_string: false,
|
70
|
-
|
70
|
+
optional: true,
|
71
|
+
conflicting_options: [:thread_sanitizer],
|
72
|
+
conflict_block: proc do |value|
|
73
|
+
UI.user_error!("You can't use 'address_sanitizer' and 'thread_sanitizer' options in one run")
|
74
|
+
end),
|
75
|
+
FastlaneCore::ConfigItem.new(key: :thread_sanitizer,
|
76
|
+
description: "Should turn on the thread sanitizer?",
|
77
|
+
is_string: false,
|
78
|
+
optional: true,
|
79
|
+
conflicting_options: [:address_sanitizer],
|
80
|
+
conflict_block: proc do |value|
|
81
|
+
UI.user_error!("You can't use 'thread_sanitizer' and 'address_sanitizer' options in one run")
|
82
|
+
end),
|
71
83
|
FastlaneCore::ConfigItem.new(key: :skip_build,
|
72
84
|
description: "Should skip debug build before test build?",
|
73
85
|
short_option: "-r",
|
@@ -35,8 +35,9 @@ module Scan
|
|
35
35
|
options << destination # generated in `detect_values`
|
36
36
|
options << "-derivedDataPath '#{config[:derived_data_path]}'" if config[:derived_data_path]
|
37
37
|
options << "-resultBundlePath '#{result_bundle_path}'" if config[:result_bundle]
|
38
|
-
options << "-enableCodeCoverage YES"
|
39
|
-
options << "-enableAddressSanitizer YES"
|
38
|
+
options << "-enableCodeCoverage #{config[:code_coverage] ? 'YES' : 'NO'}" unless config[:code_coverage].nil?
|
39
|
+
options << "-enableAddressSanitizer #{config[:address_sanitizer] ? 'YES' : 'NO'}" unless config[:address_sanitizer].nil?
|
40
|
+
options << "-enableThreadSanitizer #{config[:thread_sanitizer] ? 'YES' : 'NO'}" unless config[:thread_sanitizer].nil?
|
40
41
|
options << "-xcconfig '#{config[:xcconfig]}'" if config[:xcconfig]
|
41
42
|
options << config[:xcargs] if config[:xcargs]
|
42
43
|
|
@@ -61,6 +61,12 @@ module Screengrab
|
|
61
61
|
short_option: "-l",
|
62
62
|
type: Array,
|
63
63
|
description: "Only run tests in these Java classes"),
|
64
|
+
FastlaneCore::ConfigItem.new(key: :launch_arguments,
|
65
|
+
env_name: 'SCREENGRAB_LAUNCH_ARGUMENTS',
|
66
|
+
optional: true,
|
67
|
+
short_option: "-e",
|
68
|
+
type: Array,
|
69
|
+
description: "Additional launch arguments"),
|
64
70
|
FastlaneCore::ConfigItem.new(key: :test_instrumentation_runner,
|
65
71
|
env_name: 'SCREENGRAB_TEST_INSTRUMENTATION_RUNNER',
|
66
72
|
optional: true,
|
@@ -106,7 +112,11 @@ module Screengrab
|
|
106
112
|
FastlaneCore::ConfigItem.new(key: :exit_on_test_failure,
|
107
113
|
env_name: 'EXIT_ON_TEST_FAILURE',
|
108
114
|
description: "Whether or not to exit Screengrab on test failure. Exiting on failure will not copy sceenshots to local machine nor open sceenshots summary",
|
109
|
-
default_value: true)
|
115
|
+
default_value: true),
|
116
|
+
FastlaneCore::ConfigItem.new(key: :reinstall_app,
|
117
|
+
env_name: 'SCREENGRAB_REINSTALL_APP',
|
118
|
+
description: "Enabling this option will automatically uninstall the application before running it",
|
119
|
+
default_value: false)
|
110
120
|
]
|
111
121
|
end
|
112
122
|
end
|
@@ -63,11 +63,7 @@ module Screengrab
|
|
63
63
|
|
64
64
|
validate_apk(app_apk_path)
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
grant_permissions(device_serial)
|
69
|
-
|
70
|
-
run_tests(device_serial, test_classes_to_use, test_packages_to_use)
|
66
|
+
run_tests(device_serial, app_apk_path, tests_apk_path, test_classes_to_use, test_packages_to_use, @config[:launch_arguments])
|
71
67
|
|
72
68
|
number_of_screenshots = pull_screenshots_from_device(device_serial, device_screenshots_paths, device_type_dir_name)
|
73
69
|
|
@@ -189,6 +185,20 @@ module Screengrab
|
|
189
185
|
UI.user_error! "Tests APK could not be installed" if apk_install_output.include?("Failure [")
|
190
186
|
end
|
191
187
|
|
188
|
+
def uninstall_apks(device_serial, app_package_name, tests_package_name)
|
189
|
+
UI.message 'Uninstalling app APK'
|
190
|
+
apk_uninstall_output = run_adb_command("adb -s #{device_serial} uninstall #{app_package_name}",
|
191
|
+
print_all: true,
|
192
|
+
print_command: true)
|
193
|
+
UI.user_error! "App APK could not be uninstalled" if apk_uninstall_output.include?("Failure [")
|
194
|
+
|
195
|
+
UI.message 'Uninstalling tests APK'
|
196
|
+
apk_uninstall_output = run_adb_command("adb -s #{device_serial} uninstall -r #{tests_package_name}",
|
197
|
+
print_all: true,
|
198
|
+
print_command: true)
|
199
|
+
UI.user_error! "Tests APK could not be uninstalled" if apk_uninstall_output.include?("Failure [")
|
200
|
+
end
|
201
|
+
|
192
202
|
def grant_permissions(device_serial)
|
193
203
|
UI.message 'Granting the permission necessary to change locales on the device'
|
194
204
|
run_adb_command("adb -s #{device_serial} shell pm grant #{@config[:app_package_name]} android.permission.CHANGE_CONFIGURATION",
|
@@ -210,26 +220,41 @@ module Screengrab
|
|
210
220
|
end
|
211
221
|
end
|
212
222
|
|
213
|
-
def run_tests(device_serial, test_classes_to_use, test_packages_to_use)
|
223
|
+
def run_tests(device_serial, app_apk_path, tests_apk_path, test_classes_to_use, test_packages_to_use, launch_arguments)
|
224
|
+
unless @config[:reinstall_app]
|
225
|
+
install_apks(device_serial, app_apk_path, tests_apk_path)
|
226
|
+
grant_permissions(device_serial)
|
227
|
+
end
|
228
|
+
|
214
229
|
@config[:locales].each do |locale|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
"-e endingLocale #{@config[:ending_locale].tr('-', '_')}"]
|
220
|
-
instrument_command << "-e class #{test_classes_to_use.join(',')}" if test_classes_to_use
|
221
|
-
instrument_command << "-e package #{test_packages_to_use.join(',')}" if test_packages_to_use
|
222
|
-
instrument_command << "#{@config[:tests_package_name]}/#{@config[:test_instrumentation_runner]}"
|
223
|
-
|
224
|
-
test_output = run_adb_command(instrument_command.join(" \\\n"),
|
225
|
-
print_all: true,
|
226
|
-
print_command: true)
|
227
|
-
|
228
|
-
if @config[:exit_on_test_failure]
|
229
|
-
UI.user_error!("Tests failed", show_github_issues: false) if test_output.include?("FAILURES!!!")
|
230
|
-
else
|
231
|
-
UI.error("Tests failed") if test_output.include?("FAILURES!!!")
|
230
|
+
if @config[:reinstall_app]
|
231
|
+
uninstall_apks(device_serial, @config[:app_package_name], @config[:tests_package_name])
|
232
|
+
install_apks(device_serial, app_apk_path, tests_apk_path)
|
233
|
+
grant_permissions(device_serial)
|
232
234
|
end
|
235
|
+
run_tests_for_locale(locale, device_serial, test_classes_to_use, test_packages_to_use, launch_arguments)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def run_tests_for_locale(locale, device_serial, test_classes_to_use, test_packages_to_use, launch_arguments)
|
240
|
+
UI.message "Running tests for locale: #{locale}"
|
241
|
+
|
242
|
+
instrument_command = ["adb -s #{device_serial} shell am instrument --no-window-animation -w",
|
243
|
+
"-e testLocale #{locale.tr('-', '_')}",
|
244
|
+
"-e endingLocale #{@config[:ending_locale].tr('-', '_')}"]
|
245
|
+
instrument_command << "-e class #{test_classes_to_use.join(',')}" if test_classes_to_use
|
246
|
+
instrument_command << "-e package #{test_packages_to_use.join(',')}" if test_packages_to_use
|
247
|
+
instrument_command << launch_arguments.map { |item| '-e ' + item }.join(' ') if launch_arguments
|
248
|
+
instrument_command << "#{@config[:tests_package_name]}/#{@config[:test_instrumentation_runner]}"
|
249
|
+
|
250
|
+
test_output = run_adb_command(instrument_command.join(" \\\n"),
|
251
|
+
print_all: true,
|
252
|
+
print_command: true)
|
253
|
+
|
254
|
+
if @config[:exit_on_test_failure]
|
255
|
+
UI.user_error!("Tests failed", show_github_issues: false) if test_output.include?("FAILURES!!!")
|
256
|
+
else
|
257
|
+
UI.error("Tests failed") if test_output.include?("FAILURES!!!")
|
233
258
|
end
|
234
259
|
end
|
235
260
|
|
data/sigh/lib/assets/resign.sh
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/bin/bash
|
2
|
+
# shellcheck disable=SC2155
|
2
3
|
|
3
4
|
# Copyright (c) 2011 Float Mobile Learning
|
4
5
|
# http://www.floatlearning.com/
|
@@ -65,7 +66,7 @@
|
|
65
66
|
log() {
|
66
67
|
# Make sure it returns 0 code even when verose mode is off (test 1)
|
67
68
|
# To use like [[ condition ]] && log "x" && something
|
68
|
-
[[ -n "$VERBOSE" ]]
|
69
|
+
if [[ -n "$VERBOSE" ]]; then echo -e "$@"; else test 1; fi
|
69
70
|
}
|
70
71
|
|
71
72
|
error() {
|
@@ -79,6 +80,7 @@ warning() {
|
|
79
80
|
|
80
81
|
function checkStatus {
|
81
82
|
|
83
|
+
# shellcheck disable=SC2181
|
82
84
|
if [ $? -ne 0 ];
|
83
85
|
then
|
84
86
|
error "Encountered an error, aborting!"
|
@@ -86,7 +88,7 @@ function checkStatus {
|
|
86
88
|
}
|
87
89
|
|
88
90
|
usage() {
|
89
|
-
echo -e "Usage: $(basename $0) source identity -p|--provisioning provisioning" >&2
|
91
|
+
echo -e "Usage: $(basename "$0") source identity -p|--provisioning provisioning" >&2
|
90
92
|
echo -e "\t\t[-e|--entitlements entitlements]" >&2
|
91
93
|
echo -e "\t\t[-k|--keychain keychain]" >&2
|
92
94
|
echo -e "\t\t[-d|--display-name displayName]" >&2
|
@@ -96,7 +98,7 @@ usage() {
|
|
96
98
|
echo -e "\t\t[-b|--bundle-id bundleId]" >&2
|
97
99
|
echo -e "\t\t[--use-app-entitlements]" >&2
|
98
100
|
echo -e "\t\toutputIpa" >&2
|
99
|
-
echo "Usage: $(basename $0) -h|--help" >&2
|
101
|
+
echo "Usage: $(basename "$0") -h|--help" >&2
|
100
102
|
echo "Options:" >&2
|
101
103
|
echo -e "\t-p, --provisioning provisioning\t\tProvisioning profile option, may be provided multiple times." >&2
|
102
104
|
echo -e "\t\t\t\t\t\tYou can specify provisioning profile file name." >&2
|
@@ -224,7 +226,7 @@ then
|
|
224
226
|
fi
|
225
227
|
|
226
228
|
# Log the options
|
227
|
-
for provision in ${RAW_PROVISIONS[@]}; do
|
229
|
+
for provision in "${RAW_PROVISIONS[@]}"; do
|
228
230
|
if [[ "$provision" =~ .+=.+ ]]; then
|
229
231
|
log "Specified provisioning profile: '${provision#*=}' for bundle identifier: '${provision%%=*}'"
|
230
232
|
else
|
@@ -291,15 +293,17 @@ fi
|
|
291
293
|
# check the keychain
|
292
294
|
if [ "${KEYCHAIN}" != "" ];
|
293
295
|
then
|
294
|
-
security list-keychains -s $KEYCHAIN
|
295
|
-
security unlock $KEYCHAIN
|
296
|
-
security default-keychain -s $KEYCHAIN
|
296
|
+
security list-keychains -s "$KEYCHAIN"
|
297
|
+
security unlock "$KEYCHAIN"
|
298
|
+
security default-keychain -s "$KEYCHAIN"
|
297
299
|
fi
|
298
300
|
|
299
301
|
# Set the app name
|
300
302
|
# In Payload directory may be another file except .app file, such as StoreKit folder.
|
301
303
|
# Search the first .app file within the Payload directory
|
302
|
-
|
304
|
+
# TODO: Replace with glob or call to 'find'; and remove shellcheck directive
|
305
|
+
# shellcheck disable=SC2010
|
306
|
+
APP_NAME=$(ls "$TEMP_DIR/Payload/" | grep ".app$" | head -1)
|
303
307
|
|
304
308
|
# Make sure that PATH includes the location of the PlistBuddy helper tool as its location is not standard
|
305
309
|
export PATH=$PATH:/usr/libexec
|
@@ -308,6 +312,7 @@ export PATH=$PATH:/usr/libexec
|
|
308
312
|
# The first one may contain the wildcard character '*', in which case pattern matching will be used unless the third parameter is "STRICT"
|
309
313
|
function does_bundle_id_match {
|
310
314
|
|
315
|
+
# shellcheck disable=SC2049
|
311
316
|
if [[ "$1" == "$2" ]]; then
|
312
317
|
return 0
|
313
318
|
elif [[ "$3" != STRICT && "$1" =~ \* ]]; then
|
@@ -335,7 +340,7 @@ function provision_for_bundle_id {
|
|
335
340
|
# Find the bundle identifier contained inside a provisioning profile
|
336
341
|
function bundle_id_for_provison {
|
337
342
|
|
338
|
-
local FULL_BUNDLE_ID
|
343
|
+
local FULL_BUNDLE_ID=$(PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin <<< "$(security cms -D -i "$1")")
|
339
344
|
checkStatus
|
340
345
|
echo "${FULL_BUNDLE_ID#*.}"
|
341
346
|
}
|
@@ -346,7 +351,7 @@ function add_provision_for_bundle_id {
|
|
346
351
|
local PROVISION="$1"
|
347
352
|
local BUNDLE_ID="$2"
|
348
353
|
|
349
|
-
local CURRENT_PROVISION
|
354
|
+
local CURRENT_PROVISION=$(provision_for_bundle_id "$BUNDLE_ID" STRICT)
|
350
355
|
|
351
356
|
if [[ "$CURRENT_PROVISION" != "" && "$CURRENT_PROVISION" != "$PROVISION" ]]; then
|
352
357
|
error "Conflicting provisioning profiles '$PROVISION' and '$CURRENT_PROVISION' for bundle identifier '$BUNDLE_ID'."
|
@@ -371,7 +376,7 @@ function add_provision {
|
|
371
376
|
error "Provisioning profile '$PROVISION' file does not exist"
|
372
377
|
fi
|
373
378
|
|
374
|
-
local BUNDLE_ID
|
379
|
+
local BUNDLE_ID=$(bundle_id_for_provison "$PROVISION")
|
375
380
|
add_provision_for_bundle_id "$PROVISION" "$BUNDLE_ID"
|
376
381
|
}
|
377
382
|
|
@@ -405,9 +410,9 @@ function resign {
|
|
405
410
|
cp -f "$APP_PATH/Info.plist" "$TEMP_DIR/oldInfo.plist"
|
406
411
|
|
407
412
|
# Read in current values from the app
|
408
|
-
local CURRENT_NAME
|
409
|
-
local CURRENT_BUNDLE_IDENTIFIER
|
410
|
-
local NEW_PROVISION
|
413
|
+
local CURRENT_NAME=$(PlistBuddy -c "Print :CFBundleDisplayName" "$APP_PATH/Info.plist")
|
414
|
+
local CURRENT_BUNDLE_IDENTIFIER=$(PlistBuddy -c "Print :CFBundleIdentifier" "$APP_PATH/Info.plist")
|
415
|
+
local NEW_PROVISION=$(provision_for_bundle_id "${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}")
|
411
416
|
|
412
417
|
if [[ "$NEW_PROVISION" == "" && "$NESTED" != NESTED ]]; then
|
413
418
|
NEW_PROVISION="$DEFAULT_PROVISION"
|
@@ -422,10 +427,11 @@ function resign {
|
|
422
427
|
error "Use the -p option (example: -p com.example.app=xxxx.mobileprovision)"
|
423
428
|
fi
|
424
429
|
|
425
|
-
local PROVISION_BUNDLE_IDENTIFIER
|
430
|
+
local PROVISION_BUNDLE_IDENTIFIER=$(bundle_id_for_provison "$NEW_PROVISION")
|
426
431
|
|
427
432
|
# Use provisioning profile's bundle identifier
|
428
433
|
if [ "$BUNDLE_IDENTIFIER" == "" ]; then
|
434
|
+
# shellcheck disable=SC2049
|
429
435
|
if [[ "$PROVISION_BUNDLE_IDENTIFIER" =~ \* ]]; then
|
430
436
|
log "Bundle Identifier contains a *, using the current bundle identifier"
|
431
437
|
BUNDLE_IDENTIFIER="$CURRENT_BUNDLE_IDENTIFIER"
|
@@ -447,7 +453,7 @@ function resign {
|
|
447
453
|
if [ "${DISPLAY_NAME}" != "${CURRENT_NAME}" ];
|
448
454
|
then
|
449
455
|
log "Changing display name from '$CURRENT_NAME' to '$DISPLAY_NAME'"
|
450
|
-
|
456
|
+
PlistBuddy -c "Set :CFBundleDisplayName $DISPLAY_NAME" "$APP_PATH/Info.plist"
|
451
457
|
fi
|
452
458
|
fi
|
453
459
|
|
@@ -456,10 +462,10 @@ function resign {
|
|
456
462
|
security cms -D -i "$NEW_PROVISION" > "$TEMP_DIR/profile.plist"
|
457
463
|
checkStatus
|
458
464
|
|
459
|
-
APP_IDENTIFIER_PREFIX
|
465
|
+
APP_IDENTIFIER_PREFIX=$(PlistBuddy -c "Print :Entitlements:application-identifier" "$TEMP_DIR/profile.plist" | grep -E '^[A-Z0-9]*' -o | tr -d '\n')
|
460
466
|
if [ "$APP_IDENTIFIER_PREFIX" == "" ];
|
461
467
|
then
|
462
|
-
APP_IDENTIFIER_PREFIX
|
468
|
+
APP_IDENTIFIER_PREFIX=$(PlistBuddy -c "Print :ApplicationIdentifierPrefix:0" "$TEMP_DIR/profile.plist")
|
463
469
|
if [ "$APP_IDENTIFIER_PREFIX" == "" ];
|
464
470
|
then
|
465
471
|
error "Failed to extract any app identifier prefix from '$NEW_PROVISION'"
|
@@ -473,10 +479,10 @@ function resign {
|
|
473
479
|
# Set new app identifer prefix if such entry exists in plist file
|
474
480
|
PlistBuddy -c "Set :AppIdentifierPrefix $APP_IDENTIFIER_PREFIX." "$APP_PATH/Info.plist" 2>/dev/null
|
475
481
|
|
476
|
-
TEAM_IDENTIFIER
|
482
|
+
TEAM_IDENTIFIER=$(PlistBuddy -c "Print :Entitlements:com.apple.developer.team-identifier" "$TEMP_DIR/profile.plist" | tr -d '\n')
|
477
483
|
if [ "$TEAM_IDENTIFIER" == "" ];
|
478
484
|
then
|
479
|
-
TEAM_IDENTIFIER
|
485
|
+
TEAM_IDENTIFIER=$(PlistBuddy -c "Print :TeamIdentifier:0" "$TEMP_DIR/profile.plist")
|
480
486
|
if [ "$TEAM_IDENTIFIER" == "" ];
|
481
487
|
then
|
482
488
|
warning "Failed to extract team identifier from '$NEW_PROVISION', resigned ipa may fail on iOS 8 and higher"
|
@@ -497,19 +503,19 @@ function resign {
|
|
497
503
|
if [ "$CURRENT_BUNDLE_IDENTIFIER" != "$BUNDLE_IDENTIFIER" ];
|
498
504
|
then
|
499
505
|
log "Updating the bundle identifier from '$CURRENT_BUNDLE_IDENTIFIER' to '$BUNDLE_IDENTIFIER'"
|
500
|
-
|
506
|
+
PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_IDENTIFIER" "$APP_PATH/Info.plist"
|
501
507
|
checkStatus
|
502
508
|
fi
|
503
509
|
|
504
510
|
# Update the version number properties in the Info.plist if a version number has been provided
|
505
511
|
if [ "$VERSION_NUMBER" != "" ];
|
506
512
|
then
|
507
|
-
CURRENT_VERSION_NUMBER
|
513
|
+
CURRENT_VERSION_NUMBER=$(PlistBuddy -c "Print :CFBundleVersion" "$APP_PATH/Info.plist")
|
508
514
|
if [ "$VERSION_NUMBER" != "$CURRENT_VERSION_NUMBER" ];
|
509
515
|
then
|
510
516
|
log "Updating the version from '$CURRENT_VERSION_NUMBER' to '$VERSION_NUMBER'"
|
511
|
-
|
512
|
-
|
517
|
+
PlistBuddy -c "Set :CFBundleVersion $VERSION_NUMBER" "$APP_PATH/Info.plist"
|
518
|
+
PlistBuddy -c "Set :CFBundleShortVersionString $VERSION_NUMBER" "$APP_PATH/Info.plist"
|
513
519
|
fi
|
514
520
|
fi
|
515
521
|
|
@@ -545,7 +551,7 @@ function resign {
|
|
545
551
|
do
|
546
552
|
if [[ "$framework" == *.framework || "$framework" == *.dylib ]]
|
547
553
|
then
|
548
|
-
/usr/bin/codesign ${VERBOSE} ${KEYCHAIN_FLAG} -f -s "$CERTIFICATE" "$framework"
|
554
|
+
/usr/bin/codesign ${VERBOSE} "${KEYCHAIN_FLAG}" -f -s "$CERTIFICATE" "$framework"
|
549
555
|
checkStatus
|
550
556
|
else
|
551
557
|
log "Ignoring non-framework: $framework"
|
@@ -555,20 +561,21 @@ function resign {
|
|
555
561
|
|
556
562
|
# Check for and update bundle identifiers for extensions and associated nested apps
|
557
563
|
log "Fixing nested app and extension references"
|
558
|
-
for key in ${NESTED_APP_REFERENCE_KEYS[@]}; do
|
564
|
+
for key in "${NESTED_APP_REFERENCE_KEYS[@]}"; do
|
559
565
|
# Check if Info.plist has a reference to another app or extension
|
560
|
-
REF_BUNDLE_ID
|
566
|
+
REF_BUNDLE_ID=$(PlistBuddy -c "Print ${key}" "$APP_PATH/Info.plist" 2>/dev/null)
|
561
567
|
if [ -n "$REF_BUNDLE_ID" ];
|
562
568
|
then
|
563
569
|
# Found a reference bundle id, now get the corresponding provisioning profile for this bundle id
|
564
|
-
REF_PROVISION
|
570
|
+
REF_PROVISION=$(provision_for_bundle_id "$REF_BUNDLE_ID")
|
565
571
|
# Map to the new bundle id
|
566
|
-
NEW_REF_BUNDLE_ID
|
572
|
+
NEW_REF_BUNDLE_ID=$(bundle_id_for_provison "$REF_PROVISION")
|
567
573
|
# Change if not the same and if doesn't contain wildcard
|
574
|
+
# shellcheck disable=SC2049
|
568
575
|
if [[ "$REF_BUNDLE_ID" != "$NEW_REF_BUNDLE_ID" ]] && ! [[ "$NEW_REF_BUNDLE_ID" =~ \* ]];
|
569
576
|
then
|
570
577
|
log "Updating nested app or extension reference for ${key} key from ${REF_BUNDLE_ID} to ${NEW_REF_BUNDLE_ID}"
|
571
|
-
|
578
|
+
PlistBuddy -c "Set ${key} $NEW_REF_BUNDLE_ID" "$APP_PATH/Info.plist"
|
572
579
|
fi
|
573
580
|
fi
|
574
581
|
done
|
@@ -578,7 +585,7 @@ function resign {
|
|
578
585
|
if [ -n "$APP_IDENTIFIER_PREFIX" ];
|
579
586
|
then
|
580
587
|
# sanity check the 'application-identifier' is present in the provided entitlements and matches the provisioning profile value
|
581
|
-
ENTITLEMENTS_APP_ID_PREFIX
|
588
|
+
ENTITLEMENTS_APP_ID_PREFIX=$(PlistBuddy -c "Print :application-identifier" "$ENTITLEMENTS" | grep -E '^[A-Z0-9]*' -o | tr -d '\n')
|
582
589
|
if [ "$ENTITLEMENTS_APP_ID_PREFIX" == "" ];
|
583
590
|
then
|
584
591
|
error "Provided entitlements file is missing a value for the required 'application-identifier' key"
|
@@ -591,7 +598,7 @@ function resign {
|
|
591
598
|
if [ -n "$TEAM_IDENTIFIER" ];
|
592
599
|
then
|
593
600
|
# sanity check the 'com.apple.developer.team-identifier' is present in the provided entitlements and matches the provisioning profile value
|
594
|
-
ENTITLEMENTS_TEAM_IDENTIFIER
|
601
|
+
ENTITLEMENTS_TEAM_IDENTIFIER=$(PlistBuddy -c "Print :com.apple.developer.team-identifier" "$ENTITLEMENTS" | tr -d '\n')
|
595
602
|
if [ "$ENTITLEMENTS_TEAM_IDENTIFIER" == "" ];
|
596
603
|
then
|
597
604
|
error "Provided entitlements file is missing a value for the required 'com.apple.developer.team-identifier' key"
|
@@ -670,9 +677,9 @@ function resign {
|
|
670
677
|
"keychain-access-groups|APP_ID")
|
671
678
|
|
672
679
|
# Loop over all the entitlement keys that need to be transferred from app entitlements
|
673
|
-
for RULE in ${ENTITLEMENTS_TRANSFER_RULES[@]}; do
|
674
|
-
KEY=$(echo $RULE | cut -d'|' -f1)
|
675
|
-
ID_TYPE=$(echo $RULE | cut -d'|' -f2)
|
680
|
+
for RULE in "${ENTITLEMENTS_TRANSFER_RULES[@]}"; do
|
681
|
+
KEY=$(echo "$RULE" | cut -d'|' -f1)
|
682
|
+
ID_TYPE=$(echo "$RULE" | cut -d'|' -f2)
|
676
683
|
|
677
684
|
# Get the entry from app's entitlements
|
678
685
|
# Read it with PlistBuddy as XML, then strip the header and <plist></plist> part
|
@@ -691,7 +698,9 @@ function resign {
|
|
691
698
|
# Add new entry to patched entitlements
|
692
699
|
# plutil needs dots in the key path to be escaped (e.g. com\.apple\.security\.application-groups)
|
693
700
|
# otherwise it interprets they key path as nested keys
|
694
|
-
|
701
|
+
# TODO: Should be able to replace with echo ${KEY//\./\\\\.} and remove shellcheck disable directive
|
702
|
+
# shellcheck disable=SC2001
|
703
|
+
PLUTIL_KEY=$(echo "$KEY" | sed 's/\./\\\\./g')
|
695
704
|
plutil -insert "$PLUTIL_KEY" -xml "$ENTITLEMENTS_VALUE" "$PATCHED_ENTITLEMENTS"
|
696
705
|
|
697
706
|
# Patch the ID value if specified
|
@@ -715,6 +724,33 @@ function resign {
|
|
715
724
|
log "Replacing old bundle ID '$OLD_BUNDLE_ID' with new bundle ID '$NEW_BUNDLE_ID' in patched entitlements"
|
716
725
|
sed -i .bak "s/$OLD_BUNDLE_ID/$NEW_BUNDLE_ID/g" "$PATCHED_ENTITLEMENTS"
|
717
726
|
|
727
|
+
log "Removing blacklisted keys from patched profile"
|
728
|
+
# See https://github.com/facebook/buck/issues/798 and https://github.com/facebook/buck/pull/802/files
|
729
|
+
BLACKLISTED_KEYS=(\
|
730
|
+
"com.apple.developer.icloud-container-development-container-identifiers" \
|
731
|
+
"com.apple.developer.icloud-container-environment" \
|
732
|
+
"com.apple.developer.icloud-container-identifiers" \
|
733
|
+
"com.apple.developer.icloud-services" \
|
734
|
+
"com.apple.developer.restricted-resource-mode" \
|
735
|
+
"com.apple.developer.ubiquity-container-identifiers" \
|
736
|
+
"com.apple.developer.ubiquity-kvstore-identifier" \
|
737
|
+
"inter-app-audio" \
|
738
|
+
"com.apple.developer.homekit" \
|
739
|
+
"com.apple.developer.healthkit" \
|
740
|
+
"com.apple.developer.in-app-payments" \
|
741
|
+
"com.apple.developer.associated-domains" \
|
742
|
+
"com.apple.security.application-groups" \
|
743
|
+
"com.apple.developer.maps" \
|
744
|
+
"com.apple.developer.networking.vpn.api" \
|
745
|
+
"com.apple.external-accessory.wireless-configuration"
|
746
|
+
)
|
747
|
+
|
748
|
+
# Blacklisted keys must not be included into new profile, so remove them from patched profile
|
749
|
+
for KEY in "${BLACKLISTED_KEYS[@]}"; do
|
750
|
+
log "Removing blacklisted key: $KEY"
|
751
|
+
PlistBuddy -c "Delete $KEY" "$PATCHED_ENTITLEMENTS" 2>/dev/null
|
752
|
+
done
|
753
|
+
|
718
754
|
log "Resigning application using certificate: '$CERTIFICATE'"
|
719
755
|
log "and patched entitlements:"
|
720
756
|
log "$(cat "$PATCHED_ENTITLEMENTS")"
|
@@ -728,7 +764,7 @@ function resign {
|
|
728
764
|
log "Resigning application using certificate: '$CERTIFICATE'"
|
729
765
|
log "and entitlements from provisioning profile: $NEW_PROVISION"
|
730
766
|
cp -- "$TEMP_DIR/newEntitlements" "$APP_PATH/archived-expanded-entitlements.xcent"
|
731
|
-
/usr/bin/codesign ${VERBOSE} ${KEYCHAIN_FLAG} -f -s "$CERTIFICATE" --entitlements "$TEMP_DIR/newEntitlements" "$APP_PATH"
|
767
|
+
/usr/bin/codesign ${VERBOSE} "${KEYCHAIN_FLAG}" -f -s "$CERTIFICATE" --entitlements "$TEMP_DIR/newEntitlements" "$APP_PATH"
|
732
768
|
checkStatus
|
733
769
|
fi
|
734
770
|
|
@@ -762,6 +798,8 @@ log "Repackaging as $NEW_FILE"
|
|
762
798
|
# Zip all the contents, saving the zip file in the above directory
|
763
799
|
# Navigate back to the orignating directory (sending the output to null)
|
764
800
|
pushd "$TEMP_DIR" > /dev/null
|
801
|
+
# TODO: Fix shellcheck warning and remove directive
|
802
|
+
# shellcheck disable=SC2035
|
765
803
|
zip -qry "../$TEMP_DIR.ipa" *
|
766
804
|
popd > /dev/null
|
767
805
|
|