fastlane 2.229.0 → 2.232.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +98 -92
  3. data/bin/fastlane +2 -2
  4. data/deliver/lib/assets/summary.html.erb +3 -3
  5. data/deliver/lib/deliver/app_screenshot.rb +215 -347
  6. data/deliver/lib/deliver/app_screenshot_iterator.rb +4 -1
  7. data/deliver/lib/deliver/app_screenshot_validator.rb +5 -21
  8. data/deliver/lib/deliver/loader.rb +2 -9
  9. data/deliver/lib/deliver/upload_metadata.rb +5 -0
  10. data/deliver/lib/deliver/upload_screenshots.rb +4 -2
  11. data/fastlane/lib/assets/completions/completion.bash +1 -1
  12. data/fastlane/lib/assets/completions/completion.sh +2 -2
  13. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +19 -14
  14. data/fastlane/lib/fastlane/actions/appium.rb +1 -1
  15. data/fastlane/lib/fastlane/actions/docs/create_app_online.md +6 -3
  16. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +3 -1
  17. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +34 -6
  18. data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +2 -0
  19. data/fastlane/lib/fastlane/actions/get_version_number.rb +1 -1
  20. data/fastlane/lib/fastlane/actions/import_certificate.rb +9 -1
  21. data/fastlane/lib/fastlane/actions/increment_build_number.rb +1 -1
  22. data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +3 -2
  23. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
  24. data/fastlane/lib/fastlane/actions/modify_services.rb +1 -0
  25. data/fastlane/lib/fastlane/actions/notarize.rb +1 -1
  26. data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +1 -1
  27. data/fastlane/lib/fastlane/actions/xcov.rb +1 -7
  28. data/fastlane/lib/fastlane/cli_tools_distributor.rb +19 -1
  29. data/fastlane/lib/fastlane/console.rb +2 -2
  30. data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +4 -4
  31. data/fastlane/lib/fastlane/erb_template_helper.rb +1 -7
  32. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  33. data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +20 -20
  34. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -1
  35. data/fastlane/lib/fastlane/version.rb +2 -1
  36. data/fastlane/swift/Actions.swift +1 -1
  37. data/fastlane/swift/Appfile.swift +13 -5
  38. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  39. data/fastlane/swift/Atomic.swift +1 -1
  40. data/fastlane/swift/ControlCommand.swift +5 -4
  41. data/fastlane/swift/Deliverfile.swift +2 -2
  42. data/fastlane/swift/DeliverfileProtocol.swift +265 -68
  43. data/fastlane/swift/Fastlane.swift +140 -88
  44. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +3 -1
  45. data/fastlane/swift/Gymfile.swift +2 -2
  46. data/fastlane/swift/GymfileProtocol.swift +227 -54
  47. data/fastlane/swift/LaneFileProtocol.swift +4 -2
  48. data/fastlane/swift/MainProcess.swift +1 -1
  49. data/fastlane/swift/Matchfile.swift +2 -2
  50. data/fastlane/swift/MatchfileProtocol.swift +225 -58
  51. data/fastlane/swift/OptionalConfigValue.swift +1 -1
  52. data/fastlane/swift/Plugins.swift +1 -1
  53. data/fastlane/swift/Precheckfile.swift +2 -2
  54. data/fastlane/swift/PrecheckfileProtocol.swift +45 -13
  55. data/fastlane/swift/RubyCommand.swift +6 -7
  56. data/fastlane/swift/RubyCommandable.swift +1 -1
  57. data/fastlane/swift/Runner.swift +2 -2
  58. data/fastlane/swift/RunnerArgument.swift +1 -1
  59. data/fastlane/swift/Scanfile.swift +2 -2
  60. data/fastlane/swift/ScanfileProtocol.swift +332 -82
  61. data/fastlane/swift/Screengrabfile.swift +2 -2
  62. data/fastlane/swift/ScreengrabfileProtocol.swift +89 -24
  63. data/fastlane/swift/Snapshotfile.swift +2 -2
  64. data/fastlane/swift/SnapshotfileProtocol.swift +216 -53
  65. data/fastlane/swift/SocketClient.swift +2 -2
  66. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  67. data/fastlane/swift/SocketResponse.swift +1 -1
  68. data/fastlane/swift/main.swift +1 -1
  69. data/fastlane_core/lib/fastlane_core/cert_checker.rb +10 -0
  70. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +5 -1
  71. data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +14 -0
  72. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +38 -8
  73. data/fastlane_core/lib/fastlane_core/keychain_importer.rb +3 -1
  74. data/fastlane_core/lib/fastlane_core/project.rb +8 -0
  75. data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +7 -1
  76. data/frameit/lib/frameit/device.rb +2 -2
  77. data/frameit/lib/frameit/device_types.rb +108 -70
  78. data/frameit/lib/frameit/template_finder.rb +1 -1
  79. data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +1 -0
  80. data/gym/lib/gym/module.rb +9 -4
  81. data/gym/lib/gym/options.rb +20 -2
  82. data/gym/lib/gym/runner.rb +38 -3
  83. data/produce/lib/produce/commands_generator.rb +2 -0
  84. data/produce/lib/produce/developer_center.rb +1 -0
  85. data/produce/lib/produce/service.rb +6 -1
  86. data/scan/lib/scan/error_handler.rb +5 -0
  87. data/scan/lib/scan/options.rb +11 -1
  88. data/scan/lib/scan/test_command_generator.rb +8 -0
  89. data/sigh/lib/assets/resign.sh +6 -3
  90. data/sigh/lib/sigh/local_manage.rb +6 -4
  91. data/sigh/lib/sigh/runner.rb +18 -1
  92. data/snapshot/lib/snapshot/detect_values.rb +1 -1
  93. data/snapshot/lib/snapshot/options.rb +13 -1
  94. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +4 -2
  95. data/spaceship/lib/spaceship/client.rb +32 -2
  96. data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +62 -8
  97. data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +4 -4
  98. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +7 -1
  99. data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +16 -16
  100. data/spaceship/lib/spaceship/connect_api/models/build_upload.rb +42 -0
  101. data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +2 -0
  102. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +32 -2
  103. data/spaceship/lib/spaceship/connect_api/models/webhook.rb +62 -0
  104. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +0 -6
  105. data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +9 -0
  106. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +38 -0
  107. data/spaceship/lib/spaceship/connect_api.rb +2 -0
  108. data/spaceship/lib/spaceship/errors.rb +8 -6
  109. data/spaceship/lib/spaceship/portal/key.rb +22 -3
  110. data/spaceship/lib/spaceship/portal/portal_client.rb +29 -2
  111. data/spaceship/lib/spaceship/spaceauth_runner.rb +5 -15
  112. data/supply/lib/supply/client.rb +18 -1
  113. data/trainer/lib/trainer/legacy_xcresult.rb +1 -1
  114. data/trainer/lib/trainer/test_parser.rb +1 -1
  115. data/trainer/lib/trainer/xcresult/helper.rb +11 -1
  116. metadata +116 -41
  117. data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +0 -14
  118. data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +0 -43
  119. data/fastlane/lib/fastlane/plugins/template/.travis.yml +0 -4
@@ -1,5 +1,5 @@
1
1
  // ScreengrabfileProtocol.swift
2
- // Copyright (c) 2025 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  public protocol ScreengrabfileProtocol: AnyObject {
5
5
  /// Path to the root of your Android SDK installation, e.g. ~/tools/android-sdk-macosx
@@ -70,30 +70,95 @@ public protocol ScreengrabfileProtocol: AnyObject {
70
70
  }
71
71
 
72
72
  public extension ScreengrabfileProtocol {
73
- var androidHome: String? { return nil }
74
- var buildToolsVersion: String? { return nil }
75
- var locales: [String] { return ["en-US"] }
76
- var clearPreviousScreenshots: Bool { return false }
77
- var outputDirectory: String { return "fastlane/metadata/android" }
78
- var skipOpenSummary: Bool { return false }
79
- var appPackageName: String { return "" }
80
- var testsPackageName: String? { return nil }
81
- var useTestsInPackages: [String]? { return nil }
82
- var useTestsInClasses: [String]? { return nil }
83
- var launchArguments: [String]? { return nil }
84
- var testInstrumentationRunner: String { return "androidx.test.runner.AndroidJUnitRunner" }
85
- var endingLocale: String { return "en-US" }
86
- var useAdbRoot: Bool { return false }
87
- var appApkPath: String? { return nil }
88
- var testsApkPath: String? { return nil }
89
- var specificDevice: String? { return nil }
90
- var deviceType: String { return "phone" }
91
- var exitOnTestFailure: Bool { return true }
92
- var reinstallApp: Bool { return false }
93
- var useTimestampSuffix: Bool { return true }
94
- var adbHost: String? { return nil }
73
+ var androidHome: String? {
74
+ return nil
75
+ }
76
+
77
+ var buildToolsVersion: String? {
78
+ return nil
79
+ }
80
+
81
+ var locales: [String] {
82
+ return ["en-US"]
83
+ }
84
+
85
+ var clearPreviousScreenshots: Bool {
86
+ return false
87
+ }
88
+
89
+ var outputDirectory: String {
90
+ return "fastlane/metadata/android"
91
+ }
92
+
93
+ var skipOpenSummary: Bool {
94
+ return false
95
+ }
96
+
97
+ var appPackageName: String {
98
+ return ""
99
+ }
100
+
101
+ var testsPackageName: String? {
102
+ return nil
103
+ }
104
+
105
+ var useTestsInPackages: [String]? {
106
+ return nil
107
+ }
108
+
109
+ var useTestsInClasses: [String]? {
110
+ return nil
111
+ }
112
+
113
+ var launchArguments: [String]? {
114
+ return nil
115
+ }
116
+
117
+ var testInstrumentationRunner: String {
118
+ return "androidx.test.runner.AndroidJUnitRunner"
119
+ }
120
+
121
+ var endingLocale: String {
122
+ return "en-US"
123
+ }
124
+
125
+ var useAdbRoot: Bool {
126
+ return false
127
+ }
128
+
129
+ var appApkPath: String? {
130
+ return nil
131
+ }
132
+
133
+ var testsApkPath: String? {
134
+ return nil
135
+ }
136
+
137
+ var specificDevice: String? {
138
+ return nil
139
+ }
140
+
141
+ var deviceType: String {
142
+ return "phone"
143
+ }
144
+
145
+ var exitOnTestFailure: Bool {
146
+ return true
147
+ }
148
+
149
+ var reinstallApp: Bool {
150
+ return false
151
+ }
152
+
153
+ var useTimestampSuffix: Bool {
154
+ return true
155
+ }
156
+
157
+ var adbHost: String? {
158
+ return nil
159
+ }
95
160
  }
96
161
 
97
162
  // Please don't remove the lines below
98
163
  // They are used to detect outdated files
99
- // FastlaneRunnerAPIVersion [0.9.135]
164
+ // FastlaneRunnerAPIVersion [0.9.142]
@@ -1,5 +1,5 @@
1
1
  // Snapshotfile.swift
2
- // Copyright (c) 2025 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  // This class is automatically included in FastlaneRunner during build
5
5
 
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.229.0
20
+ // Generated with fastlane 2.232.2
@@ -1,5 +1,5 @@
1
1
  // SnapshotfileProtocol.swift
2
- // Copyright (c) 2025 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  public protocol SnapshotfileProtocol: AnyObject {
5
5
  /// Path to the workspace file
@@ -119,12 +119,18 @@ public protocol SnapshotfileProtocol: AnyObject {
119
119
  /// Sets a custom path for Swift Package Manager dependencies
120
120
  var clonedSourcePackagesPath: String? { get }
121
121
 
122
+ /// Sets a custom package cache path for Swift Package Manager dependencies
123
+ var packageCachePath: String? { get }
124
+
122
125
  /// Skips resolution of Swift Package Manager dependencies
123
126
  var skipPackageDependenciesResolution: Bool { get }
124
127
 
125
- /// Prevents packages from automatically being resolved to versions other than those recorded in the `Package.resolved` file
128
+ /// Prevents packages from automatically being resolved to versions other than those recorded in the `Package.resolved` file. This translates in the option `-disableAutomaticPackageResolution` being passed to xcodebuild
126
129
  var disablePackageAutomaticUpdates: Bool { get }
127
130
 
131
+ /// Skips updating package dependencies from their remote. This translates in the option `-skipPackageUpdates` being passed to xcodebuild
132
+ var skipPackageRepositoryFetches: Bool { get }
133
+
128
134
  /// Lets xcodebuild use a specified package authorization provider (keychain|netrc)
129
135
  var packageAuthorizationProvider: String? { get }
130
136
 
@@ -154,58 +160,215 @@ public protocol SnapshotfileProtocol: AnyObject {
154
160
  }
155
161
 
156
162
  public extension SnapshotfileProtocol {
157
- var workspace: String? { return nil }
158
- var project: String? { return nil }
159
- var xcargs: String? { return nil }
160
- var xcconfig: String? { return nil }
161
- var devices: [String]? { return nil }
162
- var languages: [String] { return ["en-US"] }
163
- var launchArguments: [String] { return [""] }
164
- var outputDirectory: String { return "screenshots" }
165
- var outputSimulatorLogs: Bool { return false }
166
- var iosVersion: String? { return nil }
167
- var skipOpenSummary: Bool { return false }
168
- var skipHelperVersionCheck: Bool { return false }
169
- var clearPreviousScreenshots: Bool { return false }
170
- var reinstallApp: Bool { return false }
171
- var eraseSimulator: Bool { return false }
172
- var headless: Bool { return true }
173
- var overrideStatusBar: Bool { return false }
174
- var overrideStatusBarArguments: String? { return nil }
175
- var localizeSimulator: Bool { return false }
176
- var darkMode: Bool? { return nil }
177
- var appIdentifier: String? { return nil }
178
- var addPhotos: [String]? { return nil }
179
- var addVideos: [String]? { return nil }
180
- var htmlTemplate: String? { return nil }
181
- var buildlogPath: String { return "~/Library/Logs/snapshot" }
182
- var clean: Bool { return false }
183
- var testWithoutBuilding: Bool? { return nil }
184
- var configuration: String? { return nil }
185
- var sdk: String? { return nil }
186
- var scheme: String? { return nil }
187
- var numberOfRetries: Int { return 1 }
188
- var stopAfterFirstError: Bool { return false }
189
- var derivedDataPath: String? { return nil }
190
- var resultBundle: Bool { return false }
191
- var testTargetName: String? { return nil }
192
- var namespaceLogFiles: String? { return nil }
193
- var concurrentSimulators: Bool { return true }
194
- var disableSlideToType: Bool { return false }
195
- var clonedSourcePackagesPath: String? { return nil }
196
- var skipPackageDependenciesResolution: Bool { return false }
197
- var disablePackageAutomaticUpdates: Bool { return false }
198
- var packageAuthorizationProvider: String? { return nil }
199
- var testplan: String? { return nil }
200
- var onlyTesting: String? { return nil }
201
- var skipTesting: String? { return nil }
202
- var xcodebuildFormatter: String { return "xcbeautify" }
203
- var xcprettyArgs: String? { return nil }
204
- var disableXcpretty: Bool? { return nil }
205
- var suppressXcodeOutput: Bool? { return nil }
206
- var useSystemScm: Bool { return false }
163
+ var workspace: String? {
164
+ return nil
165
+ }
166
+
167
+ var project: String? {
168
+ return nil
169
+ }
170
+
171
+ var xcargs: String? {
172
+ return nil
173
+ }
174
+
175
+ var xcconfig: String? {
176
+ return nil
177
+ }
178
+
179
+ var devices: [String]? {
180
+ return nil
181
+ }
182
+
183
+ var languages: [String] {
184
+ return ["en-US"]
185
+ }
186
+
187
+ var launchArguments: [String] {
188
+ return [""]
189
+ }
190
+
191
+ var outputDirectory: String {
192
+ return "screenshots"
193
+ }
194
+
195
+ var outputSimulatorLogs: Bool {
196
+ return false
197
+ }
198
+
199
+ var iosVersion: String? {
200
+ return nil
201
+ }
202
+
203
+ var skipOpenSummary: Bool {
204
+ return false
205
+ }
206
+
207
+ var skipHelperVersionCheck: Bool {
208
+ return false
209
+ }
210
+
211
+ var clearPreviousScreenshots: Bool {
212
+ return false
213
+ }
214
+
215
+ var reinstallApp: Bool {
216
+ return false
217
+ }
218
+
219
+ var eraseSimulator: Bool {
220
+ return false
221
+ }
222
+
223
+ var headless: Bool {
224
+ return true
225
+ }
226
+
227
+ var overrideStatusBar: Bool {
228
+ return false
229
+ }
230
+
231
+ var overrideStatusBarArguments: String? {
232
+ return nil
233
+ }
234
+
235
+ var localizeSimulator: Bool {
236
+ return false
237
+ }
238
+
239
+ var darkMode: Bool? {
240
+ return nil
241
+ }
242
+
243
+ var appIdentifier: String? {
244
+ return nil
245
+ }
246
+
247
+ var addPhotos: [String]? {
248
+ return nil
249
+ }
250
+
251
+ var addVideos: [String]? {
252
+ return nil
253
+ }
254
+
255
+ var htmlTemplate: String? {
256
+ return nil
257
+ }
258
+
259
+ var buildlogPath: String {
260
+ return "~/Library/Logs/snapshot"
261
+ }
262
+
263
+ var clean: Bool {
264
+ return false
265
+ }
266
+
267
+ var testWithoutBuilding: Bool? {
268
+ return nil
269
+ }
270
+
271
+ var configuration: String? {
272
+ return nil
273
+ }
274
+
275
+ var sdk: String? {
276
+ return nil
277
+ }
278
+
279
+ var scheme: String? {
280
+ return nil
281
+ }
282
+
283
+ var numberOfRetries: Int {
284
+ return 1
285
+ }
286
+
287
+ var stopAfterFirstError: Bool {
288
+ return false
289
+ }
290
+
291
+ var derivedDataPath: String? {
292
+ return nil
293
+ }
294
+
295
+ var resultBundle: Bool {
296
+ return false
297
+ }
298
+
299
+ var testTargetName: String? {
300
+ return nil
301
+ }
302
+
303
+ var namespaceLogFiles: String? {
304
+ return nil
305
+ }
306
+
307
+ var concurrentSimulators: Bool {
308
+ return true
309
+ }
310
+
311
+ var disableSlideToType: Bool {
312
+ return false
313
+ }
314
+
315
+ var clonedSourcePackagesPath: String? {
316
+ return nil
317
+ }
318
+
319
+ var packageCachePath: String? {
320
+ return nil
321
+ }
322
+
323
+ var skipPackageDependenciesResolution: Bool {
324
+ return false
325
+ }
326
+
327
+ var disablePackageAutomaticUpdates: Bool {
328
+ return false
329
+ }
330
+
331
+ var skipPackageRepositoryFetches: Bool {
332
+ return false
333
+ }
334
+
335
+ var packageAuthorizationProvider: String? {
336
+ return nil
337
+ }
338
+
339
+ var testplan: String? {
340
+ return nil
341
+ }
342
+
343
+ var onlyTesting: String? {
344
+ return nil
345
+ }
346
+
347
+ var skipTesting: String? {
348
+ return nil
349
+ }
350
+
351
+ var xcodebuildFormatter: String {
352
+ return "xcbeautify"
353
+ }
354
+
355
+ var xcprettyArgs: String? {
356
+ return nil
357
+ }
358
+
359
+ var disableXcpretty: Bool? {
360
+ return nil
361
+ }
362
+
363
+ var suppressXcodeOutput: Bool? {
364
+ return nil
365
+ }
366
+
367
+ var useSystemScm: Bool {
368
+ return false
369
+ }
207
370
  }
208
371
 
209
372
  // Please don't remove the lines below
210
373
  // They are used to detect outdated files
211
- // FastlaneRunnerAPIVersion [0.9.129]
374
+ // FastlaneRunnerAPIVersion [0.9.136]
@@ -1,5 +1,5 @@
1
1
  // SocketClient.swift
2
- // Copyright (c) 2025 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  //
5
5
  // ** NOTE **
@@ -53,7 +53,7 @@ class SocketClient: NSObject {
53
53
 
54
54
  private(set) var socketStatus: SocketStatus
55
55
 
56
- // localhost only, this prevents other computers from connecting
56
+ /// localhost only, this prevents other computers from connecting
57
57
  init(host: String = "localhost", port: UInt32 = 2000, commandTimeoutSeconds: Int = defaultCommandTimeoutSeconds, socketDelegate: SocketClientDelegateProtocol) {
58
58
  self.host = host
59
59
  self.port = port
@@ -1,5 +1,5 @@
1
1
  // SocketClientDelegateProtocol.swift
2
- // Copyright (c) 2025 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  //
5
5
  // ** NOTE **
@@ -1,5 +1,5 @@
1
1
  // SocketResponse.swift
2
- // Copyright (c) 2025 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  //
5
5
  // ** NOTE **
@@ -1,5 +1,5 @@
1
1
  // main.swift
2
- // Copyright (c) 2025 FastlaneTools
2
+ // Copyright (c) 2026 FastlaneTools
3
3
 
4
4
  //
5
5
  // ** NOTE **
@@ -30,6 +30,16 @@ WWDRCA_CERTIFICATES = [
30
30
  alias: 'G6',
31
31
  sha256: 'bdd4ed6e74691f0c2bfd01be0296197af1379e0418e2d300efa9c3bef642ca30',
32
32
  url: 'https://www.apple.com/certificateauthority/AppleWWDRCAG6.cer'
33
+ },
34
+ {
35
+ alias: 'DEV-ID-G1',
36
+ sha256: '7afc9d01a62f03a2de9637936d4afe68090d2de18d03f29c88cfb0b1ba63587f',
37
+ url: 'https://www.apple.com/certificateauthority/DeveloperIDCA.cer'
38
+ },
39
+ {
40
+ alias: 'DEV-ID-G2',
41
+ sha256: 'f16cd3c54c7f83cea4bf1a3e6a0819c8aaa8e4a1528fd144715f350643d2df3a',
42
+ url: 'https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer'
33
43
  }
34
44
  ]
35
45
 
@@ -26,8 +26,10 @@ module FastlaneCore
26
26
  spawn_with_popen(command, &block)
27
27
  end
28
28
 
29
- def self.spawn_with_pty(command, &block)
29
+ def self.spawn_with_pty(original_command, &block)
30
30
  require 'pty'
31
+ # this forces the PTY flush - fixes #21792
32
+ command = ENV['FASTLANE_EXEC_FLUSH_PTY_WORKAROUND'] ? "#{original_command};" : original_command
31
33
  PTY.spawn(command) do |command_stdout, command_stdin, pid|
32
34
  begin
33
35
  yield(command_stdout, command_stdin, pid)
@@ -37,6 +39,8 @@ module FastlaneCore
37
39
  # This is expected on some linux systems, that indicates that the subcommand finished
38
40
  # and we kept trying to read, ignore it
39
41
  ensure
42
+ command_stdin.close
43
+ command_stdout.close
40
44
  begin
41
45
  Process.wait(pid)
42
46
  rescue Errno::ECHILD, PTY::ChildExited
@@ -13,6 +13,20 @@ module FastlaneCore
13
13
  attr_accessor :package_path
14
14
 
15
15
  def generate(app_id: nil, ipa_path: nil, package_path: nil, platform: nil, app_identifier: nil, short_version: nil, bundle_version: nil)
16
+ unless Helper.is_mac?
17
+ # .itmsp packages are not supported for ipa uploads starting Transporter 4.1, for non-macOS
18
+ self.package_path = package_path
19
+ copy_ipa(ipa_path)
20
+
21
+ # copy any AppStoreInfo.plist file that's next to the ipa file
22
+ app_store_info_path = File.join(File.dirname(ipa_path), "AppStoreInfo.plist")
23
+ if File.exist?(app_store_info_path)
24
+ FileUtils.cp(app_store_info_path, File.join(self.package_path, "AppStoreInfo.plist"))
25
+ end
26
+
27
+ return self.package_path
28
+ end
29
+
16
30
  self.package_path = File.join(package_path, "#{app_id}-#{SecureRandom.uuid}.itmsp")
17
31
  FileUtils.rm_rf(self.package_path) if File.directory?(self.package_path)
18
32
  FileUtils.mkdir_p(self.package_path)
@@ -219,8 +219,8 @@ module FastlaneCore
219
219
  end
220
220
 
221
221
  def file_upload_option(source)
222
- ext = File.extname(source).downcase
223
- is_asset_file_type = !File.directory?(source) && [".ipa", ".pkg", ".dmg", ".zip"].include?(ext)
222
+ file_ext = File.extname(source).downcase
223
+ is_asset_file_type = !File.directory?(source) && allowed_package_extensions.map { |ext| ".#{ext}" }.include?(file_ext)
224
224
 
225
225
  if is_asset_file_type
226
226
  return "-assetFile #{source.shellescape}"
@@ -246,11 +246,16 @@ module FastlaneCore
246
246
  end
247
247
  return deliver_additional_params
248
248
  end
249
+
250
+ def allowed_package_extensions
251
+ ["ipa", "pkg", "dmg", "zip"]
252
+ end
249
253
  end
250
254
 
251
255
  # Generates commands and executes the altool.
252
256
  class AltoolTransporterExecutor < TransporterExecutor
253
- ERROR_REGEX = /\*\*\* Error:\s+(.+)/
257
+ # Xcode 26 uses ERROR, while previous versions used *** Error
258
+ ERROR_REGEX = /(?:\*\*\*\s*)?ERROR:\s+(.+)/i
254
259
 
255
260
  private_constant :ERROR_REGEX
256
261
 
@@ -296,7 +301,7 @@ module FastlaneCore
296
301
  end
297
302
 
298
303
  yield(@all_lines) if block_given?
299
- exit_status.zero?
304
+ @errors.empty?
300
305
  end
301
306
 
302
307
  def build_credential_params(username = nil, password = nil, jwt = nil, api_key = nil)
@@ -478,6 +483,31 @@ module FastlaneCore
478
483
  UI.error("Could not download/upload from App Store Connect! It's probably related to your password or your internet connection.")
479
484
  end
480
485
 
486
+ def file_upload_option(source)
487
+ # uploading packages on non-macOS platforms requires AppStoreInfo.plist starting with Transporter >= 4.1
488
+ if !Helper.is_mac? && File.directory?(source)
489
+ asset_file = Dir.glob(File.join(source, "*.{#{allowed_package_extensions.join(',')}}")).first
490
+ unless asset_file
491
+ UI.user_error!("No package file (#{allowed_package_extensions.join(',')}) found in #{source}")
492
+ end
493
+
494
+ appstore_info_path = File.join(source, "AppStoreInfo.plist")
495
+ unless File.file?(appstore_info_path)
496
+ UI.error("AppStoreInfo.plist is required for uploading #{File.extname(asset_file)} files on non-macOS platforms.")
497
+ UI.error("Expected AppStoreInfo.plist in the same directory as the #{File.extname(asset_file)} file.")
498
+ UI.error("Generate it by running either 'fastlane gym [...] --generate_appstore_info'")
499
+ UI.error("Or add '<key>generateAppStoreInformation</key><true/>' in an options.plist then run 'fastlane gym [...] --export_options options.plist'.")
500
+ UI.user_error!("Missing required AppStoreInfo.plist file for iTMSTransporter upload")
501
+ end
502
+
503
+ UI.verbose("Using AppStoreInfo.plist for iTMSTransporter upload: #{appstore_info_path}")
504
+ return "-assetFile #{asset_file.shellescape} -assetDescription #{appstore_info_path.shellescape}"
505
+ end
506
+
507
+ # use standard behavior for other file types or macOS platform
508
+ super(source)
509
+ end
510
+
481
511
  private
482
512
 
483
513
  def shell_escaped_password(password)
@@ -776,16 +806,16 @@ module FastlaneCore
776
806
  raise "app_id and dir are required or package_path or asset_path is required" if (app_id.nil? || dir.nil?) && package_path.nil? && asset_path.nil?
777
807
 
778
808
  # Transport can upload .ipa, .dmg, and .pkg files directly with -assetFile
779
- # However, -assetFile requires -assetDescription if Linux or Windows
780
- # This will give the asset directly if macOS and asset_path exists
781
- # otherwise it will use the .itmsp package
809
+ # However, -assetFile requires -assetDescription arguments if Linux or Windows.
810
+ # This will return the asset directly if asset_path exists,
811
+ # otherwise it will use the .itmsp package for the -f argument
782
812
 
783
813
  force_itmsp = FastlaneCore::Env.truthy?("ITMSTRANSPORTER_FORCE_ITMS_PACKAGE_UPLOAD")
784
814
  can_use_asset_path = Helper.is_mac? && asset_path
785
815
 
786
816
  actual_dir = if can_use_asset_path && !force_itmsp
787
817
  # The asset gets deleted upon completion so copying to a temp directory
788
- # (with randomized filename, for multibyte-mixed filename upload fails)
818
+ # (with randomized filename. for multibyte-mixed filename it fails to upload)
789
819
  new_file_name = "#{SecureRandom.uuid}#{File.extname(asset_path)}"
790
820
  tmp_asset_path = File.join(Dir.tmpdir, new_file_name)
791
821
  FileUtils.cp(asset_path, tmp_asset_path)
@@ -4,13 +4,15 @@ require 'security'
4
4
 
5
5
  module FastlaneCore
6
6
  class KeychainImporter
7
- def self.import_file(path, keychain_path, keychain_password: nil, certificate_password: "", skip_set_partition_list: false, output: FastlaneCore::Globals.verbose?)
7
+ def self.import_file(path, keychain_path, keychain_password: nil, certificate_password: "", certificate_format: nil, skip_set_partition_list: false, output: FastlaneCore::Globals.verbose?)
8
8
  UI.user_error!("Could not find file '#{path}'") unless File.exist?(path)
9
9
 
10
10
  password_part = " -P #{certificate_password.shellescape}"
11
+ certificate_format_part = certificate_format.to_s.strip.empty? ? "" : " -f #{certificate_format.shellescape}"
11
12
 
12
13
  command = "security import #{path.shellescape} -k '#{keychain_path.shellescape}'"
13
14
  command << password_part
15
+ command << certificate_format_part
14
16
  command << " -T /usr/bin/codesign" # to not be asked for permission when running a tool like `gym` (before Sierra)
15
17
  command << " -T /usr/bin/security"
16
18
  command << " -T /usr/bin/productbuild" # to not be asked for permission when using an installer cert for macOS
@@ -348,10 +348,18 @@ module FastlaneCore
348
348
  proj << "-clonedSourcePackagesDirPath #{options[:cloned_source_packages_path].shellescape}"
349
349
  end
350
350
 
351
+ if xcode_at_least_11 && options[:package_cache_path]
352
+ proj << "-packageCachePath #{options[:package_cache_path].shellescape}"
353
+ end
354
+
351
355
  if xcode_at_least_11 && options[:disable_package_automatic_updates]
352
356
  proj << "-disableAutomaticPackageResolution"
353
357
  end
354
358
 
359
+ if xcode_at_least_11 && options[:skip_package_repository_fetches]
360
+ proj << "-skipPackageUpdates"
361
+ end
362
+
355
363
  return proj
356
364
  end
357
365
 
@@ -73,7 +73,13 @@ module FastlaneCore
73
73
  end
74
74
 
75
75
  def profiles_path
76
- path = File.expand_path("~") + "/Library/MobileDevice/Provisioning Profiles/"
76
+ path = File.expand_path("~")
77
+ # Xcode 16 has a new location for provisioning profiles.
78
+ if FastlaneCore::Helper.xcode_at_least?(16)
79
+ path = File.join(path, "Library", "Developer", "Xcode", "UserData", "Provisioning Profiles")
80
+ else
81
+ path = File.join(path, "Library", "MobileDevice", "Provisioning Profiles")
82
+ end
77
83
  # If the directory doesn't exist, create it first
78
84
  unless File.directory?(path)
79
85
  FileUtils.mkdir_p(path)