fastlane 2.146.0 → 2.149.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +86 -86
  3. data/cert/lib/cert/commands_generator.rb +1 -0
  4. data/credentials_manager/lib/credentials_manager/cli.rb +2 -0
  5. data/deliver/lib/deliver/app_screenshot.rb +3 -3
  6. data/deliver/lib/deliver/commands_generator.rb +1 -0
  7. data/deliver/lib/deliver/html_generator.rb +2 -2
  8. data/deliver/lib/deliver/submit_for_review.rb +5 -1
  9. data/fastlane/lib/{fastlane/actions/.update_code_signing_settings.rb.swp → assets/.s3_html_template.erb.swp} +0 -0
  10. data/fastlane/lib/assets/custom_action_template.rb +6 -6
  11. data/fastlane/lib/assets/s3_html_template.erb +1 -1
  12. data/fastlane/lib/fastlane/actions/.hipchat.rb.swp +0 -0
  13. data/fastlane/lib/fastlane/actions/.slack.rb.swp +0 -0
  14. data/fastlane/lib/fastlane/actions/cocoapods.rb +1 -1
  15. data/fastlane/lib/fastlane/actions/crashlytics.rb +0 -4
  16. data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -1
  17. data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +42 -2
  18. data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +3 -1
  19. data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +1 -1
  20. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +2 -2
  21. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +12 -0
  22. data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +1 -1
  23. data/fastlane/lib/fastlane/actions/git_branch.rb +1 -1
  24. data/fastlane/lib/fastlane/actions/hipchat.rb +1 -1
  25. data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +1 -1
  26. data/fastlane/lib/fastlane/actions/set_pod_key.rb +3 -3
  27. data/fastlane/lib/fastlane/actions/slack.rb +1 -1
  28. data/fastlane/lib/fastlane/actions/slather.rb +8 -1
  29. data/fastlane/lib/fastlane/actions/swiftlint.rb +14 -0
  30. data/fastlane/lib/fastlane/actions/sync_code_signing.rb +1 -1
  31. data/fastlane/lib/fastlane/actions/testfairy.rb +18 -3
  32. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +7 -2
  33. data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +2 -2
  34. data/fastlane/lib/fastlane/actions/verify_xcode.rb +7 -0
  35. data/fastlane/lib/fastlane/actions/xcodebuild.rb +4 -4
  36. data/fastlane/lib/fastlane/cli_tools_distributor.rb +28 -6
  37. data/fastlane/lib/fastlane/commands_generator.rb +5 -2
  38. data/fastlane/lib/fastlane/documentation/actions_list.rb +1 -1
  39. data/fastlane/lib/fastlane/helper/lane_helper.rb +13 -0
  40. data/fastlane/lib/fastlane/lane_manager.rb +0 -10
  41. data/fastlane/lib/fastlane/plugins/plugin_manager.rb +3 -3
  42. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
  43. data/fastlane/lib/fastlane/swift_fastlane_function.rb +15 -2
  44. data/fastlane/lib/fastlane/swift_lane_manager.rb +0 -8
  45. data/fastlane/lib/fastlane/version.rb +1 -1
  46. data/fastlane/swift/Deliverfile.swift +1 -1
  47. data/fastlane/swift/Fastlane.swift +130 -26
  48. data/fastlane/swift/Gymfile.swift +1 -1
  49. data/fastlane/swift/GymfileProtocol.swift +1 -1
  50. data/fastlane/swift/LaneFileProtocol.swift +5 -2
  51. data/fastlane/swift/Matchfile.swift +1 -1
  52. data/fastlane/swift/MatchfileProtocol.swift +9 -1
  53. data/fastlane/swift/Precheckfile.swift +1 -1
  54. data/fastlane/swift/Scanfile.swift +1 -1
  55. data/fastlane/swift/ScanfileProtocol.swift +15 -3
  56. data/fastlane/swift/Screengrabfile.swift +1 -1
  57. data/fastlane/swift/Snapshotfile.swift +1 -1
  58. data/fastlane/swift/SnapshotfileProtocol.swift +25 -1
  59. data/fastlane_core/lib/fastlane_core/helper.rb +17 -0
  60. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +46 -2
  61. data/fastlane_core/lib/fastlane_core/project.rb +1 -0
  62. data/frameit/lib/frameit/commands_generator.rb +1 -0
  63. data/frameit/lib/frameit/device_types.rb +10 -0
  64. data/frameit/lib/frameit/options.rb +5 -2
  65. data/frameit/lib/frameit/runner.rb +5 -0
  66. data/frameit/lib/frameit/screenshot.rb +1 -0
  67. data/gym/lib/gym/generators/package_command_generator.rb +4 -0
  68. data/gym/lib/gym/generators/package_command_generator_xcode7.rb +4 -0
  69. data/gym/lib/gym/options.rb +1 -1
  70. data/gym/lib/gym/runner.rb +14 -0
  71. data/match/lib/match/change_password.rb +1 -18
  72. data/match/lib/match/commands_generator.rb +1 -0
  73. data/match/lib/match/encryption/openssl.rb +1 -1
  74. data/match/lib/match/generator.rb +7 -2
  75. data/match/lib/match/nuke.rb +21 -16
  76. data/match/lib/match/options.rb +23 -1
  77. data/match/lib/match/storage/git_storage.rb +4 -0
  78. data/match/lib/match/storage/google_cloud_storage.rb +4 -0
  79. data/match/lib/match/storage/interface.rb +4 -0
  80. data/match/lib/match/storage/s3_storage.rb +4 -0
  81. data/match/lib/match/utils.rb +1 -1
  82. data/pem/lib/pem/commands_generator.rb +1 -0
  83. data/pilot/lib/pilot/build_manager.rb +23 -7
  84. data/pilot/lib/pilot/options.rb +5 -0
  85. data/produce/lib/produce/commands_generator.rb +1 -0
  86. data/scan/lib/scan/.options.rb.swp +0 -0
  87. data/scan/lib/scan/detect_values.rb +3 -0
  88. data/scan/lib/scan/options.rb +26 -3
  89. data/scan/lib/scan/runner.rb +2 -0
  90. data/scan/lib/scan/test_command_generator.rb +7 -2
  91. data/scan/lib/scan/test_result_parser.rb +9 -2
  92. data/screengrab/lib/screengrab/runner.rb +10 -9
  93. data/sigh/lib/sigh/commands_generator.rb +1 -0
  94. data/sigh/lib/sigh/options.rb +7 -1
  95. data/sigh/lib/sigh/runner.rb +2 -1
  96. data/snapshot/lib/assets/SnapfileTemplate +3 -0
  97. data/snapshot/lib/assets/SnapshotHelper.swift +12 -33
  98. data/snapshot/lib/snapshot/detect_values.rb +15 -0
  99. data/snapshot/lib/snapshot/options.rb +42 -0
  100. data/snapshot/lib/snapshot/reports_generator.rb +1 -1
  101. data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
  102. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +4 -0
  103. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +24 -1
  104. data/snapshot/lib/snapshot/test_command_generator.rb +8 -3
  105. data/snapshot/lib/snapshot/test_command_generator_base.rb +10 -1
  106. data/spaceship/lib/spaceship/base.rb +1 -1
  107. data/spaceship/lib/spaceship/client.rb +9 -1
  108. data/spaceship/lib/spaceship/commands_generator.rb +1 -0
  109. data/spaceship/lib/spaceship/connect_api/model.rb +6 -0
  110. data/spaceship/lib/spaceship/connect_api/models/build.rb +4 -0
  111. data/spaceship/lib/spaceship/errors.rb +3 -0
  112. data/spaceship/lib/spaceship/tunes/iap.rb +15 -0
  113. data/spaceship/lib/spaceship/tunes/tunes_client.rb +14 -0
  114. data/supply/lib/supply/commands_generator.rb +1 -0
  115. data/supply/lib/supply/options.rb +9 -0
  116. data/supply/lib/supply/uploader.rb +4 -0
  117. metadata +47 -30
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.146.0
21
+ // Generated with fastlane 2.149.0
@@ -60,7 +60,7 @@ protocol GymfileProtocol: class {
60
60
  /// Platform to build when using a Catalyst enabled app. Valid values are: ios, macos
61
61
  var catalystPlatform: String? { get }
62
62
 
63
- /// Full name of 3rd Party Mac Developer Installer or Deveoper ID Installer certificate. Example: `3rd Party Mac Developer Installer: Your Company (ABC1234XWYZ)`
63
+ /// Full name of 3rd Party Mac Developer Installer or Developer ID Installer certificate. Example: `3rd Party Mac Developer Installer: Your Company (ABC1234XWYZ)`
64
64
  var installerCertName: String? { get }
65
65
 
66
66
  /// The directory in which the archive should be stored in
@@ -19,6 +19,7 @@ public protocol LaneFileProtocol: class {
19
19
  static func runLane(named: String, parameters: [String : String]) -> Bool
20
20
 
21
21
  func recordLaneDescriptions()
22
+ func beforeAll(currentLane: String, parameters: [String : String])
22
23
  func beforeAll()
23
24
  func afterAll(currentLane: String)
24
25
  func onError(currentLane: String, errorInfo: String)
@@ -26,6 +27,7 @@ public protocol LaneFileProtocol: class {
26
27
 
27
28
  public extension LaneFileProtocol {
28
29
  var fastlaneVersion: String { return "" } // default "" because that means any is fine
30
+ func beforeAll(currentLane: String, parameters: [String : String]) { } // no op by default
29
31
  func beforeAll() { } // no op by default
30
32
  func afterAll(currentLane: String) { } // no op by default
31
33
  func onError(currentLane: String, errorInfo: String) {} // no op by default
@@ -37,7 +39,8 @@ public class LaneFile: NSObject, LaneFileProtocol {
37
39
  private(set) static var fastfileInstance: Fastfile?
38
40
 
39
41
  // Called before any lane is executed.
40
- private func setupAllTheThings() {
42
+ private func setupAllTheThings(lane: String, parameters: [String : String]) {
43
+ LaneFile.fastfileInstance!.beforeAll(currentLane: lane, parameters: parameters)
41
44
  LaneFile.fastfileInstance!.beforeAll()
42
45
  }
43
46
 
@@ -123,7 +126,7 @@ public class LaneFile: NSObject, LaneFileProtocol {
123
126
  }
124
127
 
125
128
  // call all methods that need to be called before we start calling lanes
126
- fastfileInstance.setupAllTheThings()
129
+ fastfileInstance.setupAllTheThings(lane: named, parameters: parameters)
127
130
 
128
131
  // We need to catch all possible errors here and display a nice message
129
132
  _ = fastfileInstance.perform(NSSelectorFromString(laneMethod), with: parameters)
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.146.0
21
+ // Generated with fastlane 2.149.0
@@ -99,6 +99,12 @@ protocol MatchfileProtocol: class {
99
99
  /// The name of provisioning profile template. If the developer account has provisioning profile templates (aka: custom entitlements), the template name can be found by inspecting the Entitlements drop-down while creating/editing a provisioning profile (e.g. "Apple Pay Pass Suppression Development")
100
100
  var templateName: String? { get }
101
101
 
102
+ /// A custom name for the provisioning profile. This will replace the default provisioning profile name if specified
103
+ var profileName: String? { get }
104
+
105
+ /// Should the command fail if it was about to create a duplicate of an existing provisioning profile. It can happen due to issues on Apple Developer Portal, when profile to be recreated was not properly deleted first
106
+ var failOnNameTaken: Bool { get }
107
+
102
108
  /// Path in which to export certificates, key and profile
103
109
  var outputPath: String? { get }
104
110
 
@@ -140,10 +146,12 @@ extension MatchfileProtocol {
140
146
  var skipDocs: Bool { return false }
141
147
  var platform: String { return "ios" }
142
148
  var templateName: String? { return nil }
149
+ var profileName: String? { return nil }
150
+ var failOnNameTaken: Bool { return false }
143
151
  var outputPath: String? { return nil }
144
152
  var verbose: Bool { return false }
145
153
  }
146
154
 
147
155
  // Please don't remove the lines below
148
156
  // They are used to detect outdated files
149
- // FastlaneRunnerAPIVersion [0.9.15]
157
+ // FastlaneRunnerAPIVersion [0.9.17]
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.146.0
21
+ // Generated with fastlane 2.149.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.146.0
21
+ // Generated with fastlane 2.149.0
@@ -45,6 +45,12 @@ protocol ScanfileProtocol: class {
45
45
  /// The testplan associated with the scheme that should be used for testing
46
46
  var testplan: String? { get }
47
47
 
48
+ /// Array of strings matching test plan configurations to run
49
+ var onlyTestConfigurations: String? { get }
50
+
51
+ /// Array of strings matching test plan configurations to skip
52
+ var skipTestConfigurations: String? { get }
53
+
48
54
  /// Run tests using the provided `.xctestrun` file
49
55
  var xctestrun: String? { get }
50
56
 
@@ -66,10 +72,13 @@ protocol ScanfileProtocol: class {
66
72
  /// Should the HTML report be opened when tests are completed?
67
73
  var openReport: Bool { get }
68
74
 
75
+ /// Disable xcpretty formatting of build, similar to `output_style='raw'` but this will also skip the test results table
76
+ var disableXcpretty: Bool? { get }
77
+
69
78
  /// The directory in which all reports will be stored
70
79
  var outputDirectory: String { get }
71
80
 
72
- /// Define how the output should look like. Valid values are: standard, basic, rspec, or raw (disables xcpretty)
81
+ /// Define how the output should look like. Valid values are: standard, basic, rspec, or raw (disables xcpretty during xcodebuild)
73
82
  var outputStyle: String? { get }
74
83
 
75
84
  /// Comma separated list of the output types (e.g. html, junit, json-compilation-database)
@@ -197,6 +206,8 @@ extension ScanfileProtocol {
197
206
  var onlyTesting: String? { return nil }
198
207
  var skipTesting: String? { return nil }
199
208
  var testplan: String? { return nil }
209
+ var onlyTestConfigurations: String? { return nil }
210
+ var skipTestConfigurations: String? { return nil }
200
211
  var xctestrun: String? { return nil }
201
212
  var toolchain: String? { return nil }
202
213
  var clean: Bool { return false }
@@ -204,6 +215,7 @@ extension ScanfileProtocol {
204
215
  var addressSanitizer: Bool? { return nil }
205
216
  var threadSanitizer: Bool? { return nil }
206
217
  var openReport: Bool { return false }
218
+ var disableXcpretty: Bool? { return nil }
207
219
  var outputDirectory: String { return "./test_output" }
208
220
  var outputStyle: String? { return nil }
209
221
  var outputTypes: String { return "html,junit" }
@@ -234,7 +246,7 @@ extension ScanfileProtocol {
234
246
  var slackMessage: String? { return nil }
235
247
  var slackUseWebhookConfiguredUsernameAndIcon: Bool { return false }
236
248
  var slackUsername: String { return "fastlane" }
237
- var slackIconUrl: String { return "https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane.png" }
249
+ var slackIconUrl: String { return "https://fastlane.tools/assets/img/fastlane_icon.png" }
238
250
  var skipSlack: Bool { return false }
239
251
  var slackOnlyOnFailure: Bool { return false }
240
252
  var destination: String? { return nil }
@@ -246,4 +258,4 @@ extension ScanfileProtocol {
246
258
 
247
259
  // Please don't remove the lines below
248
260
  // They are used to detect outdated files
249
- // FastlaneRunnerAPIVersion [0.9.27]
261
+ // FastlaneRunnerAPIVersion [0.9.30]
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.146.0
21
+ // Generated with fastlane 2.149.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.146.0
21
+ // Generated with fastlane 2.149.0
@@ -45,6 +45,9 @@ protocol SnapshotfileProtocol: class {
45
45
  /// Enabling this option will automatically erase the simulator before running the application
46
46
  var eraseSimulator: Bool { get }
47
47
 
48
+ /// Enabling this option wil automatically override the status bar to show 9:41 AM, full battery, and full reception
49
+ var overrideStatusBar: Bool { get }
50
+
48
51
  /// Enabling this option will configure the Simulator's system language
49
52
  var localizeSimulator: Bool { get }
50
53
 
@@ -60,6 +63,9 @@ protocol SnapshotfileProtocol: class {
60
63
  /// A list of videos that should be added to the simulator before running the application
61
64
  var addVideos: [String]? { get }
62
65
 
66
+ /// A path to screenshots.html template
67
+ var htmlTemplate: String { get }
68
+
63
69
  /// The directory where to store the build log
64
70
  var buildlogPath: String { get }
65
71
 
@@ -107,6 +113,18 @@ protocol SnapshotfileProtocol: class {
107
113
 
108
114
  /// Sets a custom path for Swift Package Manager dependencies
109
115
  var clonedSourcePackagesPath: String? { get }
116
+
117
+ /// The testplan associated with the scheme that should be used for testing
118
+ var testplan: String? { get }
119
+
120
+ /// Array of strings matching Test Bundle/Test Suite/Test Cases to run
121
+ var onlyTesting: String? { get }
122
+
123
+ /// Array of strings matching Test Bundle/Test Suite/Test Cases to skip
124
+ var skipTesting: String? { get }
125
+
126
+ /// Disable xcpretty formatting of build
127
+ var disableXcpretty: Bool? { get }
110
128
  }
111
129
 
112
130
  extension SnapshotfileProtocol {
@@ -125,11 +143,13 @@ extension SnapshotfileProtocol {
125
143
  var clearPreviousScreenshots: Bool { return false }
126
144
  var reinstallApp: Bool { return false }
127
145
  var eraseSimulator: Bool { return false }
146
+ var overrideStatusBar: Bool { return false }
128
147
  var localizeSimulator: Bool { return false }
129
148
  var darkMode: Bool? { return nil }
130
149
  var appIdentifier: String? { return nil }
131
150
  var addPhotos: [String]? { return nil }
132
151
  var addVideos: [String]? { return nil }
152
+ var htmlTemplate: String { return "/Users/josh/Projects/fastlane/fastlane/snapshot/lib/snapshot/page.html.erb" }
133
153
  var buildlogPath: String { return "~/Library/Logs/snapshot" }
134
154
  var clean: Bool { return false }
135
155
  var testWithoutBuilding: Bool? { return nil }
@@ -146,8 +166,12 @@ extension SnapshotfileProtocol {
146
166
  var concurrentSimulators: Bool { return true }
147
167
  var disableSlideToType: Bool { return false }
148
168
  var clonedSourcePackagesPath: String? { return nil }
169
+ var testplan: String? { return nil }
170
+ var onlyTesting: String? { return nil }
171
+ var skipTesting: String? { return nil }
172
+ var disableXcpretty: Bool? { return nil }
149
173
  }
150
174
 
151
175
  // Please don't remove the lines below
152
176
  // They are used to detect outdated files
153
- // FastlaneRunnerAPIVersion [0.9.7]
177
+ // FastlaneRunnerAPIVersion [0.9.10]
@@ -416,5 +416,22 @@ module FastlaneCore
416
416
  UI.deprecated("Helper.log is deprecated. Use `UI` class instead")
417
417
  UI.current.log
418
418
  end
419
+
420
+ def self.ask_password(message: "Passphrase: ", confirm: nil)
421
+ raise "This code should only run in interactive mode" unless UI.interactive?
422
+
423
+ loop do
424
+ password = UI.password(message)
425
+ if confirm
426
+ password2 = UI.password("Type passphrase again: ")
427
+ if password == password2
428
+ return password
429
+ end
430
+ else
431
+ return password
432
+ end
433
+ UI.error("Passphrases differ. Try again")
434
+ end
435
+ end
419
436
  end
420
437
  end
@@ -1,9 +1,10 @@
1
1
  require_relative 'helper'
2
2
  require 'open3'
3
+ require 'security'
3
4
 
4
5
  module FastlaneCore
5
6
  class KeychainImporter
6
- def self.import_file(path, keychain_path, keychain_password: "", certificate_password: "", output: FastlaneCore::Globals.verbose?)
7
+ def self.import_file(path, keychain_path, keychain_password: nil, certificate_password: "", output: FastlaneCore::Globals.verbose?)
7
8
  UI.user_error!("Could not find file '#{path}'") unless File.exist?(path)
8
9
 
9
10
  command = "security import #{path.shellescape} -k '#{keychain_path.shellescape}'"
@@ -19,6 +20,7 @@ module FastlaneCore
19
20
 
20
21
  # Set partition list only if success since it can be a time consuming process if a lot of keys are installed
21
22
  if thrd.value.success?
23
+ keychain_password ||= resolve_keychain_password(keychain_path)
22
24
  set_partition_list(path, keychain_path, keychain_password: keychain_password, output: output)
23
25
  else
24
26
  # Output verbose if file is already installed since not an error otherwise we will show the whole error
@@ -32,7 +34,7 @@ module FastlaneCore
32
34
  end
33
35
  end
34
36
 
35
- def self.set_partition_list(path, keychain_path, keychain_password: "", output: FastlaneCore::Globals.verbose?)
37
+ def self.set_partition_list(path, keychain_path, keychain_password: nil, output: FastlaneCore::Globals.verbose?)
36
38
  # When security supports partition lists, also add the partition IDs
37
39
  # See https://openradar.appspot.com/28524119
38
40
  if Helper.backticks('security -h | grep set-key-partition-list', print: false).length > 0
@@ -53,6 +55,9 @@ module FastlaneCore
53
55
 
54
56
  # Inform user when no/wrong password was used as its needed to prevent UI permission popup from Xcode when signing
55
57
  if err.include?("SecKeychainItemSetAccessWithPassword")
58
+ keychain_name = File.basename(keychain_path, ".*")
59
+ Security::InternetPassword.delete(server: server_name(keychain_name))
60
+
56
61
  UI.important("")
57
62
  UI.important("Could not configure imported keychain item (certificate) to prevent UI permission popup when code signing\n" \
58
63
  "Check if you supplied the correct `keychain_password` for keychain: `#{keychain_path}`\n" \
@@ -72,5 +77,44 @@ module FastlaneCore
72
77
 
73
78
  end
74
79
  end
80
+
81
+ # https://github.com/fastlane/fastlane/issues/14196
82
+ # Keychain password is needed to set the partition list to
83
+ # prevent Xcode from prompting dialog for keychain password when signing
84
+ # 1. Uses keychain password from login keychain if found
85
+ # 2. Prompts user for keychain password and stores it in login keychain for user later
86
+ def self.resolve_keychain_password(keychain_path)
87
+ keychain_name = File.basename(keychain_path, ".*")
88
+ server = server_name(keychain_name)
89
+
90
+ # Attempt to find password in keychain for keychain
91
+ item = Security::InternetPassword.find(server: server)
92
+ if item
93
+ keychain_password = item.password
94
+ UI.important("Using keychain password from keychain item #{server} in #{keychain_path}")
95
+ end
96
+
97
+ if keychain_password.nil?
98
+ if UI.interactive?
99
+ UI.important("Enter the password for #{keychain_path}")
100
+ UI.important("This passphrase will be stored in your local keychain with the name #{server} and used in future runs")
101
+ UI.important("This prompt can be avoided by specifying the 'keychain_password' option or 'MATCH_KEYCHAIN_PASSWORD' environment variable")
102
+ keychain_password = FastlaneCore::Helper.ask_password(message: "Password for #{keychain_name} keychain: ", confirm: true)
103
+ Security::InternetPassword.add(server, "", keychain_password)
104
+ else
105
+ UI.important("Keychain password for #{keychain_path} was not specified and not found in your keychain. Specify the 'keychain_password' option to prevent the UI permission popup when code signing")
106
+ keychain_password = ""
107
+ end
108
+ end
109
+
110
+ return keychain_password
111
+ end
112
+
113
+ # server name used for accessing the macOS keychain
114
+ def self.server_name(keychain_name)
115
+ ["fastlane", "keychain", keychain_name].join("_")
116
+ end
117
+
118
+ private_class_method :server_name
75
119
  end
76
120
  end
@@ -321,6 +321,7 @@ module FastlaneCore
321
321
  proj << "-project #{options[:project].shellescape}" if options[:project]
322
322
  proj << "-configuration #{options[:configuration].shellescape}" if options[:configuration]
323
323
  proj << "-xcconfig #{options[:xcconfig].shellescape}" if options[:xcconfig]
324
+ proj << "-derivedDataPath #{options[:derived_data_path].shellescape}" if options[:derived_data_path]
324
325
 
325
326
  if FastlaneCore::Helper.xcode_at_least?('11.0') && options[:cloned_source_packages_path]
326
327
  proj << "-clonedSourcePackagesDirPath #{options[:cloned_source_packages_path].shellescape}"
@@ -30,6 +30,7 @@ module Frameit
30
30
  program :help_formatter, :compact
31
31
 
32
32
  global_option('--verbose') { FastlaneCore::Globals.verbose = true }
33
+ global_option('--env STRING[,STRING2]', String, 'Add environment(s) to use with `dotenv`')
33
34
 
34
35
  default_command(:run)
35
36
 
@@ -64,6 +64,14 @@ module Frameit
64
64
  def self.all_platforms
65
65
  Platform.constants.map { |c| Platform.const_get(c) }
66
66
  end
67
+
68
+ def self.symbol_to_constant(symbol)
69
+ if symbol == :android
70
+ ANDROID
71
+ else
72
+ IOS
73
+ end
74
+ end
67
75
  end
68
76
 
69
77
  module Devices
@@ -119,6 +127,8 @@ module Frameit
119
127
  IPAD_PRO = Frameit::Device.new("ipad-pro", "Apple iPad Pro", 3, [[2048, 2732], [2732, 2048]], 264, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO)
120
128
  # 3rd generation:
121
129
  IPAD_PRO_12_9 = Frameit::Device.new("ipadPro129", "Apple iPad Pro (12.9-inch) (3rd generation)", 4, [[2048, 2732], [2732, 2048]], 264, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO_12_9)
130
+ # 4th generation:
131
+ IPAD_PRO_12_9_4 = Frameit::Device.new("ipadPro129", "Apple iPad Pro (12.9-inch) (4th generation)", 5, [[2048, 2732], [2732, 2048]], 264, Color::SPACE_GRAY, Platform::IOS, Deliver::AppScreenshot::ScreenSize::IOS_IPAD_PRO_12_9)
122
132
  # iPad Pro (10.5-inch) is not in frameit-frames repo, but must be included so that we are backward compatible with PR #15373
123
133
  # priority must be lower so that users who didn't copy the frame to their frameit frames folder will not get an error
124
134
  # ID and formatted name must be exactly as specified so that device.detect_device() will select this device if the filename includes them
@@ -1,4 +1,6 @@
1
1
  require 'fastlane_core/configuration/config_item'
2
+ require 'fastlane/actions/actions_helper'
3
+ require 'fastlane/helper/lane_helper'
2
4
 
3
5
  require_relative 'module'
4
6
  require_relative 'config_parser'
@@ -97,9 +99,10 @@ module Frameit
97
99
  type: Boolean),
98
100
  FastlaneCore::ConfigItem.new(key: :use_platform,
99
101
  env_name: "FRAMEIT_USE_PLATFORM",
100
- description: "Choose a platform, the valid options are IOS, ANDROID and ANY (IOS is default to ensure backward compatibility)",
102
+ description: "Choose a platform, the valid options are IOS, ANDROID and ANY (default is either general platform defined in the fastfile or IOS to ensure backward compatibility)",
101
103
  optional: true,
102
- default_value: Platform::IOS,
104
+ default_value: Platform.symbol_to_constant(Fastlane::Helper::LaneHelper.current_platform),
105
+ default_value_dynamic: true,
103
106
  verify_block: proc do |value|
104
107
  UI.user_error!("Invalid platform type '#{value}'. Available values are " + Platform.all_platforms.join(', ') + ".") unless ConfigParser.supported_platform?(value)
105
108
  end)
@@ -82,8 +82,13 @@ module Frameit
82
82
  # Loads the config (colors, background, texts, etc.)
83
83
  # Don't use this method to access the actual text and use `fetch_texts` instead
84
84
  def create_config(screenshot_path)
85
+ # Screengrab pulls screenshots to a different folder location
86
+ # frameit only handles two levels of folders, to not break
87
+ # compatibility with Supply we look into a different path for Android
88
+ # Issue https://github.com/fastlane/fastlane/issues/16289
85
89
  config_path = File.join(File.expand_path("..", screenshot_path), "Framefile.json")
86
90
  config_path = File.join(File.expand_path("../..", screenshot_path), "Framefile.json") unless File.exist?(config_path)
91
+ config_path = File.join(File.expand_path("../../../..", screenshot_path), "Framefile.json") unless File.exist?(config_path)
87
92
  file = ConfigParser.new.load(config_path)
88
93
  return {} unless file # no config file at all
89
94
  file.fetch_value(screenshot_path)
@@ -27,6 +27,7 @@ module Frameit
27
27
  # - see Parameters in the doc
28
28
  # - contains default values and validates values
29
29
  # - accessed via Frameit.config[:key]
30
+ # - default value is either general platform from fastfile or IOS if run directly
30
31
  # - lowest priority
31
32
  # - commands_generator.rb
32
33
  # - commands entered directly to CLI (e. g. fastlane frameit android)
@@ -53,6 +53,10 @@ module Gym
53
53
  generator.asset_packs_path
54
54
  end
55
55
 
56
+ def appstore_info_path
57
+ generator.appstore_info_path
58
+ end
59
+
56
60
  # The generator we need to use for the currently used Xcode version
57
61
  # Since we dropped Xcode 6 support, it's just this class, but maybe we'll have
58
62
  # new classes in the future
@@ -141,6 +141,10 @@ module Gym
141
141
  Gym.cache[:asset_packs_path] ||= File.join(temporary_output_path, "OnDemandResources")
142
142
  end
143
143
 
144
+ def appstore_info_path
145
+ Gym.cache[:appstore_info_path] ||= File.join(temporary_output_path, "AppStoreInfo.plist")
146
+ end
147
+
144
148
  private
145
149
 
146
150
  def normalize_export_options(hash)