fastlane 2.104.0 → 2.105.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +61 -61
- data/deliver/lib/deliver/app_screenshot.rb +15 -0
- data/fastlane/lib/fastlane/actions/add_git_tag.rb +1 -1
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +1 -1
- data/fastlane/lib/fastlane/actions/deploygate.rb +11 -4
- data/fastlane/lib/fastlane/actions/hockey.rb +1 -1
- data/fastlane/lib/fastlane/actions/import_from_git.rb +1 -0
- data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
- data/fastlane/lib/fastlane/actions/push_git_tags.rb +7 -2
- data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +11 -2
- data/fastlane/lib/fastlane/actions/tryouts.rb +1 -1
- data/fastlane/lib/fastlane/actions/verify_build.rb +4 -0
- data/fastlane/lib/fastlane/actions/zip.rb +10 -1
- data/fastlane/lib/fastlane/fast_file.rb +1 -1
- data/fastlane/lib/fastlane/runner.rb +1 -1
- data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +1 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +25 -11
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +3 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb +6 -3
- data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +5 -5
- data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +4 -2
- data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +2 -1
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +1 -1
- data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +1 -1
- data/fastlane_core/lib/fastlane_core/core_ext/shellwords.rb +63 -0
- data/fastlane_core/lib/fastlane_core/fastlane_folder.rb +1 -0
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +3 -1
- data/fastlane_core/lib/fastlane_core.rb +1 -0
- data/produce/lib/produce/commands_generator.rb +2 -0
- data/produce/lib/produce/developer_center.rb +1 -0
- data/produce/lib/produce/service.rb +11 -1
- data/scan/lib/scan/options.rb +6 -1
- data/scan/lib/scan/runner.rb +3 -2
- data/scan/lib/scan/test_command_generator.rb +4 -2
- data/scan/lib/scan/xcpretty_reporter_options_generator.rb +8 -2
- data/spaceship/lib/spaceship/du/du_client.rb +4 -0
- data/spaceship/lib/spaceship/portal/certificate.rb +5 -1
- data/spaceship/lib/spaceship/test_flight/test_info.rb +17 -1
- data/spaceship/lib/spaceship/tunes/device_type.rb +1 -1
- data/supply/lib/supply/options.rb +7 -2
- data/supply/lib/supply/uploader.rb +1 -1
- metadata +17 -17
- data/fastlane_core/lib/fastlane_core/.command_executor.rb.swp +0 -0
@@ -1310,7 +1310,8 @@ func deploygate(apiToken: String,
|
|
1310
1310
|
message: String = "No changelog provided",
|
1311
1311
|
distributionKey: String? = nil,
|
1312
1312
|
releaseNote: String? = nil,
|
1313
|
-
disableNotify: Bool = false
|
1313
|
+
disableNotify: Bool = false,
|
1314
|
+
distributionName: String? = nil) {
|
1314
1315
|
let command = RubyCommand(commandID: "", methodName: "deploygate", className: nil, args: [RubyCommand.Argument(name: "api_token", value: apiToken),
|
1315
1316
|
RubyCommand.Argument(name: "user", value: user),
|
1316
1317
|
RubyCommand.Argument(name: "ipa", value: ipa),
|
@@ -1318,7 +1319,8 @@ func deploygate(apiToken: String,
|
|
1318
1319
|
RubyCommand.Argument(name: "message", value: message),
|
1319
1320
|
RubyCommand.Argument(name: "distribution_key", value: distributionKey),
|
1320
1321
|
RubyCommand.Argument(name: "release_note", value: releaseNote),
|
1321
|
-
RubyCommand.Argument(name: "disable_notify", value: disableNotify)
|
1322
|
+
RubyCommand.Argument(name: "disable_notify", value: disableNotify),
|
1323
|
+
RubyCommand.Argument(name: "distribution_name", value: distributionName)])
|
1322
1324
|
_ = runner.executeCommand(command)
|
1323
1325
|
}
|
1324
1326
|
func dotgpgEnvironment(dotgpgFile: String) {
|
@@ -1841,7 +1843,7 @@ func hockey(apk: String? = nil,
|
|
1841
1843
|
uploadDsymOnly: Bool = false,
|
1842
1844
|
ownerId: String? = nil,
|
1843
1845
|
strategy: String = "add",
|
1844
|
-
timeout:
|
1846
|
+
timeout: Int? = nil,
|
1845
1847
|
bypassCdn: Bool = false,
|
1846
1848
|
dsaSignature: String = "") {
|
1847
1849
|
let command = RubyCommand(commandID: "", methodName: "hockey", className: nil, args: [RubyCommand.Argument(name: "apk", value: apk),
|
@@ -2482,11 +2484,13 @@ func pushGitTags(force: Bool = false,
|
|
2482
2484
|
func pushToGitRemote(localBranch: String? = nil,
|
2483
2485
|
remoteBranch: String? = nil,
|
2484
2486
|
force: Bool = false,
|
2487
|
+
forceWithLease: Bool = false,
|
2485
2488
|
tags: Bool = true,
|
2486
2489
|
remote: String = "origin") {
|
2487
2490
|
let command = RubyCommand(commandID: "", methodName: "push_to_git_remote", className: nil, args: [RubyCommand.Argument(name: "local_branch", value: localBranch),
|
2488
2491
|
RubyCommand.Argument(name: "remote_branch", value: remoteBranch),
|
2489
2492
|
RubyCommand.Argument(name: "force", value: force),
|
2493
|
+
RubyCommand.Argument(name: "force_with_lease", value: forceWithLease),
|
2490
2494
|
RubyCommand.Argument(name: "tags", value: tags),
|
2491
2495
|
RubyCommand.Argument(name: "remote", value: remote)])
|
2492
2496
|
_ = runner.executeCommand(command)
|
@@ -2616,6 +2620,7 @@ func runTests(workspace: String? = nil,
|
|
2616
2620
|
buildlogPath: String = "~/Library/Logs/scan",
|
2617
2621
|
includeSimulatorLogs: Bool = false,
|
2618
2622
|
formatter: String? = nil,
|
2623
|
+
xcprettyArgs: String? = nil,
|
2619
2624
|
maxConcurrentSimulators: Int? = nil,
|
2620
2625
|
disableConcurrentTesting: Bool = false,
|
2621
2626
|
testWithoutBuilding: Bool? = nil,
|
@@ -2659,6 +2664,7 @@ func runTests(workspace: String? = nil,
|
|
2659
2664
|
RubyCommand.Argument(name: "buildlog_path", value: buildlogPath),
|
2660
2665
|
RubyCommand.Argument(name: "include_simulator_logs", value: includeSimulatorLogs),
|
2661
2666
|
RubyCommand.Argument(name: "formatter", value: formatter),
|
2667
|
+
RubyCommand.Argument(name: "xcpretty_args", value: xcprettyArgs),
|
2662
2668
|
RubyCommand.Argument(name: "max_concurrent_simulators", value: maxConcurrentSimulators),
|
2663
2669
|
RubyCommand.Argument(name: "disable_concurrent_testing", value: disableConcurrentTesting),
|
2664
2670
|
RubyCommand.Argument(name: "test_without_building", value: testWithoutBuilding),
|
@@ -2744,6 +2750,7 @@ func scan(workspace: String? = scanfile.workspace,
|
|
2744
2750
|
buildlogPath: String = scanfile.buildlogPath,
|
2745
2751
|
includeSimulatorLogs: Bool = scanfile.includeSimulatorLogs,
|
2746
2752
|
formatter: String? = scanfile.formatter,
|
2753
|
+
xcprettyArgs: String? = scanfile.xcprettyArgs,
|
2747
2754
|
maxConcurrentSimulators: Int? = scanfile.maxConcurrentSimulators,
|
2748
2755
|
disableConcurrentTesting: Bool = scanfile.disableConcurrentTesting,
|
2749
2756
|
testWithoutBuilding: Bool? = scanfile.testWithoutBuilding,
|
@@ -2787,6 +2794,7 @@ func scan(workspace: String? = scanfile.workspace,
|
|
2787
2794
|
RubyCommand.Argument(name: "buildlog_path", value: buildlogPath),
|
2788
2795
|
RubyCommand.Argument(name: "include_simulator_logs", value: includeSimulatorLogs),
|
2789
2796
|
RubyCommand.Argument(name: "formatter", value: formatter),
|
2797
|
+
RubyCommand.Argument(name: "xcpretty_args", value: xcprettyArgs),
|
2790
2798
|
RubyCommand.Argument(name: "max_concurrent_simulators", value: maxConcurrentSimulators),
|
2791
2799
|
RubyCommand.Argument(name: "disable_concurrent_testing", value: disableConcurrentTesting),
|
2792
2800
|
RubyCommand.Argument(name: "test_without_building", value: testWithoutBuilding),
|
@@ -3281,7 +3289,8 @@ func supply(packageName: String,
|
|
3281
3289
|
mappingPaths: [String]? = nil,
|
3282
3290
|
rootUrl: String? = nil,
|
3283
3291
|
checkSupersededTracks: Bool = false,
|
3284
|
-
timeout: Int = 300
|
3292
|
+
timeout: Int = 300,
|
3293
|
+
deactivateOnPromote: Bool = true) {
|
3285
3294
|
let command = RubyCommand(commandID: "", methodName: "supply", className: nil, args: [RubyCommand.Argument(name: "package_name", value: packageName),
|
3286
3295
|
RubyCommand.Argument(name: "track", value: track),
|
3287
3296
|
RubyCommand.Argument(name: "rollout", value: rollout),
|
@@ -3304,7 +3313,8 @@ func supply(packageName: String,
|
|
3304
3313
|
RubyCommand.Argument(name: "mapping_paths", value: mappingPaths),
|
3305
3314
|
RubyCommand.Argument(name: "root_url", value: rootUrl),
|
3306
3315
|
RubyCommand.Argument(name: "check_superseded_tracks", value: checkSupersededTracks),
|
3307
|
-
RubyCommand.Argument(name: "timeout", value: timeout)
|
3316
|
+
RubyCommand.Argument(name: "timeout", value: timeout),
|
3317
|
+
RubyCommand.Argument(name: "deactivate_on_promote", value: deactivateOnPromote)])
|
3308
3318
|
_ = runner.executeCommand(command)
|
3309
3319
|
}
|
3310
3320
|
func swiftlint(mode: String = "lint",
|
@@ -3771,7 +3781,8 @@ func uploadToPlayStore(packageName: String,
|
|
3771
3781
|
mappingPaths: [String]? = nil,
|
3772
3782
|
rootUrl: String? = nil,
|
3773
3783
|
checkSupersededTracks: Bool = false,
|
3774
|
-
timeout: Int = 300
|
3784
|
+
timeout: Int = 300,
|
3785
|
+
deactivateOnPromote: Bool = true) {
|
3775
3786
|
let command = RubyCommand(commandID: "", methodName: "upload_to_play_store", className: nil, args: [RubyCommand.Argument(name: "package_name", value: packageName),
|
3776
3787
|
RubyCommand.Argument(name: "track", value: track),
|
3777
3788
|
RubyCommand.Argument(name: "rollout", value: rollout),
|
@@ -3794,7 +3805,8 @@ func uploadToPlayStore(packageName: String,
|
|
3794
3805
|
RubyCommand.Argument(name: "mapping_paths", value: mappingPaths),
|
3795
3806
|
RubyCommand.Argument(name: "root_url", value: rootUrl),
|
3796
3807
|
RubyCommand.Argument(name: "check_superseded_tracks", value: checkSupersededTracks),
|
3797
|
-
RubyCommand.Argument(name: "timeout", value: timeout)
|
3808
|
+
RubyCommand.Argument(name: "timeout", value: timeout),
|
3809
|
+
RubyCommand.Argument(name: "deactivate_on_promote", value: deactivateOnPromote)])
|
3798
3810
|
_ = runner.executeCommand(command)
|
3799
3811
|
}
|
3800
3812
|
func uploadToTestflight(username: String,
|
@@ -3971,7 +3983,7 @@ func xcov(workspace: String? = nil,
|
|
3971
3983
|
coverallsServiceJobId: String? = nil,
|
3972
3984
|
coverallsRepoToken: String? = nil,
|
3973
3985
|
xcconfig: String? = nil,
|
3974
|
-
ideFoundationPath: String = "/Applications/Xcode.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
|
3986
|
+
ideFoundationPath: String = "/Applications/Xcode-10.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
|
3975
3987
|
legacySupport: Bool = false) {
|
3976
3988
|
let command = RubyCommand(commandID: "", methodName: "xcov", className: nil, args: [RubyCommand.Argument(name: "workspace", value: workspace),
|
3977
3989
|
RubyCommand.Argument(name: "project", value: project),
|
@@ -4017,10 +4029,12 @@ func xcversion(version: String) {
|
|
4017
4029
|
}
|
4018
4030
|
@discardableResult func zip(path: String,
|
4019
4031
|
outputPath: String? = nil,
|
4020
|
-
verbose: Bool = true
|
4032
|
+
verbose: Bool = true,
|
4033
|
+
password: String? = nil) -> String {
|
4021
4034
|
let command = RubyCommand(commandID: "", methodName: "zip", className: nil, args: [RubyCommand.Argument(name: "path", value: path),
|
4022
4035
|
RubyCommand.Argument(name: "output_path", value: outputPath),
|
4023
|
-
RubyCommand.Argument(name: "verbose", value: verbose)
|
4036
|
+
RubyCommand.Argument(name: "verbose", value: verbose),
|
4037
|
+
RubyCommand.Argument(name: "password", value: password)])
|
4024
4038
|
return runner.executeCommand(command)
|
4025
4039
|
}
|
4026
4040
|
|
@@ -4077,4 +4091,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
|
|
4077
4091
|
let snapshotfile: Snapshotfile = Snapshotfile()
|
4078
4092
|
// Please don't remove the lines below
|
4079
4093
|
// They are used to detect outdated files
|
4080
|
-
// FastlaneRunnerAPIVersion [0.9.
|
4094
|
+
// FastlaneRunnerAPIVersion [0.9.29]
|
@@ -18,6 +18,7 @@ protocol ScanfileProtocol: class {
|
|
18
18
|
var buildlogPath: String { get }
|
19
19
|
var includeSimulatorLogs: Bool { get }
|
20
20
|
var formatter: String? { get }
|
21
|
+
var xcprettyArgs: String? { get }
|
21
22
|
var maxConcurrentSimulators: Int? { get }
|
22
23
|
var disableConcurrentTesting: Bool { get }
|
23
24
|
var testWithoutBuilding: Bool? { get }
|
@@ -64,6 +65,7 @@ extension ScanfileProtocol {
|
|
64
65
|
var buildlogPath: String { return "~/Library/Logs/scan" }
|
65
66
|
var includeSimulatorLogs: Bool { return false }
|
66
67
|
var formatter: String? { return nil }
|
68
|
+
var xcprettyArgs: String? { return nil }
|
67
69
|
var maxConcurrentSimulators: Int? { return nil }
|
68
70
|
var disableConcurrentTesting: Bool { return false }
|
69
71
|
var testWithoutBuilding: Bool? { return nil }
|
@@ -92,4 +94,4 @@ extension ScanfileProtocol {
|
|
92
94
|
|
93
95
|
// Please don't remove the lines below
|
94
96
|
// They are used to detect outdated files
|
95
|
-
// FastlaneRunnerAPIVersion [0.9.
|
97
|
+
// FastlaneRunnerAPIVersion [0.9.5]
|
@@ -12,19 +12,22 @@ module FastlaneCore
|
|
12
12
|
attr_accessor :p_hash
|
13
13
|
attr_accessor :action_name
|
14
14
|
attr_accessor :status
|
15
|
+
attr_accessor :fastlane_client_language
|
15
16
|
|
16
|
-
def initialize(p_hash: nil, action_name: nil, status: nil)
|
17
|
+
def initialize(p_hash: nil, action_name: nil, status: nil, fastlane_client_language: nil)
|
17
18
|
@p_hash = p_hash
|
18
19
|
@action_name = action_name
|
19
20
|
@status = status
|
21
|
+
@fastlane_client_language = fastlane_client_language
|
20
22
|
end
|
21
23
|
|
22
|
-
def self.context_for_action_name(action_name, args: nil, status: nil)
|
24
|
+
def self.context_for_action_name(action_name, fastlane_client_language: :ruby, args: nil, status: nil)
|
23
25
|
app_id_guesser = FastlaneCore::AppIdentifierGuesser.new(args: args)
|
24
26
|
return self.new(
|
25
27
|
action_name: action_name,
|
26
28
|
p_hash: app_id_guesser.p_hash,
|
27
|
-
status: status
|
29
|
+
status: status,
|
30
|
+
fastlane_client_language: fastlane_client_language
|
28
31
|
)
|
29
32
|
end
|
30
33
|
end
|
@@ -8,22 +8,22 @@ module FastlaneCore
|
|
8
8
|
attr_accessor :action_name
|
9
9
|
attr_accessor :p_hash
|
10
10
|
attr_accessor :platform
|
11
|
-
attr_accessor :
|
11
|
+
attr_accessor :fastlane_client_language # example: ruby fastfile, swift fastfile
|
12
12
|
|
13
|
-
def initialize(action_name: nil, p_hash: UNKNOWN_P_HASH, platform: nil,
|
13
|
+
def initialize(action_name: nil, p_hash: UNKNOWN_P_HASH, platform: nil, fastlane_client_language: nil)
|
14
14
|
@action_name = action_name
|
15
15
|
@p_hash = p_hash
|
16
16
|
@platform = platform
|
17
|
-
@
|
17
|
+
@fastlane_client_language = fastlane_client_language
|
18
18
|
end
|
19
19
|
|
20
|
-
def self.context_for_action_name(action_name,
|
20
|
+
def self.context_for_action_name(action_name, fastlane_client_language: :ruby, args: nil)
|
21
21
|
app_id_guesser = FastlaneCore::AppIdentifierGuesser.new(args: args)
|
22
22
|
return self.new(
|
23
23
|
action_name: action_name,
|
24
24
|
p_hash: app_id_guesser.p_hash || UNKNOWN_P_HASH,
|
25
25
|
platform: app_id_guesser.platform,
|
26
|
-
|
26
|
+
fastlane_client_language: fastlane_client_language
|
27
27
|
)
|
28
28
|
end
|
29
29
|
|
@@ -2,16 +2,18 @@ module FastlaneCore
|
|
2
2
|
class AnalyticsEventBuilder
|
3
3
|
attr_accessor :action_name
|
4
4
|
|
5
|
-
|
5
|
+
# fastlane_client_language valid options are :ruby or :swift
|
6
|
+
def initialize(p_hash: nil, session_id: nil, action_name: nil, fastlane_client_language: :ruby)
|
6
7
|
@p_hash = p_hash
|
7
8
|
@session_id = session_id
|
8
9
|
@action_name = action_name
|
10
|
+
@fastlane_client_language = fastlane_client_language
|
9
11
|
end
|
10
12
|
|
11
13
|
def new_event(action_stage)
|
12
14
|
{
|
13
15
|
client_id: @p_hash,
|
14
|
-
category:
|
16
|
+
category: "fastlane Client Langauge - #{@fastlane_client_language}",
|
15
17
|
action: action_stage,
|
16
18
|
label: action_name,
|
17
19
|
value: nil
|
@@ -31,7 +31,8 @@ module FastlaneCore
|
|
31
31
|
builder = AnalyticsEventBuilder.new(
|
32
32
|
p_hash: launch_context.p_hash,
|
33
33
|
session_id: session_id,
|
34
|
-
action_name: nil
|
34
|
+
action_name: nil,
|
35
|
+
fastlane_client_language: launch_context.fastlane_client_language
|
35
36
|
)
|
36
37
|
|
37
38
|
launch_event = builder.new_event(:launch)
|
@@ -28,7 +28,7 @@ module FastlaneCore
|
|
28
28
|
if /\b0 valid identities found\b/ =~ available
|
29
29
|
UI.error([
|
30
30
|
"There are no local code signing identities found.",
|
31
|
-
"You can run `security find-identity -v -p codesigning` to get this output.",
|
31
|
+
"You can run" << " `security find-identity -v -p codesigning #{in_keychain}".rstrip << "` to get this output.",
|
32
32
|
"This Stack Overflow thread has more information: https://stackoverflow.com/q/35390072/774.",
|
33
33
|
"(Check in Keychain Access for an expired WWDR certificate: https://stackoverflow.com/a/35409835/774 has more info.)"
|
34
34
|
].join("\n"))
|
@@ -238,7 +238,7 @@ module FastlaneCore
|
|
238
238
|
elsif data_type == Float
|
239
239
|
return value.to_f if value.to_f.to_s == value.to_s
|
240
240
|
elsif allow_shell_conversion
|
241
|
-
return
|
241
|
+
return value.shelljoin if value.kind_of?(Array)
|
242
242
|
return value.map { |k, v| "#{k.to_s.shellescape}=#{v.shellescape}" }.join(' ') if value.kind_of?(Hash)
|
243
243
|
elsif data_type != String
|
244
244
|
# Special treatment if the user specified true, false or YES, NO
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative '../helper'
|
2
|
+
require 'shellwords'
|
3
|
+
|
4
|
+
# Here be monkey patches
|
5
|
+
|
6
|
+
class String
|
7
|
+
# CrossplatformShellwords
|
8
|
+
def shellescape
|
9
|
+
CrossplatformShellwords.shellescape(self)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Array
|
14
|
+
def shelljoin
|
15
|
+
CrossplatformShellwords.shelljoin(self)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Here be helper
|
20
|
+
|
21
|
+
module CrossplatformShellwords
|
22
|
+
# handle switching between implementations of shellescape
|
23
|
+
def shellescape(str)
|
24
|
+
if FastlaneCore::Helper.windows?
|
25
|
+
WindowsShellwords.shellescape(str)
|
26
|
+
else
|
27
|
+
# using `escape` instead of expected `shellescape` here
|
28
|
+
# which corresponds to Shellword's `String.shellescape` implementation
|
29
|
+
# https://github.com/ruby/ruby/blob/1cf2bb4b2085758112503e7da7414d1ef52d4f48/lib/shellwords.rb#L216
|
30
|
+
Shellwords.escape(str)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
module_function :shellescape
|
34
|
+
|
35
|
+
# make sure local implementation is also used in shelljoin
|
36
|
+
def shelljoin(array)
|
37
|
+
array.map { |arg| shellescape(arg) }.join(' ')
|
38
|
+
end
|
39
|
+
module_function :shelljoin
|
40
|
+
end
|
41
|
+
|
42
|
+
# Windows implementation
|
43
|
+
module WindowsShellwords
|
44
|
+
def shellescape(str)
|
45
|
+
str = str.to_s
|
46
|
+
|
47
|
+
# An empty argument will be skipped, so return empty quotes.
|
48
|
+
# https://github.com/ruby/ruby/blob/a6413848153e6c37f6b0fea64e3e871460732e34/lib/shellwords.rb#L142-L143
|
49
|
+
return '""'.dup if str.empty?
|
50
|
+
|
51
|
+
str = str.dup
|
52
|
+
|
53
|
+
# wrap in double quotes if contains space
|
54
|
+
if str =~ /\s/
|
55
|
+
# double quotes have to be doubled if will be quoted
|
56
|
+
str.gsub!('"', '""')
|
57
|
+
return '"' + str + '"'
|
58
|
+
else
|
59
|
+
return str
|
60
|
+
end
|
61
|
+
end
|
62
|
+
module_function :shellescape
|
63
|
+
end
|
@@ -68,7 +68,9 @@ module Commander
|
|
68
68
|
FastlaneCore::UI.user_error!("fastlane requires a minimum version of Xcode #{Fastlane::MINIMUM_XCODE_RELEASE}, please upgrade and make sure to use `sudo xcode-select -s /Applications/Xcode.app`")
|
69
69
|
end
|
70
70
|
|
71
|
-
|
71
|
+
is_swift = FastlaneCore::FastlaneFolder.swift?
|
72
|
+
fastlane_client_language = is_swift ? :swift : :ruby
|
73
|
+
action_launch_context = FastlaneCore::ActionLaunchContext.context_for_action_name(@program[:name], fastlane_client_language: fastlane_client_language, args: ARGV)
|
72
74
|
FastlaneCore.session.action_launched(launch_context: action_launch_context)
|
73
75
|
|
74
76
|
return_value = run_active_command
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require_relative 'fastlane_core/globals'
|
2
2
|
# Ruby monkey-patches - should be before almost all else
|
3
3
|
require_relative 'fastlane_core/core_ext/string'
|
4
|
+
require_relative 'fastlane_core/core_ext/shellwords'
|
4
5
|
|
5
6
|
require_relative 'fastlane_core/env'
|
6
7
|
require_relative 'fastlane_core/feature/feature'
|
@@ -47,6 +47,7 @@ module Produce
|
|
47
47
|
|
48
48
|
c.option('--app-group', 'Enable App Groups')
|
49
49
|
c.option('--apple-pay', 'Enable Apple Pay')
|
50
|
+
c.option('--auto-fill-credential', 'Enable AutoFill Credential')
|
50
51
|
c.option('--associated-domains', 'Enable Associated Domains')
|
51
52
|
c.option('--data-protection STRING', String, 'Enable Data Protection, suitable values are "complete", "unlessopen" and "untilfirstauth"')
|
52
53
|
c.option('--game-center', 'Enable Game Center')
|
@@ -86,6 +87,7 @@ module Produce
|
|
86
87
|
|
87
88
|
c.option('--app-group', 'Disable App Groups')
|
88
89
|
c.option('--apple-pay', 'Disable Apple Pay')
|
90
|
+
c.option('--auto-fill-credential', 'Disable AutoFill Credential')
|
89
91
|
c.option('--associated-domains', 'Disable Associated Domains')
|
90
92
|
c.option('--data-protection', 'Disable Data Protection')
|
91
93
|
c.option('--game-center', 'Disable Game Center')
|
@@ -15,6 +15,7 @@ module Produce
|
|
15
15
|
app_group: [SERVICE_ON, SERVICE_OFF],
|
16
16
|
apple_pay: [SERVICE_ON, SERVICE_OFF],
|
17
17
|
associated_domains: [SERVICE_ON, SERVICE_OFF],
|
18
|
+
auto_fill_credential: [SERVICE_ON, SERVICE_OFF],
|
18
19
|
data_protection: [
|
19
20
|
SERVICE_COMPLETE,
|
20
21
|
SERVICE_UNLESS_OPEN,
|
@@ -36,7 +36,7 @@ module Produce
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def valid_services_for(options)
|
39
|
-
allowed_keys = [:app_group, :apple_pay, :associated_domains, :data_protection, :game_center, :healthkit, :homekit,
|
39
|
+
allowed_keys = [:app_group, :apple_pay, :associated_domains, :auto_fill_credential, :data_protection, :game_center, :healthkit, :homekit,
|
40
40
|
:hotspot, :icloud, :in_app_purchase, :inter_app_audio, :multipath, :network_extension,
|
41
41
|
:nfc_tag_reading, :personal_vpn, :passbook, :push_notification, :sirikit, :vpn_conf,
|
42
42
|
:wallet, :wireless_conf]
|
@@ -77,6 +77,16 @@ module Produce
|
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
80
|
+
if options.auto_fill_credential
|
81
|
+
UI.message("\tAutoFill Credential")
|
82
|
+
|
83
|
+
if on
|
84
|
+
app.update_service(Spaceship.app_service.auto_fill_credential.on)
|
85
|
+
else
|
86
|
+
app.update_service(Spaceship.app_service.auto_fill_credential.off)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
80
90
|
if options.data_protection
|
81
91
|
UI.message("\tData Protection")
|
82
92
|
|
data/scan/lib/scan/options.rb
CHANGED
@@ -118,7 +118,7 @@ module Scan
|
|
118
118
|
FastlaneCore::ConfigItem.new(key: :output_style,
|
119
119
|
short_option: "-b",
|
120
120
|
env_name: "SCAN_OUTPUT_STYLE",
|
121
|
-
description: "Define how the output should look like
|
121
|
+
description: "Define how the output should look like. Valid values are: standard, basic, rspec, or raw (disables xcpretty)",
|
122
122
|
optional: true,
|
123
123
|
verify_block: proc do |value|
|
124
124
|
UI.user_error!("Invalid output_style #{value}") unless ['standard', 'basic', 'rspec', 'raw'].include?(value)
|
@@ -151,6 +151,11 @@ module Scan
|
|
151
151
|
env_name: "SCAN_FORMATTER",
|
152
152
|
description: "A custom xcpretty formatter to use",
|
153
153
|
optional: true),
|
154
|
+
FastlaneCore::ConfigItem.new(key: :xcpretty_args,
|
155
|
+
env_name: "SCAN_XCPRETTY_ARGS",
|
156
|
+
description: "Pass in xcpretty additional command line arguments (e.g. '--test --no-color' or '--tap --no-utf')",
|
157
|
+
type: String,
|
158
|
+
optional: true),
|
154
159
|
FastlaneCore::ConfigItem.new(key: :max_concurrent_simulators,
|
155
160
|
type: Integer,
|
156
161
|
env_name: "SCAN_MAX_CONCURRENT_SIMULATORS",
|
data/scan/lib/scan/runner.rb
CHANGED
@@ -122,9 +122,10 @@ module Scan
|
|
122
122
|
# We'll have to regenerate from the xcodebuild log, like we did before version 2.34.0.
|
123
123
|
UI.message("Generating test results. This may take a while for large projects.")
|
124
124
|
|
125
|
-
reporter_options_generator = XCPrettyReporterOptionsGenerator.new(false, [], [], "", false)
|
125
|
+
reporter_options_generator = XCPrettyReporterOptionsGenerator.new(false, [], [], "", false, nil)
|
126
126
|
reporter_options = reporter_options_generator.generate_reporter_options
|
127
|
-
|
127
|
+
xcpretty_args_options = reporter_options_generator.generate_xcpretty_args_options
|
128
|
+
cmd = "cat #{@test_command_generator.xcodebuild_log_path.shellescape} | xcpretty #{reporter_options.join(' ')} #{xcpretty_args_options} &> /dev/null"
|
128
129
|
system(cmd)
|
129
130
|
File.read(Scan.cache[:temp_junit_report])
|
130
131
|
end
|
@@ -111,9 +111,11 @@ module Scan
|
|
111
111
|
Scan.config[:output_types],
|
112
112
|
Scan.config[:output_files] || Scan.config[:custom_report_file_name],
|
113
113
|
Scan.config[:output_directory],
|
114
|
-
Scan.config[:use_clang_report_name]
|
114
|
+
Scan.config[:use_clang_report_name],
|
115
|
+
Scan.config[:xcpretty_args])
|
115
116
|
reporter_options = @reporter_options_generator.generate_reporter_options
|
116
|
-
|
117
|
+
reporter_xcpretty_args = @reporter_options_generator.generate_xcpretty_args_options
|
118
|
+
return pipe << "| xcpretty #{formatter.join(' ')} #{reporter_options.join(' ')} #{reporter_xcpretty_args}"
|
117
119
|
end
|
118
120
|
|
119
121
|
# Store the raw file
|
@@ -9,16 +9,18 @@ module Scan
|
|
9
9
|
Scan.config[:output_types],
|
10
10
|
Scan.config[:output_files] || Scan.config[:custom_report_file_name],
|
11
11
|
Scan.config[:output_directory],
|
12
|
-
Scan.config[:use_clang_report_name]
|
12
|
+
Scan.config[:use_clang_report_name],
|
13
|
+
Scan.config[:xcpretty_args])
|
13
14
|
end
|
14
15
|
|
15
16
|
# Intialize with values from Scan.config matching these param names
|
16
|
-
def initialize(open_report, output_types, output_files, output_directory, use_clang_report_name)
|
17
|
+
def initialize(open_report, output_types, output_files, output_directory, use_clang_report_name, xcpretty_args)
|
17
18
|
@open_report = open_report
|
18
19
|
@output_types = output_types
|
19
20
|
@output_files = output_files
|
20
21
|
@output_directory = output_directory
|
21
22
|
@use_clang_report_name = use_clang_report_name
|
23
|
+
@xcpretty_args = xcpretty_args
|
22
24
|
|
23
25
|
# might already be an array when passed via fastlane
|
24
26
|
@output_types = @output_types.split(',') if @output_types.kind_of?(String)
|
@@ -64,6 +66,10 @@ module Scan
|
|
64
66
|
return reporter
|
65
67
|
end
|
66
68
|
|
69
|
+
def generate_xcpretty_args_options
|
70
|
+
return @xcpretty_args
|
71
|
+
end
|
72
|
+
|
67
73
|
private
|
68
74
|
|
69
75
|
def determine_output_file_name(type)
|
@@ -108,6 +108,7 @@ module Spaceship
|
|
108
108
|
iphone6: "MZPFT.SortedN61ScreenShot",
|
109
109
|
iphone6Plus: "MZPFT.SortedN56ScreenShot",
|
110
110
|
iphone58: "MZPFT.SortedD22ScreenShot",
|
111
|
+
iphone65: "MZPFT.SortedD33ScreenShot",
|
111
112
|
iphone4: "MZPFT.SortedN41ScreenShot",
|
112
113
|
iphone35: "MZPFT.SortedScreenShot",
|
113
114
|
appleTV: "MZPFT.SortedATVScreenShot",
|
@@ -124,6 +125,7 @@ module Spaceship
|
|
124
125
|
iphone6: "MZPFT.SortedN61MessagesScreenShot",
|
125
126
|
iphone6Plus: "MZPFT.SortedN56MessagesScreenShot",
|
126
127
|
iphone58: "MZPFT.SortedD22MessagesScreenShot",
|
128
|
+
iphone65: "MZPFT.SortedD33MessagesScreenShot",
|
127
129
|
iphone4: "MZPFT.SortedN41MessagesScreenShot"
|
128
130
|
}
|
129
131
|
end
|
@@ -137,6 +139,8 @@ module Spaceship
|
|
137
139
|
ipad105: [[1668, 2224], [2224, 1668]],
|
138
140
|
iphone6: [[750, 1334], [1334, 750]],
|
139
141
|
iphone6Plus: [[1242, 2208], [2208, 1242]],
|
142
|
+
iphone58: [[1125, 2436], [2436, 1125]],
|
143
|
+
iphone65: [[1242, 2688], [2688, 1242]],
|
140
144
|
iphone4: [[640, 1096], [640, 1136], [1136, 600], [1136, 640]],
|
141
145
|
iphone35: [[640, 960], [640, 920], [960, 600], [960, 640]],
|
142
146
|
appleTV: [[1920, 1080]],
|
@@ -138,6 +138,9 @@ module Spaceship
|
|
138
138
|
# ApplePay certificate
|
139
139
|
class ApplePay < Certificate; end
|
140
140
|
|
141
|
+
# ApplePayMerchantIdentity certificate
|
142
|
+
class ApplePayMerchantIdentity < Certificate; end
|
143
|
+
|
141
144
|
# A Mac push notification certificate for development environment
|
142
145
|
class MacDevelopmentPush < PushCertificate; end
|
143
146
|
|
@@ -154,7 +157,8 @@ module Spaceship
|
|
154
157
|
"Y3B2F3TYSI" => Passbook,
|
155
158
|
"3T2ZP62QW8" => WebsitePush,
|
156
159
|
"E5D663CMZW" => VoipPush,
|
157
|
-
"4APLUP237T" => ApplePay
|
160
|
+
"4APLUP237T" => ApplePay,
|
161
|
+
"MD8Q2VRT6A" => ApplePayMerchantIdentity
|
158
162
|
}
|
159
163
|
|
160
164
|
OLDER_IOS_CERTIFICATE_TYPES = [
|
@@ -7,7 +7,7 @@ module Spaceship::TestFlight
|
|
7
7
|
# For now, when we set a value it sets the same value for all locales
|
8
8
|
# When getting a value, we return the first locale values
|
9
9
|
|
10
|
-
attr_accessor :description, :feedback_email, :whats_new
|
10
|
+
attr_accessor :description, :feedback_email, :whats_new, :privacy_policy_url, :marketing_url
|
11
11
|
|
12
12
|
def description
|
13
13
|
raw_data.first['description']
|
@@ -25,6 +25,22 @@ module Spaceship::TestFlight
|
|
25
25
|
raw_data.each { |locale| locale['feedbackEmail'] = value }
|
26
26
|
end
|
27
27
|
|
28
|
+
def privacy_policy_url
|
29
|
+
raw_data.first['privacyPolicyUrl']
|
30
|
+
end
|
31
|
+
|
32
|
+
def privacy_policy_url=(value)
|
33
|
+
raw_data.each { |locale| locale['privacyPolicyUrl'] = value }
|
34
|
+
end
|
35
|
+
|
36
|
+
def marketing_url
|
37
|
+
raw_data.first['marketingUrl']
|
38
|
+
end
|
39
|
+
|
40
|
+
def marketing_url=(value)
|
41
|
+
raw_data.each { |locale| locale['marketingUrl'] = value }
|
42
|
+
end
|
43
|
+
|
28
44
|
def whats_new
|
29
45
|
raw_data.first['whatsNew']
|
30
46
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spaceship
|
2
2
|
module Tunes
|
3
3
|
class DeviceType
|
4
|
-
@types = ['iphone4', 'iphone35', 'iphone6', 'iphone6Plus', 'iphone58', 'ipad', 'ipadPro', 'ipad105', 'watch', 'appleTV', 'desktop']
|
4
|
+
@types = ['iphone4', 'iphone35', 'iphone6', 'iphone6Plus', 'iphone58', 'iphone65', 'ipad', 'ipadPro', 'ipad105', 'watch', 'appleTV', 'desktop']
|
5
5
|
class << self
|
6
6
|
attr_accessor :types
|
7
7
|
|