fastlane 2.104.0 → 2.105.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +61 -61
  3. data/deliver/lib/deliver/app_screenshot.rb +15 -0
  4. data/fastlane/lib/fastlane/actions/add_git_tag.rb +1 -1
  5. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/deploygate.rb +11 -4
  7. data/fastlane/lib/fastlane/actions/hockey.rb +1 -1
  8. data/fastlane/lib/fastlane/actions/import_from_git.rb +1 -0
  9. data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
  10. data/fastlane/lib/fastlane/actions/push_git_tags.rb +7 -2
  11. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +11 -2
  12. data/fastlane/lib/fastlane/actions/tryouts.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/verify_build.rb +4 -0
  14. data/fastlane/lib/fastlane/actions/zip.rb +10 -1
  15. data/fastlane/lib/fastlane/fast_file.rb +1 -1
  16. data/fastlane/lib/fastlane/runner.rb +1 -1
  17. data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +1 -1
  18. data/fastlane/lib/fastlane/version.rb +1 -1
  19. data/fastlane/swift/Deliverfile.swift +1 -1
  20. data/fastlane/swift/Fastlane.swift +25 -11
  21. data/fastlane/swift/Gymfile.swift +1 -1
  22. data/fastlane/swift/Matchfile.swift +1 -1
  23. data/fastlane/swift/Precheckfile.swift +1 -1
  24. data/fastlane/swift/Scanfile.swift +1 -1
  25. data/fastlane/swift/ScanfileProtocol.swift +3 -1
  26. data/fastlane/swift/Screengrabfile.swift +1 -1
  27. data/fastlane/swift/Snapshotfile.swift +1 -1
  28. data/fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb +6 -3
  29. data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +5 -5
  30. data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +4 -2
  31. data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +2 -1
  32. data/fastlane_core/lib/fastlane_core/cert_checker.rb +1 -1
  33. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +1 -1
  34. data/fastlane_core/lib/fastlane_core/core_ext/shellwords.rb +63 -0
  35. data/fastlane_core/lib/fastlane_core/fastlane_folder.rb +1 -0
  36. data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +3 -1
  37. data/fastlane_core/lib/fastlane_core.rb +1 -0
  38. data/produce/lib/produce/commands_generator.rb +2 -0
  39. data/produce/lib/produce/developer_center.rb +1 -0
  40. data/produce/lib/produce/service.rb +11 -1
  41. data/scan/lib/scan/options.rb +6 -1
  42. data/scan/lib/scan/runner.rb +3 -2
  43. data/scan/lib/scan/test_command_generator.rb +4 -2
  44. data/scan/lib/scan/xcpretty_reporter_options_generator.rb +8 -2
  45. data/spaceship/lib/spaceship/du/du_client.rb +4 -0
  46. data/spaceship/lib/spaceship/portal/certificate.rb +5 -1
  47. data/spaceship/lib/spaceship/test_flight/test_info.rb +17 -1
  48. data/spaceship/lib/spaceship/tunes/device_type.rb +1 -1
  49. data/supply/lib/supply/options.rb +7 -2
  50. data/supply/lib/supply/uploader.rb +1 -1
  51. metadata +17 -17
  52. 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: String? = nil,
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) -> String {
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.28]
4094
+ // FastlaneRunnerAPIVersion [0.9.29]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.104.0
21
+ // Generated with fastlane 2.105.1
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.104.0
21
+ // Generated with fastlane 2.105.1
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.104.0
21
+ // Generated with fastlane 2.105.1
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.104.0
21
+ // Generated with fastlane 2.105.1
@@ -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.4]
97
+ // FastlaneRunnerAPIVersion [0.9.5]
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.104.0
21
+ // Generated with fastlane 2.105.1
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.104.0
21
+ // Generated with fastlane 2.105.1
@@ -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 :configuration_language # example: ruby fastfile, swift fastfile
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, configuration_language: 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
- @configuration_language = configuration_language
17
+ @fastlane_client_language = fastlane_client_language
18
18
  end
19
19
 
20
- def self.context_for_action_name(action_name, configuration_language: "ruby", args: nil)
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
- configuration_language: configuration_language
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
- def initialize(p_hash: nil, session_id: nil, action_name: nil)
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: :undefined,
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 Shellwords.join(value) if value.kind_of?(Array)
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
@@ -21,6 +21,7 @@ module FastlaneCore
21
21
  end
22
22
 
23
23
  def self.swift?
24
+ return false unless self.fastfile_path
24
25
  return self.fastfile_path.downcase.end_with?(".swift")
25
26
  end
26
27
 
@@ -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
- action_launch_context = FastlaneCore::ActionLaunchContext.context_for_action_name(@program[:name], args: ARGV)
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
 
@@ -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 (standard, basic, rspec or raw)",
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",
@@ -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
- cmd = "cat #{@test_command_generator.xcodebuild_log_path.shellescape} | xcpretty #{reporter_options.join(' ')} &> /dev/null"
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
- return pipe << "| xcpretty #{formatter.join(' ')} #{reporter_options.join(' ')}"
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