fastlane 2.221.1 → 2.223.0
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.
- 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
         
     |