fastlane 2.233.0 → 2.234.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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +99 -98
  3. data/deliver/lib/deliver/detect_values.rb +0 -2
  4. data/deliver/lib/deliver/languages.rb +1 -1
  5. data/deliver/lib/deliver/upload_price_tier.rb +4 -2
  6. data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +2 -2
  7. data/fastlane/lib/fastlane/actions/appium.rb +1 -1
  8. data/fastlane/lib/fastlane/actions/appledoc.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +2 -2
  10. data/fastlane/lib/fastlane/actions/gcovr.rb +1 -1
  11. data/fastlane/lib/fastlane/actions/increment_version_number.rb +5 -0
  12. data/fastlane/lib/fastlane/actions/install_on_device.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/lcov.rb +1 -1
  14. data/fastlane/lib/fastlane/actions/oclint.rb +1 -1
  15. data/fastlane/lib/fastlane/actions/sonar.rb +1 -1
  16. data/fastlane/lib/fastlane/actions/sourcedocs.rb +1 -1
  17. data/fastlane/lib/fastlane/actions/swiftlint.rb +1 -1
  18. data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +4 -4
  19. data/fastlane/lib/fastlane/actions/xcodebuild.rb +1 -1
  20. data/fastlane/lib/fastlane/actions/xctool.rb +1 -1
  21. data/fastlane/lib/fastlane/helper/xcodebuild_formatter_helper.rb +1 -1
  22. data/fastlane/lib/fastlane/helper/xcodes_helper.rb +1 -1
  23. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -0
  24. data/fastlane/lib/fastlane/swift_runner_upgrader.rb +1 -1
  25. data/fastlane/lib/fastlane/version.rb +2 -2
  26. data/fastlane/swift/Deliverfile.swift +1 -1
  27. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  28. data/fastlane/swift/Fastlane.swift +21 -21
  29. data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +4 -4
  30. data/fastlane/swift/Gymfile.swift +1 -1
  31. data/fastlane/swift/GymfileProtocol.swift +1 -1
  32. data/fastlane/swift/Matchfile.swift +1 -1
  33. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  34. data/fastlane/swift/Precheckfile.swift +1 -1
  35. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  36. data/fastlane/swift/Scanfile.swift +1 -1
  37. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  38. data/fastlane/swift/Screengrabfile.swift +1 -1
  39. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  40. data/fastlane/swift/Snapshotfile.swift +1 -1
  41. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  42. data/fastlane_core/lib/fastlane_core/clipboard.rb +1 -1
  43. data/fastlane_core/lib/fastlane_core/helper.rb +14 -1
  44. data/fastlane_core/lib/fastlane_core/languages.rb +1 -1
  45. data/frameit/lib/frameit/dependency_checker.rb +1 -1
  46. data/frameit/lib/frameit/device_types.rb +18 -0
  47. data/frameit/lib/frameit/editor.rb +2 -2
  48. data/match/lib/match/nuke.rb +58 -38
  49. data/match/lib/match/storage/git_storage.rb +1 -1
  50. data/produce/lib/produce/available_default_languages.rb +12 -1
  51. data/scan/lib/scan/detect_values.rb +5 -0
  52. data/sigh/lib/assets/resign.sh +6 -10
  53. data/snapshot/lib/snapshot/reports_generator.rb +7 -0
  54. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +1 -1
  55. data/spaceship/lib/assets/languageMapping.json +66 -0
  56. data/spaceship/lib/spaceship/portal/provisioning_profile.rb +63 -25
  57. data/supply/lib/supply/client.rb +61 -43
  58. data/supply/lib/supply/options.rb +2 -2
  59. metadata +31 -31
@@ -3331,8 +3331,8 @@ public func copyArtifacts(keepOriginal: OptionalConfigValue<Bool> = .fastlaneDef
3331
3331
  Create Managed Google Play Apps
3332
3332
 
3333
3333
  - parameters:
3334
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
3335
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
3334
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
3335
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account) used to authenticate with Google
3336
3336
  - developerAccountId: The ID of your Google Play Console account. Can be obtained from the URL when you log in (`https://play.google.com/apps/publish/?account=...` or when you 'Obtain private app publishing rights' (https://developers.google.com/android/work/play/custom-app-api/get-started#retrieve_the_developer_account_id)
3337
3337
  - apk: Path to the APK file to upload
3338
3338
  - appTitle: App Title
@@ -4287,8 +4287,8 @@ public func downloadDsyms(apiKeyPath: OptionalConfigValue<String?> = .fastlaneDe
4287
4287
  - metadataPath: Path to the directory containing the metadata files
4288
4288
  - key: **DEPRECATED!** Use `--json_key` instead - The p12 File used to authenticate with Google
4289
4289
  - issuer: **DEPRECATED!** Use `--json_key` instead - The issuer of the p12 file (email address of the service account)
4290
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
4291
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
4290
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
4291
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
4292
4292
  - rootUrl: Root URL for the Google Play API. The provided URL will be used for API calls in place of https://www.googleapis.com/
4293
4293
  - timeout: Timeout for read, open, and send (in seconds)
4294
4294
 
@@ -4338,8 +4338,8 @@ public func downloadFromPlayStore(packageName: String,
4338
4338
  - parameters:
4339
4339
  - packageName: The package name of the application to use
4340
4340
  - versionCode: The versionCode for which to download the generated APK
4341
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
4342
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
4341
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
4342
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
4343
4343
  - rootUrl: Root URL for the Google Play API. The provided URL will be used for API calls in place of https://www.googleapis.com/
4344
4344
  - timeout: Timeout for read, open, and send (in seconds)
4345
4345
  - destination: The path on disk where to download the Generated Universal APK
@@ -5594,8 +5594,8 @@ public func githubApi(serverUrl: String = "https://api.github.com",
5594
5594
  - track: The track of the application to use. The default available tracks are: production, beta, alpha, internal
5595
5595
  - key: **DEPRECATED!** Use `--json_key` instead - The p12 File used to authenticate with Google
5596
5596
  - issuer: **DEPRECATED!** Use `--json_key` instead - The issuer of the p12 file (email address of the service account)
5597
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
5598
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
5597
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
5598
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
5599
5599
  - rootUrl: Root URL for the Google Play API. The provided URL will be used for API calls in place of https://www.googleapis.com/
5600
5600
  - timeout: Timeout for read, open, and send (in seconds)
5601
5601
 
@@ -5643,8 +5643,8 @@ public func googlePlayTrackReleaseNames(packageName: String,
5643
5643
  - track: The track of the application to use. The default available tracks are: production, beta, alpha, internal
5644
5644
  - key: **DEPRECATED!** Use `--json_key` instead - The p12 File used to authenticate with Google
5645
5645
  - issuer: **DEPRECATED!** Use `--json_key` instead - The issuer of the p12 file (email address of the service account)
5646
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
5647
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
5646
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
5647
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
5648
5648
  - rootUrl: Root URL for the Google Play API. The provided URL will be used for API calls in place of https://www.googleapis.com/
5649
5649
  - timeout: Timeout for read, open, and send (in seconds)
5650
5650
 
@@ -11142,8 +11142,8 @@ public func ssh(username: String,
11142
11142
  - metadataPath: Path to the directory containing the metadata files
11143
11143
  - key: **DEPRECATED!** Use `--json_key` instead - The p12 File used to authenticate with Google
11144
11144
  - issuer: **DEPRECATED!** Use `--json_key` instead - The issuer of the p12 file (email address of the service account)
11145
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
11146
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
11145
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
11146
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
11147
11147
  - apk: Path to the APK file to upload
11148
11148
  - apkPaths: An array of paths to APK files to upload
11149
11149
  - aab: Path to the AAB file to upload
@@ -12955,8 +12955,8 @@ public func uploadToAppStore(apiKeyPath: OptionalConfigValue<String?> = .fastlan
12955
12955
  - metadataPath: Path to the directory containing the metadata files
12956
12956
  - key: **DEPRECATED!** Use `--json_key` instead - The p12 File used to authenticate with Google
12957
12957
  - issuer: **DEPRECATED!** Use `--json_key` instead - The issuer of the p12 file (email address of the service account)
12958
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
12959
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
12958
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
12959
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
12960
12960
  - apk: Path to the APK file to upload
12961
12961
  - apkPaths: An array of paths to APK files to upload
12962
12962
  - aab: Path to the AAB file to upload
@@ -13122,8 +13122,8 @@ public func uploadToPlayStore(packageName: String,
13122
13122
 
13123
13123
  - parameters:
13124
13124
  - packageName: The package name of the application to use
13125
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
13126
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
13125
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
13126
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
13127
13127
  - apk: Path to the APK file to upload
13128
13128
  - apkPaths: An array of paths to APK files to upload
13129
13129
  - aab: Path to the AAB file to upload
@@ -13347,15 +13347,15 @@ public func uploadToTestflight(apiKeyPath: OptionalConfigValue<String?> = .fastl
13347
13347
  }
13348
13348
 
13349
13349
  /**
13350
- Validate that the Google Play Store `json_key` works
13350
+ Validate Google credentials JSON for the Google Play Store
13351
13351
 
13352
13352
  - parameters:
13353
- - jsonKey: The path to a file containing service account JSON, used to authenticate with Google
13354
- - jsonKeyData: The raw service account JSON data used to authenticate with Google
13353
+ - jsonKey: The path to a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
13354
+ - jsonKeyData: The raw content of a Google credentials JSON file (Application Default, Workload Identity, or Service Account), used to authenticate with Google
13355
13355
  - rootUrl: Root URL for the Google Play API. The provided URL will be used for API calls in place of https://www.googleapis.com/
13356
13356
  - timeout: Timeout for read, open, and send (in seconds)
13357
13357
 
13358
- Use this action to test and validate your private key json key file used to connect and authenticate with the Google Play API
13358
+ Use this action to test and validate your Google credentials JSON file (of type authorized_user, external_account, service_account) used to connect and authenticate with the Google Play API
13359
13359
  */
13360
13360
  public func validatePlayStoreJsonKey(jsonKey: OptionalConfigValue<String?> = .fastlaneDefault(nil),
13361
13361
  jsonKeyData: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -13976,4 +13976,4 @@ public let snapshotfile: Snapshotfile = .init()
13976
13976
 
13977
13977
  // Please don't remove the lines below
13978
13978
  // They are used to detect outdated files
13979
- // FastlaneRunnerAPIVersion [0.9.198]
13979
+ // FastlaneRunnerAPIVersion [0.9.200]
@@ -337,7 +337,7 @@
337
337
  GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
338
338
  GCC_WARN_UNUSED_FUNCTION = YES;
339
339
  GCC_WARN_UNUSED_VARIABLE = YES;
340
- MACOSX_DEPLOYMENT_TARGET = 10.12;
340
+ MACOSX_DEPLOYMENT_TARGET = 14.6;
341
341
  MTL_ENABLE_DEBUG_INFO = YES;
342
342
  ONLY_ACTIVE_ARCH = YES;
343
343
  SDKROOT = macosx;
@@ -390,7 +390,7 @@
390
390
  GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
391
391
  GCC_WARN_UNUSED_FUNCTION = YES;
392
392
  GCC_WARN_UNUSED_VARIABLE = YES;
393
- MACOSX_DEPLOYMENT_TARGET = 10.12;
393
+ MACOSX_DEPLOYMENT_TARGET = 14.6;
394
394
  MTL_ENABLE_DEBUG_INFO = NO;
395
395
  SDKROOT = macosx;
396
396
  SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -404,7 +404,7 @@
404
404
  CLANG_ENABLE_MODULES = YES;
405
405
  CODE_SIGN_IDENTITY = "-";
406
406
  LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
407
- MACOSX_DEPLOYMENT_TARGET = 10.12;
407
+ MACOSX_DEPLOYMENT_TARGET = 14.6;
408
408
  PRODUCT_NAME = "$(TARGET_NAME)";
409
409
  SWIFT_OPTIMIZATION_LEVEL = "-Onone";
410
410
  SWIFT_VERSION = 4.0;
@@ -417,7 +417,7 @@
417
417
  CLANG_ENABLE_MODULES = YES;
418
418
  CODE_SIGN_IDENTITY = "-";
419
419
  LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
420
- MACOSX_DEPLOYMENT_TARGET = 10.12;
420
+ MACOSX_DEPLOYMENT_TARGET = 14.6;
421
421
  PRODUCT_NAME = "$(TARGET_NAME)";
422
422
  SWIFT_VERSION = 4.0;
423
423
  };
@@ -17,4 +17,4 @@ public class Gymfile: GymfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.233.0
20
+ // Generated with fastlane 2.234.0
@@ -392,4 +392,4 @@ public extension GymfileProtocol {
392
392
 
393
393
  // Please don't remove the lines below
394
394
  // They are used to detect outdated files
395
- // FastlaneRunnerAPIVersion [0.9.148]
395
+ // FastlaneRunnerAPIVersion [0.9.150]
@@ -17,4 +17,4 @@ public class Matchfile: MatchfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.233.0
20
+ // Generated with fastlane 2.234.0
@@ -406,4 +406,4 @@ public extension MatchfileProtocol {
406
406
 
407
407
  // Please don't remove the lines below
408
408
  // They are used to detect outdated files
409
- // FastlaneRunnerAPIVersion [0.9.142]
409
+ // FastlaneRunnerAPIVersion [0.9.144]
@@ -17,4 +17,4 @@ public class Precheckfile: PrecheckfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.233.0
20
+ // Generated with fastlane 2.234.0
@@ -84,4 +84,4 @@ public extension PrecheckfileProtocol {
84
84
 
85
85
  // Please don't remove the lines below
86
86
  // They are used to detect outdated files
87
- // FastlaneRunnerAPIVersion [0.9.141]
87
+ // FastlaneRunnerAPIVersion [0.9.143]
@@ -17,4 +17,4 @@ public class Scanfile: ScanfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.233.0
20
+ // Generated with fastlane 2.234.0
@@ -574,4 +574,4 @@ public extension ScanfileProtocol {
574
574
 
575
575
  // Please don't remove the lines below
576
576
  // They are used to detect outdated files
577
- // FastlaneRunnerAPIVersion [0.9.153]
577
+ // FastlaneRunnerAPIVersion [0.9.155]
@@ -17,4 +17,4 @@ public class Screengrabfile: ScreengrabfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.233.0
20
+ // Generated with fastlane 2.234.0
@@ -161,4 +161,4 @@ public extension ScreengrabfileProtocol {
161
161
 
162
162
  // Please don't remove the lines below
163
163
  // They are used to detect outdated files
164
- // FastlaneRunnerAPIVersion [0.9.143]
164
+ // FastlaneRunnerAPIVersion [0.9.145]
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.233.0
20
+ // Generated with fastlane 2.234.0
@@ -371,4 +371,4 @@ public extension SnapshotfileProtocol {
371
371
 
372
372
  // Please don't remove the lines below
373
373
  // They are used to detect outdated files
374
- // FastlaneRunnerAPIVersion [0.9.137]
374
+ // FastlaneRunnerAPIVersion [0.9.139]
@@ -14,7 +14,7 @@ module FastlaneCore
14
14
  end
15
15
 
16
16
  def self.is_supported?
17
- return `which pbcopy`.length > 0 && `which pbpaste`.length > 0
17
+ return FastlaneCore::Helper.which('pbcopy') && FastlaneCore::Helper.which('pbpaste')
18
18
  end
19
19
  end
20
20
  end
@@ -3,6 +3,7 @@ require 'colored'
3
3
  require 'tty-spinner'
4
4
  require 'pathname'
5
5
 
6
+ require_relative 'command_executor'
6
7
  require_relative 'fastlane_folder'
7
8
  require_relative 'ui/ui'
8
9
  require_relative 'env'
@@ -184,7 +185,7 @@ module FastlaneCore
184
185
 
185
186
  # @return Swift version
186
187
  def self.swift_version
187
- if system("which swift > /dev/null 2>&1")
188
+ if self.which('swift')
188
189
  output = `swift --version 2> /dev/null`
189
190
  return output.split("\n").first.match(/version ([0-9.]+)/).captures.first
190
191
  end
@@ -301,6 +302,18 @@ module FastlaneCore
301
302
  # helper methods
302
303
  #
303
304
 
305
+ # Cross-platform way of finding an executable in the $PATH.
306
+ # Returns the full path to the executable, or nil if not found.
307
+ # Unlike shelling out to `which`, this produces no output, making
308
+ # it suitable for CI environments.
309
+ #
310
+ # Helper.which('ruby') #=> "/usr/bin/ruby"
311
+ # Helper.which('not_real') #=> nil
312
+ #
313
+ def self.which(cmd)
314
+ FastlaneCore::CommandExecutor.which(cmd)
315
+ end
316
+
304
317
  # Runs a given command using backticks (`)
305
318
  # and prints them out using the UI.command method
306
319
  def self.backticks(command, print: true)
@@ -11,6 +11,6 @@ module FastlaneCore
11
11
  # - produce/lib/produce/available_default_languages.rb
12
12
  # - spaceship/lib/assets/languageMapping.json
13
13
  # See pull request for example: https://github.com/fastlane/fastlane/pull/14110
14
- ALL_LANGUAGES = %w[ar-SA ca cs da de-DE el en-AU en-CA en-GB en-US es-ES es-MX fi fr-CA fr-FR he hi hr hu id it ja ko ms nl-NL no pl pt-BR pt-PT ro ru sk sv th tr uk vi zh-Hans zh-Hant]
14
+ ALL_LANGUAGES = %w[ar-SA bn-BD ca cs da de-DE el en-AU en-CA en-GB en-US es-ES es-MX fi fr-CA fr-FR gu-IN he hi hr hu id it ja kn-IN ko ml-IN mr-IN ms nl-NL no or-IN pa-IN pl pt-BR pt-PT ro ru sk sl-SI sv ta-IN te-IN th tr uk ur-PK vi zh-Hans zh-Hant]
15
15
  end
16
16
  end
@@ -9,7 +9,7 @@ module Frameit
9
9
  end
10
10
 
11
11
  def self.check_image_magick
12
- unless `which convert`.include?("convert")
12
+ unless FastlaneCore::Helper.which('convert')
13
13
  UI.error('#############################################################')
14
14
  UI.error("# You have to install the ImageMagick to use FrameIt")
15
15
  UI.error("# Install it using 'brew update && brew install imagemagick'")
@@ -89,6 +89,17 @@ module Frameit
89
89
  STARLIGHT ||= "Starlight"
90
90
  SIERRA ||= "Sierra"
91
91
  SORTA_SAGE ||= "Sorta Sage"
92
+ TEAL ||= "Teal"
93
+ ULTRAMARINE ||= "Ultramarine"
94
+ BLACK_TITANIUM ||= "Black Titanium"
95
+ DESERT_TITANIUM ||= "Desert Titanium"
96
+ NATURAL_TITANIUM ||= "Natural Titanium"
97
+ WHITE_TITANIUM ||= "White Titanium"
98
+ COSMIC_ORANGE ||= "Cosmic Orange"
99
+ DEEP_BLUE ||= "Deep Blue"
100
+ MIST_BLUE ||= "Mist Blue"
101
+ SAGE ||= "Sage"
102
+ LAVENDER ||= "Lavender"
92
103
 
93
104
  def self.all_colors
94
105
  Color.constants.map { |c| Color.const_get(c).upcase.gsub(' ', '_') }
@@ -175,6 +186,13 @@ module Frameit
175
186
  IPHONE_14_PLUS ||= Device.new("iphone-14-plus", "Apple iPhone 14 Plus", 12, [[1284, 2778], [2778, 1284]], 458, Color::MIDNIGHT, Platform::IOS)
176
187
  IPHONE_14_PRO ||= Device.new("iphone-14-pro", "Apple iPhone 14 Pro", 12, [[1179, 2556], [2556, 1179]], 460, Color::BLACK, Platform::IOS)
177
188
  IPHONE_14_PRO_MAX ||= Device.new("iphone14-pro-max", "Apple iPhone 14 Pro Max", 12, [[1290, 2796], [2796, 1290]], 458, Color::BLACK, Platform::IOS)
189
+ IPHONE_16 ||= Device.new("iphone-16", "Apple iPhone 16", 13, [[1179, 2556], [2556, 1179]], 460, Color::BLACK, Platform::IOS)
190
+ IPHONE_16_PLUS ||= Device.new("iphone-16-plus", "Apple iPhone 16 Plus", 13, [[1290, 2796], [2796, 1290]], 460, Color::BLACK, Platform::IOS)
191
+ IPHONE_16_PRO ||= Device.new("iphone-16-pro", "Apple iPhone 16 Pro", 13, [[1206, 2622], [2622, 1206]], 460, Color::NATURAL_TITANIUM, Platform::IOS, DEVICE_SCREEN_IDS[DisplayType::APP_IPHONE_61])
192
+ IPHONE_16_PRO_MAX ||= Device.new("iphone16-pro-max", "Apple iPhone 16 Pro Max", 13, [[1320, 2868], [2868, 1320]], 460, Color::NATURAL_TITANIUM, Platform::IOS, DEVICE_SCREEN_IDS[DisplayType::APP_IPHONE_67])
193
+ IPHONE_17 ||= Device.new("iphone-17", "Apple iPhone 17", 14, [[1206, 2622], [2622, 1206]], 460, Color::BLACK, Platform::IOS)
194
+ IPHONE_17_PRO ||= Device.new("iphone-17-pro", "Apple iPhone 17 Pro", 14, [[1206, 2622], [2622, 1206]], 460, Color::SILVER, Platform::IOS, DEVICE_SCREEN_IDS[DisplayType::APP_IPHONE_61])
195
+ IPHONE_17_PRO_MAX ||= Device.new("iphone17-pro-max", "Apple iPhone 17 Pro Max", 14, [[1320, 2868], [2868, 1320]], 460, Color::SILVER, Platform::IOS, DEVICE_SCREEN_IDS[DisplayType::APP_IPHONE_67])
178
196
  IPAD_10_2 ||= Device.new("ipad-10-2", "Apple iPad 10.2", 1, [[1620, 2160], [2160, 1620]], 264, Color::SPACE_GRAY, Platform::IOS)
179
197
  IPAD_AIR_2 ||= Device.new("ipad-air-2", "Apple iPad Air 2", 1, [[1536, 2048], [2048, 1536]], 264, Color::SPACE_GRAY, Platform::IOS, DEVICE_SCREEN_IDS[DisplayType::APP_IPAD_97])
180
198
  IPAD_AIR_2019 ||= Device.new("ipad-air-2019", "Apple iPad Air (2019)", 2, [[1668, 2224], [2224, 1668]], 265, Color::SPACE_GRAY, Platform::IOS)
@@ -109,8 +109,8 @@ module Frameit
109
109
  end
110
110
  end
111
111
 
112
- # Apply rounded corners for all iPhone 14 devices
113
- if screenshot.device.id.to_s.include?("iphone-14") || screenshot.device.id.to_s.include?("iphone14")
112
+ # Apply rounded corners for the specifically matched iPhone 14, 16, and 17 device identifiers
113
+ if ["iphone-14", "iphone14", "iphone-16", "iphone16", "iphone-17", "iphone17"].any? { |id| screenshot.device.id.to_s.include?(id) }
114
114
 
115
115
  maskData = MiniMagick::Tool::Convert.new do |img|
116
116
  img.size("#{screenshot.size[0]}x#{screenshot.size[1]}")
@@ -168,6 +168,12 @@ module Match
168
168
  end
169
169
 
170
170
  def filter_by_cert
171
+ certificate_id = self.params[:certificate_id].to_s.strip
172
+ unless certificate_id.empty?
173
+ filter_by_certificate_ids([certificate_id], missing_error_message: "No certificate found for certificate_id '#{certificate_id}'")
174
+ return
175
+ end
176
+
171
177
  # Force will continue to revoke and delete all certificates and profiles
172
178
  return if self.params[:force] || !UI.interactive?
173
179
  return if self.certs.count < 2
@@ -198,44 +204,7 @@ module Match
198
204
  UI.user_error!("No certificates were selected based on option number(s) entered")
199
205
  end
200
206
 
201
- # Do profile selection logic
202
- cert_ids = self.certs.map(&:id)
203
- self.profiles = self.profiles.select do |profile|
204
- profile_cert_ids = profile.certificates.map(&:id)
205
- (cert_ids & profile_cert_ids).any?
206
- end
207
-
208
- # Do file selection logic
209
- self.files = self.files.select do |f|
210
- found = false
211
-
212
- ext = File.extname(f)
213
- filename = File.basename(f, ".*")
214
-
215
- # Attempt to find cert based on filename
216
- if ext == ".cer" || ext == ".p12"
217
- found ||= self.certs.any? do |cert|
218
- filename == cert.id.to_s
219
- end
220
- end
221
-
222
- # Attempt to find profile matched on UUIDs in profile
223
- if ext == ".mobileprovision" || ext == ".provisionprofile"
224
- storage_uuid = FastlaneCore::ProvisioningProfile.uuid(f)
225
-
226
- found ||= self.profiles.any? do |profile|
227
- tmp_file = Tempfile.new
228
- tmp_file.write(Base64.decode64(profile.profile_content))
229
- tmp_file.close
230
-
231
- # Compare profile uuid in storage to profile uuid on developer portal
232
- portal_uuid = FastlaneCore::ProvisioningProfile.uuid(tmp_file.path)
233
- storage_uuid == portal_uuid
234
- end
235
- end
236
-
237
- found
238
- end
207
+ filter_profiles_and_files_by_selected_certificates
239
208
  end
240
209
  end
241
210
 
@@ -358,6 +327,57 @@ module Match
358
327
  end
359
328
  end
360
329
 
330
+ def filter_by_certificate_ids(certificate_ids, missing_error_message: nil)
331
+ certificate_ids = certificate_ids.map { |id| id.to_s.strip }.reject(&:empty?)
332
+ self.certs = self.certs.select do |cert|
333
+ certificate_ids.include?(cert.id.to_s)
334
+ end
335
+
336
+ UI.user_error!(missing_error_message || "No certificates were selected") if self.certs.empty?
337
+
338
+ filter_profiles_and_files_by_selected_certificates
339
+ end
340
+
341
+ def filter_profiles_and_files_by_selected_certificates
342
+ # Do profile selection logic
343
+ cert_ids = self.certs.map { |cert| cert.id.to_s }
344
+ self.profiles = self.profiles.reject do |profile|
345
+ profile_cert_ids = profile.certificates.map { |cert| cert.id.to_s }
346
+ (cert_ids & profile_cert_ids).empty?
347
+ end
348
+
349
+ profile_uuids = self.profiles.map do |profile|
350
+ Tempfile.create("profile") do |tmp_file|
351
+ tmp_file.binmode
352
+ tmp_file.write(Base64.decode64(profile.profile_content))
353
+ tmp_file.flush
354
+
355
+ FastlaneCore::ProvisioningProfile.uuid(tmp_file.path)
356
+ end
357
+ end
358
+
359
+ # Do file selection logic
360
+ self.files = self.files.select do |f|
361
+ found = false
362
+
363
+ ext = File.extname(f)
364
+ filename = File.basename(f, ".*")
365
+
366
+ # Attempt to find cert based on filename
367
+ if ext == ".cer" || ext == ".p12"
368
+ found ||= cert_ids.include?(filename)
369
+ end
370
+
371
+ # Attempt to find profile matched on UUIDs in profile
372
+ if ext == ".mobileprovision" || ext == ".provisionprofile"
373
+ storage_uuid = FastlaneCore::ProvisioningProfile.uuid(f)
374
+ found ||= profile_uuids.include?(storage_uuid)
375
+ end
376
+
377
+ found
378
+ end
379
+ end
380
+
361
381
  # The kind of certificate we're interested in
362
382
  def certificate_type(type)
363
383
  case type.to_sym
@@ -141,7 +141,7 @@ module Match
141
141
 
142
142
  def delete_files(files_to_delete: [], custom_message: nil)
143
143
  if files_to_delete.count > 0
144
- commands = files_to_delete.map { |filename| "git rm #{filename.shellescape}" }
144
+ commands = files_to_delete.map { |filename| "git --literal-pathspecs rm -- #{filename.shellescape}" }
145
145
  git_push(commands: commands, commit_message: custom_message)
146
146
  end
147
147
  end
@@ -7,6 +7,7 @@ module Produce
7
7
  def self.all_languages
8
8
  [
9
9
  "Arabic",
10
+ "Bangla",
10
11
  "Catalan",
11
12
  "Croatian",
12
13
  "Czech",
@@ -22,28 +23,38 @@ module Produce
22
23
  "French_CA",
23
24
  "German",
24
25
  "Greek",
26
+ "Gujarati",
25
27
  "Hebrew",
26
28
  "Hindi",
27
29
  "Hungarian",
28
30
  "Indonesian",
29
31
  "Italian",
30
32
  "Japanese",
33
+ "Kannada",
31
34
  "Korean",
35
+ "Malayalam",
32
36
  "Malay",
37
+ "Marathi",
33
38
  "Norwegian",
39
+ "Odia",
34
40
  "Polish",
35
41
  "Portuguese",
42
+ "Punjabi",
36
43
  "Romanian",
37
44
  "Russian",
38
45
  "Simplified Chinese",
39
46
  "Slovak",
47
+ "Slovenian",
40
48
  "Spanish",
41
49
  "Spanish_MX",
42
50
  "Swedish",
43
- "Ukrainian",
51
+ "Tamil",
52
+ "Telugu",
44
53
  "Thai",
45
54
  "Traditional Chinese",
46
55
  "Turkish",
56
+ "Ukrainian",
57
+ "Urdu",
47
58
  "Vietnamese"
48
59
  ]
49
60
  end
@@ -90,6 +90,11 @@ module Scan
90
90
  default_path = Scan.project.build_settings(key: "BUILT_PRODUCTS_DIR")
91
91
  # => /Users/.../Library/Developer/Xcode/DerivedData/app-bqrfaojicpsqnoglloisfftjhksc/Build/Products/Release-iphoneos
92
92
  # We got 3 folders up to point to ".../DerivedData/app-[random_chars]/"
93
+ if default_path.nil?
94
+ UI.error("Can't retrieve BUILT_PRODUCTS_DIR from the project to detect derived data path.")
95
+ UI.error("Either set `derived_data_path` explicitly in `scan`, or enable build for running in the scheme.")
96
+ return
97
+ end
93
98
  default_path = File.expand_path("../../..", default_path)
94
99
  UI.verbose("Detected derived data path '#{default_path}'")
95
100
  Scan.config[:derived_data_path] = default_path
@@ -249,9 +249,9 @@ while [ "$1" != "" ]; do
249
249
  shift
250
250
  done
251
251
 
252
- KEYCHAIN_FLAG=
252
+ KEYCHAIN_ARGS=()
253
253
  if [ -n "$KEYCHAIN_PATH" ]; then
254
- KEYCHAIN_FLAG="--keychain $KEYCHAIN_PATH"
254
+ KEYCHAIN_ARGS=(--keychain "$KEYCHAIN_PATH")
255
255
  fi
256
256
 
257
257
  PAGESIZE_ARGS=()
@@ -277,7 +277,7 @@ log "Certificate: '$CERTIFICATE'"
277
277
  [[ -n "${VERSION_NUMBER}" ]] && log "Specified version number to use: '$VERSION_NUMBER'"
278
278
  [[ -n "${SHORT_VERSION}" ]] && log "Specified short version to use: '$SHORT_VERSION'"
279
279
  [[ -n "${BUNDLE_VERSION}" ]] && log "Specified bundle version to use: '$BUNDLE_VERSION'"
280
- [[ -n "${KEYCHAIN_FLAG}" ]] && log "Specified keychain to use: '$KEYCHAIN_PATH'"
280
+ [[ ${#KEYCHAIN_ARGS[@]} -gt 0 ]] && log "Specified keychain to use: '$KEYCHAIN_PATH'"
281
281
  [[ -n "${PAGESIZE}" ]] && log "Specified page size: '$PAGESIZE'"
282
282
  [[ -n "${NEW_FILE}" ]] && log "Output file name: '$NEW_FILE'"
283
283
  [[ -n "${USE_APP_ENTITLEMENTS}" ]] && log "Extract app entitlements: YES"
@@ -562,7 +562,7 @@ function resign {
562
562
  do
563
563
  if [[ "$assetpack" == *.assetpack ]]; then
564
564
  rm -rf "$assetpack"/_CodeSignature
565
- /usr/bin/codesign ${VERBOSE} "${PAGESIZE_ARGS[@]}" --generate-entitlement-der "${KEYCHAIN_FLAG}" -f -s "$CERTIFICATE" "$assetpack"
565
+ /usr/bin/codesign ${VERBOSE} "${PAGESIZE_ARGS[@]}" --generate-entitlement-der "${KEYCHAIN_ARGS[@]}" -f -s "$CERTIFICATE" "$assetpack"
566
566
  checkStatus
567
567
  else
568
568
  log "Ignoring non-assetpack: $assetpack"
@@ -582,9 +582,7 @@ function resign {
582
582
  do
583
583
  if [[ "$framework" == *.framework || "$framework" == *.dylib ]]; then
584
584
  log "Resigning '$framework'"
585
- # Must not quote KEYCHAIN_FLAG because it needs to be unwrapped and passed to codesign with spaces
586
- # shellcheck disable=SC2086
587
- /usr/bin/codesign ${VERBOSE} "${PAGESIZE_ARGS[@]}" --generate-entitlement-der ${KEYCHAIN_FLAG} -f -s "$CERTIFICATE" "$framework"
585
+ /usr/bin/codesign ${VERBOSE} "${PAGESIZE_ARGS[@]}" --generate-entitlement-der "${KEYCHAIN_ARGS[@]}" -f -s "$CERTIFICATE" "$framework"
588
586
  checkStatus
589
587
  else
590
588
  log "Ignoring non-framework: $framework"
@@ -895,9 +893,7 @@ function resign {
895
893
  log "Creating an archived-expanded-entitlements.xcent file for Xcode 9 builds or earlier"
896
894
  cp -- "$TEMP_DIR/newEntitlements" "$APP_PATH/archived-expanded-entitlements.xcent"
897
895
  fi
898
- # Must not quote KEYCHAIN_FLAG because it needs to be unwrapped and passed to codesign with spaces
899
- # shellcheck disable=SC2086
900
- /usr/bin/codesign ${VERBOSE} "${PAGESIZE_ARGS[@]}" --generate-entitlement-der ${KEYCHAIN_FLAG} -f -s "$CERTIFICATE" --entitlements "$TEMP_DIR/newEntitlements" "$APP_PATH"
896
+ /usr/bin/codesign ${VERBOSE} "${PAGESIZE_ARGS[@]}" --generate-entitlement-der "${KEYCHAIN_ARGS[@]}" -f -s "$CERTIFICATE" --entitlements "$TEMP_DIR/newEntitlements" "$APP_PATH"
901
897
  checkStatus
902
898
  fi
903
899
 
@@ -84,6 +84,13 @@ module Snapshot
84
84
  {
85
85
  # snapshot in Xcode 9 saves screenshots with the SIMULATOR_DEVICE_NAME
86
86
  # which includes spaces
87
+ 'iPhone 17 Pro Max' => "iPhone 17 Pro Max",
88
+ 'iPhone 17 Pro' => "iPhone 17 Pro",
89
+ 'iPhone 17' => "iPhone 17",
90
+ 'iPhone 16 Pro Max' => "iPhone 16 Pro Max",
91
+ 'iPhone 16 Pro' => "iPhone 16 Pro",
92
+ 'iPhone 16 Plus' => "iPhone 16 Plus",
93
+ 'iPhone 16' => "iPhone 16",
87
94
  'iPhone 15 Pro Max' => "iPhone 15 Pro Max",
88
95
  'iPhone 15 Pro' => "iPhone 15 Pro",
89
96
  'iPhone 15 Plus' => "iPhone 15 Plus",
@@ -4,7 +4,7 @@ require_relative 'simulator_launcher_base'
4
4
  module Snapshot
5
5
  class CPUInspector
6
6
  def self.hwprefs_available?
7
- `which hwprefs` != ''
7
+ !!FastlaneCore::Helper.which('hwprefs')
8
8
  end
9
9
 
10
10
  def self.cpu_count