fastlane 2.221.1 → 2.223.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 +98 -98
- data/deliver/lib/deliver/options.rb +1 -1
- data/deliver/lib/deliver/runner.rb +11 -2
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -3
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -0
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +2 -2
- data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +16 -1
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/set_changelog.rb +3 -3
- data/fastlane/lib/fastlane/actions/slack.rb +9 -2
- data/fastlane/lib/fastlane/actions/testfairy.rb +9 -1
- data/fastlane/lib/fastlane/fast_file.rb +8 -2
- data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
- data/fastlane/lib/fastlane/notification/slack.rb +3 -2
- 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 +81 -21
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +5 -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 +5 -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 +5 -1
- data/fastlane/swift/formatting/Brewfile.lock.json +24 -19
- data/fastlane/swift/formatting/Rakefile +1 -0
- data/fastlane_core/lib/fastlane_core/project.rb +1 -0
- data/gym/lib/gym/generators/build_command_generator.rb +1 -1
- data/gym/lib/gym/options.rb +10 -1
- data/match/lib/match/change_password.rb +2 -1
- data/match/lib/match/encryption/encryption.rb +2 -2
- data/match/lib/match/encryption/openssl.rb +10 -5
- data/match/lib/match/importer.rb +2 -1
- data/match/lib/match/nuke.rb +2 -1
- data/match/lib/match/options.rb +5 -0
- data/match/lib/match/runner.rb +2 -1
- data/pilot/lib/pilot/build_manager.rb +9 -0
- data/scan/lib/scan/module.rb +1 -1
- data/scan/lib/scan/options.rb +10 -1
- data/snapshot/lib/snapshot/options.rb +9 -0
- data/spaceship/lib/spaceship/connect_api/models/app.rb +10 -0
- data/spaceship/lib/spaceship/connect_api/models/app_availability.rb +23 -0
- data/spaceship/lib/spaceship/connect_api/models/territory_availability.rb +62 -0
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +9 -0
- data/spaceship/lib/spaceship/connect_api.rb +2 -0
- data/spaceship/lib/spaceship/tunes/application.rb +1 -1
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -0
- data/trainer/lib/trainer/test_parser.rb +27 -2
- metadata +22 -20
@@ -235,6 +235,9 @@ public protocol ScanfileProtocol: AnyObject {
|
|
235
235
|
|
236
236
|
/// Should this step stop the build if the tests fail? Set this to false if you're using trainer
|
237
237
|
var failBuild: Bool { get }
|
238
|
+
|
239
|
+
/// Lets xcodebuild use a specified package authorization provider (keychain|netrc)
|
240
|
+
var packageAuthorizationProvider: String? { get }
|
238
241
|
}
|
239
242
|
|
240
243
|
public extension ScanfileProtocol {
|
@@ -316,8 +319,9 @@ public extension ScanfileProtocol {
|
|
316
319
|
var useSystemScm: Bool { return false }
|
317
320
|
var numberOfRetries: Int { return 0 }
|
318
321
|
var failBuild: Bool { return true }
|
322
|
+
var packageAuthorizationProvider: String? { return nil }
|
319
323
|
}
|
320
324
|
|
321
325
|
// Please don't remove the lines below
|
322
326
|
// They are used to detect outdated files
|
323
|
-
// FastlaneRunnerAPIVersion [0.9.
|
327
|
+
// FastlaneRunnerAPIVersion [0.9.136]
|
@@ -125,6 +125,9 @@ public protocol SnapshotfileProtocol: AnyObject {
|
|
125
125
|
/// Prevents packages from automatically being resolved to versions other than those recorded in the `Package.resolved` file
|
126
126
|
var disablePackageAutomaticUpdates: Bool { get }
|
127
127
|
|
128
|
+
/// Lets xcodebuild use a specified package authorization provider (keychain|netrc)
|
129
|
+
var packageAuthorizationProvider: String? { get }
|
130
|
+
|
128
131
|
/// The testplan associated with the scheme that should be used for testing
|
129
132
|
var testplan: String? { get }
|
130
133
|
|
@@ -192,6 +195,7 @@ public extension SnapshotfileProtocol {
|
|
192
195
|
var clonedSourcePackagesPath: String? { return nil }
|
193
196
|
var skipPackageDependenciesResolution: Bool { return false }
|
194
197
|
var disablePackageAutomaticUpdates: Bool { return false }
|
198
|
+
var packageAuthorizationProvider: String? { return nil }
|
195
199
|
var testplan: String? { return nil }
|
196
200
|
var onlyTesting: String? { return nil }
|
197
201
|
var skipTesting: String? { return nil }
|
@@ -204,4 +208,4 @@ public extension SnapshotfileProtocol {
|
|
204
208
|
|
205
209
|
// Please don't remove the lines below
|
206
210
|
// They are used to detect outdated files
|
207
|
-
// FastlaneRunnerAPIVersion [0.9.
|
211
|
+
// FastlaneRunnerAPIVersion [0.9.120]
|
@@ -2,45 +2,50 @@
|
|
2
2
|
"entries": {
|
3
3
|
"brew": {
|
4
4
|
"swiftformat": {
|
5
|
-
"version": "0.
|
5
|
+
"version": "0.54.5",
|
6
6
|
"bottle": {
|
7
7
|
"rebuild": 0,
|
8
8
|
"root_url": "https://ghcr.io/v2/homebrew/core",
|
9
9
|
"files": {
|
10
|
+
"arm64_sequoia": {
|
11
|
+
"cellar": ":any_skip_relocation",
|
12
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d",
|
13
|
+
"sha256": "3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d"
|
14
|
+
},
|
10
15
|
"arm64_sonoma": {
|
11
16
|
"cellar": ":any_skip_relocation",
|
12
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
13
|
-
"sha256": "
|
17
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee",
|
18
|
+
"sha256": "4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee"
|
14
19
|
},
|
15
20
|
"arm64_ventura": {
|
16
21
|
"cellar": ":any_skip_relocation",
|
17
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
18
|
-
"sha256": "
|
22
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c",
|
23
|
+
"sha256": "416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c"
|
19
24
|
},
|
20
25
|
"arm64_monterey": {
|
21
26
|
"cellar": ":any_skip_relocation",
|
22
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
23
|
-
"sha256": "
|
27
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4",
|
28
|
+
"sha256": "3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4"
|
24
29
|
},
|
25
30
|
"sonoma": {
|
26
31
|
"cellar": ":any_skip_relocation",
|
27
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
28
|
-
"sha256": "
|
32
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19",
|
33
|
+
"sha256": "445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19"
|
29
34
|
},
|
30
35
|
"ventura": {
|
31
36
|
"cellar": ":any_skip_relocation",
|
32
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
33
|
-
"sha256": "
|
37
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a",
|
38
|
+
"sha256": "508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a"
|
34
39
|
},
|
35
40
|
"monterey": {
|
36
41
|
"cellar": ":any_skip_relocation",
|
37
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
38
|
-
"sha256": "
|
42
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e",
|
43
|
+
"sha256": "8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e"
|
39
44
|
},
|
40
45
|
"x86_64_linux": {
|
41
46
|
"cellar": "/home/linuxbrew/.linuxbrew/Cellar",
|
42
|
-
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:
|
43
|
-
"sha256": "
|
47
|
+
"url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662",
|
48
|
+
"sha256": "8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662"
|
44
49
|
}
|
45
50
|
}
|
46
51
|
}
|
@@ -82,12 +87,12 @@
|
|
82
87
|
"macOS": "13.6"
|
83
88
|
},
|
84
89
|
"sonoma": {
|
85
|
-
"HOMEBREW_VERSION": "4.3.
|
90
|
+
"HOMEBREW_VERSION": "4.3.24",
|
86
91
|
"HOMEBREW_PREFIX": "/opt/homebrew",
|
87
92
|
"Homebrew/homebrew-core": "api",
|
88
|
-
"CLT": "
|
89
|
-
"Xcode": "15.
|
90
|
-
"macOS": "14.
|
93
|
+
"CLT": "16.0.0.0.1.1724870825",
|
94
|
+
"Xcode": "15.4",
|
95
|
+
"macOS": "14.6.1"
|
91
96
|
}
|
92
97
|
}
|
93
98
|
}
|
@@ -341,6 +341,7 @@ module FastlaneCore
|
|
341
341
|
proj << "-derivedDataPath #{options[:derived_data_path].shellescape}" if options[:derived_data_path]
|
342
342
|
proj << "-xcconfig #{options[:xcconfig].shellescape}" if options[:xcconfig]
|
343
343
|
proj << "-scmProvider system" if options[:use_system_scm]
|
344
|
+
proj << "-packageAuthorizationProvider #{options[:package_authorization_provider].shellescape}" if options[:package_authorization_provider]
|
344
345
|
|
345
346
|
xcode_at_least_11 = FastlaneCore::Helper.xcode_at_least?('11.0')
|
346
347
|
if xcode_at_least_11 && options[:cloned_source_packages_path]
|
@@ -184,7 +184,7 @@ module Gym
|
|
184
184
|
def result_bundle_path
|
185
185
|
unless Gym.cache[:result_bundle_path]
|
186
186
|
path = Gym.config[:result_bundle_path]
|
187
|
-
path ||= File.join(Gym.config[:output_directory], Gym.config[:output_name] + ".
|
187
|
+
path ||= File.join(Gym.config[:output_directory], Gym.config[:output_name] + ".xcresult")
|
188
188
|
if File.directory?(path)
|
189
189
|
FileUtils.remove_dir(path)
|
190
190
|
end
|
data/gym/lib/gym/options.rb
CHANGED
@@ -320,7 +320,16 @@ module Gym
|
|
320
320
|
description: "Lets xcodebuild use system's scm configuration",
|
321
321
|
optional: true,
|
322
322
|
type: Boolean,
|
323
|
-
default_value: false)
|
323
|
+
default_value: false),
|
324
|
+
FastlaneCore::ConfigItem.new(key: :package_authorization_provider,
|
325
|
+
env_name: "GYM_PACKAGE_AUTHORIZATION_PROVIDER",
|
326
|
+
description: "Lets xcodebuild use a specified package authorization provider (keychain|netrc)",
|
327
|
+
optional: true,
|
328
|
+
type: String,
|
329
|
+
verify_block: proc do |value|
|
330
|
+
av = %w(netrc keychain)
|
331
|
+
UI.user_error!("Unsupported authorization provider '#{value}', must be: #{av}") unless av.include?(value)
|
332
|
+
end)
|
324
333
|
]
|
325
334
|
end
|
326
335
|
end
|
@@ -26,7 +26,8 @@ module Match
|
|
26
26
|
git_url: params[:git_url],
|
27
27
|
s3_bucket: params[:s3_bucket],
|
28
28
|
s3_skip_encryption: params[:s3_skip_encryption],
|
29
|
-
working_directory: storage.working_directory
|
29
|
+
working_directory: storage.working_directory,
|
30
|
+
force_legacy_encryption: params[:force_legacy_encryption]
|
30
31
|
})
|
31
32
|
encryption.decrypt_files
|
32
33
|
|
@@ -134,11 +134,11 @@ module Match
|
|
134
134
|
|
135
135
|
# The methods of this class will encrypt or decrypt files in place, by default.
|
136
136
|
class MatchFileEncryption
|
137
|
-
def encrypt(file_path:, password:, output_path: nil)
|
137
|
+
def encrypt(file_path:, password:, output_path: nil, version: 2)
|
138
138
|
output_path = file_path unless output_path
|
139
139
|
data_to_encrypt = File.binread(file_path)
|
140
140
|
e = MatchDataEncryption.new
|
141
|
-
data = e.encrypt(data: data_to_encrypt, password: password)
|
141
|
+
data = e.encrypt(data: data_to_encrypt, password: password, version: version)
|
142
142
|
File.write(output_path, data)
|
143
143
|
end
|
144
144
|
|
@@ -14,18 +14,23 @@ module Match
|
|
14
14
|
|
15
15
|
attr_accessor :working_directory
|
16
16
|
|
17
|
+
attr_accessor :force_legacy_encryption
|
18
|
+
|
17
19
|
def self.configure(params)
|
18
20
|
return self.new(
|
19
21
|
keychain_name: params[:keychain_name],
|
20
|
-
working_directory: params[:working_directory]
|
22
|
+
working_directory: params[:working_directory],
|
23
|
+
force_legacy_encryption: params[:force_legacy_encryption]
|
21
24
|
)
|
22
25
|
end
|
23
26
|
|
24
27
|
# @param keychain_name: The identifier used to store the passphrase in the Keychain
|
25
28
|
# @param working_directory: The path to where the certificates are stored
|
26
|
-
|
29
|
+
# @param force_legacy_encryption: Force use of legacy EncryptionV1 algorithm
|
30
|
+
def initialize(keychain_name: nil, working_directory: nil, force_legacy_encryption: false)
|
27
31
|
self.keychain_name = keychain_name
|
28
32
|
self.working_directory = working_directory
|
33
|
+
self.force_legacy_encryption = force_legacy_encryption
|
29
34
|
end
|
30
35
|
|
31
36
|
def encrypt_files(password: nil)
|
@@ -33,7 +38,7 @@ module Match
|
|
33
38
|
password ||= fetch_password!
|
34
39
|
iterate(self.working_directory) do |current|
|
35
40
|
files << current
|
36
|
-
encrypt_specific_file(path: current, password: password)
|
41
|
+
encrypt_specific_file(path: current, password: password, version: force_legacy_encryption ? 1 : 2)
|
37
42
|
UI.success("🔒 Encrypted '#{File.basename(current)}'") if FastlaneCore::Globals.verbose?
|
38
43
|
end
|
39
44
|
UI.success("🔒 Successfully encrypted certificates repo")
|
@@ -109,10 +114,10 @@ module Match
|
|
109
114
|
return password
|
110
115
|
end
|
111
116
|
|
112
|
-
def encrypt_specific_file(path: nil, password: nil)
|
117
|
+
def encrypt_specific_file(path: nil, password: nil, version: nil)
|
113
118
|
UI.user_error!("No password supplied") if password.to_s.strip.length == 0
|
114
119
|
e = MatchFileEncryption.new
|
115
|
-
e.encrypt(file_path: path, password: password)
|
120
|
+
e.encrypt(file_path: path, password: password, version: version)
|
116
121
|
rescue FastlaneCore::Interface::FastlaneError
|
117
122
|
raise
|
118
123
|
rescue => error
|
data/match/lib/match/importer.rb
CHANGED
@@ -23,7 +23,8 @@ module Match
|
|
23
23
|
git_url: params[:git_url],
|
24
24
|
s3_bucket: params[:s3_bucket],
|
25
25
|
s3_skip_encryption: params[:s3_skip_encryption],
|
26
|
-
working_directory: storage.working_directory
|
26
|
+
working_directory: storage.working_directory,
|
27
|
+
force_legacy_encryption: params[:force_legacy_encryption]
|
27
28
|
})
|
28
29
|
encryption.decrypt_files if encryption
|
29
30
|
UI.success("Repo is at: '#{storage.working_directory}'")
|
data/match/lib/match/nuke.rb
CHANGED
@@ -42,7 +42,8 @@ module Match
|
|
42
42
|
git_url: params[:git_url],
|
43
43
|
s3_bucket: params[:s3_bucket],
|
44
44
|
s3_skip_encryption: params[:s3_skip_encryption],
|
45
|
-
working_directory: storage.working_directory
|
45
|
+
working_directory: storage.working_directory,
|
46
|
+
force_legacy_encryption: params[:force_legacy_encryption]
|
46
47
|
})
|
47
48
|
self.encryption.decrypt_files if self.encryption
|
48
49
|
|
data/match/lib/match/options.rb
CHANGED
@@ -355,6 +355,11 @@ module Match
|
|
355
355
|
description: "Skips setting the partition list (which can sometimes take a long time). Setting the partition list is usually needed to prevent Xcode from prompting to allow a cert to be used for signing",
|
356
356
|
type: Boolean,
|
357
357
|
default_value: false),
|
358
|
+
FastlaneCore::ConfigItem.new(key: :force_legacy_encryption,
|
359
|
+
env_name: "MATCH_FORCE_LEGACY_ENCRYPTION",
|
360
|
+
description: "Force encryption to use legacy cbc algorithm for backwards compatibility with older match versions",
|
361
|
+
type: Boolean,
|
362
|
+
default_value: false),
|
358
363
|
|
359
364
|
# other
|
360
365
|
FastlaneCore::ConfigItem.new(key: :verbose,
|
data/match/lib/match/runner.rb
CHANGED
@@ -49,7 +49,8 @@ module Match
|
|
49
49
|
git_url: params[:git_url],
|
50
50
|
s3_bucket: params[:s3_bucket],
|
51
51
|
s3_skip_encryption: params[:s3_skip_encryption],
|
52
|
-
working_directory: storage.working_directory
|
52
|
+
working_directory: storage.working_directory,
|
53
|
+
force_legacy_encryption: params[:force_legacy_encryption]
|
53
54
|
})
|
54
55
|
encryption.decrypt_files if encryption
|
55
56
|
|
@@ -391,6 +391,7 @@ module Pilot
|
|
391
391
|
end
|
392
392
|
|
393
393
|
# If App Store Connect API token, use token.
|
394
|
+
# If api_key is specified and it is an Individual API Key, don't use token but use username.
|
394
395
|
# If itc_provider was explicitly specified, use it.
|
395
396
|
# If there are multiple teams, infer the provider from the selected team name.
|
396
397
|
# If there are fewer than two teams, don't infer the provider.
|
@@ -407,6 +408,14 @@ module Pilot
|
|
407
408
|
api_key
|
408
409
|
end
|
409
410
|
|
411
|
+
# Currently no kind of transporters accept an Individual API Key. Use username and app-specific password instead.
|
412
|
+
# See https://github.com/fastlane/fastlane/issues/22115
|
413
|
+
is_individual_key = !api_key.nil? && api_key[:issuer_id].nil?
|
414
|
+
if is_individual_key
|
415
|
+
api_key = nil
|
416
|
+
api_token = nil
|
417
|
+
end
|
418
|
+
|
410
419
|
unless api_token.nil?
|
411
420
|
api_token.refresh! if api_token.expired?
|
412
421
|
return FastlaneCore::ItunesTransporter.new(nil, nil, false, nil, api_token.text, altool_compatible_command: true, api_key: api_key)
|
data/scan/lib/scan/module.rb
CHANGED
@@ -24,7 +24,7 @@ module Scan
|
|
24
24
|
|
25
25
|
def building_mac_catalyst_for_mac?
|
26
26
|
return false unless Scan.project
|
27
|
-
Scan.
|
27
|
+
Scan.config[:catalyst_platform] == "macos" && Scan.project.supports_mac_catalyst?
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
data/scan/lib/scan/options.rb
CHANGED
@@ -537,7 +537,16 @@ module Scan
|
|
537
537
|
env_name: "SCAN_FAIL_BUILD",
|
538
538
|
description: "Should this step stop the build if the tests fail? Set this to false if you're using trainer",
|
539
539
|
type: Boolean,
|
540
|
-
default_value: true)
|
540
|
+
default_value: true),
|
541
|
+
FastlaneCore::ConfigItem.new(key: :package_authorization_provider,
|
542
|
+
env_name: "SCAN_PACKAGE_AUTHORIZATION_PROVIDER",
|
543
|
+
description: "Lets xcodebuild use a specified package authorization provider (keychain|netrc)",
|
544
|
+
optional: true,
|
545
|
+
type: String,
|
546
|
+
verify_block: proc do |value|
|
547
|
+
av = %w(netrc keychain)
|
548
|
+
UI.user_error!("Unsupported authorization provider '#{value}', must be: #{av}") unless av.include?(value)
|
549
|
+
end)
|
541
550
|
|
542
551
|
]
|
543
552
|
end
|
@@ -267,6 +267,15 @@ module Snapshot
|
|
267
267
|
description: "Prevents packages from automatically being resolved to versions other than those recorded in the `Package.resolved` file",
|
268
268
|
type: Boolean,
|
269
269
|
default_value: false),
|
270
|
+
FastlaneCore::ConfigItem.new(key: :package_authorization_provider,
|
271
|
+
env_name: "SNAPSHOT_PACKAGE_AUTHORIZATION_PROVIDER",
|
272
|
+
description: "Lets xcodebuild use a specified package authorization provider (keychain|netrc)",
|
273
|
+
optional: true,
|
274
|
+
type: String,
|
275
|
+
verify_block: proc do |value|
|
276
|
+
av = %w(netrc keychain)
|
277
|
+
UI.user_error!("Unsupported authorization provider '#{value}', must be: #{av}") unless av.include?(value)
|
278
|
+
end),
|
270
279
|
FastlaneCore::ConfigItem.new(key: :testplan,
|
271
280
|
env_name: "SNAPSHOT_TESTPLAN",
|
272
281
|
description: "The testplan associated with the scheme that should be used for testing",
|
@@ -148,6 +148,16 @@ module Spaceship
|
|
148
148
|
return resp.to_models.first
|
149
149
|
end
|
150
150
|
|
151
|
+
#
|
152
|
+
# App Availabilities
|
153
|
+
#
|
154
|
+
|
155
|
+
def get_app_availabilities(client: nil, filter: {}, includes: "territoryAvailabilities", limit: { "territoryAvailabilities": 200 })
|
156
|
+
client ||= Spaceship::ConnectAPI
|
157
|
+
resp = client.get_app_availabilities(app_id: id, filter: filter, includes: includes, limit: limit, sort: nil)
|
158
|
+
return resp.to_models.first
|
159
|
+
end
|
160
|
+
|
151
161
|
#
|
152
162
|
# Available Territories
|
153
163
|
#
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative '../model'
|
2
|
+
module Spaceship
|
3
|
+
class ConnectAPI
|
4
|
+
class AppAvailability
|
5
|
+
include Spaceship::ConnectAPI::Model
|
6
|
+
|
7
|
+
attr_accessor :app
|
8
|
+
attr_accessor :available_in_new_territories
|
9
|
+
|
10
|
+
attr_accessor :territoryAvailabilities
|
11
|
+
|
12
|
+
attr_mapping({
|
13
|
+
app: 'app',
|
14
|
+
availableInNewTerritories: 'available_in_new_territories',
|
15
|
+
territoryAvailabilities: 'territory_availabilities'
|
16
|
+
})
|
17
|
+
|
18
|
+
def self.type
|
19
|
+
return 'appAvailabilities'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative '../model'
|
2
|
+
module Spaceship
|
3
|
+
class ConnectAPI
|
4
|
+
class TerritoryAvailability
|
5
|
+
include Spaceship::ConnectAPI::Model
|
6
|
+
|
7
|
+
attr_accessor :available
|
8
|
+
attr_accessor :content_statuses
|
9
|
+
attr_accessor :pre_order_enabled
|
10
|
+
attr_accessor :pre_order_publish_date
|
11
|
+
attr_accessor :release_date
|
12
|
+
|
13
|
+
module ContentStatus
|
14
|
+
AVAILABLE = "AVAILABLE"
|
15
|
+
AVAILABLE_FOR_PREORDER_ON_DATE = "AVAILABLE_FOR_PREORDER_ON_DATE"
|
16
|
+
PROCESSING_TO_NOT_AVAILABLE = "PROCESSING_TO_NOT_AVAILABLE"
|
17
|
+
PROCESSING_TO_AVAILABLE = "PROCESSING_TO_AVAILABLE"
|
18
|
+
PROCESSING_TO_PRE_ORDER = "PROCESSING_TO_PRE_ORDER"
|
19
|
+
AVAILABLE_FOR_SALE_UNRELEASED_APP = "AVAILABLE_FOR_SALE_UNRELEASED_APP"
|
20
|
+
PREORDER_ON_UNRELEASED_APP = "PREORDER_ON_UNRELEASED_APP"
|
21
|
+
AVAILABLE_FOR_PREORDER = "AVAILABLE_FOR_PREORDER"
|
22
|
+
MISSING_RATING = "MISSING_RATING"
|
23
|
+
CANNOT_SELL_RESTRICTED_RATING = "CANNOT_SELL_RESTRICTED_RATING"
|
24
|
+
BRAZIL_REQUIRED_TAX_ID = "BRAZIL_REQUIRED_TAX_ID"
|
25
|
+
MISSING_GRN = "MISSING_GRN"
|
26
|
+
UNVERIFIED_GRN = "UNVERIFIED_GRN"
|
27
|
+
CANNOT_SELL_SEVENTEEN_PLUS_APPS = "CANNOT_SELL_SEVENTEEN_PLUS_APPS"
|
28
|
+
CANNOT_SELL_SEXUALLY_EXPLICIT = "CANNOT_SELL_SEXUALLY_EXPLICIT"
|
29
|
+
CANNOT_SELL_NON_IOS_GAMES = "CANNOT_SELL_NON_IOS_GAMES"
|
30
|
+
CANNOT_SELL_SEVENTEEN_PLUS_GAMES = "CANNOT_SELL_SEVENTEEN_PLUS_GAMES"
|
31
|
+
CANNOT_SELL_FREQUENT_INTENSE_GAMBLING = "CANNOT_SELL_FREQUENT_INTENSE_GAMBLING"
|
32
|
+
CANNOT_SELL_CASINO = "CANNOT_SELL_CASINO"
|
33
|
+
CANNOT_SELL_CASINO_WITHOUT_GRAC = "CANNOT_SELL_CASINO_WITHOUT_GRAC"
|
34
|
+
CANNOT_SELL_CASINO_WITHOUT_AGE_VERIFICATION = "CANNOT_SELL_CASINO_WITHOUT_AGE_VERIFICATION"
|
35
|
+
CANNOT_SELL_FREQUENT_INTENSE_ALCOHOL_TOBACCO_DRUGS = "CANNOT_SELL_FREQUENT_INTENSE_ALCOHOL_TOBACCO_DRUGS"
|
36
|
+
CANNOT_SELL_FREQUENT_INTENSE_VIOLENCE = "CANNOT_SELL_FREQUENT_INTENSE_VIOLENCE"
|
37
|
+
CANNOT_SELL_FREQUENT_INTENSE_SEXUAL_CONTENT_NUDITY = "CANNOT_SELL_FREQUENT_INTENSE_SEXUAL_CONTENT_NUDITY"
|
38
|
+
CANNOT_SELL_INFREQUENT_MILD_ALCOHOL_TOBACCO_DRUGS = "CANNOT_SELL_INFREQUENT_MILD_ALCOHOL_TOBACCO_DRUGS"
|
39
|
+
CANNOT_SELL_INFREQUENT_MILD_SEXUAL_CONTENT_NUDITY = "CANNOT_SELL_INFREQUENT_MILD_SEXUAL_CONTENT_NUDITY"
|
40
|
+
CANNOT_SELL_ADULT_ONLY = "CANNOT_SELL_ADULT_ONLY"
|
41
|
+
CANNOT_SELL_FREQUENT_INTENSE = "CANNOT_SELL_FREQUENT_INTENSE"
|
42
|
+
CANNOT_SELL_FREQUENT_INTENSE_WITHOUT_GRAC = "CANNOT_SELL_FREQUENT_INTENSE_WITHOUT_GRAC"
|
43
|
+
CANNOT_SELL_GAMBLING_CONTESTS = "CANNOT_SELL_GAMBLING_CONTESTS"
|
44
|
+
CANNOT_SELL_GAMBLING = "CANNOT_SELL_GAMBLING"
|
45
|
+
CANNOT_SELL_CONTESTS = "CANNOT_SELL_CONTESTS"
|
46
|
+
CANNOT_SELL = "CANNOT_SELL"
|
47
|
+
end
|
48
|
+
|
49
|
+
attr_mapping({
|
50
|
+
available: 'available',
|
51
|
+
contentStatuses: 'content_statuses',
|
52
|
+
preOrderEnabled: 'pre_order_enabled',
|
53
|
+
preOrderPublishDate: 'pre_order_publish_date',
|
54
|
+
releaseDate: 'release_date'
|
55
|
+
})
|
56
|
+
|
57
|
+
def self.type
|
58
|
+
return 'territoryAvailabilities'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -416,6 +416,15 @@ module Spaceship
|
|
416
416
|
tunes_request_client.patch("#{Version::V1}/appPreviewSets/#{app_preview_set_id}/relationships/appPreviews", body)
|
417
417
|
end
|
418
418
|
|
419
|
+
#
|
420
|
+
# appAvailabilities
|
421
|
+
#
|
422
|
+
|
423
|
+
def get_app_availabilities(app_id: nil, filter: nil, includes: nil, limit: nil, sort: nil)
|
424
|
+
params = tunes_request_client.build_params(filter: nil, includes: includes, limit: limit, sort: nil)
|
425
|
+
tunes_request_client.get("#{Version::V2}/appAvailabilities/#{app_id}", params)
|
426
|
+
end
|
427
|
+
|
419
428
|
#
|
420
429
|
# availableTerritories
|
421
430
|
#
|
@@ -38,6 +38,8 @@ require 'spaceship/connect_api/models/custom_app_organization'
|
|
38
38
|
require 'spaceship/connect_api/models/custom_app_user'
|
39
39
|
require 'spaceship/connect_api/models/pre_release_version'
|
40
40
|
|
41
|
+
require 'spaceship/connect_api/models/app_availability'
|
42
|
+
require 'spaceship/connect_api/models/territory_availability'
|
41
43
|
require 'spaceship/connect_api/models/app_data_usage'
|
42
44
|
require 'spaceship/connect_api/models/app_data_usage_category'
|
43
45
|
require 'spaceship/connect_api/models/app_data_usage_data_protection'
|
@@ -72,7 +72,7 @@ module Spaceship
|
|
72
72
|
def find(identifier, mac: false)
|
73
73
|
all.find do |app|
|
74
74
|
((app.apple_id && app.apple_id.casecmp(identifier.to_s) == 0) || (app.bundle_id && app.bundle_id.casecmp(identifier.to_s) == 0)) &&
|
75
|
-
app.version_sets.any? { |v| (mac ? ["osx"] : ["ios", "appletvos"]).include?(v.platform) }
|
75
|
+
app.version_sets.any? { |v| (mac ? ["osx"] : ["ios", "xros", "appletvos"]).include?(v.platform) }
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -197,12 +197,37 @@ module Trainer
|
|
197
197
|
return output
|
198
198
|
end
|
199
199
|
|
200
|
+
# Hotfix: From Xcode 16 beta 3 'xcresulttool get --format json' has been deprecated;
|
201
|
+
# '--legacy' flag required to keep on using the command
|
202
|
+
def generate_cmd_parse_xcresult(path)
|
203
|
+
xcresulttool_cmd = %W(
|
204
|
+
xcrun
|
205
|
+
xcresulttool
|
206
|
+
get
|
207
|
+
--format
|
208
|
+
json
|
209
|
+
--path
|
210
|
+
#{path}
|
211
|
+
)
|
212
|
+
|
213
|
+
# e.g. DEVELOPER_DIR=/Applications/Xcode_16_beta_3.app
|
214
|
+
# xcresulttool version 23021, format version 3.53 (current)
|
215
|
+
match = `xcrun xcresulttool version`.match(/xcresulttool version (?<version>[\d.]+)/)
|
216
|
+
version = match[:version]
|
217
|
+
xcresulttool_cmd << '--legacy' if Gem::Version.new(version) >= Gem::Version.new(23_021)
|
218
|
+
|
219
|
+
xcresulttool_cmd.join(' ')
|
220
|
+
end
|
221
|
+
|
200
222
|
def parse_xcresult(path, output_remove_retry_attempts: false)
|
201
223
|
require 'shellwords'
|
202
224
|
path = Shellwords.escape(path)
|
203
225
|
|
204
226
|
# Executes xcresulttool to get JSON format of the result bundle object
|
205
|
-
|
227
|
+
# Hotfix: From Xcode 16 beta 3 'xcresulttool get --format json' has been deprecated; '--legacy' flag required to keep on using the command
|
228
|
+
xcresulttool_cmd = generate_cmd_parse_xcresult(path)
|
229
|
+
|
230
|
+
result_bundle_object_raw = execute_cmd(xcresulttool_cmd)
|
206
231
|
result_bundle_object = JSON.parse(result_bundle_object_raw)
|
207
232
|
|
208
233
|
# Parses JSON into ActionsInvocationRecord to find a list of all ids for ActionTestPlanRunSummaries
|
@@ -215,7 +240,7 @@ module Trainer
|
|
215
240
|
# Maps ids into ActionTestPlanRunSummaries by executing xcresulttool to get JSON
|
216
241
|
# containing specific information for each test summary,
|
217
242
|
summaries = ids.map do |id|
|
218
|
-
raw = execute_cmd("
|
243
|
+
raw = execute_cmd("#{xcresulttool_cmd} --id #{id}")
|
219
244
|
json = JSON.parse(raw)
|
220
245
|
Trainer::XCResult::ActionTestPlanRunSummaries.new(json)
|
221
246
|
end
|