fastlane 2.178.0 → 2.182.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/LICENSE +1 -1
- data/README.md +97 -84
- data/cert/lib/cert/commands_generator.rb +2 -1
- data/cert/lib/cert/options.rb +1 -0
- data/cert/lib/cert/runner.rb +4 -0
- data/deliver/lib/deliver/commands_generator.rb +2 -1
- data/deliver/lib/deliver/download_screenshots.rb +1 -2
- data/deliver/lib/deliver/languages.rb +1 -1
- data/deliver/lib/deliver/options.rb +3 -2
- data/deliver/lib/deliver/runner.rb +4 -0
- data/deliver/lib/deliver/setup.rb +0 -1
- data/deliver/lib/deliver/upload_metadata.rb +2 -1
- data/fastlane/lib/fastlane/actions/actions_helper.rb +2 -2
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +5 -0
- data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +3 -3
- data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +1 -1
- data/fastlane/lib/fastlane/actions/build_app.rb +4 -0
- data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +4 -0
- data/fastlane/lib/fastlane/actions/clipboard.rb +3 -6
- data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +1 -1
- data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +18 -1
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +2 -1
- data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +2 -6
- data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +4 -0
- data/fastlane/lib/fastlane/actions/get_version_number.rb +17 -10
- data/fastlane/lib/fastlane/actions/git_branch.rb +4 -10
- data/fastlane/lib/fastlane/actions/git_commit.rb +3 -1
- data/fastlane/lib/fastlane/actions/git_submodule_update.rb +16 -8
- data/fastlane/lib/fastlane/actions/git_tag_exists.rb +4 -0
- data/fastlane/lib/fastlane/actions/import_from_git.rb +5 -5
- data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +4 -0
- data/fastlane/lib/fastlane/actions/jira.rb +61 -14
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -0
- data/fastlane/lib/fastlane/actions/match_nuke.rb +59 -0
- data/fastlane/lib/fastlane/actions/notarize.rb +98 -51
- data/fastlane/lib/fastlane/actions/slack.rb +155 -133
- data/fastlane/lib/fastlane/actions/sourcedocs.rb +164 -0
- data/fastlane/lib/fastlane/actions/spaceship_logs.rb +1 -1
- data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +1 -2
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +4 -2
- data/fastlane/lib/fastlane/cli_tools_distributor.rb +1 -1
- data/fastlane/lib/fastlane/commands_generator.rb +2 -1
- data/fastlane/lib/fastlane/fast_file.rb +10 -2
- data/fastlane/lib/fastlane/fastlane_require.rb +7 -1
- data/fastlane/lib/fastlane/helper/git_helper.rb +19 -7
- data/fastlane/lib/fastlane/lane_manager.rb +3 -2
- data/fastlane/lib/fastlane/notification/slack.rb +56 -0
- data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +1 -2
- data/fastlane/lib/fastlane/plugins/plugin_info.rb +2 -2
- data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +1 -2
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +1 -2
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +7 -6
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +30 -35
- data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +1 -1
- data/fastlane/lib/fastlane/setup/setup.rb +23 -10
- data/fastlane/lib/fastlane/swift_fastlane_function.rb +39 -14
- data/fastlane/lib/fastlane/swift_runner_upgrader.rb +2 -0
- data/fastlane/lib/fastlane/version.rb +2 -2
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/DeliverfileProtocol.swift +3 -3
- data/fastlane/swift/Fastlane.swift +6852 -3824
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +4 -0
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/GymfileProtocol.swift +1 -1
- data/fastlane/swift/LaneFileProtocol.swift +9 -3
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/MatchfileProtocol.swift +1 -1
- data/fastlane/swift/OptionalConfigValue.swift +131 -0
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/PrecheckfileProtocol.swift +3 -3
- data/fastlane/swift/RubyCommand.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/ScanfileProtocol.swift +5 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- data/fastlane/swift/SnapshotfileProtocol.swift +5 -1
- data/fastlane/swift/SocketClient.swift +2 -1
- data/fastlane/swift/SocketResponse.swift +4 -2
- data/fastlane/swift/formatting/Brewfile.lock.json +18 -16
- data/fastlane/swift/upgrade_manifest.json +1 -1
- data/fastlane_core/lib/fastlane_core.rb +22 -21
- data/fastlane_core/lib/fastlane_core/build_watcher.rb +50 -9
- data/fastlane_core/lib/fastlane_core/clipboard.rb +20 -0
- data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +5 -3
- data/fastlane_core/lib/fastlane_core/helper.rb +28 -5
- data/fastlane_core/lib/fastlane_core/languages.rb +2 -2
- data/fastlane_core/lib/fastlane_core/queue_worker.rb +2 -2
- data/fastlane_core/lib/fastlane_core/swag.rb +1 -1
- data/fastlane_core/lib/fastlane_core/ui/help.erb +35 -0
- data/fastlane_core/lib/fastlane_core/ui/help_formatter.rb +16 -0
- data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +12 -1
- data/frameit/lib/frameit/commands_generator.rb +2 -1
- data/gym/lib/gym/commands_generator.rb +2 -1
- data/gym/lib/gym/generators/package_command_generator.rb +4 -0
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +13 -8
- data/gym/lib/gym/runner.rb +15 -4
- data/match/lib/match/change_password.rb +3 -3
- data/match/lib/match/commands_generator.rb +2 -1
- data/match/lib/match/encryption/interface.rb +1 -1
- data/match/lib/match/encryption/openssl.rb +2 -2
- data/match/lib/match/module.rb +1 -0
- data/pem/lib/pem/commands_generator.rb +2 -1
- data/pilot/lib/pilot/commands_generator.rb +2 -1
- data/pilot/lib/pilot/manager.rb +4 -0
- data/pilot/lib/pilot/options.rb +3 -2
- data/pilot/lib/pilot/tester_exporter.rb +0 -1
- data/pilot/lib/pilot/tester_manager.rb +0 -1
- data/precheck/lib/precheck/commands_generator.rb +2 -1
- data/precheck/lib/precheck/options.rb +1 -0
- data/precheck/lib/precheck/runner.rb +4 -0
- data/produce/lib/produce/commands_generator.rb +2 -1
- data/scan/lib/scan/commands_generator.rb +2 -1
- data/scan/lib/scan/options.rb +10 -5
- data/scan/lib/scan/runner.rb +54 -1
- data/scan/lib/scan/test_command_generator.rb +10 -8
- data/screengrab/lib/screengrab/android_environment.rb +6 -4
- data/screengrab/lib/screengrab/commands_generator.rb +2 -1
- data/screengrab/lib/screengrab/runner.rb +1 -1
- data/sigh/lib/sigh/commands_generator.rb +2 -1
- data/sigh/lib/sigh/options.rb +1 -0
- data/sigh/lib/sigh/runner.rb +4 -0
- data/snapshot/lib/assets/SnapfileTemplate +1 -1
- data/snapshot/lib/assets/SnapshotHelper.swift +1 -1
- data/snapshot/lib/snapshot/commands_generator.rb +3 -1
- data/snapshot/lib/snapshot/options.rb +5 -0
- data/snapshot/lib/snapshot/reports_generator.rb +4 -0
- data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +2 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +1 -1
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +8 -4
- data/spaceship/README.md +2 -12
- data/spaceship/lib/spaceship/base.rb +2 -2
- data/spaceship/lib/spaceship/commands_generator.rb +4 -2
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +1 -1
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +6 -0
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +6 -2
- data/spaceship/lib/spaceship/connect_api/token.rb +7 -1
- data/spaceship/lib/spaceship/spaceauth_runner.rb +19 -9
- data/spaceship/lib/spaceship/tunes/members.rb +1 -1
- data/spaceship/lib/spaceship/ui.rb +2 -2
- data/supply/lib/supply/client.rb +3 -1
- data/supply/lib/supply/commands_generator.rb +2 -1
- data/supply/lib/supply/options.rb +2 -2
- data/supply/lib/supply/uploader.rb +1 -0
- metadata +53 -64
- data/gym/lib/gym/.runner.rb.swp +0 -0
- data/pilot/lib/pilot/tester_util.rb +0 -0
@@ -3,39 +3,40 @@ require_relative 'fastlane_core/globals'
|
|
3
3
|
require_relative 'fastlane_core/core_ext/string'
|
4
4
|
require_relative 'fastlane_core/core_ext/shellwords'
|
5
5
|
|
6
|
+
require_relative 'fastlane_core/analytics/action_completion_context'
|
7
|
+
require_relative 'fastlane_core/analytics/action_launch_context'
|
8
|
+
require_relative 'fastlane_core/analytics/analytics_event_builder'
|
9
|
+
require_relative 'fastlane_core/analytics/analytics_ingester_client'
|
10
|
+
require_relative 'fastlane_core/analytics/analytics_session'
|
11
|
+
require_relative 'fastlane_core/build_watcher'
|
12
|
+
require_relative 'fastlane_core/cert_checker'
|
13
|
+
require_relative 'fastlane_core/clipboard'
|
14
|
+
require_relative 'fastlane_core/command_executor'
|
15
|
+
require_relative 'fastlane_core/configuration/configuration'
|
16
|
+
require_relative 'fastlane_core/device_manager'
|
6
17
|
require_relative 'fastlane_core/env'
|
18
|
+
require_relative 'fastlane_core/fastlane_folder'
|
19
|
+
require_relative 'fastlane_core/fastlane_pty'
|
7
20
|
require_relative 'fastlane_core/feature/feature'
|
8
21
|
require_relative 'fastlane_core/features'
|
9
22
|
require_relative 'fastlane_core/helper'
|
10
|
-
require_relative 'fastlane_core/configuration/configuration'
|
11
|
-
require_relative 'fastlane_core/update_checker/update_checker'
|
12
|
-
require_relative 'fastlane_core/languages'
|
13
|
-
require_relative 'fastlane_core/cert_checker'
|
14
23
|
require_relative 'fastlane_core/ipa_file_analyser'
|
24
|
+
require_relative 'fastlane_core/ipa_upload_package_builder'
|
15
25
|
require_relative 'fastlane_core/itunes_transporter'
|
16
|
-
require_relative 'fastlane_core/
|
26
|
+
require_relative 'fastlane_core/keychain_importer'
|
27
|
+
require_relative 'fastlane_core/languages'
|
17
28
|
require_relative 'fastlane_core/pkg_file_analyser'
|
18
29
|
require_relative 'fastlane_core/pkg_upload_package_builder'
|
19
|
-
require_relative 'fastlane_core/command_executor'
|
20
|
-
require_relative 'fastlane_core/ipa_upload_package_builder'
|
21
30
|
require_relative 'fastlane_core/print_table'
|
22
31
|
require_relative 'fastlane_core/project'
|
23
|
-
require_relative 'fastlane_core/
|
24
|
-
require_relative 'fastlane_core/
|
25
|
-
require_relative 'fastlane_core/fastlane_folder'
|
26
|
-
require_relative 'fastlane_core/keychain_importer'
|
32
|
+
require_relative 'fastlane_core/provisioning_profile'
|
33
|
+
require_relative 'fastlane_core/queue_worker'
|
27
34
|
require_relative 'fastlane_core/swag'
|
28
|
-
require_relative 'fastlane_core/build_watcher'
|
29
|
-
require_relative 'fastlane_core/ui/errors'
|
30
|
-
require_relative 'fastlane_core/test_parser'
|
31
|
-
require_relative 'fastlane_core/analytics/action_completion_context'
|
32
|
-
require_relative 'fastlane_core/analytics/action_launch_context'
|
33
|
-
require_relative 'fastlane_core/analytics/analytics_event_builder'
|
34
|
-
require_relative 'fastlane_core/analytics/analytics_ingester_client'
|
35
|
-
require_relative 'fastlane_core/analytics/analytics_session'
|
36
35
|
require_relative 'fastlane_core/tag_version'
|
37
|
-
require_relative 'fastlane_core/
|
38
|
-
require_relative 'fastlane_core/
|
36
|
+
require_relative 'fastlane_core/test_parser'
|
37
|
+
require_relative 'fastlane_core/ui/errors'
|
38
|
+
require_relative 'fastlane_core/ui/ui'
|
39
|
+
require_relative 'fastlane_core/update_checker/update_checker'
|
39
40
|
|
40
41
|
# Third Party code
|
41
42
|
require 'colored'
|
@@ -4,6 +4,8 @@ require_relative 'ui/ui'
|
|
4
4
|
|
5
5
|
module FastlaneCore
|
6
6
|
class BuildWatcher
|
7
|
+
VersionMatches = Struct.new(:version, :builds)
|
8
|
+
|
7
9
|
class << self
|
8
10
|
# @return The build we waited for. This method will always return a build
|
9
11
|
def wait_for_build_processing_to_be_complete(app_id: nil, platform: nil, train_version: nil, app_version: nil, build_version: nil, poll_interval: 10, strict_build_watch: false, return_when_build_appears: false, return_spaceship_testflight_build: true, select_latest: false)
|
@@ -23,7 +25,7 @@ module FastlaneCore
|
|
23
25
|
|
24
26
|
showed_info = false
|
25
27
|
loop do
|
26
|
-
matched_build = matching_build(watched_app_version: app_version, watched_build_version: build_version, app_id: app_id, platform: platform, select_latest: select_latest)
|
28
|
+
matched_build, app_version_queried = matching_build(watched_app_version: app_version, watched_build_version: build_version, app_id: app_id, platform: platform, select_latest: select_latest)
|
27
29
|
|
28
30
|
if matched_build.nil? && !showed_info
|
29
31
|
UI.important("Read more information on why this build isn't showing up yet - https://github.com/fastlane/fastlane/issues/14997")
|
@@ -37,6 +39,13 @@ module FastlaneCore
|
|
37
39
|
# having a build resource appear in AppStoreConnect (matched_build) may be enough (i.e. setting a changelog)
|
38
40
|
# so here we may choose to skip the full processing of the build if return_when_build_appears is true
|
39
41
|
if matched_build && (return_when_build_appears || matched_build.processed?)
|
42
|
+
|
43
|
+
if !app_version.nil? && app_version != app_version_queried
|
44
|
+
UI.important("App version is #{app_version} but build was found while querying #{app_version_queried}")
|
45
|
+
UI.important("This shouldn't be an issue as Apple sees #{app_version} and #{app_version_queried} as equal")
|
46
|
+
UI.important("See docs for more info - https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102364")
|
47
|
+
end
|
48
|
+
|
40
49
|
if return_spaceship_testflight_build
|
41
50
|
return matched_build.to_testflight_build
|
42
51
|
else
|
@@ -60,15 +69,31 @@ module FastlaneCore
|
|
60
69
|
watched_app_version = remove_version_leading_zeros(version: watched_app_version)
|
61
70
|
watched_build_version = remove_version_leading_zeros(version: watched_build_version)
|
62
71
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
72
|
+
# App Store Connect will allow users to upload X.Y is the same as X.Y.0 and treat them as the same version
|
73
|
+
# However, only the first uploaded version format will be the one that is queryable
|
74
|
+
# This could lead to BuildWatcher never finding X.Y.0 if X.Y was upoaded first as X.Y will only yield results
|
75
|
+
#
|
76
|
+
# This will add an additional request to search for both X.Y and X.Y.0 but
|
77
|
+
# will give preference to the version format specified passed in
|
78
|
+
watched_app_version_alternate = alternate_version(watched_app_version)
|
79
|
+
versions = [watched_app_version, watched_app_version_alternate].compact
|
80
|
+
|
81
|
+
version_matches = versions.map do |version|
|
82
|
+
match = VersionMatches.new
|
83
|
+
match.version = version
|
84
|
+
match.builds = Spaceship::ConnectAPI::Build.all(
|
85
|
+
app_id: app_id,
|
86
|
+
version: version,
|
87
|
+
build_number: watched_build_version,
|
88
|
+
platform: platform
|
89
|
+
)
|
90
|
+
|
91
|
+
match
|
92
|
+
end.flatten
|
69
93
|
|
70
94
|
# Raise error if more than 1 build is returned
|
71
95
|
# This should never happen but need to inform the user if it does
|
96
|
+
matched_builds = version_matches.map(&:builds).flatten
|
72
97
|
if matched_builds.size > 1 && !select_latest
|
73
98
|
error_builds = matched_builds.map do |build|
|
74
99
|
"#{build.app_version}(#{build.version}) for #{build.platform} - #{build.processing_state}"
|
@@ -77,9 +102,25 @@ module FastlaneCore
|
|
77
102
|
UI.crash!(error_message)
|
78
103
|
end
|
79
104
|
|
80
|
-
|
105
|
+
version_match = version_matches.reject do |match|
|
106
|
+
match.builds.empty?
|
107
|
+
end.first
|
108
|
+
matched_build = version_match&.builds&.first
|
109
|
+
|
110
|
+
return matched_build, version_match&.version
|
111
|
+
end
|
112
|
+
|
113
|
+
def alternate_version(version)
|
114
|
+
return nil if version.nil?
|
115
|
+
|
116
|
+
version_info = Gem::Version.new(version)
|
117
|
+
if version_info.segments.size == 3 && version_info.segments[2] == 0
|
118
|
+
return version_info.segments[0..1].join(".")
|
119
|
+
elsif version_info.segments.size == 2
|
120
|
+
return "#{version}.0"
|
121
|
+
end
|
81
122
|
|
82
|
-
return
|
123
|
+
return nil
|
83
124
|
end
|
84
125
|
|
85
126
|
def report_status(build: nil)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'fastlane_core'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
module FastlaneCore
|
5
|
+
class Clipboard
|
6
|
+
def self.copy(content: nil)
|
7
|
+
return UI.crash!("'pbcopy' or 'pbpaste' command not found.") unless is_supported?
|
8
|
+
Open3.popen3('pbcopy') { |input, _, _| input << content }
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.paste
|
12
|
+
return UI.crash!("'pbcopy' or 'pbpaste' command not found.") unless is_supported?
|
13
|
+
return `pbpaste`
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.is_supported?
|
17
|
+
return `which pbcopy`.length > 0 && `which pbpaste`.length > 0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -208,8 +208,10 @@ module FastlaneCore
|
|
208
208
|
#####################################################
|
209
209
|
|
210
210
|
# Returns the value for a certain key. fastlane_core tries to fetch the value from different sources
|
211
|
-
# if 'ask' is true and the value is not present, the user will be prompted to provide a value
|
212
|
-
|
211
|
+
# if 'ask' is true and the value is not present, the user will be prompted to provide a value if optional
|
212
|
+
# if 'force_ask' is true, the option is not required to be optional to ask
|
213
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
214
|
+
def fetch(key, ask: true, force_ask: false)
|
213
215
|
UI.crash!("Key '#{key}' must be a symbol. Example :app_id.") unless key.kind_of?(Symbol)
|
214
216
|
|
215
217
|
option = verify_options_key!(key)
|
@@ -227,7 +229,7 @@ module FastlaneCore
|
|
227
229
|
|
228
230
|
value = option.auto_convert_value(value)
|
229
231
|
value = nil if value.nil? && !option.string? # by default boolean flags are false
|
230
|
-
return value unless value.nil? && !option.optional && ask
|
232
|
+
return value unless value.nil? && (!option.optional || force_ask) && ask
|
231
233
|
|
232
234
|
# fallback to asking
|
233
235
|
if Helper.test? || !UI.interactive?
|
@@ -75,7 +75,7 @@ module FastlaneCore
|
|
75
75
|
|
76
76
|
# Check for Jenkins, Travis CI, ... environment variables
|
77
77
|
['JENKINS_HOME', 'JENKINS_URL', 'TRAVIS', 'CI', 'APPCENTER_BUILD_ID', 'TEAMCITY_VERSION', 'GO_PIPELINE_NAME', 'bamboo_buildKey', 'GITLAB_CI', 'XCS', 'TF_BUILD', 'GITHUB_ACTION', 'GITHUB_ACTIONS', 'BITRISE_IO', 'BUDDY'].each do |current|
|
78
|
-
return true if
|
78
|
+
return true if FastlaneCore::Env.truthy?(current)
|
79
79
|
end
|
80
80
|
return false
|
81
81
|
end
|
@@ -167,11 +167,11 @@ module FastlaneCore
|
|
167
167
|
@xcode_version
|
168
168
|
end
|
169
169
|
|
170
|
-
# @return true if Xcode version is
|
170
|
+
# @return true if installed Xcode version is 'greater than or equal to' the input parameter version
|
171
171
|
def self.xcode_at_least?(version)
|
172
|
-
|
173
|
-
|
174
|
-
Gem::Version.new(
|
172
|
+
installed_xcode_version = xcode_version
|
173
|
+
UI.user_error!("Unable to locate Xcode. Please make sure to have Xcode installed on your machine") if installed_xcode_version.nil?
|
174
|
+
Gem::Version.new(installed_xcode_version) >= Gem::Version.new(version)
|
175
175
|
end
|
176
176
|
|
177
177
|
# iTMSTransporter
|
@@ -377,6 +377,8 @@ module FastlaneCore
|
|
377
377
|
|
378
378
|
# returns the path of the executable with the correct extension on Windows
|
379
379
|
def self.get_executable_path(cmd_path)
|
380
|
+
cmd_path = localize_file_path(cmd_path)
|
381
|
+
|
380
382
|
if self.windows?
|
381
383
|
# PATHEXT contains the list of file extensions that Windows considers executable, semicolon separated.
|
382
384
|
# e.g. ".COM;.EXE;.BAT;.CMD"
|
@@ -393,6 +395,12 @@ module FastlaneCore
|
|
393
395
|
return cmd_path
|
394
396
|
end
|
395
397
|
|
398
|
+
# returns the path with the platform-specific path separator (`/` on UNIX, `\` on Windows)
|
399
|
+
def self.localize_file_path(path)
|
400
|
+
# change `/` to `\` on Windows
|
401
|
+
return self.windows? ? path.gsub('/', '\\') : path
|
402
|
+
end
|
403
|
+
|
396
404
|
# checks if given file is a valid json file
|
397
405
|
# base taken from: http://stackoverflow.com/a/26235831/1945875
|
398
406
|
def self.json_file?(filename)
|
@@ -462,5 +470,20 @@ module FastlaneCore
|
|
462
470
|
UI.error("Your entries do not match. Please try again")
|
463
471
|
end
|
464
472
|
end
|
473
|
+
|
474
|
+
# URI.open added by `require 'open-uri'` is not available in Ruby 2.4. This helper lets you open a URI
|
475
|
+
# by choosing appropriate interface to do so depending on Ruby version. This helper is subject to be removed
|
476
|
+
# when fastlane drops Ruby 2.4 support.
|
477
|
+
def self.open_uri(*rest, &block)
|
478
|
+
require 'open-uri'
|
479
|
+
|
480
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5')
|
481
|
+
dup = rest.dup
|
482
|
+
uri = dup.shift
|
483
|
+
URI.parse(uri).open(*dup, &block)
|
484
|
+
else
|
485
|
+
URI.open(*rest, &block)
|
486
|
+
end
|
487
|
+
end
|
465
488
|
end
|
466
489
|
end
|
@@ -3,7 +3,7 @@ module FastlaneCore
|
|
3
3
|
# These are all the languages which are available to use to upload app metadata and screenshots
|
4
4
|
|
5
5
|
# The old format which was used until August 2015 (good old times)
|
6
|
-
ALL_LANGUAGES_LEGACY = [
|
6
|
+
ALL_LANGUAGES_LEGACY = %w[da-DK de-DE el-GR en-AU en-CA en-GB en-US es-ES es-MX fi-FI fr-CA fr-FR id-ID it-IT ja-JP ko-KR ms-MY nl-NL no-NO pt-BR pt-PT ru-RU sv-SE th-TH tr-TR vi-VI cmn-Hans cmn-Hant]
|
7
7
|
|
8
8
|
# The new format used from September 2015 on
|
9
9
|
# This was generated from `Spaceship::Tunes.client.available_languages.sort`
|
@@ -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 = [
|
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]
|
15
15
|
end
|
16
16
|
end
|
@@ -16,12 +16,12 @@ module FastlaneCore
|
|
16
16
|
@queue = Queue.new
|
17
17
|
end
|
18
18
|
|
19
|
-
# @param job (Object) - An
|
19
|
+
# @param job (Object) - An arbitrary object that keeps parameters
|
20
20
|
def enqueue(job)
|
21
21
|
@queue.push(job)
|
22
22
|
end
|
23
23
|
|
24
|
-
# @param jobs (Array<Object>) - An array of
|
24
|
+
# @param jobs (Array<Object>) - An array of arbitrary object that keeps parameters
|
25
25
|
def batch_enqueue(jobs)
|
26
26
|
raise(ArgumentError, "Enqueue Array instead of #{jobs.class}") unless jobs.kind_of?(Array)
|
27
27
|
jobs.each { |job| enqueue(job) }
|
@@ -4,7 +4,7 @@ require_relative 'helper'
|
|
4
4
|
|
5
5
|
module FastlaneCore
|
6
6
|
class Swag
|
7
|
-
# rubocop:disable LineLength
|
7
|
+
# rubocop:disable Layout/LineLength
|
8
8
|
require 'zlib'
|
9
9
|
FRAMES = ["x\x9C\xED[\xD9u\xDB0\x10\xFCO\v\xFEq\t<C\xE0\xB9\x14\xD7\xE0\x1ERE\nt%\x91D\x12<0\xB3\aH\xC9\x8A\x9F\xF3\xF2\x13\x02\xC4\xB13;{Pyyo\xE3[\x17?^O\xFF\xF3\xF2\xDE\xDDV\xFE\xF5\xF2\xB3\xC5\xCF\x16_\xB2\xC5\xFC\xC28?\xBC\xF5oM\xFD\xFB\x03>\xAE\xE0\xE3\xEA\xBA\x87}z\xBE\xB8\xCF\f\xBE\v\xEA\a\x98\x9E\xCD\x97i>>\xFF\xFE\xD9\x0FWQ\x1En6\xC3\xE2\x8C\xA0\xCE\xA0k\xC8\x87\xE0W\xE0\x808,\xEF1;\xDA{\xF0\e\xBD1\x0E\aq\xF8\xB23\xB2Vu\xFDWf\xA7\xF1Z\xE8\xA0\xFB\xC9\x96M\xACG,\x06t(\x06\xB4\x10\xCE\x1D\x11K\xAE\xB5\fC\x93\xD6\x03\x03&7@\xDD\xB7\xE8\xF1\xD0g\\\xAB\xEBz\x1Ck[\xB0\xE9\xD0\v\x83\xF5\xF5Dp\x14o\x97\x1D\xD6H\xA1\xD1\x1C\x84\a\x94\xAA\xE7B\x8D\xC00\xF1\x9BiV\xE2\xF0Et\xE1\r\b\x12\x17\x9B\xE6\xAB\xB5\xED\x1A\x88\xF5_\x06Y\xB6\xCCL\x1C\xD5sL\xEF0\xB2\xF5\xF3A\x11\xE2\x9CO:Q\xF9\xCA\xAB\xD3\xD8\x1C\x05\xD3\xE0 W\x14\x86\x1FSA\xE2\x03\x84A5\xA4,\xA1\x10\x9BE\\r\xBB\xCA~0\xDEMiZ\xA8\x82\xB9\xFE\xC8\x147qX<\xA8|\xFFv\xED{||\x02H\x9Cc\x90\x01\x8F\xF5U\x03\xEB\xBA\xE0\xF5\x12\x1E<\x8B%u`\xEE$\xA6\x05Hg\x90\xBB^\x81G\xCF\xC7e\xEC\xF3kS \xA73K\x8E\xB2cV\x11\xA7\xA4u\x1F\xE6\xEE[\xA9w/\xECpO\x83\xC5i\xF2\x15;\xF88\f8\x04\xE5\xD3\x1DTX;\xA8\x17=Q\x11zf\x0E\xEC\xD7\xAE\xE2\x93'C\x85\xAE_\x059T\xD2l-;\xAA\xDB\x05\x1F\xE8mQx\xF3\x86\x97MU\xE2|\xBE\xBE\x82\vU\xD30V\xAF.n\x86\xFD\v\xF0\xED\x95\xBC\xA5\xF7\xBB4c\xB8'\xAA\x15\xC6\xB4\x14s@S\xC5\xD75Q\n\xA3#U\xD1\x01\x12u\x8BzI\x1C8\x83cwz\e\x1F-\xD13\x02\xD2\x00C\xF4\xADHOIcE\xEE\xA6 \x98\xCBH9MQ\x01\x94\xC5\xB0<\e\xDE\xA5WJ1\xA3\xB6\xE9l\x17\xA2\x1C\xADD\xE6%\xF41\xBC\xBA|)\v\xF0\xED\xB1|\xF1\x92\xDB\x9C\x91\xE0j\x99\xFB\xAA\x97\x19\xBA0NL\x19\a;t\x910U\xE7\x1D\x02\xA5\xEB\xD7\x83%\\\xFF\xDF\x84\x95p\xF7\xAE\xAA\xE9P\xAE\xB8h\x16\xE5kA\xC6\xAFe\xD0X'\xB1\r\x15\xD6\xDA8+\xB3\xB23\f\x86Z\xE0s\xDD 3\x04R@\n\x85\xDF\x1D\xC46,nB2bo\xEB\xF4\xA9\xC8\x9C\xD3\x96X}\xCDu\x1F&>F\xDA\b\xB9UB\x17!\xC5\xF6\xDDM\x9C\xAD\x05\xEA\xED\xC3$z\x1C\xF0\xE3\xE6\xC1B[\xD1\xBBH\x7F\xCE\xA5\xA7\x92\x05\xA8\xF4\x14\x8F\xA82h\xAD]X\x81,T\xC9\xDEdbC;\xC9Dl>IwR\xEFI\x7F\x01\x80\x8A\xBE\x04O2\xFA \x00S\xD8\"\xBD\x17\x9EY#Sx\x00\\V\"\x9F\xA5\xCA\x00\xC4\x1D\xA6g\xF7\xC0%-\xED\x11\x87\x12\x84(\xDD\x11\xF1\xBD\xE4\r>\x0FE\x8A\xB8\x85v\xC4K\x9C\x81{kEZ\xFB\r\x9C\x15\x82-\xC1|\xC0\x8D\xB1I\"w\xF2i?\x96T\xA0lc7}\xC3_\x7F\xC5\x96N\xC7\x18\xFA$*p,\xC9\f\x03\e^\xED\x8A@\x88\xB6\xAF\xC6\n\x03a\xC4\x90(\x88\xEB\r\eAu\x91\xD2^\xD6v>1\xC8%\xA6\x1F)O\xE6\xFE\b\xE2\x05+\xD1z\xF0\xEB\xA7-\x0F3\t:\x81\xA6\xC9EXK\xDCM,d\x90\x064\x8CD\xE5\x13\x8A\x8Alq4u\x9D\x8B\xE2\xB2\xE5\x04\xF9\xF4\t\x14\xA0\xD9\x00Z]a\x0E8-\xFC\xD62\f\x9Ba\xA4,t\x81\xC4\#$!H\xA0d:\x16\xC5\xD3\xA4{F\xBE\x99\xE8\xC6%\xED.)\x14\x8Dmq\xD9\xD0$\x1F:6[D;$\xB3\x17\x9C\xF7\x94 iv\xDA\x03\x1D\x0F\xE9\x94\x10;\x15\x98\xB9\xEA\xA48\x86>=\x1F\x00\xDF\xAC9\xB4D-W\x05\x9A6\xE9\x8D\x9A\xDC\x17\x912\xC4\x05\xE1\x83\x82\xE1#\x0FV\x98\xF4\xCE\xA0\xB7\xCCwN\x0F\t\xAC\xA4J\xD6\b\xC6\xBE\x8A\x1C\xE0\xD4\xF3h\x8A\x90\x92\xDB\x05\xC8\xCE\xBF\x0Eo\xF7 \xFE\xD1I\x8A\x00\x86\xF9\x17\x84\x99Z\xB1\xA4k`Q.\b)\x1C}\xA9\xE5\xBF\xCC\x80/\x11wYr\xB2\x12w\xB1\xE6\x83\xC6\xE6\x85\xC3_\x8C\xE1La\xC4I\xF9\xCBi\r\x14\\^H\xCDt\xD1\x99\x11\xE0\\P\x89\x8F\x14,\x80\xB9\xE2\xF1\x8B\x15\xFAJ\x15q\xB0\xA0\x9Db\x06V6\xD0k\xE05\x8C%~\x1Cw\xA7S>\xE2HQg\xF1\x89\x00\x931\x9D |\x01\xC5{\f\xB5\x93\x90*$7\xC1\xBF\e\x8B\xCCE\xF1\xA1\x92p\x14\xB8\xC9\xD6\xE0\x19\x83X}\xCA\xD5\x12\x91C\xC9\x9B\x94\xC5h\x03\xE0\xCAo\xEF\xCF\xAA\n\xEA%\x03\x8D\xB8tce\xD3\xBAJ\x86\xBE\x91\xF3e\xB4c\xC6&):u5\xBB\"\xB2\x91;5\x16\xCC\x9F`.h*\x94\xC0\x1D\x18\xE9\xAD\xE9\x166\x017\xA0\x92\\\xC2\xB0\xFEj\xAF\x92c\xE1\xB1\x8E\xE1JM\xA9\xC1Q\n#\xBC8\x8D\xEE\xD3\x8C\x82;\x992s\xBD\x1D\xE5K\xF0\xF1Q\x94l\xE4l\x03#\e3_1\xD5\x02\xE7V$\xC5Fx\xCE\xFF\xEB\xFE\xB3\xC5w\xD8\xE2\x1F\x8E\x13\xC7\t",
|
10
10
|
"x\x9C\xED[\xDBq\xDB0\x10\xFCO\v\xFEI\t\x02\t\x9A\xE4\xA8\x14\xD7\xE0\x1ERE\nL%\xA1D\x11\x10\x89\xDD{\x00\xB4'3\x91\xC6\x1F\xB6@\xE2q\xB7\xBB\xF7 \xFD\xF6\xD1\xCF\xD78\x7F\xFE<\xFD\xF3\xF6\x11\xEF3\xFFx{-\xF1Z\xE2\xB5\x84\x7F\x89\xED\xCA\xF5\xC2\xE9:\\\xBB\xF0\xFE\x89\xBE\xBEt\xBB\xAF\x1F\x97\xE6\xC1?\xBF\x7F\x1D\x87/\xF3n8\xFD\x14\xD3\\\xC4i\xC2\xC8\x86\xD3\x96/\xC7-\x1F\x8E\\\xDE\x13\x86\x1E\x1Ds\x1C\x8AS.W\xAEc}\x0Fv\x17B\x10F\xC7\xE1y\x10\x9E^\x9E />\xE3\xB3\x1F6\xCCOGA`\x05\v\xC2\xC4\\b\xE2\xE0\xF4b\xB83\x0E\x1F\xCF\xBB\x1F^@\x8A\x86\xA7\xDB_\x04\x893u\x81:\xADqS&\x16 \xF8\x8E\x82\xB3t\xE7\xEEp\xB2\xE0A\x83\xE1a\xB0\x97\xE0\xDDK\xD3>o\b/\xCAm.\xDF+/+mX<*\xB7\x92\x00|#?\xB8jY@#\xE1f\x81\a\x18\xEE\xFA\x12\xEB\xEB\xF6\\bg\xD4FBtx\xB4[T\xC0;\xF3a:\xB9\x12\xADR\x8F\xDA\xBB\xE0\x9A-7C\xCB\x85a\x898\xE8\xFB\xA9\xA0\xF2:K\xD4\r\x1An\x88\x91\x8E\xDA@\x06\x12<\xCCa\xA2\x92\x037=n\x88\x05O\xE1\x1D\xA2\xC9\xA5\x81\xDB\x99\r\x1A(\nV}\x98\xA6v\xCA)\x80\x1F\xE9\xB3\x84\xF4\xC1\xA2\x11\x0F\x98g`\xA3\x89\x1E\x19Z\x80\x00\rq\xDE\r\xE3<\x87\xCF\xC1\xB9\x06v\x8A\xCE\xA4ZB\xB4a\xD8\xA4\xDA\x1E\x15j\xF9\xA0\x8A~\xCE\xA8\x89\x82\x12\x86\eN-d\xE0{\x85\x11~\xC8}\v\x80U\xDD\x82\x13l\xDB\x0FE\x8C#0\x8D\xD8\xF9\x19\\\x18\xBF\x10\xA0\xD2u\x84\x06!#\xF5d\xEFX\xEF<\x1D\x92Td]\x12\xCDs\xDB\xA2\x9Atp:\xC1CL\x12-\xE8s\xDD\x9A2W\xBB\x9E\xCAV\xBE\xCB\xAB\x8C\xDB\x02Q\b\x8F:\xB2\xED\xBC 1t\xD3B\xD9\xA8r\x10\x85;I\x13\x17\xBEl\x854O;\xB4rNWa\x06\xEB\v\xCC\x161\xDAm\xBB6C\xA1\xC2\xD1\xED\xD1\x95R\x82'\xD3-\x1E-\xAB)PS\xEC\x9D\x89\xAB$C\x99\x95\xAE\x98X\xF3\xC9~>\xC0\xFCs\"\x16\x8DD\x8C\xD7\xCA\xF6\\\x9D\xC1\xBB!\xBA\xBE\x91T9\xD2\x1C'pm$\xA7\xAAKQU\x11\xC2\xE5L6\xE7\xC1G\xF93\xC1\xD5\x83\xEB\xCD\x1C]Y\xF9>\xC5U\bJ-*OY\xA5<\x96\xFEG4\xE9<\x13+)\xB5#\x1A\xB4\x1A\xF2\x8Bd`\x1Akd@7%p\xD5\x00#\xDE\x14p\x1F\xE3\xF6K\x84\xFC\x1C\xF2\x9DZBB\xA2\xEA\x01\xE3m\xAD\x05\x9F\x16A\xD76\xE9\x91\x95BQ\xA8\xAC9\n\x12\xF6d\x1A\x0E\xC1@C\x155fO\xDF\xC11\b \x89\x8F\x1DG\x94\xBBo\x83p\xDA\x89\xA7#'k\xAC\xFCL\x80wg]\xD8\xCA\xFA\x8B\xB9t\xB9F\xB9\xA0m\xAE/\x14}\x12\xB1U\x9CV\x83\x10S\x12\x8C\xA0h@\x10\xBC\x13vZ\xD7\xFD \xF5\x81-]\xF8\xECK{\x1Ej/<H?D\xF9\x00j\x8F\xB8!\xDD\x0F\xB8\x7F\x1D\v%X\x15\xC6T;\x00\xEE\x9D!\x81\x9ETWA\x18\x93\xA8\xD0!z\xD84\n23W\xBBv\x9C\xA1(7;\x01\xA5\xA4\xDE\xA8\x9EUau<\xDB8f\x10\x81\xA3\xF7\xC3n\x98\xEC\xCB\x85,%\xC4\xB6\xE5Pi\xF2I\xE7\x9C\x13^]\xCFP`\x8Err\x12e\xEC\x9B\n\xBA\"\xE2\xC8\x1F\xF7\xBC\xE52\x93\xAD\t\xA0`\xEA\xB3\xA6\xF9p\x87r\xA6>\x03\xD0F\xD0\xE3C<\x17\xF4\x94~r;\xF4\x8E;\xDB\xB4\xCB\x1F:\xA7@`\xF9\xA4\x95*e-\r\x9Bw\x9A\xD1\xF2\x179L\x91[\xCF>\xD3(=\xA4\xF8N\x86\x0E_\xF0\x86FB\x9CU6\xE9\x15\x11\x1E)\r\x17\x88\xDE\x0F\xAF\xEC\xF1O0rjSIm\xAByH\xCAiJ\xAD\xBD\xA9\xE60c\xC4m<*\x95V\x97p)}\xE0Ur\xC6\xAD\xA3\x0E\a\xA4D\x93\xEC\xF8\r\xB3\x9A\xE6\xB2L\xD6\x141\x9A\xF9\x14\xA7\x96\x86\xB3H\xC3\x18\xCEb\xA9\x9BE\xF0\b\xE5\x9B#\x0F\x12\xD0\xD7R(\x9D0\xDB\xBE\x83\x8C*\eq\xE9'\xF2QL\xA9\xE4\xA8G\\\xB7G\xF0\x99]\x89m\x10\x8B\b\xEAY<`\x8F\a\xD8\ri\x19\\\xCDTk\x15e\xEF\x93\xCA\x98\x94j\xE7wS1\xB0\xC5\xBB/\x8C\xA6m<}\xA4or\x9Agi\xE2\xB5e\x92i\x18\xF7yR\xA3HSQ\x9D\xA8b\xF0t\x80\x18F\xDC\xA7%\xAD\x01Z#\x83A\nN\x8F\xDB\xC4\xCA\xDF\x9E(\xE2B)2\xBD\x99d1\xB7h\xFF\xEA\xAAm\x01\xBC=c\xCCp\xE0Q\x04'\x03`K$\xA9RK\x00\x1Fl\xA0t\r\xC9\x87 \xC4P\x9E\x03\xBDc\xAD\x13(\xBC\xA6\x99M`\xF2P\x9BK\x95P1\xA1\x98\xE3\xCD-\f5s\x93\xA4p\xCC\x18\x1E\x8A\x19\x9D\x94\x9AtE\xB1\xF8EN\xA2\e0uk\xECi\xB8\xC7\xD3\x9BYk\x12\xA2\xA3\xBB\x9D\xF7\xA7\xA5\xCD\r`\x18\vtG'K\x15v\xFE&G\xA3\xA8\xB1\xDF\xBB\xD2\xAF\xC0\b\xE0]f.\x01\x0E\xAE\xD3\xB4\x81\xBC\xE8D\x93t\xCF\xB3$\xE8b_;\xDDid%\xA4\x9F\x89\x8B\n`\xD4F \x1D\e=\xFE\xB7\xB8[%\x01\xC3I\x0F\xFE\xEF\xCF\xFD\x9C\xC3y\xCEj\xDF\xD48\xC7\xE9\x9E&\xBF\x99\xF8\xAE\x98\xAC\xAA\xC7Y\x9B\xD9\x9Eol\xDF\xE7\xB5\xC4\x7F\xB9\xC4_\x06\x16#\x10",
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<%= program :name %>
|
2
|
+
|
3
|
+
<%= program :description %>
|
4
|
+
|
5
|
+
<%= "Commands:#{@default_command ? ' (* default)' : '' }" %>
|
6
|
+
<% for name, command in @commands.sort -%>
|
7
|
+
<% unless alias? name -%>
|
8
|
+
<%= "%-#{max_command_length}s #{@default_command.nil? ? '' : (command.name == @default_command.to_s ? '* ' : ' ') }%s" % [command.name, command.summary || command.description] %>
|
9
|
+
<% end -%>
|
10
|
+
<% end -%>
|
11
|
+
<% unless @aliases.empty? %>
|
12
|
+
Aliases:
|
13
|
+
<% for alias_name, args in @aliases.sort -%>
|
14
|
+
<%= "%-#{max_aliases_length}s %s %s" % [alias_name, command(alias_name).name, args.join(' ')] %>
|
15
|
+
<% end -%>
|
16
|
+
<% end %>
|
17
|
+
<% unless @options.empty? -%>
|
18
|
+
Global Options:
|
19
|
+
<% for option in @options -%>
|
20
|
+
<%= "%-20s %s" % [option[:switches].join(', '), option[:description]] %>
|
21
|
+
<% end -%>
|
22
|
+
<% end -%>
|
23
|
+
<% default_command_options = @commands.values.find {|c| c.name == @default_command.to_s }&.options || [] %>
|
24
|
+
<% unless default_command_options.empty? %>
|
25
|
+
<%= "Options for #{@default_command}:" %>
|
26
|
+
<% for option in default_command_options -%>
|
27
|
+
<%= "%-20s %s" % [option[:switches].join(', '), option[:description]] %>
|
28
|
+
<% end -%>
|
29
|
+
<% end -%>
|
30
|
+
<% if program :help -%>
|
31
|
+
<% for title, body in program(:help) %>
|
32
|
+
<%= title %>:
|
33
|
+
<%= body %>
|
34
|
+
<% end %>
|
35
|
+
<% end -%>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'commander'
|
2
|
+
|
3
|
+
module FastlaneCore
|
4
|
+
class HelpFormatter < ::Commander::HelpFormatter::TerminalCompact
|
5
|
+
def template(name)
|
6
|
+
# fastlane only customizes the global command help
|
7
|
+
return super unless name == :help
|
8
|
+
|
9
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.6')
|
10
|
+
ERB.new(File.read(File.join(File.dirname(__FILE__), "help.erb")), nil, '-')
|
11
|
+
else
|
12
|
+
ERB.new(File.read(File.join(File.dirname(__FILE__), "help.erb")), trim_mode: '-')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -69,7 +69,7 @@ module FastlaneCore
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def command_output(message)
|
72
|
-
actual = (message.split("\r").last || "") # as clearing the line will remove the `>` and the time stamp
|
72
|
+
actual = (encode_as_utf_8_if_possible(message).split("\r").last || "") # as clearing the line will remove the `>` and the time stamp
|
73
73
|
actual.split("\n").each do |msg|
|
74
74
|
if FastlaneCore::Env.truthy?("FASTLANE_DISABLE_OUTPUT_FORMAT")
|
75
75
|
log.info(msg)
|
@@ -150,6 +150,17 @@ module FastlaneCore
|
|
150
150
|
|
151
151
|
private
|
152
152
|
|
153
|
+
def encode_as_utf_8_if_possible(message)
|
154
|
+
return message if message.valid_encoding?
|
155
|
+
|
156
|
+
# genstrings outputs UTF-16, so we should try to use this encoding if it turns out to be valid
|
157
|
+
test_message = message.dup
|
158
|
+
return message.encode(Encoding::UTF_8, Encoding::UTF_16) if test_message.force_encoding(Encoding::UTF_16).valid_encoding?
|
159
|
+
|
160
|
+
# replace any invalid with empty string
|
161
|
+
message.encode(Encoding::UTF_8, invalid: :replace)
|
162
|
+
end
|
163
|
+
|
153
164
|
def verify_interactive!(message)
|
154
165
|
return if interactive?
|
155
166
|
important(message)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'commander'
|
2
2
|
require 'fastlane/version'
|
3
|
+
require 'fastlane_core/ui/help_formatter'
|
3
4
|
require 'fastlane_core/globals'
|
4
5
|
require 'fastlane_core/configuration/configuration'
|
5
6
|
|
@@ -27,7 +28,7 @@ module Frameit
|
|
27
28
|
program :help, 'Author', 'Felix Krause <frameit@krausefx.com>'
|
28
29
|
program :help, 'Website', 'https://fastlane.tools'
|
29
30
|
program :help, 'Documentation', 'https://docs.fastlane.tools/actions/frameit/'
|
30
|
-
program :help_formatter,
|
31
|
+
program :help_formatter, FastlaneCore::HelpFormatter
|
31
32
|
|
32
33
|
global_option('--verbose') { FastlaneCore::Globals.verbose = true }
|
33
34
|
global_option('--env STRING[,STRING2]', String, 'Add environment(s) to use with `dotenv`')
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'commander'
|
2
2
|
|
3
3
|
require 'fastlane_core/configuration/configuration'
|
4
|
+
require 'fastlane_core/ui/help_formatter'
|
4
5
|
require_relative 'module'
|
5
6
|
require_relative 'manager'
|
6
7
|
require_relative 'options'
|
@@ -28,7 +29,7 @@ module Gym
|
|
28
29
|
program :help, "Author", "Felix Krause <gym@krausefx.com>"
|
29
30
|
program :help, "Website", "https://fastlane.tools"
|
30
31
|
program :help, "Documentation", "https://docs.fastlane.tools/actions/gym/"
|
31
|
-
program :help_formatter,
|
32
|
+
program :help_formatter, FastlaneCore::HelpFormatter
|
32
33
|
|
33
34
|
global_option("--verbose") { FastlaneCore::Globals.verbose = true }
|
34
35
|
|
@@ -81,28 +81,33 @@ module Gym
|
|
81
81
|
Gym.cache[:ipa_path]
|
82
82
|
end
|
83
83
|
|
84
|
-
def
|
85
|
-
path = Gym.cache[:
|
84
|
+
def binary_path
|
85
|
+
path = Gym.cache[:binary_path]
|
86
86
|
return path if path
|
87
87
|
|
88
88
|
path = Dir[File.join(temporary_output_path, "*.pkg")].last
|
89
|
-
|
89
|
+
app_path = Dir[File.join(temporary_output_path, "*.app")].last
|
90
|
+
# We need to process generic PKG or APP
|
90
91
|
if path
|
91
92
|
# Try to find PKG file in the output directory, used when app thinning was not set
|
92
|
-
Gym.cache[:
|
93
|
-
FileUtils.mv(path, Gym.cache[:
|
93
|
+
Gym.cache[:binary_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.pkg")
|
94
|
+
FileUtils.mv(path, Gym.cache[:binary_path]) unless File.expand_path(path).casecmp(File.expand_path(Gym.cache[:binary_path]).downcase).zero?
|
94
95
|
elsif Dir.exist?(apps_path)
|
95
96
|
# Try to find "generic" PKG file inside "Apps" folder, used when app thinning was set
|
96
97
|
files = Dir[File.join(apps_path, "*.pkg")]
|
97
98
|
# Generic PKG file doesn't have suffix so its name is the shortest
|
98
99
|
path = files.min_by(&:length)
|
99
|
-
Gym.cache[:
|
100
|
-
FileUtils.cp(path, Gym.cache[:
|
100
|
+
Gym.cache[:binary_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.pkg")
|
101
|
+
FileUtils.cp(path, Gym.cache[:binary_path]) unless File.expand_path(path).casecmp(File.expand_path(Gym.cache[:binary_path]).downcase).zero?
|
102
|
+
elsif app_path
|
103
|
+
# Try to find .app file in the output directory. This is used when macOS is set and .app is being generated.
|
104
|
+
Gym.cache[:binary_path] = File.join(temporary_output_path, "#{Gym.config[:output_name]}.app")
|
105
|
+
FileUtils.mv(app_path, Gym.cache[:binary_path]) unless File.expand_path(app_path).casecmp(File.expand_path(Gym.cache[:binary_path]).downcase).zero?
|
101
106
|
else
|
102
107
|
ErrorHandler.handle_empty_pkg unless path
|
103
108
|
end
|
104
109
|
|
105
|
-
Gym.cache[:
|
110
|
+
Gym.cache[:binary_path]
|
106
111
|
end
|
107
112
|
|
108
113
|
# The path the the dsym file for this app. Might be nil
|