fastlane 1.81.0 → 1.82.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/assets/DefaultFastfileTemplate +2 -2
- data/lib/assets/FastfileTemplateAndroid +3 -3
- data/lib/assets/completions/completion.bash +2 -0
- data/lib/assets/completions/completion.zsh +2 -0
- data/lib/fastlane/action.rb +3 -4
- data/lib/fastlane/actions/danger.rb +41 -0
- data/lib/fastlane/actions/flock.rb +63 -0
- data/lib/fastlane/actions/increment_build_number.rb +8 -1
- data/lib/fastlane/actions/notification.rb +27 -19
- data/lib/fastlane/actions/slather.rb +8 -2
- data/lib/fastlane/actions/update_project_code_signing.rb +2 -2
- data/lib/fastlane/actions/update_project_provisioning.rb +2 -1
- data/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +1 -1
- data/lib/fastlane/actions/verify_xcode.rb +52 -23
- data/lib/fastlane/documentation/actions_list.rb +90 -78
- data/lib/fastlane/helper/sh_helper.rb +1 -1
- data/lib/fastlane/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7998aae1e3621d16b14ded685f639a0859638eb1
|
4
|
+
data.tar.gz: 0faeced9da7bf89dc50e8b18f78ee54caf1cb851
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45b6291fd8d7d746de441e7f6fb2abbaf199ec94f7689229d1519c16aaaee0b7a407175868cf1692d5860452b4750d8801c3bc250da267fda8c11ac56a7ed8b4
|
7
|
+
data.tar.gz: 034587e5406780a3cc5837e8ff85b37a54967fdad129a6ffd5baaf743b4a42bc169fb87df4d448f26995e22c35397882c0fc5b150365b94908714e47b37071f6
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Customise this file, documentation can be found here:
|
2
|
-
# https://github.com/fastlane/fastlane/tree/master/docs
|
2
|
+
# https://github.com/fastlane/fastlane/tree/master/fastlane/docs
|
3
3
|
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md
|
4
4
|
# can also be listed using the `fastlane actions` command
|
5
5
|
|
@@ -66,7 +66,7 @@ platform :ios do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
|
69
|
-
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/docs/Platforms.md
|
69
|
+
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
|
70
70
|
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md
|
71
71
|
|
72
72
|
# fastlane reports which actions are used
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Customise this file, documentation can be found here:
|
2
|
-
# https://github.com/fastlane/fastlane/tree/master/docs
|
2
|
+
# https://github.com/fastlane/fastlane/tree/master/fastlane/docs
|
3
3
|
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md
|
4
4
|
# can also be listed using the `fastlane actions` command
|
5
5
|
|
@@ -44,7 +44,7 @@ platform :android do
|
|
44
44
|
|
45
45
|
after_all do |lane|
|
46
46
|
# This block is called, only if the executed lane was successful
|
47
|
-
|
47
|
+
|
48
48
|
# slack(
|
49
49
|
# message: "Successfully deployed new App Update."
|
50
50
|
# )
|
@@ -59,7 +59,7 @@ platform :android do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
|
62
|
-
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/docs/Platforms.md
|
62
|
+
# More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md
|
63
63
|
# All available actions: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md
|
64
64
|
|
65
65
|
# fastlane reports which actions are used
|
data/lib/fastlane/action.rb
CHANGED
@@ -15,12 +15,11 @@ module Fastlane
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.available_options
|
18
|
-
# Return an array of 2-3 element arrays, like:
|
19
18
|
# [
|
20
|
-
#
|
21
|
-
#
|
19
|
+
# FastlaneCore::ConfigItem.new(key: :ipa_path,
|
20
|
+
# env_name: "CRASHLYTICS_IPA_PATH",
|
21
|
+
# description: "Value Description")
|
22
22
|
# ]
|
23
|
-
# Take a look at sigh.rb if you're using the config manager of fastlane
|
24
23
|
nil
|
25
24
|
end
|
26
25
|
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class DangerAction < Action
|
4
|
+
def self.run(params)
|
5
|
+
Actions.verify_gem!('danger')
|
6
|
+
cmd = []
|
7
|
+
|
8
|
+
cmd << ['bundle exec'] if File.exist?('Gemfile') && params[:use_bundle_exec]
|
9
|
+
cmd << ['danger']
|
10
|
+
|
11
|
+
Actions.sh(cmd.join(' '))
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.description
|
15
|
+
"Runs `danger` for the project"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.details
|
19
|
+
"More information: https://github.com/danger/danger"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.available_options
|
23
|
+
[
|
24
|
+
FastlaneCore::ConfigItem.new(key: :use_bundle_exec,
|
25
|
+
env_name: "FL_DANGER_USE_BUNDLE_EXEC",
|
26
|
+
description: "Use bundle exec when there is a Gemfile presented",
|
27
|
+
is_string: false,
|
28
|
+
default_value: true)
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.is_supported?(platform)
|
33
|
+
true
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.authors
|
37
|
+
["KrauseFx"]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
class FlockAction < Action
|
4
|
+
BASE_URL = 'https://api.flock.co/hooks/sendMessage'.freeze
|
5
|
+
|
6
|
+
def self.run(options)
|
7
|
+
require 'net/http'
|
8
|
+
require 'uri'
|
9
|
+
require 'json'
|
10
|
+
|
11
|
+
notify_incoming_message_webhook(options[:base_url], options[:message], options[:token])
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.notify_incoming_message_webhook(base_url, message, token)
|
15
|
+
uri = URI.join(base_url + '/', token)
|
16
|
+
response = Net::HTTP.start(
|
17
|
+
uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
18
|
+
request = Net::HTTP::Post.new uri.path
|
19
|
+
request.content_type = 'application/json'
|
20
|
+
request.body = JSON.generate("text" => message)
|
21
|
+
http.request request
|
22
|
+
end
|
23
|
+
if response.kind_of? Net::HTTPSuccess
|
24
|
+
UI.success 'Message sent to Flock.'
|
25
|
+
else
|
26
|
+
UI.error "HTTP request to '#{uri}' with message '#{message}' failed with a #{response.code} response."
|
27
|
+
UI.user_error! 'Error sending message to Flock. Please verify the Flock webhook token.'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.description
|
32
|
+
"Send a message to a Flock group"
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.available_options
|
36
|
+
[
|
37
|
+
FastlaneCore::ConfigItem.new(key: :message,
|
38
|
+
env_name: 'FL_FLOCK_MESSAGE',
|
39
|
+
description: 'Message text'),
|
40
|
+
FastlaneCore::ConfigItem.new(key: :token,
|
41
|
+
env_name: 'FL_FLOCK_TOKEN',
|
42
|
+
description: 'Token for the Flock incoming webhook'),
|
43
|
+
FastlaneCore::ConfigItem.new(key: :base_url,
|
44
|
+
env_name: 'FL_FLOCK_BASE_URL',
|
45
|
+
description: 'Base URL of the Flock incoming message webhook',
|
46
|
+
optional: true,
|
47
|
+
default_value: BASE_URL,
|
48
|
+
verify_block: proc do |value|
|
49
|
+
UI.user_error! 'Invalid https URL' unless value.start_with? 'https://'
|
50
|
+
end)
|
51
|
+
]
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.author
|
55
|
+
"Manav"
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.is_supported?(platform)
|
59
|
+
true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -24,10 +24,17 @@ module Fastlane
|
|
24
24
|
'&&'
|
25
25
|
].join(' ')
|
26
26
|
|
27
|
+
command_suffix = [
|
28
|
+
'&&',
|
29
|
+
'cd',
|
30
|
+
'-'
|
31
|
+
].join(' ')
|
32
|
+
|
27
33
|
command = [
|
28
34
|
command_prefix,
|
29
35
|
'agvtool',
|
30
|
-
params[:build_number] ? "new-version -all #{params[:build_number]}" : 'next-version -all'
|
36
|
+
params[:build_number] ? "new-version -all #{params[:build_number]}" : 'next-version -all',
|
37
|
+
command_suffix
|
31
38
|
].join(' ')
|
32
39
|
|
33
40
|
if Helper.test?
|
@@ -4,24 +4,17 @@ module Fastlane
|
|
4
4
|
def self.run(params)
|
5
5
|
require 'terminal-notifier'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
title: params[:title],
|
19
|
-
sound: params[:sound])
|
20
|
-
else
|
21
|
-
# It should look nice without a subtitle too
|
22
|
-
TerminalNotifier.notify(params[:message],
|
23
|
-
title: params[:title])
|
24
|
-
end
|
7
|
+
options = params.values
|
8
|
+
# :message is non-optional
|
9
|
+
message = options.delete :message
|
10
|
+
# remove nil keys, since `notify` below does not ignore them and instead translates them into empty strings in output, which looks ugly
|
11
|
+
options = options.select { |_, v| v }
|
12
|
+
option_map = {
|
13
|
+
app_icon: :appIcon,
|
14
|
+
content_image: :contentImage
|
15
|
+
}
|
16
|
+
options = Hash[options.map { |k, v| [option_map.fetch(k, k), v] }]
|
17
|
+
TerminalNotifier.notify(message, options)
|
25
18
|
end
|
26
19
|
|
27
20
|
def self.description
|
@@ -29,7 +22,7 @@ module Fastlane
|
|
29
22
|
end
|
30
23
|
|
31
24
|
def self.author
|
32
|
-
["champo", "cbowns", "KrauseFx", "amarcadet"]
|
25
|
+
["champo", "cbowns", "KrauseFx", "amarcadet", "dusek"]
|
33
26
|
end
|
34
27
|
|
35
28
|
def self.available_options
|
@@ -45,6 +38,21 @@ module Fastlane
|
|
45
38
|
optional: false),
|
46
39
|
FastlaneCore::ConfigItem.new(key: :sound,
|
47
40
|
description: "The name of a sound to play when the notification appears (names are listed in Sound Preferences)",
|
41
|
+
optional: true),
|
42
|
+
FastlaneCore::ConfigItem.new(key: :activate,
|
43
|
+
description: "Bundle identifier of application to be opened when the notification is clicked",
|
44
|
+
optional: true),
|
45
|
+
FastlaneCore::ConfigItem.new(key: :app_icon,
|
46
|
+
description: "The URL of an image to display instead of the application icon (Mavericks+ only)",
|
47
|
+
optional: true),
|
48
|
+
FastlaneCore::ConfigItem.new(key: :content_image,
|
49
|
+
description: "The URL of an image to display attached to the notification (Mavericks+ only)",
|
50
|
+
optional: true),
|
51
|
+
FastlaneCore::ConfigItem.new(key: :open,
|
52
|
+
description: "URL of the resource to be opened when the notification is clicked",
|
53
|
+
optional: true),
|
54
|
+
FastlaneCore::ConfigItem.new(key: :execute,
|
55
|
+
description: "Shell command to run when the notification is clicked",
|
48
56
|
optional: true)
|
49
57
|
]
|
50
58
|
end
|
@@ -24,7 +24,8 @@ module Fastlane
|
|
24
24
|
output_directory: "--output-directory",
|
25
25
|
binary_basename: "--binary-basename",
|
26
26
|
binary_file: "--binary-file",
|
27
|
-
ignore: "--ignore"
|
27
|
+
ignore: "--ignore",
|
28
|
+
workspace: "--workspace"
|
28
29
|
}.freeze
|
29
30
|
|
30
31
|
def self.run(params)
|
@@ -91,6 +92,11 @@ Slather is available at https://github.com/SlatherOrg/slather
|
|
91
92
|
verify_block: proc do |value|
|
92
93
|
UI.user_error!("No project file specified, pass using `proj: 'Project.xcodeproj'`") unless value and !value.empty?
|
93
94
|
end),
|
95
|
+
FastlaneCore::ConfigItem.new(key: :workspace,
|
96
|
+
env_name: "FL_SLATHER_WORKSPACE",
|
97
|
+
description: "The workspace that slather looks at",
|
98
|
+
optional: true
|
99
|
+
),
|
94
100
|
FastlaneCore::ConfigItem.new(key: :scheme,
|
95
101
|
env_name: "FL_SLATHER_SCHEME", # The name of the environment variable
|
96
102
|
description: "Scheme to use when calling slather",
|
@@ -148,7 +154,7 @@ Slather is available at https://github.com/SlatherOrg/slather
|
|
148
154
|
optional: true),
|
149
155
|
FastlaneCore::ConfigItem.new(key: :show,
|
150
156
|
env_name: "FL_SLATHER_SHOW_ENABLED",
|
151
|
-
description: "Tell slather that it should
|
157
|
+
description: "Tell slather that it should open static html pages automatically",
|
152
158
|
is_string: false,
|
153
159
|
default_value: false),
|
154
160
|
FastlaneCore::ConfigItem.new(key: :source_directory,
|
@@ -6,8 +6,8 @@ module Fastlane
|
|
6
6
|
class UpdateProjectCodeSigningAction < Action
|
7
7
|
def self.run(params)
|
8
8
|
UI.message("You shouldn't use update_project_code_signing")
|
9
|
-
UI.message("Have you considered using the recommended way to do code
|
10
|
-
UI.message("https://github.com/fastlane/fastlane/blob/master/docs/CodeSigning.md")
|
9
|
+
UI.message("Have you considered using the recommended way to do code signing?")
|
10
|
+
UI.message("https://github.com/fastlane/fastlane/blob/master/fastlane/docs/CodeSigning.md")
|
11
11
|
|
12
12
|
path = params[:path]
|
13
13
|
path = File.join(path, "project.pbxproj")
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
# rubocop:disable Metrics/AbcSize
|
2
3
|
module Fastlane
|
3
4
|
module Actions
|
@@ -8,7 +9,7 @@ module Fastlane
|
|
8
9
|
ROOT_CERTIFICATE_URL = "http://www.apple.com/appleca/AppleIncRootCertificate.cer"
|
9
10
|
def self.run(params)
|
10
11
|
UI.message("You’re updating provisioning profiles directly in your project, but have you considered easier ways to do code signing?")
|
11
|
-
UI.message("https://github.com/fastlane/fastlane/blob/master/docs/CodeSigning.md")
|
12
|
+
UI.message("https://github.com/fastlane/fastlane/blob/master/fastlane/docs/CodeSigning.md")
|
12
13
|
|
13
14
|
# assign folder from parameter or search for xcodeproj file
|
14
15
|
folder = params[:xcodeproj] || Dir["*.xcodeproj"].first
|
@@ -52,7 +52,7 @@ module Fastlane
|
|
52
52
|
def self.upload_dsym(params, path)
|
53
53
|
UI.message("Uploading '#{path}'...")
|
54
54
|
command = []
|
55
|
-
command << params[:binary_path]
|
55
|
+
command << params[:binary_path].shellescape
|
56
56
|
command << "-a #{params[:api_token]}"
|
57
57
|
command << "-p #{params[:platform]}"
|
58
58
|
command << File.expand_path(path).shellescape
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
1
3
|
module Fastlane
|
2
4
|
module Actions
|
3
5
|
module SharedValues
|
@@ -5,31 +7,58 @@ module Fastlane
|
|
5
7
|
|
6
8
|
class VerifyXcodeAction < Action
|
7
9
|
def self.run(params)
|
8
|
-
UI.
|
10
|
+
UI.message("Verifying your Xcode installation at path '#{params[:xcode_path]}'...")
|
9
11
|
|
10
12
|
# Check 1/2
|
13
|
+
verify_codesign(params)
|
11
14
|
|
12
|
-
|
13
|
-
|
15
|
+
# Check 2/2
|
16
|
+
# More information https://developer.apple.com/news/?id=09222015a
|
17
|
+
verify_gatekeeper(params)
|
14
18
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.verify_codesign(params)
|
23
|
+
UI.message("Verifying Xcode was signed by Apple Inc.")
|
24
|
+
|
25
|
+
codesign_output = Actions.sh("codesign --display --verbose=4 #{params[:xcode_path].shellescape}")
|
26
|
+
|
27
|
+
# If the returned codesign info contains all entries for any one of these sets, we'll consider it valid
|
28
|
+
accepted_codesign_detail_sets = [
|
29
|
+
[ # Found on App Store installed Xcode installations
|
30
|
+
"Identifier=com.apple.dt.Xcode",
|
31
|
+
"Authority=Apple Mac OS Application Signing",
|
32
|
+
"Authority=Apple Worldwide Developer Relations Certification Authority",
|
33
|
+
"Authority=Apple Root CA",
|
34
|
+
"TeamIdentifier=59GAB85EFG"
|
35
|
+
],
|
36
|
+
[ # Found on Xcode installations downloaded from developer.apple.com
|
37
|
+
"Identifier=com.apple.dt.Xcode",
|
38
|
+
"Authority=Software Signing",
|
39
|
+
"Authority=Apple Code Signing Certification Authority",
|
40
|
+
"Authority=Apple Root CA",
|
41
|
+
"TeamIdentifier=not set"
|
42
|
+
]
|
21
43
|
]
|
22
44
|
|
23
|
-
|
45
|
+
# Map the accepted details sets into an equal number of sets collecting the details for which
|
46
|
+
# the output of codesign did not have matches
|
47
|
+
missing_details_sets = accepted_codesign_detail_sets.map do |accepted_details_set|
|
48
|
+
accepted_details_set.reject { |detail| codesign_output.include?(detail) }
|
49
|
+
end
|
50
|
+
|
51
|
+
# If any of the sets is empty, it means that all details were matched, and the check is successful
|
52
|
+
show_and_raise_error(nil, params[:xcode_path]) unless missing_details_sets.any?(&:empty?)
|
24
53
|
|
25
|
-
UI.success("Successfully verified the code signature")
|
54
|
+
UI.success("Successfully verified the code signature ✅")
|
55
|
+
end
|
26
56
|
|
27
|
-
|
28
|
-
# More information https://developer.apple.com/news/?id=09222015a
|
57
|
+
def self.verify_gatekeeper(params)
|
29
58
|
UI.message("Verifying Xcode using GateKeeper...")
|
30
|
-
UI.
|
59
|
+
UI.message("This will take up to a few minutes, now is a great time to go for a coffee ☕...")
|
31
60
|
|
32
|
-
command = "/usr/sbin/spctl --assess --verbose
|
61
|
+
command = "/usr/sbin/spctl --assess --verbose #{params[:xcode_path].shellescape}"
|
33
62
|
must_includes = ['accepted']
|
34
63
|
|
35
64
|
output = verify(command: command, must_includes: must_includes, params: params)
|
@@ -39,8 +68,6 @@ module Fastlane
|
|
39
68
|
else
|
40
69
|
show_and_raise_error("Invalid Download Source of Xcode: #{output}", params[:xcode_path])
|
41
70
|
end
|
42
|
-
|
43
|
-
true
|
44
71
|
end
|
45
72
|
|
46
73
|
def self.verify(command: nil, must_includes: nil, params: nil)
|
@@ -60,11 +87,13 @@ module Fastlane
|
|
60
87
|
end
|
61
88
|
|
62
89
|
def self.show_and_raise_error(error, xcode_path)
|
63
|
-
UI.error("Attention: Your Xcode Installation
|
64
|
-
UI.error("
|
65
|
-
|
66
|
-
|
67
|
-
|
90
|
+
UI.error("Attention: Your Xcode Installation could not be verified.")
|
91
|
+
UI.error("If you believe that your Xcode is valid, please submit an issue on GitHub")
|
92
|
+
if error
|
93
|
+
UI.error("The following information couldn't be found:")
|
94
|
+
UI.error(error)
|
95
|
+
end
|
96
|
+
UI.user_error!("The Xcode installation at path '#{xcode_path}' could not be verified.")
|
68
97
|
end
|
69
98
|
|
70
99
|
#####################################################
|
@@ -77,7 +106,7 @@ module Fastlane
|
|
77
106
|
|
78
107
|
def self.details
|
79
108
|
[
|
80
|
-
"This action was implemented after the recent Xcode
|
109
|
+
"This action was implemented after the recent Xcode attack to make sure",
|
81
110
|
"you're not using a hacked Xcode installation.",
|
82
111
|
"http://researchcenter.paloaltonetworks.com/2015/09/novel-malware-xcodeghost-modifies-xcode-infects-apple-ios-apps-and-hits-app-store/"
|
83
112
|
].join("\n")
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# rubocop:disable Metrics/AbcSize
|
2
|
-
# rubocop:disable Metrics/MethodLength
|
3
1
|
module Fastlane
|
4
2
|
class ActionsList
|
5
3
|
def self.run(filter: nil, platform: nil)
|
@@ -24,18 +22,18 @@ module Fastlane
|
|
24
22
|
current << authors.first.green if authors.count == 1
|
25
23
|
current << "Multiple".green if authors.count > 1
|
26
24
|
else
|
27
|
-
UI.error(
|
25
|
+
UI.error action_subclass_error(name)
|
28
26
|
current << "Please update action file".red
|
27
|
+
current << ' '
|
29
28
|
end
|
30
29
|
rows << current
|
31
30
|
end
|
32
31
|
|
33
|
-
|
32
|
+
puts Terminal::Table.new(
|
34
33
|
title: "Available fastlane actions".green,
|
35
34
|
headings: ['Action', 'Description', 'Author'],
|
36
35
|
rows: rows
|
37
36
|
)
|
38
|
-
puts table
|
39
37
|
puts " Platform filter: #{platform}".magenta if platform
|
40
38
|
puts " Total of #{rows.count} actions"
|
41
39
|
|
@@ -44,100 +42,119 @@ module Fastlane
|
|
44
42
|
|
45
43
|
def self.show_details(filter: nil)
|
46
44
|
puts "Loading documentation for #{filter}:".green
|
47
|
-
|
48
45
|
puts ""
|
49
46
|
|
50
|
-
|
51
|
-
next unless name == filter.strip
|
47
|
+
action = find_action_named(filter)
|
52
48
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
if action.details
|
57
|
-
rows << [action.details]
|
58
|
-
rows << [' ']
|
49
|
+
if action
|
50
|
+
unless action < Action
|
51
|
+
UI.user_error! action_subclass_error(filter)
|
59
52
|
end
|
60
53
|
|
61
|
-
|
54
|
+
print_summary(action, filter)
|
55
|
+
print_options(action, filter)
|
56
|
+
print_output_variables(action, filter)
|
57
|
+
print_return_value(action, filter)
|
62
58
|
|
63
|
-
|
59
|
+
puts "More information can be found on https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Actions.md"
|
60
|
+
puts ""
|
61
|
+
else
|
62
|
+
puts "Couldn't find action for the given filter.".red
|
63
|
+
puts "==========================================\n".red
|
64
|
+
print_all # show all available actions instead
|
65
|
+
end
|
66
|
+
end
|
64
67
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
)
|
68
|
+
def self.action_subclass_error(name)
|
69
|
+
"Please update your action '#{name}' to be a subclass of `Action` by adding ` < Action` after your class name."
|
70
|
+
end
|
69
71
|
|
70
|
-
|
71
|
-
|
72
|
-
options = parse_options(action.available_options) if action.available_options
|
73
|
-
|
74
|
-
if options
|
75
|
-
puts Terminal::Table.new(
|
76
|
-
title: filter.green,
|
77
|
-
headings: ['Key', 'Description', 'Env Var'],
|
78
|
-
rows: options
|
79
|
-
)
|
80
|
-
required_count = action.available_options.count do |o|
|
81
|
-
if o.kind_of?(FastlaneCore::ConfigItem)
|
82
|
-
o.optional == false
|
83
|
-
else
|
84
|
-
false
|
85
|
-
end
|
86
|
-
end
|
72
|
+
def self.print_summary(action, name)
|
73
|
+
rows = []
|
87
74
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
75
|
+
if action.description
|
76
|
+
rows << [action.description]
|
77
|
+
rows << [' ']
|
78
|
+
end
|
79
|
+
|
80
|
+
if action.details
|
81
|
+
rows << [action.details]
|
82
|
+
rows << [' ']
|
83
|
+
end
|
84
|
+
|
85
|
+
authors = Array(action.author || action.authors)
|
86
|
+
rows << ["Created by #{authors.join(', ').green}"] unless authors.empty?
|
87
|
+
|
88
|
+
puts Terminal::Table.new(title: name.green, rows: rows)
|
89
|
+
puts ""
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.print_options(action, name)
|
93
|
+
options = parse_options(action.available_options) if action.available_options
|
94
|
+
|
95
|
+
if options
|
96
|
+
puts Terminal::Table.new(
|
97
|
+
title: "#{name} Options".green,
|
98
|
+
headings: ['Key', 'Description', 'Env Var', 'Default'],
|
99
|
+
rows: options
|
100
|
+
)
|
101
|
+
required_count = action.available_options.count do |o|
|
102
|
+
o.kind_of?(FastlaneCore::ConfigItem) && o.optional == false
|
106
103
|
end
|
107
104
|
|
108
|
-
if
|
109
|
-
puts
|
110
|
-
|
111
|
-
headings: [],
|
112
|
-
rows: [[action.return_value]]
|
113
|
-
)
|
114
|
-
puts ""
|
105
|
+
if required_count > 0
|
106
|
+
puts "#{required_count} of the available parameters are required".magenta
|
107
|
+
puts "They are marked with an asterisk *".magenta
|
115
108
|
end
|
109
|
+
else
|
110
|
+
puts "No available options".yellow
|
111
|
+
end
|
112
|
+
puts ""
|
113
|
+
end
|
116
114
|
|
117
|
-
|
118
|
-
|
115
|
+
def self.print_output_variables(action, name)
|
116
|
+
output = action.output
|
117
|
+
return if output.nil? || output.empty?
|
119
118
|
|
120
|
-
|
121
|
-
|
119
|
+
puts Terminal::Table.new(
|
120
|
+
title: "#{name} Output Variables".green,
|
121
|
+
headings: ['Key', 'Description'],
|
122
|
+
rows: output.map { |key, desc| [key.yellow, desc] }
|
123
|
+
)
|
124
|
+
puts "Access the output values using `lane_context[SharedValues::VARIABLE_NAME]`"
|
125
|
+
puts ""
|
126
|
+
end
|
122
127
|
|
123
|
-
|
124
|
-
|
125
|
-
|
128
|
+
def self.print_return_value(action, name)
|
129
|
+
return unless action.return_value
|
130
|
+
|
131
|
+
puts Terminal::Table.new(title: "#{name} Return Value".green, rows: [[action.return_value]])
|
132
|
+
puts ""
|
126
133
|
end
|
127
134
|
|
128
135
|
# Iterates through all available actions and yields from there
|
129
136
|
def self.all_actions(platform = nil)
|
130
|
-
|
131
|
-
|
137
|
+
action_symbols = Fastlane::Actions.constants.select {|c| Fastlane::Actions.const_get(c).kind_of? Class }
|
138
|
+
action_symbols.sort.each do |symbol|
|
132
139
|
action = Fastlane::Actions.const_get(symbol)
|
133
140
|
|
134
|
-
|
141
|
+
# We allow classes that don't respond to is_supported? to come through because we want to list
|
142
|
+
# them as broken actions in the table, regardless of platform specification
|
143
|
+
next if platform && action.respond_to?(:is_supported?) && !action.is_supported?(platform.to_sym)
|
135
144
|
|
136
145
|
name = symbol.to_s.gsub('Action', '').fastlane_underscore
|
137
146
|
yield action, name
|
138
147
|
end
|
139
148
|
end
|
140
149
|
|
150
|
+
def self.find_action_named(name)
|
151
|
+
all_actions do |action, action_name|
|
152
|
+
return action if action_name == name
|
153
|
+
end
|
154
|
+
|
155
|
+
nil
|
156
|
+
end
|
157
|
+
|
141
158
|
# Helper:
|
142
159
|
def self.parse_options(options, fill_all = true)
|
143
160
|
rows = []
|
@@ -147,10 +164,7 @@ module Fastlane
|
|
147
164
|
options.each do |current|
|
148
165
|
if current.kind_of? FastlaneCore::ConfigItem
|
149
166
|
key_name = (current.optional ? " " : "* ") + current.key.to_s
|
150
|
-
|
151
|
-
|
152
|
-
rows << [key_name.yellow, description, current.env_name]
|
153
|
-
|
167
|
+
rows << [key_name.yellow, current.description, current.env_name, current.default_value]
|
154
168
|
elsif current.kind_of? Array
|
155
169
|
# Legacy actions that don't use the new config manager
|
156
170
|
UI.user_error!("Invalid number of elements in this row: #{current}. Must be 2 or 3") unless [2, 3].include? current.count
|
@@ -165,5 +179,3 @@ module Fastlane
|
|
165
179
|
end
|
166
180
|
end
|
167
181
|
end
|
168
|
-
# rubocop:enable Metrics/AbcSize
|
169
|
-
# rubocop:enable Metrics/MethodLength
|
data/lib/fastlane/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.82.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: krausefx-shenzhen
|
@@ -148,7 +148,7 @@ dependencies:
|
|
148
148
|
requirements:
|
149
149
|
- - ">="
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: 0.
|
151
|
+
version: 0.42.0
|
152
152
|
- - "<"
|
153
153
|
- !ruby/object:Gem::Version
|
154
154
|
version: 1.0.0
|
@@ -158,7 +158,7 @@ dependencies:
|
|
158
158
|
requirements:
|
159
159
|
- - ">="
|
160
160
|
- !ruby/object:Gem::Version
|
161
|
-
version: 0.
|
161
|
+
version: 0.42.0
|
162
162
|
- - "<"
|
163
163
|
- !ruby/object:Gem::Version
|
164
164
|
version: 1.0.0
|
@@ -701,6 +701,7 @@ files:
|
|
701
701
|
- lib/fastlane/actions/crashlytics.rb
|
702
702
|
- lib/fastlane/actions/create_keychain.rb
|
703
703
|
- lib/fastlane/actions/create_pull_request.rb
|
704
|
+
- lib/fastlane/actions/danger.rb
|
704
705
|
- lib/fastlane/actions/debug.rb
|
705
706
|
- lib/fastlane/actions/default_platform.rb
|
706
707
|
- lib/fastlane/actions/delete_keychain.rb
|
@@ -716,6 +717,7 @@ files:
|
|
716
717
|
- lib/fastlane/actions/ensure_xcode_version.rb
|
717
718
|
- lib/fastlane/actions/erb.rb
|
718
719
|
- lib/fastlane/actions/fastlane_version.rb
|
720
|
+
- lib/fastlane/actions/flock.rb
|
719
721
|
- lib/fastlane/actions/frameit.rb
|
720
722
|
- lib/fastlane/actions/gcovr.rb
|
721
723
|
- lib/fastlane/actions/get_build_number.rb
|