fastlane 2.238.0 → 2.241.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 +57 -177
- data/bin/fastlane +4 -2
- data/credentials_manager/README.md +1 -1
- data/credentials_manager/lib/credentials_manager/account_manager.rb +6 -2
- data/deliver/lib/deliver/app_screenshot.rb +0 -4
- data/deliver/lib/deliver/commands_generator.rb +1 -1
- data/deliver/lib/deliver/detect_values.rb +3 -1
- data/deliver/lib/deliver/download_screenshots.rb +8 -1
- data/deliver/lib/deliver/html_generator.rb +1 -1
- data/deliver/lib/deliver/options.rb +8 -0
- data/deliver/lib/deliver/runner.rb +5 -4
- data/deliver/lib/deliver/sync_screenshots.rb +27 -28
- data/deliver/lib/deliver/upload_app_clip_default_experience_header_images.rb +3 -3
- data/deliver/lib/deliver/upload_metadata.rb +34 -16
- data/deliver/lib/deliver/upload_screenshots.rb +24 -18
- data/docs/README.md +25 -0
- data/fastlane/lib/assets/TeamTable.md.erb +28 -0
- data/fastlane/lib/fastlane/actions/appaloosa.rb +2 -1
- data/fastlane/lib/fastlane/actions/appium.rb +1 -1
- data/fastlane/lib/fastlane/actions/apteligent.rb +8 -1
- data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +3 -1
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -2
- data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +3 -0
- data/fastlane/lib/fastlane/actions/danger.rb +5 -5
- data/fastlane/lib/fastlane/actions/docs/build_app.md +1 -2
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +1 -2
- data/fastlane/lib/fastlane/actions/docs/get_certificates.md +0 -2
- data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +7 -3
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +13 -3
- data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +2 -2
- data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +1 -0
- data/fastlane/lib/fastlane/actions/github_api.rb +1 -2
- data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +1 -1
- data/fastlane/lib/fastlane/actions/increment_build_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/increment_version_number.rb +1 -1
- data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +16 -6
- data/fastlane/lib/fastlane/actions/lcov.rb +11 -2
- data/fastlane/lib/fastlane/actions/nexus_upload.rb +16 -4
- data/fastlane/lib/fastlane/actions/notification.rb +3 -2
- data/fastlane/lib/fastlane/actions/oclint.rb +8 -8
- data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +9 -4
- data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
- data/fastlane/lib/fastlane/actions/say.rb +2 -4
- data/fastlane/lib/fastlane/actions/set_pod_key.rb +3 -3
- data/fastlane/lib/fastlane/actions/sonar.rb +16 -16
- data/fastlane/lib/fastlane/actions/sourcedocs.rb +8 -8
- data/fastlane/lib/fastlane/actions/spaceship_logs.rb +4 -2
- data/fastlane/lib/fastlane/actions/splunkmint.rb +8 -1
- data/fastlane/lib/fastlane/actions/swiftlint.rb +6 -3
- data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +4 -2
- data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +5 -2
- data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +5 -2
- data/fastlane/lib/fastlane/actions/verify_build.rb +1 -4
- data/fastlane/lib/fastlane/actions/verify_pod_keys.rb +3 -1
- data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +20 -19
- data/fastlane/lib/fastlane/actions/xcodebuild.rb +5 -6
- data/fastlane/lib/fastlane/actions/zip.rb +2 -1
- data/fastlane/lib/fastlane/auto_complete.rb +1 -1
- data/fastlane/lib/fastlane/cli_tools_distributor.rb +14 -0
- data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +23 -0
- data/fastlane/lib/fastlane/environment_printer.rb +12 -25
- data/fastlane/lib/fastlane/fast_file.rb +2 -1
- data/fastlane/lib/fastlane/fastlane_require.rb +5 -1
- data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
- data/fastlane/lib/fastlane/helper/sh_helper.rb +25 -7
- data/fastlane/lib/fastlane/new_action.rb +1 -1
- data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +1 -1
- data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +1 -1
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +36 -4
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
- data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +1 -1
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +7 -7
- data/fastlane/lib/fastlane/swift_lane_manager.rb +22 -4
- data/fastlane/lib/fastlane/version.rb +3 -2
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +8 -1
- data/fastlane/swift/Fastlane.swift +129 -11
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +8 -1
- data/fastlane/swift/MainProcess.swift +190 -20
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +10 -3
- 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 +15 -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 +8 -1
- data/fastlane/swift/formatting/Rakefile +1 -0
- data/fastlane/swift/main.swift +4 -1
- data/fastlane_core/README.md +1 -1
- data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +1 -17
- data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +23 -8
- data/fastlane_core/lib/fastlane_core/device_manager.rb +2 -2
- data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +20 -7
- data/fastlane_core/lib/fastlane_core/helper.rb +34 -5
- data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +1 -1
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +16 -27
- data/fastlane_core/lib/fastlane_core/keychain_importer.rb +31 -28
- data/fastlane_core/lib/fastlane_core/languages.rb +0 -1
- data/fastlane_core/lib/fastlane_core/print_table.rb +5 -2
- data/fastlane_core/lib/fastlane_core/project.rb +19 -0
- data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +10 -19
- data/fastlane_core/lib/fastlane_core/secrets.rb +77 -0
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +3 -3
- data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +1 -1
- data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +2 -1
- data/fastlane_core/lib/fastlane_core.rb +1 -0
- data/frameit/lib/frameit/device.rb +1 -1
- data/frameit/lib/frameit/frame_downloader.rb +2 -0
- data/frameit/lib/frameit/runner.rb +3 -2
- data/frameit/lib/frameit/screenshot.rb +0 -1
- data/gym/lib/gym/generators/build_command_generator.rb +4 -4
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +3 -3
- data/gym/lib/gym/options.rb +5 -0
- data/gym/lib/gym/runner.rb +1 -1
- data/internal/README.md +1 -1
- data/match/lib/match/encryption/openssl.rb +6 -2
- data/match/lib/match/generator.rb +1 -0
- data/match/lib/match/nuke.rb +2 -2
- data/match/lib/match/options.rb +13 -5
- data/match/lib/match/runner.rb +30 -3
- data/match/lib/match/storage/git_storage.rb +44 -11
- data/match/lib/match/storage/gitlab/secure_file.rb +2 -1
- data/match/lib/match/storage/google_cloud_storage.rb +6 -1
- data/match/lib/match/storage/interface.rb +8 -5
- data/pem/lib/pem/manager.rb +5 -1
- data/pem/lib/pem/module.rb +0 -4
- data/pem/lib/pem/options.rb +6 -0
- data/pilot/lib/pilot/build_manager.rb +32 -0
- data/pilot/lib/pilot/options.rb +8 -0
- data/precheck/lib/precheck/rule_processor.rb +1 -0
- data/produce/lib/produce/developer_center.rb +49 -2
- data/produce/lib/produce/itunes_connect.rb +1 -1
- data/produce/lib/produce/module.rb +21 -0
- data/produce/lib/produce/options.rb +17 -0
- data/produce/lib/produce/service.rb +3 -5
- data/produce/lib/produce.rb +0 -1
- data/scan/lib/scan/options.rb +12 -0
- data/scan/lib/scan/runner.rb +1 -1
- data/scan/lib/scan/test_command_generator.rb +12 -9
- data/scan/lib/scan/test_result_parser.rb +1 -0
- data/scan/lib/scan/xcpretty_reporter_options_generator.rb +2 -2
- data/screengrab/lib/screengrab/page.html.erb +12 -7
- data/screengrab/lib/screengrab/reports_generator.rb +1 -1
- data/sigh/lib/assets/resign.sh +38 -9
- data/sigh/lib/sigh/local_manage.rb +1 -1
- data/sigh/lib/sigh/options.rb +5 -0
- data/sigh/lib/sigh/resign.rb +3 -3
- data/sigh/lib/sigh/runner.rb +6 -1
- data/snapshot/lib/snapshot/options.rb +5 -0
- data/snapshot/lib/snapshot/page.html.erb +17 -12
- data/snapshot/lib/snapshot/reports_generator.rb +1 -1
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +1 -1
- data/snapshot/lib/snapshot.rb +0 -2
- data/spaceship/README.md +2 -3
- data/spaceship/lib/spaceship/base.rb +3 -1
- data/spaceship/lib/spaceship/client.rb +159 -19
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +16 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +13 -2
- data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +6 -0
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +7 -5
- data/spaceship/lib/spaceship/connect_api/models/routing_app_coverage.rb +75 -0
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +25 -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/du/upload_file.rb +4 -3
- data/spaceship/lib/spaceship/errors.rb +7 -1
- data/spaceship/lib/spaceship/globals.rb +2 -2
- data/spaceship/lib/spaceship/portal/merchant.rb +127 -2
- data/spaceship/lib/spaceship/portal/portal_client.rb +58 -0
- data/spaceship/lib/spaceship/portal/ui/select_team.rb +0 -2
- data/spaceship/lib/spaceship/portal/website_push.rb +8 -2
- data/spaceship/lib/spaceship/test_flight/client.rb +0 -22
- data/spaceship/lib/spaceship/test_flight.rb +0 -1
- data/spaceship/lib/spaceship/two_step_or_factor_client.rb +11 -0
- data/supply/lib/supply/client.rb +6 -0
- data/supply/lib/supply/options.rb +1 -0
- data/supply/lib/supply/reader.rb +15 -0
- data/supply/lib/supply.rb +0 -1
- data/trainer/lib/trainer/xcresult/helper.rb +27 -13
- metadata +80 -64
- data/produce/lib/produce/available_default_languages.rb +0 -62
- data/snapshot/lib/snapshot/screenshot_flatten.rb +0 -20
- data/snapshot/lib/snapshot/screenshot_rotate.rb +0 -36
- data/spaceship/lib/spaceship/test_flight/app_test_info.rb +0 -40
- data/supply/lib/supply/apk_listing.rb +0 -14
- /data/fastlane/lib/assets/{custom_action_template.rb → custom_action_template.rb.template} +0 -0
|
@@ -357,6 +357,7 @@ module Deliver
|
|
|
357
357
|
review_information(version)
|
|
358
358
|
app_clip_review_information(version)
|
|
359
359
|
review_attachment_file(version)
|
|
360
|
+
routing_app_coverage_file(version)
|
|
360
361
|
app_rating(app_info)
|
|
361
362
|
end
|
|
362
363
|
|
|
@@ -534,16 +535,14 @@ module Deliver
|
|
|
534
535
|
if locales_to_enable.count > 0
|
|
535
536
|
lng_text = "language"
|
|
536
537
|
lng_text += "s" if locales_to_enable.count != 1
|
|
537
|
-
Helper.
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
538
|
+
Helper.with_loading_indicator("Activating info #{lng_text} #{locales_to_enable.join(', ')}...") do
|
|
539
|
+
locales_to_enable.each do |locale|
|
|
540
|
+
app_info.create_app_info_localization(attributes: {
|
|
541
|
+
locale: locale
|
|
542
|
+
})
|
|
543
|
+
end
|
|
543
544
|
end
|
|
544
545
|
|
|
545
|
-
Helper.hide_loading_indicator
|
|
546
|
-
|
|
547
546
|
# Refresh version localizations
|
|
548
547
|
localizations = app_info.get_app_info_localizations
|
|
549
548
|
end
|
|
@@ -569,16 +568,14 @@ module Deliver
|
|
|
569
568
|
if locales_to_enable.count > 0
|
|
570
569
|
lng_text = "language"
|
|
571
570
|
lng_text += "s" if locales_to_enable.count != 1
|
|
572
|
-
Helper.
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
571
|
+
Helper.with_loading_indicator("Activating version #{lng_text} #{locales_to_enable.join(', ')}...") do
|
|
572
|
+
locales_to_enable.each do |locale|
|
|
573
|
+
version.create_app_store_version_localization(attributes: {
|
|
574
|
+
locale: locale
|
|
575
|
+
})
|
|
576
|
+
end
|
|
578
577
|
end
|
|
579
578
|
|
|
580
|
-
Helper.hide_loading_indicator
|
|
581
|
-
|
|
582
579
|
# Refresh version localizations
|
|
583
580
|
localizations = version.get_app_store_version_localizations
|
|
584
581
|
end
|
|
@@ -766,6 +763,27 @@ module Deliver
|
|
|
766
763
|
end
|
|
767
764
|
end
|
|
768
765
|
|
|
766
|
+
def routing_app_coverage_file(version)
|
|
767
|
+
# Skip logic entirely if no coverage file passed. So status-quo stays the same.
|
|
768
|
+
return unless options[:routing_app_coverage_file]
|
|
769
|
+
|
|
770
|
+
routing_app_coverage =
|
|
771
|
+
begin
|
|
772
|
+
version.fetch_routing_app_coverage
|
|
773
|
+
rescue => error
|
|
774
|
+
UI.error("Error fetching routing app coverage - #{error.message}")
|
|
775
|
+
nil
|
|
776
|
+
end
|
|
777
|
+
|
|
778
|
+
if routing_app_coverage
|
|
779
|
+
UI.message("Removing previous routing app coverage file from App Store Connect")
|
|
780
|
+
routing_app_coverage.delete!
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
UI.message("Uploading routing app coverage file to App Store Connect")
|
|
784
|
+
version.upload_routing_app_coverage(path: options[:routing_app_coverage_file])
|
|
785
|
+
end
|
|
786
|
+
|
|
769
787
|
def app_rating(app_info)
|
|
770
788
|
return unless options[:app_rating_config_path]
|
|
771
789
|
|
|
@@ -41,25 +41,23 @@ module Deliver
|
|
|
41
41
|
if locales_to_enable.count > 0
|
|
42
42
|
lng_text = "language"
|
|
43
43
|
lng_text += "s" if locales_to_enable.count != 1
|
|
44
|
-
Helper.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
44
|
+
Helper.with_loading_indicator("Activating #{lng_text} #{locales_to_enable.join(', ')}...") do
|
|
45
|
+
locales_to_enable.each do |locale|
|
|
46
|
+
version.create_app_store_version_localization(attributes: {
|
|
47
|
+
locale: locale
|
|
48
|
+
})
|
|
49
|
+
end
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
Helper.hide_loading_indicator
|
|
53
|
-
|
|
54
52
|
# Refresh version localizations
|
|
55
53
|
localizations = version.get_app_store_version_localizations
|
|
56
54
|
end
|
|
57
55
|
|
|
58
56
|
upload_screenshots(localizations, screenshots_per_language, options[:screenshot_processing_timeout])
|
|
59
57
|
|
|
60
|
-
Helper.
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
Helper.with_loading_indicator("Sorting screenshots uploaded...") do
|
|
59
|
+
sort_screenshots(localizations)
|
|
60
|
+
end
|
|
63
61
|
|
|
64
62
|
UI.success("Successfully uploaded screenshots to App Store Connect")
|
|
65
63
|
end
|
|
@@ -159,9 +157,9 @@ module Deliver
|
|
|
159
157
|
|
|
160
158
|
UI.verbose('Uploading jobs are completed')
|
|
161
159
|
|
|
162
|
-
Helper.
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
states = Helper.with_loading_indicator("Waiting for all the screenshots to finish being processed...") do
|
|
161
|
+
wait_for_complete(iterator, timeout_seconds)
|
|
162
|
+
end
|
|
165
163
|
retry_upload_screenshots_if_needed(iterator, states, total_number_of_screenshots, tries, timeout_seconds, localizations, screenshots_per_language)
|
|
166
164
|
|
|
167
165
|
UI.message("Successfully uploaded all screenshots")
|
|
@@ -171,13 +169,17 @@ module Deliver
|
|
|
171
169
|
def wait_for_complete(iterator, timeout_seconds)
|
|
172
170
|
start_time = Time.now
|
|
173
171
|
loop do
|
|
172
|
+
# App Store Connect publishes a screenshot's `sourceFileChecksum` asynchronously,
|
|
173
|
+
# shortly after its state becomes COMPLETE. (#30094)
|
|
174
|
+
number_of_screenshots_missing_checksum = 0
|
|
174
175
|
states = iterator.each_app_screenshot.map { |_, _, app_screenshot| app_screenshot }.each_with_object({}) do |app_screenshot, hash|
|
|
175
176
|
state = app_screenshot.asset_delivery_state['state']
|
|
176
177
|
hash[state] ||= 0
|
|
177
178
|
hash[state] += 1
|
|
179
|
+
number_of_screenshots_missing_checksum += 1 if state == 'COMPLETE' && app_screenshot.source_file_checksum.nil?
|
|
178
180
|
end
|
|
179
181
|
|
|
180
|
-
is_processing = states.fetch('UPLOAD_COMPLETE', 0) > 0
|
|
182
|
+
is_processing = states.fetch('UPLOAD_COMPLETE', 0) > 0 || number_of_screenshots_missing_checksum > 0
|
|
181
183
|
return states unless is_processing
|
|
182
184
|
|
|
183
185
|
if Time.now - start_time > timeout_seconds
|
|
@@ -185,7 +187,11 @@ module Deliver
|
|
|
185
187
|
return states
|
|
186
188
|
end
|
|
187
189
|
|
|
188
|
-
|
|
190
|
+
if number_of_screenshots_missing_checksum > 0
|
|
191
|
+
UI.verbose("There are still incomplete screenshots - #{states}, missing checksum: #{number_of_screenshots_missing_checksum}")
|
|
192
|
+
else
|
|
193
|
+
UI.verbose("There are still incomplete screenshots - #{states}")
|
|
194
|
+
end
|
|
189
195
|
sleep(5)
|
|
190
196
|
end
|
|
191
197
|
end
|
|
@@ -205,9 +211,9 @@ module Deliver
|
|
|
205
211
|
UI.user_error!("Failed verification of all screenshots uploaded... #{incomplete_screenshot_count} incomplete screenshot(s) still exist")
|
|
206
212
|
else
|
|
207
213
|
UI.error("Failed to upload all screenshots... Tries remaining: #{tries}")
|
|
208
|
-
# Delete bad entries before retry
|
|
214
|
+
# Delete bad entries before retry (not complete OR missing checksum)
|
|
209
215
|
iterator.each_app_screenshot do |_, _, app_screenshot|
|
|
210
|
-
app_screenshot.delete! unless app_screenshot.complete?
|
|
216
|
+
app_screenshot.delete! unless app_screenshot.complete? && !app_screenshot.source_file_checksum.nil?
|
|
211
217
|
end
|
|
212
218
|
upload_screenshots(localizations, screenshots_per_language, timeout_seconds, tries: tries)
|
|
213
219
|
end
|
data/docs/README.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<h3 align="center">
|
|
2
|
+
<a href="https://github.com/fastlane/fastlane/blob/master/fastlane/assets/fastlane_text.png">
|
|
3
|
+
<img src="https://github.com/fastlane/fastlane/blob/master/fastlane/assets/fastlane_text.png?raw=true" alt="fastlane Logo" width="500">
|
|
4
|
+
</a>
|
|
5
|
+
</h3>
|
|
6
|
+
|
|
7
|
+
# _fastlane_ Documentation
|
|
8
|
+
|
|
9
|
+
## Contributing
|
|
10
|
+
|
|
11
|
+
- [Contributing to _fastlane_](CONTRIBUTING.md)
|
|
12
|
+
- [Designing _fastlane_ code](Design.md)
|
|
13
|
+
- [Tooling and Debugging](ToolsAndDebugging.md)
|
|
14
|
+
|
|
15
|
+
## Testing
|
|
16
|
+
|
|
17
|
+
- [Testing _fastlane_](Testing.md)
|
|
18
|
+
- [When a spec passes alone and fails in the split](ParallelTesting.md)
|
|
19
|
+
|
|
20
|
+
## Project
|
|
21
|
+
|
|
22
|
+
- [_fastlane_'s Philosophy](VISION.md)
|
|
23
|
+
- [Maintaining _fastlane_](Maintaining.md)
|
|
24
|
+
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
25
|
+
- [Security Policy](SECURITY.md)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<table id='team'>
|
|
2
|
+
<%- team.each_slice(5) do |row| -%>
|
|
3
|
+
<tr>
|
|
4
|
+
<%- row.each do |github_user, user| -%>
|
|
5
|
+
<td id='<%= ERB::Util.h(user['name'].downcase.tr(' ', '-')) %>'>
|
|
6
|
+
<a href='https://github.com/<%= github_user %>'>
|
|
7
|
+
<img src='https://github.com/<%= github_user %>.png?size=200' width='140'>
|
|
8
|
+
</a>
|
|
9
|
+
<%- if user['twitter'] -%>
|
|
10
|
+
<h4 align='center'><a href='https://twitter.com/<%= user['twitter'] %>'><%= ERB::Util.h(user['name']) %></a></h4>
|
|
11
|
+
<%- else -%>
|
|
12
|
+
<h4 align='center'><%= ERB::Util.h(user['name']) %></h4>
|
|
13
|
+
<%- end -%>
|
|
14
|
+
</td>
|
|
15
|
+
<%- end -%>
|
|
16
|
+
</tr>
|
|
17
|
+
<%- end -%>
|
|
18
|
+
</table>
|
|
19
|
+
<%- unless alumni.empty? -%>
|
|
20
|
+
|
|
21
|
+
### _fastlane_ alumni
|
|
22
|
+
|
|
23
|
+
_fastlane_ wouldn't be what it is today without the countless hours these former team members have dedicated to the project ❤️
|
|
24
|
+
|
|
25
|
+
<p id='alumni'>
|
|
26
|
+
<%= alumni.map { |github_user, user| "<a href='https://github.com/#{github_user}'>#{ERB::Util.h(user['name'])}</a>" }.join(",\n") %>
|
|
27
|
+
</p>
|
|
28
|
+
<%- end -%>
|
|
@@ -33,7 +33,8 @@ module Fastlane
|
|
|
33
33
|
path = json_res['path']
|
|
34
34
|
uri = URI.parse(Base64.decode64(s3_sign))
|
|
35
35
|
File.open(file, 'rb') do |f|
|
|
36
|
-
http = Net::HTTP.new(uri.host)
|
|
36
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
37
|
+
http.use_ssl = (uri.scheme == 'https')
|
|
37
38
|
put = Net::HTTP::Put.new(uri.request_uri)
|
|
38
39
|
put.body = f.read
|
|
39
40
|
put['content-type'] = ''
|
|
@@ -37,7 +37,7 @@ module Fastlane
|
|
|
37
37
|
|
|
38
38
|
def self.invoke_appium_server(params)
|
|
39
39
|
appium = detect_appium(params)
|
|
40
|
-
Process.spawn(
|
|
40
|
+
Process.spawn(appium, "-a", params[:host].to_s, "-p", params[:port].to_s)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def self.detect_appium(params)
|
|
@@ -99,7 +99,14 @@ module Fastlane
|
|
|
99
99
|
end
|
|
100
100
|
|
|
101
101
|
def self.category
|
|
102
|
-
:
|
|
102
|
+
:deprecated
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def self.deprecated_notes
|
|
106
|
+
[
|
|
107
|
+
"VMware stopped selling Apteligent to new customers on February 4, 2019, and announced moving its capabilities to VMware Workspace ONE Intelligence.",
|
|
108
|
+
"See [Apteligent moving to Workspace ONE Intelligence](https://vcdx181.com/2019/01/20/apteligent-moving-to-workspace-one-intelligence/)."
|
|
109
|
+
].join("\n")
|
|
103
110
|
end
|
|
104
111
|
end
|
|
105
112
|
end
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
require 'tmpdir'
|
|
2
|
+
|
|
1
3
|
module Fastlane
|
|
2
4
|
module Actions
|
|
3
5
|
class BuildAndUploadToAppetizeAction < Action
|
|
4
6
|
def self.run(params)
|
|
5
|
-
tmp_path = "
|
|
7
|
+
tmp_path = Dir.mktmpdir("fastlane_build-")
|
|
6
8
|
|
|
7
9
|
xcodebuild_configs = params[:xcodebuild]
|
|
8
10
|
xcodebuild_configs[:sdk] = "iphonesimulator"
|
|
@@ -37,9 +37,9 @@ module Fastlane
|
|
|
37
37
|
|
|
38
38
|
Dir.chdir(params[:path]) do
|
|
39
39
|
if params[:commits_count]
|
|
40
|
-
changelog = Actions.git_log_last_commits(params[:pretty], params[:commits_count], merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
|
|
40
|
+
changelog = Actions.git_log_last_commits(params[:pretty], params[:commits_count], params[:matching_pattern], merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
|
|
41
41
|
else
|
|
42
|
-
changelog = Actions.git_log_between(params[:pretty], from, to, merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
|
|
42
|
+
changelog = Actions.git_log_between(params[:pretty], from, to, params[:matching_pattern], merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
changelog = changelog.gsub("\n\n", "\n") if changelog # as there are duplicate newlines
|
|
@@ -104,6 +104,10 @@ module Fastlane
|
|
|
104
104
|
description: 'The format applied to each commit while generating the collected value',
|
|
105
105
|
optional: true,
|
|
106
106
|
default_value: '%B'),
|
|
107
|
+
FastlaneCore::ConfigItem.new(key: :matching_pattern,
|
|
108
|
+
env_name: 'FL_CHANGELOG_FROM_GIT_COMMITS_MATCHING_PATTERN',
|
|
109
|
+
description: 'A regexp pattern to filter only the commits matching the pattern',
|
|
110
|
+
optional: true),
|
|
107
111
|
FastlaneCore::ConfigItem.new(key: :date_format,
|
|
108
112
|
env_name: 'FL_CHANGELOG_FROM_GIT_COMMITS_DATE_FORMAT',
|
|
109
113
|
description: 'The date format applied to each commit while generating the collected value',
|
|
@@ -179,6 +183,7 @@ module Fastlane
|
|
|
179
183
|
pretty: "- (%ae) %s", # Optional, lets you provide a custom format to apply to each commit when generating the changelog text
|
|
180
184
|
date_format: "short", # Optional, lets you provide an additional date format to dates within the pretty-formatted string
|
|
181
185
|
match_lightweight_tag: false, # Optional, lets you ignore lightweight (non-annotated) tags when searching for the last tag
|
|
186
|
+
matching_pattern: "[.*?].*", # Optional, lets you filter out commits not matching the regex pattern
|
|
182
187
|
merge_commit_filtering: "exclude_merges" # Optional, lets you filter out merge commits
|
|
183
188
|
)'
|
|
184
189
|
]
|
|
@@ -45,6 +45,9 @@ module Fastlane
|
|
|
45
45
|
[
|
|
46
46
|
"This action deletes the files that get created in your repo as a result of running the _gym_ and _sigh_ commands. It doesn't delete the `fastlane/report.xml` though, this is probably more suited for the .gitignore.",
|
|
47
47
|
"",
|
|
48
|
+
"From _cert_ it only deletes the `.cer` file. The private key (`<certificate id>.p12`, despite its name an unencrypted PEM key) and the `.certSigningRequest` that _cert_ writes to its `output_path` when it creates a certificate are kept: " \
|
|
49
|
+
"_cert_ uses that `.p12` to install the certificate on a machine that doesn't have it, and on systems other than macOS it is the only copy of the key. Keep them out of version control.",
|
|
50
|
+
"",
|
|
48
51
|
"Useful if you quickly want to send out a test build by dropping down to the command line and typing something like `fastlane beta`, without leaving your repo in a messy state afterwards."
|
|
49
52
|
].join("\n")
|
|
50
53
|
end
|
|
@@ -14,15 +14,15 @@ module Fastlane
|
|
|
14
14
|
base = params[:base]
|
|
15
15
|
head = params[:head]
|
|
16
16
|
pr = params[:pr]
|
|
17
|
-
cmd << "--danger_id=#{danger_id}" if danger_id
|
|
18
|
-
cmd << "--dangerfile=#{dangerfile}" if dangerfile
|
|
17
|
+
cmd << "--danger_id=#{danger_id.shellescape}" if danger_id
|
|
18
|
+
cmd << "--dangerfile=#{dangerfile.shellescape}" if dangerfile
|
|
19
19
|
cmd << "--fail-on-errors=true" if params[:fail_on_errors]
|
|
20
20
|
cmd << "--fail-if-no-pr=true" if params[:fail_if_no_pr]
|
|
21
21
|
cmd << "--new-comment" if params[:new_comment]
|
|
22
22
|
cmd << "--remove-previous-comments" if params[:remove_previous_comments]
|
|
23
|
-
cmd << "--base=#{base}" if base
|
|
24
|
-
cmd << "--head=#{head}" if head
|
|
25
|
-
cmd << "pr #{pr}" if pr
|
|
23
|
+
cmd << "--base=#{base.shellescape}" if base
|
|
24
|
+
cmd << "--head=#{head.shellescape}" if head
|
|
25
|
+
cmd << "pr #{pr.shellescape}" if pr
|
|
26
26
|
|
|
27
27
|
ENV['DANGER_GITHUB_API_TOKEN'] = params[:github_api_token] if params[:github_api_token]
|
|
28
28
|
ENV['DANGER_GITHUB_HOST'] = params[:github_enterprise_host] if params[:github_enterprise_host]
|
|
@@ -10,8 +10,7 @@ _produce_ creates new iOS apps on both the Apple Developer Portal and App Store
|
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
12
|
<a href="#features">Features</a> •
|
|
13
|
-
<a href="#usage">Usage</a>
|
|
14
|
-
<a href="#how-does-it-work">How does it work?</a>
|
|
13
|
+
<a href="#usage">Usage</a>
|
|
15
14
|
</p>
|
|
16
15
|
|
|
17
16
|
-------
|
|
@@ -17,9 +17,7 @@ To automate iOS Provisioning profiles you can use [_match_](https://docs.fastlan
|
|
|
17
17
|
<p align="center">
|
|
18
18
|
<a href="#features">Features</a> •
|
|
19
19
|
<a href="#usage">Usage</a> •
|
|
20
|
-
<a href="#how-does-it-work">How does it work?</a>
|
|
21
|
-
<a href="#tips">Tips</a> •
|
|
22
|
-
<a href="#need-help">Need help?</a>
|
|
20
|
+
<a href="#how-does-it-work">How does it work?</a>
|
|
23
21
|
</p>
|
|
24
22
|
|
|
25
23
|
-------
|
|
@@ -74,6 +72,12 @@ If you want to generate a Website Push certificate:
|
|
|
74
72
|
fastlane pem --website_push
|
|
75
73
|
```
|
|
76
74
|
|
|
75
|
+
If you want to generate a VoIP Services certificate (the type PushKit requires):
|
|
76
|
+
|
|
77
|
+
```no-highlight
|
|
78
|
+
fastlane pem --voip_push
|
|
79
|
+
```
|
|
80
|
+
|
|
77
81
|
Set a password for your `p12` file:
|
|
78
82
|
|
|
79
83
|
```no-highlight
|
|
@@ -81,12 +81,15 @@ Use Git Storage to store all code signing identities in a private git repo, owne
|
|
|
81
81
|
|
|
82
82
|
First, enter the URL to your private (!) Git repo (You can create one for free on e.g. [GitHub](https://github.com/new) or [BitBucket](https://bitbucket.org/repo/create)). The URL you enter can be either a `https://` or a `git` URL. `fastlane match init` won't read or modify your certificates or profiles yet, and also won't validate your git URL.
|
|
83
83
|
|
|
84
|
+
You'll then be asked which branch of that repo to use, defaulting to `main` if you leave the answer blank.
|
|
85
|
+
|
|
84
86
|
This will create a `Matchfile` in your current directory (or in your `./fastlane/` folder).
|
|
85
87
|
|
|
86
88
|
Example content (for more advanced setups check out the [fastlane section](#fastlane)):
|
|
87
89
|
|
|
88
90
|
```ruby-skip-tests
|
|
89
91
|
git_url("https://github.com/fastlane/certificates")
|
|
92
|
+
git_branch("main")
|
|
90
93
|
|
|
91
94
|
app_identifier("tools.fastlane.app")
|
|
92
95
|
username("user@fastlane.tools")
|
|
@@ -94,7 +97,7 @@ username("user@fastlane.tools")
|
|
|
94
97
|
|
|
95
98
|
##### Git Storage on GitHub
|
|
96
99
|
|
|
97
|
-
If your machine is currently using SSH to authenticate with GitHub, you'll want to use a `git` URL, otherwise, you may see an authentication error when you attempt to use match. Alternatively, you can set a basic authorization for _match_:
|
|
100
|
+
If your machine is currently using SSH to authenticate with GitHub, you'll want to use a `git` URL, otherwise, you may see an authentication error when you attempt to use match. Alternatively, you can set a basic authorization for _match_ (needs git 2.31 or later):
|
|
98
101
|
|
|
99
102
|
Using parameter:
|
|
100
103
|
|
|
@@ -138,7 +141,7 @@ You can find more information about GitHub basic authentication and personal tok
|
|
|
138
141
|
|
|
139
142
|
##### Git Storage on Azure DevOps
|
|
140
143
|
|
|
141
|
-
If you're running a pipeline on Azure DevOps and using git storage in a another repository on the same project, you might want to use `bearer` token authentication.
|
|
144
|
+
If you're running a pipeline on Azure DevOps and using git storage in a another repository on the same project, you might want to use `bearer` token authentication (needs git 2.31 or later).
|
|
142
145
|
|
|
143
146
|
Using parameter:
|
|
144
147
|
|
|
@@ -259,7 +262,7 @@ If you want to use a single developer and/or distribution certificate for multip
|
|
|
259
262
|
|
|
260
263
|
```ruby-skip-tests
|
|
261
264
|
git_url("https://github.com/example/example-repo.git")
|
|
262
|
-
git_branch("
|
|
265
|
+
git_branch("main")
|
|
263
266
|
```
|
|
264
267
|
|
|
265
268
|
_match_ will reuse certificates and will create separate provisioning profiles for each app.
|
|
@@ -408,6 +411,13 @@ If you're not using `Fastfile`, you can also use the `force_for_new_devices` opt
|
|
|
408
411
|
fastlane match adhoc --force_for_new_devices
|
|
409
412
|
```
|
|
410
413
|
|
|
414
|
+
##### Offline profile use
|
|
415
|
+
|
|
416
|
+
If your profile requires the 'Offline support (7 day validity)' setting for use without Internet, use `offline_profile: true` to add this permission to generated profiles.
|
|
417
|
+
|
|
418
|
+
> [!NOTE]
|
|
419
|
+
> Offline profiles can only be created when logging in with an Apple ID. Apple's App Store Connect API (`api_key` / `api_key_path`) does not support this setting, so _match_ will fail with a clear error if both are combined.
|
|
420
|
+
|
|
411
421
|
##### Managed capabilities
|
|
412
422
|
|
|
413
423
|
> [!IMPORTANT]
|
|
@@ -2,7 +2,7 @@ module Fastlane
|
|
|
2
2
|
module Actions
|
|
3
3
|
class EnsureNoDebugCodeAction < Action
|
|
4
4
|
def self.run(params)
|
|
5
|
-
command = "grep -RE
|
|
5
|
+
command = "grep -RE #{params[:text].shellescape} #{File.absolute_path(params[:path]).shellescape}"
|
|
6
6
|
|
|
7
7
|
extensions = []
|
|
8
8
|
extensions << params[:extension] unless params[:extension].nil?
|
|
@@ -20,7 +20,7 @@ module Fastlane
|
|
|
20
20
|
command << " --include=\\*.#{extensions.join(',')}"
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
command << " --exclude #{params[:exclude]}" if params[:exclude]
|
|
23
|
+
command << " --exclude #{params[:exclude].shellescape}" if params[:exclude]
|
|
24
24
|
|
|
25
25
|
if params[:exclude_dirs]
|
|
26
26
|
params[:exclude_dirs].each do |dir|
|
|
@@ -92,6 +92,7 @@ module Fastlane
|
|
|
92
92
|
conflicting_options: [:json_key],
|
|
93
93
|
optional: true,
|
|
94
94
|
description: "The raw service account JSON data used to authenticate with Google",
|
|
95
|
+
sensitive: true,
|
|
95
96
|
code_gen_sensitive: true,
|
|
96
97
|
default_value: CredentialsManager::AppfileConfig.try_fetch_value(:json_key_data_raw),
|
|
97
98
|
default_value_dynamic: true,
|
|
@@ -250,12 +250,11 @@ module Fastlane
|
|
|
250
250
|
def call_endpoint(url, http_method, headers, body, secure)
|
|
251
251
|
require 'excon'
|
|
252
252
|
|
|
253
|
-
Excon.defaults[:ssl_verify_peer] = secure
|
|
254
253
|
middlewares = Excon.defaults[:middlewares] + [Excon::Middleware::RedirectFollower] # allow redirect in case of repo renames
|
|
255
254
|
|
|
256
255
|
UI.verbose("#{http_method} : #{url}")
|
|
257
256
|
|
|
258
|
-
connection = Excon.new(url)
|
|
257
|
+
connection = Excon.new(url, ssl_verify_peer: secure)
|
|
259
258
|
connection.request(
|
|
260
259
|
method: http_method,
|
|
261
260
|
headers: headers,
|
|
@@ -37,7 +37,7 @@ module Fastlane
|
|
|
37
37
|
command = [
|
|
38
38
|
command_prefix,
|
|
39
39
|
'agvtool',
|
|
40
|
-
params[:build_number] ? "new-version#{mode} #{params[:build_number].to_s.strip}" : "next-version#{mode}",
|
|
40
|
+
params[:build_number] ? "new-version#{mode} #{params[:build_number].to_s.strip.shellescape}" : "next-version#{mode}",
|
|
41
41
|
command_suffix
|
|
42
42
|
].join(' ')
|
|
43
43
|
|
|
@@ -25,11 +25,14 @@ module Fastlane
|
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
Dir.mktmpdir do |dir|
|
|
29
|
+
zip_path = File.join(dir, 'plugin.zip')
|
|
30
|
+
# -f fails on an HTTP error instead of saving the error page; --proto also applies to redirects
|
|
31
|
+
Action.sh("curl", "-f", "-L", "-s", "--proto", "=https", "-o", zip_path, params[:url])
|
|
32
|
+
plugins_path = "#{ENV['HOME']}/Library/Application Support/Developer/Shared/Xcode/Plug-ins"
|
|
33
|
+
FileUtils.mkdir_p(plugins_path)
|
|
34
|
+
Action.sh("unzip", "-qo", zip_path, "-d", plugins_path)
|
|
35
|
+
end
|
|
33
36
|
|
|
34
37
|
UI.success("Plugin #{File.basename(params[:url], '.zip')} installed successfully")
|
|
35
38
|
UI.message("Please restart Xcode to use the newly installed plugin")
|
|
@@ -85,7 +88,14 @@ module Fastlane
|
|
|
85
88
|
end
|
|
86
89
|
|
|
87
90
|
def self.category
|
|
88
|
-
:
|
|
91
|
+
:deprecated
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def self.deprecated_notes
|
|
95
|
+
[
|
|
96
|
+
"Since Xcode 8, which added runtime library validation and source editor extensions ([New Features in Xcode 8](https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Chapters/xcode_8_0.html)), Xcode only loads plugins once you re-sign it yourself, and Xcode 14 removed its plugin system.",
|
|
97
|
+
"A source editor extension ships inside a macOS app: install the app, then enable the extension in the Extensions section of System Settings."
|
|
98
|
+
].join("\n")
|
|
89
99
|
end
|
|
90
100
|
end
|
|
91
101
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'tmpdir'
|
|
2
|
+
|
|
1
3
|
module Fastlane
|
|
2
4
|
module Actions
|
|
3
5
|
class LcovAction < Action
|
|
@@ -42,7 +44,7 @@ module Fastlane
|
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
def self.gen_cov(options)
|
|
45
|
-
tmp_cov_file = "
|
|
47
|
+
tmp_cov_file = File.join(Dir.mktmpdir("lcov-"), "coverage.info")
|
|
46
48
|
output_dir = options[:output_dir]
|
|
47
49
|
derived_data_path = derived_data_dir(options)
|
|
48
50
|
|
|
@@ -91,7 +93,14 @@ module Fastlane
|
|
|
91
93
|
end
|
|
92
94
|
|
|
93
95
|
def self.category
|
|
94
|
-
:
|
|
96
|
+
:deprecated
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def self.deprecated_notes
|
|
100
|
+
[
|
|
101
|
+
"Xcode records coverage as LLVM `.profdata`, not the gcov `.gcda` files that `lcov --capture --directory` reads, and this action looks for them under `Build/Intermediates`, which Xcode now names `Build/Intermediates.noindex`.",
|
|
102
|
+
"Use `slather`, or `xcrun llvm-cov export -format=lcov` to produce an lcov file."
|
|
103
|
+
].join("\n")
|
|
95
104
|
end
|
|
96
105
|
end
|
|
97
106
|
end
|
|
@@ -9,9 +9,24 @@ module Fastlane
|
|
|
9
9
|
command += ssl_options(params)
|
|
10
10
|
command += proxy_options(params)
|
|
11
11
|
command += upload_options(params)
|
|
12
|
+
command << "--config -"
|
|
12
13
|
command << upload_url(params)
|
|
13
14
|
|
|
14
|
-
Fastlane::Actions.sh(command.join(' '), log: params[:verbose])
|
|
15
|
+
Fastlane::Actions.sh(command.join(' '), log: params[:verbose], stdin: curl_config(params))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.curl_config(params)
|
|
19
|
+
config = "user = #{curl_config_string("#{params[:username]}:#{params[:password]}")}\n"
|
|
20
|
+
if params[:proxy_address] && params[:proxy_port] && params[:proxy_username] && params[:proxy_password]
|
|
21
|
+
config << "proxy-user = #{curl_config_string("#{params[:proxy_username]}:#{params[:proxy_password]}")}\n"
|
|
22
|
+
end
|
|
23
|
+
config
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Quotes a value for a curl config file, using the escapes listed under `-K, --config` in `man curl`.
|
|
27
|
+
def self.curl_config_string(value)
|
|
28
|
+
escapes = { "\\" => "\\\\", "\"" => "\\\"", "\t" => "\\t", "\n" => "\\n", "\r" => "\\r", "\v" => "\\v" }
|
|
29
|
+
"\"#{value.gsub(/[\\"\t\n\r\v]/, escapes)}\""
|
|
15
30
|
end
|
|
16
31
|
|
|
17
32
|
def self.upload_url(params)
|
|
@@ -61,8 +76,6 @@ module Fastlane
|
|
|
61
76
|
options << "--upload-file #{file_path}"
|
|
62
77
|
end
|
|
63
78
|
|
|
64
|
-
options << "-u #{params[:username].shellescape}:#{params[:password].shellescape}"
|
|
65
|
-
|
|
66
79
|
options
|
|
67
80
|
end
|
|
68
81
|
|
|
@@ -79,7 +92,6 @@ module Fastlane
|
|
|
79
92
|
options = []
|
|
80
93
|
if params[:proxy_address] && params[:proxy_port] && params[:proxy_username] && params[:proxy_password]
|
|
81
94
|
options << "-x #{params[:proxy_address].shellescape}:#{params[:proxy_port].shellescape}"
|
|
82
|
-
options << "--proxy-user #{params[:proxy_username].shellescape}:#{params[:proxy_password].shellescape}"
|
|
83
95
|
end
|
|
84
96
|
|
|
85
97
|
options
|