fastlane 2.237.0 → 2.239.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 +107 -100
- data/bin/fastlane +2 -2
- data/deliver/lib/deliver/html_generator.rb +1 -1
- data/deliver/lib/deliver/options.rb +9 -1
- data/deliver/lib/deliver/upload_metadata.rb +22 -0
- data/deliver/lib/deliver/upload_screenshots.rb +12 -4
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -2
- data/fastlane/lib/fastlane/actions/deploygate.rb +3 -2
- data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +6 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +4 -2
- data/fastlane/lib/fastlane/actions/hockey.rb +3 -2
- data/fastlane/lib/fastlane/actions/installr.rb +3 -2
- data/fastlane/lib/fastlane/actions/mailgun.rb +1 -0
- data/fastlane/lib/fastlane/actions/notarize.rb +3 -18
- data/fastlane/lib/fastlane/actions/register_devices.rb +21 -5
- data/fastlane/lib/fastlane/actions/setup_ci.rb +7 -2
- data/fastlane/lib/fastlane/actions/spm.rb +6 -0
- data/fastlane/lib/fastlane/actions/testfairy.rb +5 -3
- data/fastlane/lib/fastlane/actions/tryouts.rb +3 -2
- data/fastlane/lib/fastlane/actions/update_project_team.rb +17 -9
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +33 -7
- data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
- data/fastlane/lib/fastlane/helper/sh_helper.rb +9 -1
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +5 -1
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +9 -2
- data/fastlane/swift/Fastlane.swift +66 -20
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +1 -1
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
- data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +31 -5
- data/fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb +24 -12
- data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +22 -12
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +22 -9
- data/fastlane_core/lib/fastlane_core/helper.rb +4 -3
- data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +6 -2
- data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +1 -1
- data/fastlane_core/lib/fastlane_core/print_table.rb +0 -16
- data/fastlane_core/lib/fastlane_core/queue_worker.rb +10 -1
- data/fastlane_core/lib/fastlane_core/video_utils.rb +4 -2
- data/gym/lib/gym/module.rb +20 -2
- data/match/lib/match/nuke.rb +2 -2
- data/match/lib/match/storage/git_storage.rb +1 -4
- data/match/lib/match/storage/google_cloud_storage.rb +6 -1
- data/pem/lib/pem/manager.rb +5 -1
- data/pem/lib/pem/options.rb +6 -0
- data/pilot/lib/pilot/build_manager.rb +34 -2
- data/pilot/lib/pilot/options.rb +10 -2
- data/pilot/lib/pilot/tester_manager.rb +2 -2
- data/precheck/lib/precheck/rules/copyright_date_rule.rb +1 -1
- data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +2 -2
- data/sigh/lib/assets/resign.sh +21 -9
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +4 -1
- data/spaceship/lib/spaceship/client.rb +0 -1
- data/spaceship/lib/spaceship/connect_api/file_uploader.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +6 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +16 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +5 -0
- data/spaceship/lib/spaceship/connect_api/models/routing_app_coverage.rb +75 -0
- data/spaceship/lib/spaceship/connect_api/token.rb +6 -1
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +45 -0
- data/spaceship/lib/spaceship/connect_api.rb +1 -0
- data/spaceship/lib/spaceship/helper/plist_middleware.rb +37 -8
- data/supply/lib/supply/client.rb +6 -0
- data/supply/lib/supply/reader.rb +15 -0
- metadata +79 -53
|
@@ -11,6 +11,10 @@ module Fastlane
|
|
|
11
11
|
['Device ID', 'Device Name', 'Device Platform']
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
def self.ignored_line?(row)
|
|
15
|
+
row.all? { |value| value.to_s.strip.empty? } || row.first.to_s.strip.start_with?('#')
|
|
16
|
+
end
|
|
17
|
+
|
|
14
18
|
def self.run(params)
|
|
15
19
|
platform = Spaceship::ConnectAPI::BundleIdPlatform.map(params[:platform])
|
|
16
20
|
|
|
@@ -22,6 +26,7 @@ module Fastlane
|
|
|
22
26
|
require 'csv'
|
|
23
27
|
|
|
24
28
|
devices_file = CSV.read(File.expand_path(File.join(params[:devices_file])), col_sep: "\t")
|
|
29
|
+
devices_file = devices_file.reject { |row| ignored_line?(row) }
|
|
25
30
|
unless devices_file.first == file_column_headers.first(2) || devices_file.first == file_column_headers
|
|
26
31
|
UI.user_error!("Please provide a file according to the Apple Sample UDID file (https://developer.apple.com/account/resources/downloads/Multiple-Upload-Samples.zip)")
|
|
27
32
|
end
|
|
@@ -55,8 +60,14 @@ module Fastlane
|
|
|
55
60
|
existing_devices = Spaceship::ConnectAPI::Device.all
|
|
56
61
|
|
|
57
62
|
device_objs = new_devices.map do |device|
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
normalized_udid = device[0].tr("-", "")
|
|
64
|
+
existing_device = existing_devices.find do |ed|
|
|
65
|
+
ed.udid.tr("-", "").casecmp(normalized_udid).zero?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if existing_device
|
|
69
|
+
UI.verbose("UDID #{existing_device.udid} already exists - Skipping...")
|
|
70
|
+
|
|
60
71
|
next
|
|
61
72
|
end
|
|
62
73
|
|
|
@@ -74,8 +85,12 @@ module Fastlane
|
|
|
74
85
|
try_create_device(name: device[1], platform: device_platform, udid: device[0])
|
|
75
86
|
end
|
|
76
87
|
|
|
77
|
-
|
|
78
|
-
|
|
88
|
+
if device_objs.compact.empty?
|
|
89
|
+
UI.success("No new devices to register")
|
|
90
|
+
else
|
|
91
|
+
UI.success("Successfully registered new devices.")
|
|
92
|
+
end
|
|
93
|
+
return device_objs.compact
|
|
79
94
|
end
|
|
80
95
|
|
|
81
96
|
def self.try_create_device(name: nil, platform: nil, udid: nil)
|
|
@@ -169,7 +184,8 @@ module Fastlane
|
|
|
169
184
|
[
|
|
170
185
|
"This will register iOS/Mac devices with the Developer Portal so that you can include them in your provisioning profiles.",
|
|
171
186
|
"This is an optimistic action, in that it will only ever add new devices to the member center, and never remove devices. If a device which has already been registered within the member center is not passed to this action, it will be left alone in the member center and continue to work.",
|
|
172
|
-
"The action will connect to the Apple Developer Portal using the username you specified in your `Appfile` with `apple_id`, but you can override it using the `username` option, or by setting the env variable `ENV['DELIVER_USER']`."
|
|
187
|
+
"The action will connect to the Apple Developer Portal using the username you specified in your `Appfile` with `apple_id`, but you can override it using the `username` option, or by setting the env variable `ENV['DELIVER_USER']`.",
|
|
188
|
+
"When using `devices_file`, blank lines and lines starting with `#` are ignored, so you can group devices, add notes, or comment out a device row without removing it."
|
|
173
189
|
].join("\n")
|
|
174
190
|
end
|
|
175
191
|
|
|
@@ -41,7 +41,7 @@ module Fastlane
|
|
|
41
41
|
UI.message("Creating temporary keychain: \"#{keychain_name}\".")
|
|
42
42
|
Actions::CreateKeychainAction.run(
|
|
43
43
|
name: keychain_name,
|
|
44
|
-
default_keychain:
|
|
44
|
+
default_keychain: params[:set_default_keychain],
|
|
45
45
|
unlock: true,
|
|
46
46
|
timeout: params[:timeout],
|
|
47
47
|
lock_when_sleeps: true,
|
|
@@ -113,7 +113,12 @@ module Fastlane
|
|
|
113
113
|
env_name: "FL_SETUP_CI_KEYCHAIN_NAME",
|
|
114
114
|
description: "Set a custom keychain name",
|
|
115
115
|
type: String,
|
|
116
|
-
default_value: "fastlane_tmp_keychain")
|
|
116
|
+
default_value: "fastlane_tmp_keychain"),
|
|
117
|
+
FastlaneCore::ConfigItem.new(key: :set_default_keychain,
|
|
118
|
+
env_name: "FL_SETUP_CI_SET_DEFAULT_KEYCHAIN",
|
|
119
|
+
description: "Set the temporary keychain as the system default",
|
|
120
|
+
type: Boolean,
|
|
121
|
+
default_value: true)
|
|
117
122
|
]
|
|
118
123
|
end
|
|
119
124
|
|
|
@@ -10,6 +10,7 @@ module Fastlane
|
|
|
10
10
|
cmd << "--package-path #{params[:package_path]}" if params[:package_path]
|
|
11
11
|
cmd << "--configuration #{params[:configuration]}" if params[:configuration]
|
|
12
12
|
cmd << "--disable-sandbox" if params[:disable_sandbox]
|
|
13
|
+
cmd << "--skip-update" if params[:skip_update]
|
|
13
14
|
cmd << "--verbose" if params[:verbose]
|
|
14
15
|
cmd << "--very-verbose" if params[:very_verbose]
|
|
15
16
|
if params[:simulator]
|
|
@@ -113,6 +114,11 @@ module Fastlane
|
|
|
113
114
|
description: "Pass in xcpretty additional command line arguments (e.g. '--test --no-color' or '--tap --no-utf'), requires xcpretty_output to be specified also",
|
|
114
115
|
type: String,
|
|
115
116
|
optional: true),
|
|
117
|
+
FastlaneCore::ConfigItem.new(key: :skip_update,
|
|
118
|
+
env_name: "FL_SPM_SKIP_UPDATE",
|
|
119
|
+
description: "Skip updating dependencies from their remote during a resolution",
|
|
120
|
+
type: Boolean,
|
|
121
|
+
default_value: false),
|
|
116
122
|
FastlaneCore::ConfigItem.new(key: :verbose,
|
|
117
123
|
short_option: "-v",
|
|
118
124
|
env_name: "FL_SPM_VERBOSE",
|
|
@@ -9,16 +9,18 @@ module Fastlane
|
|
|
9
9
|
class TestfairyAction < Action
|
|
10
10
|
def self.upload_build(upload_url, ipa, options, timeout)
|
|
11
11
|
require 'faraday'
|
|
12
|
-
require '
|
|
12
|
+
require 'faraday/multipart'
|
|
13
|
+
require 'faraday/retry'
|
|
14
|
+
require 'faraday/follow_redirects'
|
|
13
15
|
|
|
14
16
|
UI.success("Uploading to #{upload_url}...")
|
|
15
17
|
|
|
16
18
|
connection = Faraday.new(url: upload_url) do |builder|
|
|
17
19
|
builder.request(:multipart)
|
|
18
20
|
builder.request(:url_encoded)
|
|
19
|
-
builder.request(:retry, max: 3, interval: 5)
|
|
21
|
+
builder.request(:retry, { max: 3, interval: 5 })
|
|
20
22
|
builder.response(:json, content_type: /\bjson$/)
|
|
21
|
-
builder.
|
|
23
|
+
builder.response(:follow_redirects)
|
|
22
24
|
builder.adapter(:net_http)
|
|
23
25
|
end
|
|
24
26
|
|
|
@@ -24,14 +24,15 @@ module Fastlane
|
|
|
24
24
|
|
|
25
25
|
def self.upload_build(params)
|
|
26
26
|
require 'faraday'
|
|
27
|
-
require '
|
|
27
|
+
require 'faraday/multipart'
|
|
28
|
+
require 'faraday/follow_redirects'
|
|
28
29
|
|
|
29
30
|
url = TRYOUTS_API_BUILD_RELEASE_TEMPLATE % params[:app_id]
|
|
30
31
|
connection = Faraday.new(url) do |builder|
|
|
31
32
|
builder.request(:multipart)
|
|
32
33
|
builder.request(:url_encoded)
|
|
33
34
|
builder.response(:json, content_type: /\bjson$/)
|
|
34
|
-
builder.
|
|
35
|
+
builder.response(:follow_redirects)
|
|
35
36
|
builder.adapter(:net_http)
|
|
36
37
|
end
|
|
37
38
|
|
|
@@ -8,10 +8,8 @@ module Fastlane
|
|
|
8
8
|
project_path = params[:path]
|
|
9
9
|
selected_targets = params[:targets]
|
|
10
10
|
|
|
11
|
-
UI.user_error!("Could not find path to xcodeproj '#{project_path}'. Pass the path to your project (not workspace)!") unless File.exist?(project_path)
|
|
12
|
-
|
|
13
11
|
# Load .xcodeproj
|
|
14
|
-
project =
|
|
12
|
+
project = Fastlane::Helper::XcodeprojHelper.get_project!(project_path)
|
|
15
13
|
|
|
16
14
|
# Fetch target
|
|
17
15
|
targets = project.native_targets
|
|
@@ -25,10 +23,20 @@ module Fastlane
|
|
|
25
23
|
|
|
26
24
|
# Set teamid in target
|
|
27
25
|
targets.each do |target|
|
|
28
|
-
UI.message("Updating development team (#{params[:teamid]}) for target `#{target.name}` in the project '#{project_path}'")
|
|
29
|
-
# Update the build settings
|
|
30
26
|
target.build_configurations.each do |configuration|
|
|
31
|
-
|
|
27
|
+
# Iterate over any keys that start with DEVELOPMENT_TEAM
|
|
28
|
+
# This will also set keys that have filtering like [sdk=iphoneos*]
|
|
29
|
+
keys = configuration.build_settings.keys.select { |key| key.to_s.start_with?("DEVELOPMENT_TEAM") }
|
|
30
|
+
keys.each do |key|
|
|
31
|
+
configuration.build_settings[key] = params[:teamid]
|
|
32
|
+
UI.message("Updated build setting '#{key}' to '#{params[:teamid]}' for configuration '#{configuration.name}'")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Explicitly set the key with value if keys don't exist
|
|
36
|
+
unless keys.include?('DEVELOPMENT_TEAM')
|
|
37
|
+
configuration.build_settings['DEVELOPMENT_TEAM'] = params[:teamid]
|
|
38
|
+
UI.message("Added build setting 'DEVELOPMENT_TEAM' with value '#{params[:teamid]}' for configuration '#{configuration.name}'")
|
|
39
|
+
end
|
|
32
40
|
end
|
|
33
41
|
|
|
34
42
|
project.save
|
|
@@ -42,7 +50,7 @@ module Fastlane
|
|
|
42
50
|
end
|
|
43
51
|
|
|
44
52
|
def self.details
|
|
45
|
-
"This action updates the Developer Team ID of your Xcode project."
|
|
53
|
+
"This action updates (or adds) the Developer Team ID of your Xcode project."
|
|
46
54
|
end
|
|
47
55
|
|
|
48
56
|
def self.available_options
|
|
@@ -69,8 +77,8 @@ module Fastlane
|
|
|
69
77
|
]
|
|
70
78
|
end
|
|
71
79
|
|
|
72
|
-
def self.
|
|
73
|
-
"lgaches"
|
|
80
|
+
def self.authors
|
|
81
|
+
["lgaches", "iBotPeaches"]
|
|
74
82
|
end
|
|
75
83
|
|
|
76
84
|
def self.is_supported?(platform)
|
|
@@ -36,20 +36,29 @@ module Fastlane
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
worker = FastlaneCore::QueueWorker.new(max_worker_threads) do |dsym_path|
|
|
39
|
-
handle_dsym(params, dsym_path
|
|
39
|
+
handle_dsym(params, dsym_path)
|
|
40
40
|
end
|
|
41
41
|
worker.batch_enqueue(dsym_paths)
|
|
42
|
-
worker.start
|
|
43
|
-
|
|
42
|
+
results = worker.start
|
|
43
|
+
|
|
44
|
+
if results.all?
|
|
45
|
+
UI.success("Successfully uploaded dSYM files to Crashlytics 💯")
|
|
46
|
+
elsif results.any?
|
|
47
|
+
UI.success("Successfully uploaded some dSYM files to Crashlytics 💯")
|
|
48
|
+
UI.important("Some dSYM files failed to upload, see the errors above")
|
|
49
|
+
else
|
|
50
|
+
UI.user_error!("Service failed to upload any dSYM files to Crashlytics")
|
|
51
|
+
end
|
|
44
52
|
end
|
|
45
53
|
|
|
46
54
|
# @param current_path this is a path to either a dSYM or a zipped dSYM
|
|
47
55
|
# this might also be either nested or not, we're flexible
|
|
48
|
-
def self.handle_dsym(params, current_path
|
|
56
|
+
def self.handle_dsym(params, current_path)
|
|
49
57
|
if current_path.end_with?(".dSYM", ".zip")
|
|
50
|
-
upload_dsym(params, current_path)
|
|
58
|
+
return upload_dsym(params, current_path)
|
|
51
59
|
else
|
|
52
60
|
UI.error("Don't know how to handle '#{current_path}'")
|
|
61
|
+
return false
|
|
53
62
|
end
|
|
54
63
|
end
|
|
55
64
|
|
|
@@ -69,12 +78,21 @@ module Fastlane
|
|
|
69
78
|
end
|
|
70
79
|
command << "-p #{params[:platform] == 'appletvos' ? 'tvos' : params[:platform]}"
|
|
71
80
|
command << File.expand_path(path).shellescape
|
|
81
|
+
|
|
72
82
|
begin
|
|
73
83
|
command_to_execute = command.join(" ")
|
|
74
84
|
UI.verbose("upload_dsym using command: #{command_to_execute}")
|
|
75
85
|
Actions.sh(command_to_execute, log: params[:debug])
|
|
86
|
+
return true
|
|
76
87
|
rescue => ex
|
|
77
|
-
|
|
88
|
+
# If it fails - emit the warning, then continue (or crash) depending on "fail_on_error"
|
|
89
|
+
UI.error(ex.to_s)
|
|
90
|
+
|
|
91
|
+
if params[:fail_on_error] == true
|
|
92
|
+
raise
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
return false
|
|
78
96
|
end
|
|
79
97
|
end
|
|
80
98
|
|
|
@@ -118,7 +136,10 @@ module Fastlane
|
|
|
118
136
|
end
|
|
119
137
|
|
|
120
138
|
def self.details
|
|
121
|
-
|
|
139
|
+
[
|
|
140
|
+
"This action allows you to upload symbolication files to Crashlytics. It's extra useful if you use it to download the latest dSYM files from Apple when you use Bitcode. This action will not fail the build if one of the uploads failed by default.",
|
|
141
|
+
"The reason for that is that sometimes some of dSYM files are invalid, and we don't want them to fail the complete build. However, fail_on_build parameter can be used to prevent this behavior."
|
|
142
|
+
].join("\n")
|
|
122
143
|
end
|
|
123
144
|
|
|
124
145
|
def self.available_options
|
|
@@ -195,6 +216,11 @@ module Fastlane
|
|
|
195
216
|
min_threads = 1
|
|
196
217
|
UI.user_error!("Too few threads (#{value}) minimum number of threads: #{min_threads}") unless value >= min_threads
|
|
197
218
|
end),
|
|
219
|
+
FastlaneCore::ConfigItem.new(key: :fail_on_error,
|
|
220
|
+
env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_FAIL_ON_ERROR",
|
|
221
|
+
description: "Should the action fail when an upload fails?",
|
|
222
|
+
type: Boolean,
|
|
223
|
+
default_value: false),
|
|
198
224
|
FastlaneCore::ConfigItem.new(key: :debug,
|
|
199
225
|
env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_DEBUG",
|
|
200
226
|
description: "Enable debug mode for upload-symbols",
|
|
@@ -9,9 +9,10 @@ module Fastlane
|
|
|
9
9
|
end.freeze
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def self.git_log_between(pretty_format, from, to, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
|
|
12
|
+
def self.git_log_between(pretty_format, from, to, matching_pattern, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
|
|
13
13
|
command = %w(git log)
|
|
14
14
|
command << "--pretty=#{pretty_format}"
|
|
15
|
+
command << "--grep=#{matching_pattern}" if matching_pattern
|
|
15
16
|
command << "--date=#{date_format}" if date_format
|
|
16
17
|
command << '--ancestry-path' if ancestry_path
|
|
17
18
|
command << "#{from}...#{to}"
|
|
@@ -24,9 +25,10 @@ module Fastlane
|
|
|
24
25
|
nil
|
|
25
26
|
end
|
|
26
27
|
|
|
27
|
-
def self.git_log_last_commits(pretty_format, commit_count, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
|
|
28
|
+
def self.git_log_last_commits(pretty_format, commit_count, matching_pattern, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
|
|
28
29
|
command = %w(git log)
|
|
29
30
|
command << "--pretty=#{pretty_format}"
|
|
31
|
+
command << "--grep=#{matching_pattern}" if matching_pattern
|
|
30
32
|
command << "--date=#{date_format}" if date_format
|
|
31
33
|
command << '--ancestry-path' if ancestry_path
|
|
32
34
|
command << '-n' << commit_count.to_s
|
|
@@ -51,15 +51,23 @@ module Fastlane
|
|
|
51
51
|
# sh "ls -la /Applications/Xcode\ 7.3.1.app"
|
|
52
52
|
# sh "ls", "-la", "/Applications/Xcode 7.3.1.app"
|
|
53
53
|
# sh({ "FOO" => "Hello" }, "echo $FOO")
|
|
54
|
+
sanitized_output = false
|
|
54
55
|
Open3.popen2e(*command) do |stdin, io, thread|
|
|
55
56
|
io.sync = true
|
|
56
57
|
io.each do |line|
|
|
57
|
-
|
|
58
|
+
if print_command_output
|
|
59
|
+
# Ensure the string being stripped is in valid UTF-8 format; Otherwise warn at the end
|
|
60
|
+
text = line.encode('UTF-8', invalid: :replace)
|
|
61
|
+
UI.command_output(text.strip)
|
|
62
|
+
sanitized_output = true if text != line
|
|
63
|
+
end
|
|
58
64
|
result << line
|
|
59
65
|
end
|
|
60
66
|
exit_status = thread.value
|
|
61
67
|
end
|
|
62
68
|
|
|
69
|
+
UI.important("Command output wasn't valid UTF-8 and was sanitized. Please report the issue.") if sanitized_output
|
|
70
|
+
|
|
63
71
|
# Checking Process::Status#exitstatus instead of #success? makes for more
|
|
64
72
|
# testable code. (Tests mock exitstatus only.) This is also consistent
|
|
65
73
|
# with previous implementations of sh and... probably portable to all
|
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
|
|
|
15
15
|
spec.files = Dir["lib/**/*"] + %w(README.md LICENSE)
|
|
16
16
|
spec.require_paths = ['lib']
|
|
17
17
|
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
18
|
-
spec.required_ruby_version = '>= 3.
|
|
18
|
+
spec.required_ruby_version = '>= 3.1'
|
|
19
19
|
|
|
20
20
|
# Don't add a dependency to fastlane or fastlane_re
|
|
21
21
|
# since this would cause a circular dependency
|
|
@@ -3,7 +3,7 @@ require:
|
|
|
3
3
|
- rubocop/require_tools
|
|
4
4
|
- rubocop-performance
|
|
5
5
|
AllCops:
|
|
6
|
-
TargetRubyVersion: 3.
|
|
6
|
+
TargetRubyVersion: 3.1
|
|
7
7
|
SuggestExtensions: false
|
|
8
8
|
NewCops: enable
|
|
9
9
|
Include:
|
|
@@ -21,6 +21,10 @@ AllCops:
|
|
|
21
21
|
- "**/*.provisionprofile"
|
|
22
22
|
Lint/ErbNewArguments:
|
|
23
23
|
Enabled: false
|
|
24
|
+
Style/HashSyntax:
|
|
25
|
+
EnforcedShorthandSyntax: either
|
|
26
|
+
Naming/BlockForwarding:
|
|
27
|
+
EnforcedStyle: explicit
|
|
24
28
|
Style/SlicingWithRange:
|
|
25
29
|
Enabled: false
|
|
26
30
|
Style/MultipleComparison:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module Fastlane
|
|
2
|
-
VERSION = '2.
|
|
2
|
+
VERSION = '2.239.0'.freeze
|
|
3
3
|
SUMMARY = "The easiest way to build and release mobile apps.".freeze
|
|
4
4
|
DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
|
|
5
5
|
MINIMUM_XCODE_RELEASE = "7.0".freeze
|
|
@@ -125,7 +125,7 @@ public protocol DeliverfileProtocol: AnyObject {
|
|
|
125
125
|
/// The name of your Developer Portal team if you're in multiple teams
|
|
126
126
|
var devPortalTeamName: String? { get }
|
|
127
127
|
|
|
128
|
-
/// The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `
|
|
128
|
+
/// The provider short name to be used with the iTMSTransporter to identify your team. This value will override the automatically detected provider short name. To get provider short name run `xcrun iTMSTransporter -m provider -u 'USERNAME' -p 'PASSWORD' -account_type itunes_connect -v off`. The short names of providers should be listed in the second column
|
|
129
129
|
var itcProvider: String? { get }
|
|
130
130
|
|
|
131
131
|
/// The provider public ID to be used with altool (--provider-public-id). This value will override the automatically detected provider value for altool uploads. Required after Xcode 26 when your account is associated with multiple providers and using username/app-password authentication
|
|
@@ -179,6 +179,9 @@ public protocol DeliverfileProtocol: AnyObject {
|
|
|
179
179
|
/// Metadata: Path to the app review attachment file
|
|
180
180
|
var appReviewAttachmentFile: String? { get }
|
|
181
181
|
|
|
182
|
+
/// Metadata: Path to the routing app coverage file (`.geojson`) that is required for routing apps
|
|
183
|
+
var routingAppCoverageFile: String? { get }
|
|
184
|
+
|
|
182
185
|
/// Metadata: The localised app description
|
|
183
186
|
var description: [String: Any]? { get }
|
|
184
187
|
|
|
@@ -465,6 +468,10 @@ public extension DeliverfileProtocol {
|
|
|
465
468
|
return nil
|
|
466
469
|
}
|
|
467
470
|
|
|
471
|
+
var routingAppCoverageFile: String? {
|
|
472
|
+
return nil
|
|
473
|
+
}
|
|
474
|
+
|
|
468
475
|
var description: [String: Any]? {
|
|
469
476
|
return nil
|
|
470
477
|
}
|
|
@@ -532,4 +539,4 @@ public extension DeliverfileProtocol {
|
|
|
532
539
|
|
|
533
540
|
// Please don't remove the lines below
|
|
534
541
|
// They are used to detect outdated files
|
|
535
|
-
// FastlaneRunnerAPIVersion [0.9.
|
|
542
|
+
// FastlaneRunnerAPIVersion [0.9.153]
|