fastlane 2.216.0 → 2.217.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +96 -96
- data/deliver/lib/deliver/app_screenshot.rb +7 -0
- data/deliver/lib/deliver/runner.rb +2 -1
- data/deliver/lib/deliver/upload_metadata.rb +58 -13
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -1
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +6 -2
- data/fastlane/lib/fastlane/actions/git_branch.rb +1 -1
- data/fastlane/lib/fastlane/actions/install_on_device.rb +1 -1
- data/fastlane/lib/fastlane/actions/nexus_upload.rb +1 -0
- data/fastlane/lib/fastlane/actions/notarize.rb +17 -2
- data/fastlane/lib/fastlane/actions/slather.rb +17 -4
- data/fastlane/lib/fastlane/helper/git_helper.rb +3 -0
- data/fastlane/lib/fastlane/lane.rb +9 -1
- data/fastlane/lib/fastlane/runner.rb +1 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +1 -1
- data/fastlane/swift/Fastlane.swift +22 -6
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +5 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
- data/fastlane/swift/formatting/Brewfile.lock.json +18 -28
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +1 -1
- data/fastlane_core/lib/fastlane_core/project.rb +4 -0
- data/fastlane_core/lib/fastlane_core/queue_worker.rb +1 -1
- data/gym/lib/gym/module.rb +13 -2
- data/gym/lib/gym/options.rb +1 -1
- data/match/lib/match/options.rb +5 -0
- data/match/lib/match/runner.rb +11 -5
- data/match/lib/match/storage/git_storage.rb +9 -1
- data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +1 -1
- data/snapshot/lib/assets/SnapshotHelper.swift +13 -9
- data/snapshot/lib/snapshot/reports_generator.rb +48 -7
- data/spaceship/lib/spaceship/connect_api/api_client.rb +2 -1
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +2 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +4 -4
- data/spaceship/lib/spaceship/connect_api/models/certificate.rb +2 -2
- data/spaceship/lib/spaceship/connect_api/models/device.rb +2 -2
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +3 -2
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +14 -8
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +0 -3
- data/supply/lib/supply/uploader.rb +28 -13
- data/trainer/lib/trainer/xcresult.rb +1 -1
- metadata +25 -28
- data/fastlane/lib/fastlane/.features.rb.swp +0 -0
- data/fastlane_core/lib/fastlane_core/.env.rb.swp +0 -0
- data/supply/lib/supply/.client.rb.swp +0 -0
@@ -5252,7 +5252,7 @@ public func gitAdd(path: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
|
|
5252
5252
|
/**
|
5253
5253
|
Returns the name of the current git branch, possibly as managed by CI ENV vars
|
5254
5254
|
|
5255
|
-
If no branch could be found, this action will return an empty string. This is a wrapper for the internal action Actions.git_branch
|
5255
|
+
If no branch could be found, this action will return an empty string. If `FL_GIT_BRANCH_DONT_USE_ENV_VARS` is `true`, it'll ignore CI ENV vars. This is a wrapper for the internal action Actions.git_branch
|
5256
5256
|
*/
|
5257
5257
|
@discardableResult public func gitBranch() -> String {
|
5258
5258
|
let args: [RubyCommand.Argument] = []
|
@@ -6236,7 +6236,7 @@ public func importCertificate(certificatePath: String,
|
|
6236
6236
|
- skipWifi: Do not search for devices via WiFi
|
6237
6237
|
- ipa: The IPA file to put on the device
|
6238
6238
|
|
6239
|
-
Installs the ipa on the device. If no id is given, the first found iOS device will be used. Works via USB or Wi-Fi. This requires `ios-deploy` to be installed. Please have a look at [ios-deploy](https://github.com/ios-control/ios-deploy). To quickly install it, use `
|
6239
|
+
Installs the ipa on the device. If no id is given, the first found iOS device will be used. Works via USB or Wi-Fi. This requires `ios-deploy` to be installed. Please have a look at [ios-deploy](https://github.com/ios-control/ios-deploy). To quickly install it, use `brew install ios-deploy`
|
6240
6240
|
*/
|
6241
6241
|
public func installOnDevice(extra: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
6242
6242
|
deviceId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
@@ -6745,6 +6745,7 @@ public func makeChangelogFromJenkins(fallbackChangelog: String = "",
|
|
6745
6745
|
- forceForNewDevices: Renew the provisioning profiles if the device count on the developer portal has changed. Ignored for profile types 'appstore' and 'developer_id'
|
6746
6746
|
- includeMacInProfiles: Include Apple Silicon Mac devices in provisioning profiles for iOS/iPadOS apps
|
6747
6747
|
- includeAllCertificates: Include all matching certificates in the provisioning profile. Works only for the 'development' provisioning profile type
|
6748
|
+
- certificateId: Select certificate by id. Useful if multiple certificates are stored in one place
|
6748
6749
|
- forceForNewCertificates: Renew the provisioning profiles if the certificate count on the developer portal has changed. Works only for the 'development' provisioning profile type. Requires 'include_all_certificates' option to be 'true'
|
6749
6750
|
- skipConfirmation: Disables confirmation prompts during nuke, answering them with yes
|
6750
6751
|
- safeRemoveCerts: Remove certs from repository during nuke without revoking them on the developer portal
|
@@ -6802,6 +6803,7 @@ public func match(type: String = matchfile.type,
|
|
6802
6803
|
forceForNewDevices: OptionalConfigValue<Bool> = .fastlaneDefault(matchfile.forceForNewDevices),
|
6803
6804
|
includeMacInProfiles: OptionalConfigValue<Bool> = .fastlaneDefault(matchfile.includeMacInProfiles),
|
6804
6805
|
includeAllCertificates: OptionalConfigValue<Bool> = .fastlaneDefault(matchfile.includeAllCertificates),
|
6806
|
+
certificateId: OptionalConfigValue<String?> = .fastlaneDefault(matchfile.certificateId),
|
6805
6807
|
forceForNewCertificates: OptionalConfigValue<Bool> = .fastlaneDefault(matchfile.forceForNewCertificates),
|
6806
6808
|
skipConfirmation: OptionalConfigValue<Bool> = .fastlaneDefault(matchfile.skipConfirmation),
|
6807
6809
|
safeRemoveCerts: OptionalConfigValue<Bool> = .fastlaneDefault(matchfile.safeRemoveCerts),
|
@@ -6857,6 +6859,7 @@ public func match(type: String = matchfile.type,
|
|
6857
6859
|
let forceForNewDevicesArg = forceForNewDevices.asRubyArgument(name: "force_for_new_devices", type: nil)
|
6858
6860
|
let includeMacInProfilesArg = includeMacInProfiles.asRubyArgument(name: "include_mac_in_profiles", type: nil)
|
6859
6861
|
let includeAllCertificatesArg = includeAllCertificates.asRubyArgument(name: "include_all_certificates", type: nil)
|
6862
|
+
let certificateIdArg = certificateId.asRubyArgument(name: "certificate_id", type: nil)
|
6860
6863
|
let forceForNewCertificatesArg = forceForNewCertificates.asRubyArgument(name: "force_for_new_certificates", type: nil)
|
6861
6864
|
let skipConfirmationArg = skipConfirmation.asRubyArgument(name: "skip_confirmation", type: nil)
|
6862
6865
|
let safeRemoveCertsArg = safeRemoveCerts.asRubyArgument(name: "safe_remove_certs", type: nil)
|
@@ -6911,6 +6914,7 @@ public func match(type: String = matchfile.type,
|
|
6911
6914
|
forceForNewDevicesArg,
|
6912
6915
|
includeMacInProfilesArg,
|
6913
6916
|
includeAllCertificatesArg,
|
6917
|
+
certificateIdArg,
|
6914
6918
|
forceForNewCertificatesArg,
|
6915
6919
|
skipConfirmationArg,
|
6916
6920
|
safeRemoveCertsArg,
|
@@ -6976,6 +6980,7 @@ public func match(type: String = matchfile.type,
|
|
6976
6980
|
- forceForNewDevices: Renew the provisioning profiles if the device count on the developer portal has changed. Ignored for profile types 'appstore' and 'developer_id'
|
6977
6981
|
- includeMacInProfiles: Include Apple Silicon Mac devices in provisioning profiles for iOS/iPadOS apps
|
6978
6982
|
- includeAllCertificates: Include all matching certificates in the provisioning profile. Works only for the 'development' provisioning profile type
|
6983
|
+
- certificateId: Select certificate by id. Useful if multiple certificates are stored in one place
|
6979
6984
|
- forceForNewCertificates: Renew the provisioning profiles if the certificate count on the developer portal has changed. Works only for the 'development' provisioning profile type. Requires 'include_all_certificates' option to be 'true'
|
6980
6985
|
- skipConfirmation: Disables confirmation prompts during nuke, answering them with yes
|
6981
6986
|
- safeRemoveCerts: Remove certs from repository during nuke without revoking them on the developer portal
|
@@ -7037,6 +7042,7 @@ public func matchNuke(type: String = "development",
|
|
7037
7042
|
forceForNewDevices: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
7038
7043
|
includeMacInProfiles: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
7039
7044
|
includeAllCertificates: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
7045
|
+
certificateId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
7040
7046
|
forceForNewCertificates: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
7041
7047
|
skipConfirmation: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
7042
7048
|
safeRemoveCerts: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
@@ -7092,6 +7098,7 @@ public func matchNuke(type: String = "development",
|
|
7092
7098
|
let forceForNewDevicesArg = forceForNewDevices.asRubyArgument(name: "force_for_new_devices", type: nil)
|
7093
7099
|
let includeMacInProfilesArg = includeMacInProfiles.asRubyArgument(name: "include_mac_in_profiles", type: nil)
|
7094
7100
|
let includeAllCertificatesArg = includeAllCertificates.asRubyArgument(name: "include_all_certificates", type: nil)
|
7101
|
+
let certificateIdArg = certificateId.asRubyArgument(name: "certificate_id", type: nil)
|
7095
7102
|
let forceForNewCertificatesArg = forceForNewCertificates.asRubyArgument(name: "force_for_new_certificates", type: nil)
|
7096
7103
|
let skipConfirmationArg = skipConfirmation.asRubyArgument(name: "skip_confirmation", type: nil)
|
7097
7104
|
let safeRemoveCertsArg = safeRemoveCerts.asRubyArgument(name: "safe_remove_certs", type: nil)
|
@@ -7146,6 +7153,7 @@ public func matchNuke(type: String = "development",
|
|
7146
7153
|
forceForNewDevicesArg,
|
7147
7154
|
includeMacInProfilesArg,
|
7148
7155
|
includeAllCertificatesArg,
|
7156
|
+
certificateIdArg,
|
7149
7157
|
forceForNewCertificatesArg,
|
7150
7158
|
skipConfirmationArg,
|
7151
7159
|
safeRemoveCertsArg,
|
@@ -10282,6 +10290,7 @@ public func slackTrainStart(distance: Int = 5,
|
|
10282
10290
|
- arch: Specify which architecture the binary file is in. Needed for universal binaries
|
10283
10291
|
- sourceFiles: A Dir.glob compatible pattern used to limit the lookup to specific source files. Ignored in gcov mode
|
10284
10292
|
- decimals: The amount of decimals to use for % coverage reporting
|
10293
|
+
- ymlfile: Relative path to a file used in place of '.slather.yml'
|
10285
10294
|
|
10286
10295
|
Slather works with multiple code coverage formats, including Xcode 7 code coverage.
|
10287
10296
|
Slather is available at [https://github.com/SlatherOrg/slather](https://github.com/SlatherOrg/slather).
|
@@ -10317,7 +10326,8 @@ public func slather(buildDirectory: OptionalConfigValue<String?> = .fastlaneDefa
|
|
10317
10326
|
binaryFile: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
|
10318
10327
|
arch: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
10319
10328
|
sourceFiles: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
10320
|
-
decimals: OptionalConfigValue<Bool> = .fastlaneDefault(false)
|
10329
|
+
decimals: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
10330
|
+
ymlfile: OptionalConfigValue<String?> = .fastlaneDefault(nil))
|
10321
10331
|
{
|
10322
10332
|
let buildDirectoryArg = buildDirectory.asRubyArgument(name: "build_directory", type: nil)
|
10323
10333
|
let projArg = proj.asRubyArgument(name: "proj", type: nil)
|
@@ -10351,6 +10361,7 @@ public func slather(buildDirectory: OptionalConfigValue<String?> = .fastlaneDefa
|
|
10351
10361
|
let archArg = arch.asRubyArgument(name: "arch", type: nil)
|
10352
10362
|
let sourceFilesArg = sourceFiles.asRubyArgument(name: "source_files", type: nil)
|
10353
10363
|
let decimalsArg = decimals.asRubyArgument(name: "decimals", type: nil)
|
10364
|
+
let ymlfileArg = ymlfile.asRubyArgument(name: "ymlfile", type: nil)
|
10354
10365
|
let array: [RubyCommand.Argument?] = [buildDirectoryArg,
|
10355
10366
|
projArg,
|
10356
10367
|
workspaceArg,
|
@@ -10382,7 +10393,8 @@ public func slather(buildDirectory: OptionalConfigValue<String?> = .fastlaneDefa
|
|
10382
10393
|
binaryFileArg,
|
10383
10394
|
archArg,
|
10384
10395
|
sourceFilesArg,
|
10385
|
-
decimalsArg
|
10396
|
+
decimalsArg,
|
10397
|
+
ymlfileArg]
|
10386
10398
|
let args: [RubyCommand.Argument] = array
|
10387
10399
|
.filter { $0?.value != nil }
|
10388
10400
|
.compactMap { $0 }
|
@@ -11230,6 +11242,7 @@ public func swiftlint(mode: String = "lint",
|
|
11230
11242
|
- forceForNewDevices: Renew the provisioning profiles if the device count on the developer portal has changed. Ignored for profile types 'appstore' and 'developer_id'
|
11231
11243
|
- includeMacInProfiles: Include Apple Silicon Mac devices in provisioning profiles for iOS/iPadOS apps
|
11232
11244
|
- includeAllCertificates: Include all matching certificates in the provisioning profile. Works only for the 'development' provisioning profile type
|
11245
|
+
- certificateId: Select certificate by id. Useful if multiple certificates are stored in one place
|
11233
11246
|
- forceForNewCertificates: Renew the provisioning profiles if the certificate count on the developer portal has changed. Works only for the 'development' provisioning profile type. Requires 'include_all_certificates' option to be 'true'
|
11234
11247
|
- skipConfirmation: Disables confirmation prompts during nuke, answering them with yes
|
11235
11248
|
- safeRemoveCerts: Remove certs from repository during nuke without revoking them on the developer portal
|
@@ -11287,6 +11300,7 @@ public func syncCodeSigning(type: String = "development",
|
|
11287
11300
|
forceForNewDevices: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
11288
11301
|
includeMacInProfiles: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
11289
11302
|
includeAllCertificates: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
11303
|
+
certificateId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
11290
11304
|
forceForNewCertificates: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
11291
11305
|
skipConfirmation: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
11292
11306
|
safeRemoveCerts: OptionalConfigValue<Bool> = .fastlaneDefault(false),
|
@@ -11342,6 +11356,7 @@ public func syncCodeSigning(type: String = "development",
|
|
11342
11356
|
let forceForNewDevicesArg = forceForNewDevices.asRubyArgument(name: "force_for_new_devices", type: nil)
|
11343
11357
|
let includeMacInProfilesArg = includeMacInProfiles.asRubyArgument(name: "include_mac_in_profiles", type: nil)
|
11344
11358
|
let includeAllCertificatesArg = includeAllCertificates.asRubyArgument(name: "include_all_certificates", type: nil)
|
11359
|
+
let certificateIdArg = certificateId.asRubyArgument(name: "certificate_id", type: nil)
|
11345
11360
|
let forceForNewCertificatesArg = forceForNewCertificates.asRubyArgument(name: "force_for_new_certificates", type: nil)
|
11346
11361
|
let skipConfirmationArg = skipConfirmation.asRubyArgument(name: "skip_confirmation", type: nil)
|
11347
11362
|
let safeRemoveCertsArg = safeRemoveCerts.asRubyArgument(name: "safe_remove_certs", type: nil)
|
@@ -11396,6 +11411,7 @@ public func syncCodeSigning(type: String = "development",
|
|
11396
11411
|
forceForNewDevicesArg,
|
11397
11412
|
includeMacInProfilesArg,
|
11398
11413
|
includeAllCertificatesArg,
|
11414
|
+
certificateIdArg,
|
11399
11415
|
forceForNewCertificatesArg,
|
11400
11416
|
skipConfirmationArg,
|
11401
11417
|
safeRemoveCertsArg,
|
@@ -13493,7 +13509,7 @@ public func xcov(workspace: OptionalConfigValue<String?> = .fastlaneDefault(nil)
|
|
13493
13509
|
coverallsServiceJobId: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
13494
13510
|
coverallsRepoToken: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
13495
13511
|
xcconfig: OptionalConfigValue<String?> = .fastlaneDefault(nil),
|
13496
|
-
ideFoundationPath: String = "/Applications/Xcode-
|
13512
|
+
ideFoundationPath: String = "/Applications/Xcode-15.0.0.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
|
13497
13513
|
legacySupport: OptionalConfigValue<Bool> = .fastlaneDefault(false))
|
13498
13514
|
{
|
13499
13515
|
let workspaceArg = workspace.asRubyArgument(name: "workspace", type: nil)
|
@@ -13696,4 +13712,4 @@ public let snapshotfile: Snapshotfile = .init()
|
|
13696
13712
|
|
13697
13713
|
// Please don't remove the lines below
|
13698
13714
|
// They are used to detect outdated files
|
13699
|
-
// FastlaneRunnerAPIVersion [0.9.
|
13715
|
+
// FastlaneRunnerAPIVersion [0.9.174]
|
@@ -125,6 +125,9 @@ public protocol MatchfileProtocol: AnyObject {
|
|
125
125
|
/// Include all matching certificates in the provisioning profile. Works only for the 'development' provisioning profile type
|
126
126
|
var includeAllCertificates: Bool { get }
|
127
127
|
|
128
|
+
/// Select certificate by id. Useful if multiple certificates are stored in one place
|
129
|
+
var certificateId: String? { get }
|
130
|
+
|
128
131
|
/// Renew the provisioning profiles if the certificate count on the developer portal has changed. Works only for the 'development' provisioning profile type. Requires 'include_all_certificates' option to be 'true'
|
129
132
|
var forceForNewCertificates: Bool { get }
|
130
133
|
|
@@ -207,6 +210,7 @@ public extension MatchfileProtocol {
|
|
207
210
|
var forceForNewDevices: Bool { return false }
|
208
211
|
var includeMacInProfiles: Bool { return false }
|
209
212
|
var includeAllCertificates: Bool { return false }
|
213
|
+
var certificateId: String? { return nil }
|
210
214
|
var forceForNewCertificates: Bool { return false }
|
211
215
|
var skipConfirmation: Bool { return false }
|
212
216
|
var safeRemoveCerts: Bool { return false }
|
@@ -224,4 +228,4 @@ public extension MatchfileProtocol {
|
|
224
228
|
|
225
229
|
// Please don't remove the lines below
|
226
230
|
// They are used to detect outdated files
|
227
|
-
// FastlaneRunnerAPIVersion [0.9.
|
231
|
+
// FastlaneRunnerAPIVersion [0.9.118]
|
@@ -2,55 +2,45 @@
|
|
2
2
|
"entries": {
|
3
3
|
"brew": {
|
4
4
|
"swiftformat": {
|
5
|
-
"version": "0.52.
|
5
|
+
"version": "0.52.9",
|
6
6
|
"bottle": {
|
7
7
|
"rebuild": 0,
|
8
8
|
"root_url": "https://ghcr.io/v2/homebrew/core",
|
9
9
|
"files": {
|
10
10
|
"arm64_sonoma": {
|
11
11
|
"cellar": ":any_skip_relocation",
|
12
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
13
|
-
"sha256": "
|
12
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:52697577d90a9cea86cb2829c5a40a9388e5df727a8ee496ff7dad824e572142",
|
13
|
+
"sha256": "52697577d90a9cea86cb2829c5a40a9388e5df727a8ee496ff7dad824e572142"
|
14
14
|
},
|
15
15
|
"arm64_ventura": {
|
16
16
|
"cellar": ":any_skip_relocation",
|
17
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
18
|
-
"sha256": "
|
17
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:2f64a4615f4bc08b5b00fc95ca746c910e66a612d04252a384a150ea4319b3fd",
|
18
|
+
"sha256": "2f64a4615f4bc08b5b00fc95ca746c910e66a612d04252a384a150ea4319b3fd"
|
19
19
|
},
|
20
20
|
"arm64_monterey": {
|
21
21
|
"cellar": ":any_skip_relocation",
|
22
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
23
|
-
"sha256": "
|
24
|
-
},
|
25
|
-
"arm64_big_sur": {
|
26
|
-
"cellar": ":any_skip_relocation",
|
27
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:aa49d987ffd2f32284fd422f1038f5a17584655be5cbfc3bb3726752fd00a6c5",
|
28
|
-
"sha256": "aa49d987ffd2f32284fd422f1038f5a17584655be5cbfc3bb3726752fd00a6c5"
|
22
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:74ee2483b087132a623c63ebe85c0650bd4a1f4ab4e12a592ffddfc93db0f9a0",
|
23
|
+
"sha256": "74ee2483b087132a623c63ebe85c0650bd4a1f4ab4e12a592ffddfc93db0f9a0"
|
29
24
|
},
|
30
25
|
"sonoma": {
|
31
26
|
"cellar": ":any_skip_relocation",
|
32
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
33
|
-
"sha256": "
|
27
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:2e55e58e59fd79c6adb7340dcc0a33fa6fc611a2375e22d6b7c90101ee1bd439",
|
28
|
+
"sha256": "2e55e58e59fd79c6adb7340dcc0a33fa6fc611a2375e22d6b7c90101ee1bd439"
|
34
29
|
},
|
35
30
|
"ventura": {
|
36
31
|
"cellar": ":any_skip_relocation",
|
37
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
38
|
-
"sha256": "
|
32
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:1ef2d7df464f3d8c3e0ae18c1901e595a52038ea6e55760f719e93df5c80d065",
|
33
|
+
"sha256": "1ef2d7df464f3d8c3e0ae18c1901e595a52038ea6e55760f719e93df5c80d065"
|
39
34
|
},
|
40
35
|
"monterey": {
|
41
36
|
"cellar": ":any_skip_relocation",
|
42
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
43
|
-
"sha256": "
|
44
|
-
},
|
45
|
-
"big_sur": {
|
46
|
-
"cellar": ":any_skip_relocation",
|
47
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:492b417360077a31d5c78cfa173526fb8219430e84d01f24f9402ca1d97a63f0",
|
48
|
-
"sha256": "492b417360077a31d5c78cfa173526fb8219430e84d01f24f9402ca1d97a63f0"
|
37
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:c4752c5c2908bbd592c845ced5910e31e4c5ccbfaf3d294d9a9468b9fd9b0d5d",
|
38
|
+
"sha256": "c4752c5c2908bbd592c845ced5910e31e4c5ccbfaf3d294d9a9468b9fd9b0d5d"
|
49
39
|
},
|
50
40
|
"x86_64_linux": {
|
51
41
|
"cellar": "/home/linuxbrew/.linuxbrew/Cellar",
|
52
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
53
|
-
"sha256": "
|
42
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:4e5d1239be58399f35ddc87bbe123a435f27fbc537e0b4cb52a23b33316e3fa4",
|
43
|
+
"sha256": "4e5d1239be58399f35ddc87bbe123a435f27fbc537e0b4cb52a23b33316e3fa4"
|
54
44
|
}
|
55
45
|
}
|
56
46
|
}
|
@@ -84,12 +74,12 @@
|
|
84
74
|
"macOS": "12.5"
|
85
75
|
},
|
86
76
|
"ventura": {
|
87
|
-
"HOMEBREW_VERSION": "4.1.
|
77
|
+
"HOMEBREW_VERSION": "4.1.20-17-g8df40f4",
|
88
78
|
"HOMEBREW_PREFIX": "/opt/homebrew",
|
89
79
|
"Homebrew/homebrew-core": "api",
|
90
80
|
"CLT": "",
|
91
|
-
"Xcode": "
|
92
|
-
"macOS": "13.
|
81
|
+
"Xcode": "15.0",
|
82
|
+
"macOS": "13.6"
|
93
83
|
}
|
94
84
|
}
|
95
85
|
}
|
@@ -116,7 +116,7 @@ module FastlaneCore
|
|
116
116
|
|
117
117
|
# Find all installed WWDRCA certificates
|
118
118
|
installed_certs = []
|
119
|
-
Helper.backticks("security find-certificate -a -c '#{certificate_name}' -p #{wwdr_keychain.shellescape}")
|
119
|
+
Helper.backticks("security find-certificate -a -c '#{certificate_name}' -p #{wwdr_keychain.shellescape}", print: false)
|
120
120
|
.lines
|
121
121
|
.each do |line|
|
122
122
|
if line.start_with?('-----BEGIN CERTIFICATE-----')
|
@@ -307,6 +307,10 @@ module FastlaneCore
|
|
307
307
|
supported_platforms.include?(:watchOS)
|
308
308
|
end
|
309
309
|
|
310
|
+
def multiplatform?
|
311
|
+
supported_platforms.count > 1
|
312
|
+
end
|
313
|
+
|
310
314
|
def supported_platforms
|
311
315
|
supported_platforms = build_settings(key: "SUPPORTED_PLATFORMS")
|
312
316
|
if supported_platforms.nil?
|
@@ -6,7 +6,7 @@ module FastlaneCore
|
|
6
6
|
# Use this when you have all the items that you'll process in advance.
|
7
7
|
# Simply enqueue them to this and call `QueueWorker#start`.
|
8
8
|
class QueueWorker
|
9
|
-
NUMBER_OF_THREADS = FastlaneCore::Helper.test? ? 1 : [
|
9
|
+
NUMBER_OF_THREADS = FastlaneCore::Helper.test? ? 1 : [ENV["DELIVER_NUMBER_OF_THREADS"], ENV["FL_NUMBER_OF_THREADS"], 10].map(&:to_i).find(&:positive?).clamp(1, ENV.fetch("FL_MAX_NUMBER_OF_THREADS", 10).to_i)
|
10
10
|
|
11
11
|
# @param concurrency (Numeric) - A number of threads to be created
|
12
12
|
# @param block (Proc) - A task you want to execute with enqueued items
|
data/gym/lib/gym/module.rb
CHANGED
@@ -27,8 +27,8 @@ module Gym
|
|
27
27
|
|
28
28
|
def building_for_ios?
|
29
29
|
if Gym.project.mac?
|
30
|
-
# Can be building for iOS if mac project and catalyst
|
31
|
-
return building_mac_catalyst_for_ios?
|
30
|
+
# Can be building for iOS if mac project and catalyst or multiplatform and set to iOS
|
31
|
+
return building_mac_catalyst_for_ios? || building_multiplatform_for_ios?
|
32
32
|
else
|
33
33
|
# Can be iOS project and build for mac if catalyst
|
34
34
|
return false if building_mac_catalyst_for_mac?
|
@@ -43,6 +43,9 @@ module Gym
|
|
43
43
|
# Can be a mac project and not build mac if catalyst
|
44
44
|
return building_mac_catalyst_for_mac?
|
45
45
|
else
|
46
|
+
# Can be mac project but multiplatform and building for iOS
|
47
|
+
return false if building_multiplatform_for_ios?
|
48
|
+
|
46
49
|
return Gym.project.mac?
|
47
50
|
end
|
48
51
|
end
|
@@ -55,6 +58,14 @@ module Gym
|
|
55
58
|
Gym.project.supports_mac_catalyst? && Gym.config[:catalyst_platform] == "macos"
|
56
59
|
end
|
57
60
|
|
61
|
+
def building_multiplatform_for_ios?
|
62
|
+
Gym.project.multiplatform? && Gym.project.ios? && (Gym.config[:sdk] == "iphoneos" || Gym.config[:sdk] == "iphonesimulator")
|
63
|
+
end
|
64
|
+
|
65
|
+
def building_multiplatform_for_mac?
|
66
|
+
Gym.project.multiplatform? && Gym.project.mac? && Gym.config[:sdk] == "macosx"
|
67
|
+
end
|
68
|
+
|
58
69
|
def export_destination_upload?
|
59
70
|
config_path = Gym.cache[:config_path]
|
60
71
|
return false if config_path.nil?
|
data/gym/lib/gym/options.rb
CHANGED
@@ -152,7 +152,7 @@ module Gym
|
|
152
152
|
optional: true,
|
153
153
|
verify_block: proc do |value|
|
154
154
|
av = %w(ios macos)
|
155
|
-
UI.user_error!("Unsupported
|
155
|
+
UI.user_error!("Unsupported catalyst_platform '#{value}', must be: #{av}") unless av.include?(value)
|
156
156
|
end),
|
157
157
|
FastlaneCore::ConfigItem.new(key: :installer_cert_name,
|
158
158
|
env_name: "GYM_INSTALLER_CERT_NAME",
|
data/match/lib/match/options.rb
CHANGED
@@ -282,6 +282,11 @@ module Match
|
|
282
282
|
description: "Include all matching certificates in the provisioning profile. Works only for the 'development' provisioning profile type",
|
283
283
|
type: Boolean,
|
284
284
|
default_value: false),
|
285
|
+
FastlaneCore::ConfigItem.new(key: :certificate_id,
|
286
|
+
env_name: "MATCH_CERTIFICATE_ID",
|
287
|
+
description: "Select certificate by id. Useful if multiple certificates are stored in one place",
|
288
|
+
type: String,
|
289
|
+
optional: true),
|
285
290
|
FastlaneCore::ConfigItem.new(key: :force_for_new_certificates,
|
286
291
|
env_name: "MATCH_FORCE_FOR_NEW_CERTIFICATES",
|
287
292
|
description: "Renew the provisioning profiles if the certificate count on the developer portal has changed. Works only for the 'development' provisioning profile type. Requires 'include_all_certificates' option to be 'true'",
|
data/match/lib/match/runner.rb
CHANGED
@@ -148,7 +148,7 @@ module Match
|
|
148
148
|
self.files_to_commit << cert_path
|
149
149
|
self.files_to_commit << private_key_path
|
150
150
|
else
|
151
|
-
cert_path = certs
|
151
|
+
cert_path = select_cert_or_key(paths: certs)
|
152
152
|
|
153
153
|
# Check validity of certificate
|
154
154
|
if Utils.is_cert_valid?(cert_path)
|
@@ -172,7 +172,7 @@ module Match
|
|
172
172
|
# Import the private key
|
173
173
|
# there seems to be no good way to check if it's already installed - so just install it
|
174
174
|
# Key will only be added to the partition list if it isn't already installed
|
175
|
-
Utils.import(keys
|
175
|
+
Utils.import(select_cert_or_key(paths: keys), params[:keychain_name], password: params[:keychain_password])
|
176
176
|
end
|
177
177
|
else
|
178
178
|
UI.message("Skipping installation of certificate as it would not work on this operating system.")
|
@@ -180,7 +180,7 @@ module Match
|
|
180
180
|
|
181
181
|
if params[:output_path]
|
182
182
|
FileUtils.cp(cert_path, params[:output_path])
|
183
|
-
FileUtils.cp(keys
|
183
|
+
FileUtils.cp(select_cert_or_key(paths: keys), params[:output_path])
|
184
184
|
end
|
185
185
|
|
186
186
|
# Get and print info of certificate
|
@@ -191,6 +191,12 @@ module Match
|
|
191
191
|
return File.basename(cert_path).gsub(".cer", "") # Certificate ID
|
192
192
|
end
|
193
193
|
|
194
|
+
# @return [String] Path to certificate or P12 key
|
195
|
+
def select_cert_or_key(paths:)
|
196
|
+
cert_id_path = ENV['MATCH_CERTIFICATE_ID'] ? paths.find { |path| path.include?(ENV['MATCH_CERTIFICATE_ID']) } : nil
|
197
|
+
cert_id_path || paths.last
|
198
|
+
end
|
199
|
+
|
194
200
|
# rubocop:disable Metrics/PerceivedComplexity
|
195
201
|
# @return [String] The UUID of the provisioning profile so we can verify it with the Apple Developer Portal
|
196
202
|
def fetch_provisioning_profile(params: nil, certificate_id: nil, app_identifier: nil, working_directory: nil)
|
@@ -331,7 +337,7 @@ module Match
|
|
331
337
|
portal_profile = all_profiles.detect { |i| i.uuid == uuid }
|
332
338
|
|
333
339
|
if portal_profile
|
334
|
-
profile_device_count = portal_profile.
|
340
|
+
profile_device_count = portal_profile.devices.count
|
335
341
|
|
336
342
|
device_classes =
|
337
343
|
case platform
|
@@ -412,7 +418,7 @@ module Match
|
|
412
418
|
# * For portal certificates, we filter out the expired one but includes a new certificate;
|
413
419
|
# * Profile still contains an expired certificate and is valid.
|
414
420
|
# Thus, we need to check the validity of profile certificates too.
|
415
|
-
profile_certs_count = portal_profile.
|
421
|
+
profile_certs_count = portal_profile.certificates.select(&:valid?).count
|
416
422
|
|
417
423
|
certificate_types =
|
418
424
|
case platform
|
@@ -59,12 +59,20 @@ module Match
|
|
59
59
|
self.clone_branch_directly = clone_branch_directly
|
60
60
|
self.git_basic_authorization = git_basic_authorization
|
61
61
|
self.git_bearer_authorization = git_bearer_authorization
|
62
|
-
self.git_private_key = git_private_key
|
62
|
+
self.git_private_key = convert_private_key_path_to_absolute(git_private_key)
|
63
63
|
|
64
64
|
self.type = type if type
|
65
65
|
self.platform = platform if platform
|
66
66
|
end
|
67
67
|
|
68
|
+
def convert_private_key_path_to_absolute(git_private_key)
|
69
|
+
if !git_private_key.nil? && File.file?(File.expand_path(git_private_key))
|
70
|
+
File.expand_path(git_private_key).shellescape.to_s
|
71
|
+
else
|
72
|
+
git_private_key
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
68
76
|
def prefixed_working_directory
|
69
77
|
return working_directory
|
70
78
|
end
|
@@ -33,7 +33,7 @@ module Precheck
|
|
33
33
|
connection.use(FaradayMiddleware::FollowRedirects)
|
34
34
|
connection.adapter(:net_http)
|
35
35
|
end
|
36
|
-
return RuleReturn.new(validation_state: Precheck::VALIDATION_STATES[:failed], failure_data: url) unless request.head.status == 200
|
36
|
+
return RuleReturn.new(validation_state: Precheck::VALIDATION_STATES[:failed], failure_data: "HTTP #{request.head.status}: #{url}") unless request.head.status == 200
|
37
37
|
rescue StandardError => e
|
38
38
|
UI.verbose("URL #{url} not reachable 😵: #{e.message}")
|
39
39
|
# I can only return :fail here, but I also want to return #{url}
|
@@ -15,13 +15,12 @@
|
|
15
15
|
import Foundation
|
16
16
|
import XCTest
|
17
17
|
|
18
|
-
|
19
|
-
var locale = ""
|
20
|
-
|
18
|
+
@MainActor
|
21
19
|
func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) {
|
22
20
|
Snapshot.setupSnapshot(app, waitForAnimations: waitForAnimations)
|
23
21
|
}
|
24
22
|
|
23
|
+
@MainActor
|
25
24
|
func snapshot(_ name: String, waitForLoadingIndicator: Bool) {
|
26
25
|
if waitForLoadingIndicator {
|
27
26
|
Snapshot.snapshot(name)
|
@@ -33,6 +32,7 @@ func snapshot(_ name: String, waitForLoadingIndicator: Bool) {
|
|
33
32
|
/// - Parameters:
|
34
33
|
/// - name: The name of the snapshot
|
35
34
|
/// - timeout: Amount of seconds to wait until the network loading indicator disappears. Pass `0` if you don't want to wait.
|
35
|
+
@MainActor
|
36
36
|
func snapshot(_ name: String, timeWaitingForIdle timeout: TimeInterval = 20) {
|
37
37
|
Snapshot.snapshot(name, timeWaitingForIdle: timeout)
|
38
38
|
}
|
@@ -52,6 +52,7 @@ enum SnapshotError: Error, CustomDebugStringConvertible {
|
|
52
52
|
}
|
53
53
|
|
54
54
|
@objcMembers
|
55
|
+
@MainActor
|
55
56
|
open class Snapshot: NSObject {
|
56
57
|
static var app: XCUIApplication?
|
57
58
|
static var waitForAnimations = true
|
@@ -59,6 +60,8 @@ open class Snapshot: NSObject {
|
|
59
60
|
static var screenshotsDirectory: URL? {
|
60
61
|
return cacheDirectory?.appendingPathComponent("screenshots", isDirectory: true)
|
61
62
|
}
|
63
|
+
static var deviceLanguage = ""
|
64
|
+
static var currentLocale = ""
|
62
65
|
|
63
66
|
open class func setupSnapshot(_ app: XCUIApplication, waitForAnimations: Bool = true) {
|
64
67
|
|
@@ -103,17 +106,17 @@ open class Snapshot: NSObject {
|
|
103
106
|
|
104
107
|
do {
|
105
108
|
let trimCharacterSet = CharacterSet.whitespacesAndNewlines
|
106
|
-
|
109
|
+
currentLocale = try String(contentsOf: path, encoding: .utf8).trimmingCharacters(in: trimCharacterSet)
|
107
110
|
} catch {
|
108
111
|
NSLog("Couldn't detect/set locale...")
|
109
112
|
}
|
110
113
|
|
111
|
-
if
|
112
|
-
|
114
|
+
if currentLocale.isEmpty && !deviceLanguage.isEmpty {
|
115
|
+
currentLocale = Locale(identifier: deviceLanguage).identifier
|
113
116
|
}
|
114
117
|
|
115
|
-
if !
|
116
|
-
app.launchArguments += ["-AppleLocale", "\"\(
|
118
|
+
if !currentLocale.isEmpty {
|
119
|
+
app.launchArguments += ["-AppleLocale", "\"\(currentLocale)\""]
|
117
120
|
}
|
118
121
|
}
|
119
122
|
|
@@ -281,6 +284,7 @@ private extension XCUIElementQuery {
|
|
281
284
|
return self.containing(isNetworkLoadingIndicator)
|
282
285
|
}
|
283
286
|
|
287
|
+
@MainActor
|
284
288
|
var deviceStatusBars: XCUIElementQuery {
|
285
289
|
guard let app = Snapshot.app else {
|
286
290
|
fatalError("XCUIApplication is not set. Please call setupSnapshot(app) before snapshot().")
|
@@ -306,4 +310,4 @@ private extension CGFloat {
|
|
306
310
|
|
307
311
|
// Please don't remove the lines below
|
308
312
|
// They are used to detect outdated configuration files
|
309
|
-
// SnapshotHelperVersion [1.
|
313
|
+
// SnapshotHelperVersion [1.30]
|