fastlane 2.85.0.beta.20180308050114 → 2.85.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +70 -70
- data/fastlane/lib/fastlane/actions/update_url_schemes.rb +48 -8
- data/fastlane/lib/fastlane/commands_generator.rb +0 -2
- data/fastlane/lib/fastlane/setup/setup.rb +0 -7
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +6 -4
- data/fastlane/swift/Gymfile.swift +1 -1
- data/fastlane/swift/Matchfile.swift +1 -1
- data/fastlane/swift/Precheckfile.swift +1 -1
- data/fastlane/swift/Scanfile.swift +1 -1
- data/fastlane/swift/Screengrabfile.swift +1 -1
- data/fastlane/swift/Snapshotfile.swift +1 -1
- metadata +28 -35
- data/fastlane/lib/fastlane/setup/crashlytics_beta.rb +0 -106
- data/fastlane/lib/fastlane/setup/crashlytics_beta_command_line_handler.rb +0 -26
- data/fastlane/lib/fastlane/setup/crashlytics_beta_info.rb +0 -57
- data/fastlane/lib/fastlane/setup/crashlytics_beta_info_collector.rb +0 -164
- data/fastlane/lib/fastlane/setup/crashlytics_beta_ui.rb +0 -33
- data/fastlane/lib/fastlane/setup/crashlytics_beta_user_email_fetcher.rb +0 -13
- data/fastlane/lib/fastlane/setup/crashlytics_project_parser.rb +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3776dd5f9fe6cea24c7d2e06a213eaec89018bea
|
4
|
+
data.tar.gz: 67846f04c71a0b0a02a8cb231d0700ae10d82531
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3483a1f123942221a7290ff57506c92194b372c068cb9c94f14d6b53390e4c4652ecad2257d9767a843f794421f09c945d1b2981140c4a31f3a0a9f3e136dba
|
7
|
+
data.tar.gz: 97ea5db90e615a4c9b4d93a0cc1d7b1dbd224e213a1b8524b786d61955759eb0fdaf1577a25aa8e412416f39807aaf8ae000f45b26eab4705125ecaf76bfc6e9
|
data/README.md
CHANGED
@@ -30,23 +30,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
30
30
|
|
31
31
|
<table id='team'>
|
32
32
|
<tr>
|
33
|
-
<td id='
|
34
|
-
<a href='https://github.com/
|
35
|
-
<img src='https://github.com/
|
33
|
+
<td id='maksym-grebenets'>
|
34
|
+
<a href='https://github.com/mgrebenets'>
|
35
|
+
<img src='https://github.com/mgrebenets.png?size=140'>
|
36
36
|
</a>
|
37
|
-
<h4 align='center'><a href='https://twitter.com/
|
37
|
+
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
38
38
|
</td>
|
39
|
-
<td id='
|
40
|
-
<a href='https://github.com/
|
41
|
-
<img src='https://github.com/
|
39
|
+
<td id='josh-holtz'>
|
40
|
+
<a href='https://github.com/joshdholtz'>
|
41
|
+
<img src='https://github.com/joshdholtz.png?size=140'>
|
42
42
|
</a>
|
43
|
-
<h4 align='center'><a href='https://twitter.com/
|
43
|
+
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
44
44
|
</td>
|
45
|
-
<td id='
|
46
|
-
<a href='https://github.com/
|
47
|
-
<img src='https://github.com/
|
45
|
+
<td id='jérôme-lacoste'>
|
46
|
+
<a href='https://github.com/lacostej'>
|
47
|
+
<img src='https://github.com/lacostej.png?size=140'>
|
48
48
|
</a>
|
49
|
-
<h4 align='center'><a href='https://twitter.com/
|
49
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
50
50
|
</td>
|
51
51
|
<td id='andrew-mcburney'>
|
52
52
|
<a href='https://github.com/AndrewMcBurney'>
|
@@ -54,25 +54,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
54
54
|
</a>
|
55
55
|
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
56
56
|
</td>
|
57
|
-
<td id='
|
58
|
-
<a href='https://github.com/
|
59
|
-
<img src='https://github.com/
|
57
|
+
<td id='joshua-liebowitz'>
|
58
|
+
<a href='https://github.com/taquitos'>
|
59
|
+
<img src='https://github.com/taquitos.png?size=140'>
|
60
60
|
</a>
|
61
|
-
<h4 align='center'><a href='https://twitter.com/
|
61
|
+
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
62
62
|
</td>
|
63
63
|
</tr>
|
64
64
|
<tr>
|
65
|
-
<td id='
|
66
|
-
<a href='https://github.com/
|
67
|
-
<img src='https://github.com/
|
65
|
+
<td id='helmut-januschka'>
|
66
|
+
<a href='https://github.com/hjanuschka'>
|
67
|
+
<img src='https://github.com/hjanuschka.png?size=140'>
|
68
68
|
</a>
|
69
|
-
<h4 align='center'>
|
69
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
70
70
|
</td>
|
71
|
-
<td id='
|
72
|
-
<a href='https://github.com/
|
73
|
-
<img src='https://github.com/
|
71
|
+
<td id='iulian-onofrei'>
|
72
|
+
<a href='https://github.com/revolter'>
|
73
|
+
<img src='https://github.com/revolter.png?size=140'>
|
74
74
|
</a>
|
75
|
-
<h4 align='center'><a href='https://twitter.com/
|
75
|
+
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
76
76
|
</td>
|
77
77
|
<td id='aaron-brager'>
|
78
78
|
<a href='https://github.com/getaaron'>
|
@@ -80,31 +80,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
80
80
|
</a>
|
81
81
|
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
82
82
|
</td>
|
83
|
-
<td id='
|
84
|
-
<a href='https://github.com/
|
85
|
-
<img src='https://github.com/
|
83
|
+
<td id='jorge-revuelta-h'>
|
84
|
+
<a href='https://github.com/minuscorp'>
|
85
|
+
<img src='https://github.com/minuscorp.png?size=140'>
|
86
86
|
</a>
|
87
|
-
<h4 align='center'><a href='https://twitter.com/
|
87
|
+
<h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
|
88
88
|
</td>
|
89
|
-
<td id='
|
90
|
-
<a href='https://github.com/
|
91
|
-
<img src='https://github.com/
|
89
|
+
<td id='kohki-miki'>
|
90
|
+
<a href='https://github.com/giginet'>
|
91
|
+
<img src='https://github.com/giginet.png?size=140'>
|
92
92
|
</a>
|
93
|
-
<h4 align='center'><a href='https://twitter.com/
|
93
|
+
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
94
94
|
</td>
|
95
95
|
</tr>
|
96
96
|
<tr>
|
97
|
-
<td id='
|
98
|
-
<a href='https://github.com/
|
99
|
-
<img src='https://github.com/
|
100
|
-
</a>
|
101
|
-
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
102
|
-
</td>
|
103
|
-
<td id='stefan-natchev'>
|
104
|
-
<a href='https://github.com/snatchev'>
|
105
|
-
<img src='https://github.com/snatchev.png?size=140'>
|
97
|
+
<td id='luka-mirosevic'>
|
98
|
+
<a href='https://github.com/lmirosevic'>
|
99
|
+
<img src='https://github.com/lmirosevic.png?size=140'>
|
106
100
|
</a>
|
107
|
-
<h4 align='center'><a href='https://twitter.com/
|
101
|
+
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
108
102
|
</td>
|
109
103
|
<td id='manu-wallner'>
|
110
104
|
<a href='https://github.com/milch'>
|
@@ -112,49 +106,55 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
112
106
|
</a>
|
113
107
|
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
114
108
|
</td>
|
115
|
-
<td id='
|
116
|
-
<a href='https://github.com/
|
117
|
-
<img src='https://github.com/
|
118
|
-
</a>
|
119
|
-
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
120
|
-
</td>
|
121
|
-
<td id='jorge-revuelta-h'>
|
122
|
-
<a href='https://github.com/minuscorp'>
|
123
|
-
<img src='https://github.com/minuscorp.png?size=140'>
|
109
|
+
<td id='olivier-halligon'>
|
110
|
+
<a href='https://github.com/AliSoftware'>
|
111
|
+
<img src='https://github.com/AliSoftware.png?size=140'>
|
124
112
|
</a>
|
125
|
-
<h4 align='center'><a href='https://twitter.com/
|
113
|
+
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
126
114
|
</td>
|
127
|
-
</tr>
|
128
|
-
<tr>
|
129
115
|
<td id='matthew-ellis'>
|
130
116
|
<a href='https://github.com/matthewellis'>
|
131
117
|
<img src='https://github.com/matthewellis.png?size=140'>
|
132
118
|
</a>
|
133
119
|
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
134
120
|
</td>
|
135
|
-
<td id='
|
136
|
-
<a href='https://github.com/
|
137
|
-
<img src='https://github.com/
|
121
|
+
<td id='jan-piotrowski'>
|
122
|
+
<a href='https://github.com/janpio'>
|
123
|
+
<img src='https://github.com/janpio.png?size=140'>
|
138
124
|
</a>
|
139
|
-
<h4 align='center'><a href='https://twitter.com/
|
125
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
140
126
|
</td>
|
141
|
-
|
142
|
-
<
|
143
|
-
<
|
127
|
+
</tr>
|
128
|
+
<tr>
|
129
|
+
<td id='felix-krause'>
|
130
|
+
<a href='https://github.com/KrauseFx'>
|
131
|
+
<img src='https://github.com/KrauseFx.png?size=140'>
|
144
132
|
</a>
|
145
|
-
<h4 align='center'><a href='https://twitter.com/
|
133
|
+
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
146
134
|
</td>
|
147
|
-
<td id='
|
148
|
-
<a href='https://github.com/
|
149
|
-
<img src='https://github.com/
|
135
|
+
<td id='jimmy-dee'>
|
136
|
+
<a href='https://github.com/jdee'>
|
137
|
+
<img src='https://github.com/jdee.png?size=140'>
|
150
138
|
</a>
|
151
|
-
<h4 align='center'
|
139
|
+
<h4 align='center'>Jimmy Dee</h4>
|
152
140
|
</td>
|
153
|
-
<td id='
|
154
|
-
<a href='https://github.com/
|
155
|
-
<img src='https://github.com/
|
141
|
+
<td id='fumiya-nakamura'>
|
142
|
+
<a href='https://github.com/nafu'>
|
143
|
+
<img src='https://github.com/nafu.png?size=140'>
|
156
144
|
</a>
|
157
|
-
<h4 align='center'><a href='https://twitter.com/
|
145
|
+
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
146
|
+
</td>
|
147
|
+
<td id='danielle-tomlinson'>
|
148
|
+
<a href='https://github.com/DanToml'>
|
149
|
+
<img src='https://github.com/DanToml.png?size=140'>
|
150
|
+
</a>
|
151
|
+
<h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
|
152
|
+
</td>
|
153
|
+
<td id='stefan-natchev'>
|
154
|
+
<a href='https://github.com/snatchev'>
|
155
|
+
<img src='https://github.com/snatchev.png?size=140'>
|
156
|
+
</a>
|
157
|
+
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
158
158
|
</td>
|
159
159
|
</tr>
|
160
160
|
</table>
|
@@ -6,12 +6,45 @@ module Fastlane
|
|
6
6
|
def self.run(params)
|
7
7
|
path = params[:path]
|
8
8
|
url_schemes = params[:url_schemes]
|
9
|
+
update_url_schemes = params[:update_url_schemes]
|
9
10
|
|
10
11
|
hash = Plist.parse_xml(path)
|
11
|
-
|
12
|
+
|
13
|
+
# Create CFBundleURLTypes array with empty scheme if none exist
|
14
|
+
unless hash['CFBundleURLTypes']
|
15
|
+
hash['CFBundleURLTypes'] = [{
|
16
|
+
'CFBundleTypeRole' => 'Editor',
|
17
|
+
'CFBundleURLSchemes' => []
|
18
|
+
}]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Updates schemes with update block if exists
|
22
|
+
# Else updates with array of strings if exist
|
23
|
+
# Otherwise shows error to user
|
24
|
+
if update_url_schemes
|
25
|
+
new_schemes = update_url_schemes.call(hash['CFBundleURLTypes'].first['CFBundleURLSchemes'])
|
26
|
+
|
27
|
+
# Verify array of strings
|
28
|
+
string = "The URL schemes must be an array of strings, got '#{new_schemes}'."
|
29
|
+
verify_schemes!(new_schemes, string)
|
30
|
+
|
31
|
+
hash['CFBundleURLTypes'].first['CFBundleURLSchemes'] = new_schemes
|
32
|
+
elsif url_schemes
|
33
|
+
hash['CFBundleURLTypes'].first['CFBundleURLSchemes'] = url_schemes
|
34
|
+
else
|
35
|
+
UI.user_error!("No `url_schemes` or `update_url_schemes` provided")
|
36
|
+
end
|
12
37
|
File.write(path, Plist::Emit.dump(hash))
|
13
38
|
end
|
14
39
|
|
40
|
+
def self.verify_schemes!(url_schemes, error_message)
|
41
|
+
UI.user_error!(error_message) unless url_schemes.kind_of?(Array)
|
42
|
+
|
43
|
+
url_schemes.each do |url_scheme|
|
44
|
+
UI.user_error!(error_message) unless url_scheme.kind_of?(String)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
15
48
|
def self.description
|
16
49
|
'Updates the URL schemes in the given Info.plist'
|
17
50
|
end
|
@@ -34,16 +67,17 @@ module Fastlane
|
|
34
67
|
env_name: "FL_UPDATE_URL_SCHEMES_SCHEMES",
|
35
68
|
description: 'The new URL schemes',
|
36
69
|
is_string: false,
|
37
|
-
optional:
|
70
|
+
optional: true,
|
38
71
|
verify_block: proc do |url_schemes|
|
39
72
|
string = "The URL schemes must be an array of strings, got '#{url_schemes}'."
|
40
|
-
|
41
|
-
|
42
|
-
url_schemes.each do |url_scheme|
|
43
|
-
UI.user_error!(string) unless url_scheme.kind_of?(String)
|
44
|
-
end
|
73
|
+
verify_schemes!(url_schemes, string)
|
45
74
|
end
|
46
|
-
)
|
75
|
+
),
|
76
|
+
|
77
|
+
FastlaneCore::ConfigItem.new(key: :update_url_schemes,
|
78
|
+
description: "Block that is called to update schemes with current schemes passed in as parameter",
|
79
|
+
optional: true,
|
80
|
+
is_string: false)
|
47
81
|
]
|
48
82
|
end
|
49
83
|
|
@@ -72,6 +106,12 @@ module Fastlane
|
|
72
106
|
'update_url_schemes(
|
73
107
|
path: "path/to/Info.plist",
|
74
108
|
url_schemes: ["com.myapp"]
|
109
|
+
)',
|
110
|
+
'update_url_schemes(
|
111
|
+
path: "path/to/Info.plist",
|
112
|
+
update_url_schemes: proc do |schemes|
|
113
|
+
schemes + ["anotherscheme"]
|
114
|
+
end
|
75
115
|
)'
|
76
116
|
]
|
77
117
|
end
|
@@ -116,8 +116,6 @@ module Fastlane
|
|
116
116
|
|
117
117
|
c.option('-u STRING', '--user STRING', String, 'iOS projects only: Your Apple ID')
|
118
118
|
|
119
|
-
# CrashlyticsBetaCommandLineHandler.apply_options(c)
|
120
|
-
|
121
119
|
c.action do |args, options|
|
122
120
|
is_swift_fastfile = args.include?("swift")
|
123
121
|
Fastlane::Setup.start(user: options.user, is_swift_fastfile: is_swift_fastfile)
|
@@ -349,10 +349,3 @@ end
|
|
349
349
|
|
350
350
|
require 'fastlane/setup/setup_ios'
|
351
351
|
require 'fastlane/setup/setup_android'
|
352
|
-
require 'fastlane/setup/crashlytics_beta_ui'
|
353
|
-
require 'fastlane/setup/crashlytics_beta'
|
354
|
-
require 'fastlane/setup/crashlytics_project_parser'
|
355
|
-
require 'fastlane/setup/crashlytics_beta_info'
|
356
|
-
require 'fastlane/setup/crashlytics_beta_info_collector'
|
357
|
-
require 'fastlane/setup/crashlytics_beta_command_line_handler'
|
358
|
-
require 'fastlane/setup/crashlytics_beta_user_email_fetcher'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Fastlane
|
2
|
-
VERSION = '2.85.0
|
2
|
+
VERSION = '2.85.0'.freeze
|
3
3
|
DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
|
4
4
|
MINIMUM_XCODE_RELEASE = "7.0".freeze
|
5
5
|
RUBOCOP_REQUIREMENT = '0.49.1'.freeze
|
@@ -3426,12 +3426,14 @@ func updateUrbanAirshipConfiguration(plistPath: String,
|
|
3426
3426
|
_ = runner.executeCommand(command)
|
3427
3427
|
}
|
3428
3428
|
func updateUrlSchemes(path: String,
|
3429
|
-
urlSchemes: String
|
3429
|
+
urlSchemes: String? = nil,
|
3430
|
+
updateUrlSchemes: String? = nil) {
|
3430
3431
|
let command = RubyCommand(commandID: "", methodName: "update_url_schemes", className: nil, args: [RubyCommand.Argument(name: "path", value: path),
|
3431
|
-
RubyCommand.Argument(name: "url_schemes", value: urlSchemes)
|
3432
|
+
RubyCommand.Argument(name: "url_schemes", value: urlSchemes),
|
3433
|
+
RubyCommand.Argument(name: "update_url_schemes", value: updateUrlSchemes)])
|
3432
3434
|
_ = runner.executeCommand(command)
|
3433
3435
|
}
|
3434
|
-
func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji.dSYM
|
3436
|
+
func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji.dSYM",
|
3435
3437
|
apiToken: String? = nil,
|
3436
3438
|
gspPath: String? = nil,
|
3437
3439
|
binaryPath: String? = nil,
|
@@ -3817,4 +3819,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
|
|
3817
3819
|
let snapshotfile: Snapshotfile = Snapshotfile()
|
3818
3820
|
// Please don't remove the lines below
|
3819
3821
|
// They are used to detect outdated files
|
3820
|
-
// FastlaneRunnerAPIVersion [0.9.
|
3822
|
+
// FastlaneRunnerAPIVersion [0.9.8]
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.85.0
|
4
|
+
version: 2.85.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
- Olivier Halligon
|
9
|
-
- Jimmy Dee
|
7
|
+
- Maksym Grebenets
|
10
8
|
- Luka Mirosevic
|
11
|
-
- Matthew Ellis
|
12
|
-
- Felix Krause
|
13
9
|
- Fumiya Nakamura
|
14
|
-
- Aaron Brager
|
15
10
|
- Andrew McBurney
|
16
|
-
-
|
11
|
+
- Olivier Halligon
|
12
|
+
- Helmut Januschka
|
13
|
+
- Kohki Miki
|
14
|
+
- Matthew Ellis
|
17
15
|
- Danielle Tomlinson
|
18
16
|
- Jérôme Lacoste
|
19
|
-
- Jan Piotrowski
|
20
|
-
- Josh Holtz
|
21
|
-
- Helmut Januschka
|
22
17
|
- Iulian Onofrei
|
18
|
+
- Jimmy Dee
|
23
19
|
- Stefan Natchev
|
24
|
-
-
|
25
|
-
-
|
20
|
+
- Aaron Brager
|
21
|
+
- Jan Piotrowski
|
26
22
|
- Joshua Liebowitz
|
23
|
+
- Manu Wallner
|
24
|
+
- Felix Krause
|
25
|
+
- Jorge Revuelta H
|
26
|
+
- Josh Holtz
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
@@ -1196,13 +1196,6 @@ files:
|
|
1196
1196
|
- fastlane/lib/fastlane/server/json_return_value_processor.rb
|
1197
1197
|
- fastlane/lib/fastlane/server/socket_server.rb
|
1198
1198
|
- fastlane/lib/fastlane/server/socket_server_action_command_executor.rb
|
1199
|
-
- fastlane/lib/fastlane/setup/crashlytics_beta.rb
|
1200
|
-
- fastlane/lib/fastlane/setup/crashlytics_beta_command_line_handler.rb
|
1201
|
-
- fastlane/lib/fastlane/setup/crashlytics_beta_info.rb
|
1202
|
-
- fastlane/lib/fastlane/setup/crashlytics_beta_info_collector.rb
|
1203
|
-
- fastlane/lib/fastlane/setup/crashlytics_beta_ui.rb
|
1204
|
-
- fastlane/lib/fastlane/setup/crashlytics_beta_user_email_fetcher.rb
|
1205
|
-
- fastlane/lib/fastlane/setup/crashlytics_project_parser.rb
|
1206
1199
|
- fastlane/lib/fastlane/setup/setup.rb
|
1207
1200
|
- fastlane/lib/fastlane/setup/setup_android.rb
|
1208
1201
|
- fastlane/lib/fastlane/setup/setup_ios.rb
|
@@ -1613,24 +1606,24 @@ metadata:
|
|
1613
1606
|
post_install_message:
|
1614
1607
|
rdoc_options: []
|
1615
1608
|
require_paths:
|
1616
|
-
-
|
1609
|
+
- credentials_manager/lib
|
1610
|
+
- pem/lib
|
1611
|
+
- snapshot/lib
|
1617
1612
|
- frameit/lib
|
1613
|
+
- match/lib
|
1614
|
+
- fastlane_core/lib
|
1615
|
+
- deliver/lib
|
1616
|
+
- scan/lib
|
1617
|
+
- supply/lib
|
1618
1618
|
- cert/lib
|
1619
|
-
-
|
1620
|
-
-
|
1621
|
-
- pem/lib
|
1619
|
+
- fastlane/lib
|
1620
|
+
- spaceship/lib
|
1622
1621
|
- pilot/lib
|
1622
|
+
- gym/lib
|
1623
1623
|
- precheck/lib
|
1624
|
-
-
|
1624
|
+
- screengrab/lib
|
1625
1625
|
- sigh/lib
|
1626
|
-
- gym/lib
|
1627
|
-
- spaceship/lib
|
1628
|
-
- scan/lib
|
1629
|
-
- fastlane_core/lib
|
1630
|
-
- fastlane/lib
|
1631
|
-
- deliver/lib
|
1632
1626
|
- produce/lib
|
1633
|
-
- credentials_manager/lib
|
1634
1627
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1635
1628
|
requirements:
|
1636
1629
|
- - ">="
|
@@ -1638,12 +1631,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1638
1631
|
version: 2.0.0
|
1639
1632
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1640
1633
|
requirements:
|
1641
|
-
- - "
|
1634
|
+
- - ">="
|
1642
1635
|
- !ruby/object:Gem::Version
|
1643
|
-
version:
|
1636
|
+
version: '0'
|
1644
1637
|
requirements: []
|
1645
1638
|
rubyforge_project:
|
1646
|
-
rubygems_version: 2.5.2.
|
1639
|
+
rubygems_version: 2.5.2.2
|
1647
1640
|
signing_key:
|
1648
1641
|
specification_version: 4
|
1649
1642
|
summary: The easiest way to automate beta deployments and releases for your iOS and
|
@@ -1,106 +0,0 @@
|
|
1
|
-
module Fastlane
|
2
|
-
class CrashlyticsBeta
|
3
|
-
def initialize(beta_info, ui)
|
4
|
-
@beta_info = beta_info
|
5
|
-
@ui = ui
|
6
|
-
end
|
7
|
-
|
8
|
-
def run
|
9
|
-
setup = Setup.new
|
10
|
-
|
11
|
-
@ui.message('This command will generate a fastlane configuration for distributing your app with Beta by Crashlytics')
|
12
|
-
@ui.message('so that you can get your testers new builds with a single command!')
|
13
|
-
|
14
|
-
@ui.message('')
|
15
|
-
|
16
|
-
if setup.is_android?
|
17
|
-
UI.user_error!('Sorry, Beta by Crashlytics configuration is currently only available for iOS projects!')
|
18
|
-
elsif !setup.is_ios?
|
19
|
-
UI.user_error!('Please run Beta by Crashlytics configuration from your iOS project folder.')
|
20
|
-
end
|
21
|
-
|
22
|
-
@ui.message("\nAttempting to detect your project settings in this directory...".cyan)
|
23
|
-
info_collector = CrashlyticsBetaInfoCollector.new(CrashlyticsProjectParser.new,
|
24
|
-
CrashlyticsBetaUserEmailFetcher.new,
|
25
|
-
@ui)
|
26
|
-
info_collector.collect_info_into(@beta_info)
|
27
|
-
|
28
|
-
if FastlaneCore::FastlaneFolder.setup?
|
29
|
-
@ui.message("")
|
30
|
-
@ui.header('Copy and paste the following lane into your Fastfile to use Crashlytics Beta!')
|
31
|
-
@ui.message("")
|
32
|
-
puts(lane_template.cyan)
|
33
|
-
@ui.message("")
|
34
|
-
else
|
35
|
-
fastfile = fastfile_template
|
36
|
-
FileUtils.mkdir_p('fastlane')
|
37
|
-
File.write('fastlane/Fastfile', fastfile)
|
38
|
-
@ui.success('A Fastfile has been generated for you at ./fastlane/Fastfile 🚀')
|
39
|
-
end
|
40
|
-
@ui.header('Next Steps')
|
41
|
-
@ui.success('Run the following command to build and upload to Beta by Crashlytics. 🎯')
|
42
|
-
@ui.message("\n fastlane beta")
|
43
|
-
@ui.message("")
|
44
|
-
end
|
45
|
-
|
46
|
-
def lane_template
|
47
|
-
discovered_crashlytics_path = Fastlane::Helper::CrashlyticsHelper.discover_default_crashlytics_path
|
48
|
-
|
49
|
-
unless expanded_paths_equal?(@beta_info.crashlytics_path, discovered_crashlytics_path)
|
50
|
-
crashlytics_path_arg = "\n crashlytics_path: '#{@beta_info.crashlytics_path}',"
|
51
|
-
end
|
52
|
-
|
53
|
-
beta_info_groups = @beta_info.groups_valid? ? "['#{@beta_info.groups.join("', '")}']" : "nil"
|
54
|
-
beta_info_emails = @beta_info.emails_valid? ? "['#{@beta_info.emails.join("', '")}']" : "nil"
|
55
|
-
|
56
|
-
# rubocop:disable Layout/IndentationConsistency
|
57
|
-
%{ #
|
58
|
-
# Learn more here: https://docs.fastlane.tools/getting-started/ios/beta-deployment/
|
59
|
-
# and: https://docs.fastlane.tools/getting-started/android/beta-deployment/
|
60
|
-
#
|
61
|
-
lane :beta do |values|
|
62
|
-
# Fabric generated this lane for deployment to Crashlytics Beta
|
63
|
-
# set 'export_method' to 'ad-hoc' if your Crashlytics Beta distribution uses ad-hoc provisioning
|
64
|
-
build_app(scheme: '#{@beta_info.schemes.first}', export_method: '#{@beta_info.export_method}')
|
65
|
-
|
66
|
-
emails = values[:test_email] ? values[:test_email] : #{beta_info_emails} # You can list more emails here
|
67
|
-
groups = values[:test_email] ? nil : #{beta_info_groups} # You can define groups on the web and reference them here
|
68
|
-
|
69
|
-
crashlytics(api_token: '#{@beta_info.api_key}',
|
70
|
-
build_secret: '#{@beta_info.build_secret}',#{crashlytics_path_arg}
|
71
|
-
emails: emails,
|
72
|
-
groups: groups,
|
73
|
-
notes: 'Distributed with fastlane', # Check out the changelog_from_git_commits action
|
74
|
-
notifications: true) # Should this distribution notify your testers via email?
|
75
|
-
|
76
|
-
# for all available options run `fastlane action crashlytics`
|
77
|
-
|
78
|
-
# You can notify your team in chat that a beta build has been uploaded
|
79
|
-
# slack(
|
80
|
-
# slack_url: "https://hooks.slack.com/services/YOUR/TEAM/INFO"
|
81
|
-
# channel: "beta-releases",
|
82
|
-
# message: "Successfully uploaded a beta release - see it at https://fabric.io/_/beta"
|
83
|
-
# )
|
84
|
-
end}
|
85
|
-
# rubocop:enable Layout/IndentationConsistency
|
86
|
-
end
|
87
|
-
|
88
|
-
def expanded_paths_equal?(path1, path2)
|
89
|
-
return nil if path1.nil? || path2.nil?
|
90
|
-
|
91
|
-
File.expand_path(path1) == File.expand_path(path2)
|
92
|
-
end
|
93
|
-
|
94
|
-
def fastfile_template
|
95
|
-
<<-eos
|
96
|
-
fastlane_version "#{Fastlane::VERSION}"
|
97
|
-
|
98
|
-
default_platform :ios
|
99
|
-
|
100
|
-
platform :ios do
|
101
|
-
#{lane_template}
|
102
|
-
end
|
103
|
-
eos
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module Fastlane
|
2
|
-
class CrashlyticsBetaCommandLineHandler
|
3
|
-
def self.info_from_options(options)
|
4
|
-
beta_info = CrashlyticsBetaInfo.new
|
5
|
-
beta_info.crashlytics_path = options.crashlytics_path
|
6
|
-
beta_info.api_key = options.api_key
|
7
|
-
beta_info.build_secret = options.build_secret
|
8
|
-
beta_info.emails = options.emails
|
9
|
-
beta_info.groups = options.groups
|
10
|
-
beta_info.schemes = [options.scheme] if options.scheme
|
11
|
-
beta_info.export_method = options.export_method
|
12
|
-
|
13
|
-
beta_info
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.apply_options(command)
|
17
|
-
command.option('--crashlytics_path STRING', String, 'Path to Crashlytics.framework')
|
18
|
-
command.option('--api_key STRING', String, 'Crashlytics API key')
|
19
|
-
command.option('--build_secret STRING', String, 'Crashlytics build secret')
|
20
|
-
command.option('--emails ARRAY', Array, 'List of emails to invite')
|
21
|
-
command.option('--groups ARRAY', Array, 'List of group aliases to invite')
|
22
|
-
command.option('--scheme STRING', String, 'Xcode scheme')
|
23
|
-
command.option('--export_method STRING', String, 'Provisioning profile type (ad-hoc, enterprise, development)')
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
module Fastlane
|
2
|
-
class CrashlyticsBetaInfo
|
3
|
-
EXPORT_METHODS = %w(app-store ad-hoc package enterprise development developer-id).freeze
|
4
|
-
|
5
|
-
attr_accessor :crashlytics_path
|
6
|
-
attr_accessor :api_key
|
7
|
-
attr_accessor :build_secret
|
8
|
-
attr_accessor :emails
|
9
|
-
attr_accessor :groups
|
10
|
-
attr_accessor :schemes
|
11
|
-
attr_accessor :export_method
|
12
|
-
|
13
|
-
def schemes=(schemes)
|
14
|
-
@schemes = schemes ? schemes.compact : nil
|
15
|
-
end
|
16
|
-
|
17
|
-
def emails=(emails)
|
18
|
-
@emails = emails ? emails.compact : nil
|
19
|
-
end
|
20
|
-
|
21
|
-
def groups=(groups)
|
22
|
-
@groups = groups ? groups.compact : nil
|
23
|
-
end
|
24
|
-
|
25
|
-
def api_key_valid?
|
26
|
-
!api_key.nil? && api_key.to_s.length == 40
|
27
|
-
end
|
28
|
-
|
29
|
-
def build_secret_valid?
|
30
|
-
!build_secret.nil? && build_secret.to_s.length == 64
|
31
|
-
end
|
32
|
-
|
33
|
-
def crashlytics_path_valid?
|
34
|
-
!crashlytics_path.nil? && File.exist?(crashlytics_path) && File.exist?(File.join(crashlytics_path, 'submit'))
|
35
|
-
end
|
36
|
-
|
37
|
-
def emails_valid?
|
38
|
-
!emails.nil? && emails.any? { |email| !email.empty? }
|
39
|
-
end
|
40
|
-
|
41
|
-
def groups_valid?
|
42
|
-
!groups.nil? && groups.any? { |groups| !groups.empty? }
|
43
|
-
end
|
44
|
-
|
45
|
-
def schemes_valid?
|
46
|
-
!schemes.nil? && schemes.size == 1 && !schemes.first.empty?
|
47
|
-
end
|
48
|
-
|
49
|
-
def export_method_valid?
|
50
|
-
!export_method.nil? && !export_method.empty? && EXPORT_METHODS.include?(export_method)
|
51
|
-
end
|
52
|
-
|
53
|
-
def has_all_detectable_values?
|
54
|
-
api_key && build_secret && crashlytics_path && emails && schemes
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
@@ -1,164 +0,0 @@
|
|
1
|
-
module Fastlane
|
2
|
-
class CrashlyticsBetaInfoCollector
|
3
|
-
def initialize(project_parser, user_email_fetcher, ui)
|
4
|
-
@project_parser = project_parser
|
5
|
-
@user_email_fetcher = user_email_fetcher
|
6
|
-
@ui = ui
|
7
|
-
|
8
|
-
@shown_fabric_org_help = false
|
9
|
-
end
|
10
|
-
|
11
|
-
# @param info CrashlyticsBetaInfo to supplement with needed info that is collected
|
12
|
-
def collect_info_into(info)
|
13
|
-
if user_provided_invalid_values?(info) || !info.has_all_detectable_values?
|
14
|
-
@ui.message("\nTrying to discover Beta by Crashlytics info from your project...".cyan)
|
15
|
-
parse_project_info_into(info)
|
16
|
-
fetch_email_into(info)
|
17
|
-
end
|
18
|
-
|
19
|
-
prompt_for_missing_values(info)
|
20
|
-
end
|
21
|
-
|
22
|
-
def user_provided_invalid_values?(info)
|
23
|
-
invalid = false
|
24
|
-
|
25
|
-
if info.crashlytics_path && !info.crashlytics_path_valid?
|
26
|
-
@ui.message("The crashlytics_path you provided (#{info.crashlytics_path}) is not valid.")
|
27
|
-
invalid = true
|
28
|
-
end
|
29
|
-
|
30
|
-
if info.api_key && !info.api_key_valid?
|
31
|
-
@ui.message("The api_key you provided (#{info.api_key}) is not valid.")
|
32
|
-
invalid = true
|
33
|
-
end
|
34
|
-
|
35
|
-
if info.build_secret && !info.build_secret_valid?
|
36
|
-
@ui.message("The build_secret you provided (#{info.build_secret}) is not valid.")
|
37
|
-
invalid = true
|
38
|
-
end
|
39
|
-
|
40
|
-
if info.emails && !info.emails_valid?
|
41
|
-
@ui.message("The email you provided (#{info.emails.first}) is not valid.")
|
42
|
-
invalid = true
|
43
|
-
end
|
44
|
-
|
45
|
-
if info.schemes && !info.schemes_valid?
|
46
|
-
@ui.message("The scheme you provided (#{info.schemes.first}) is not valid.")
|
47
|
-
invalid = true
|
48
|
-
end
|
49
|
-
|
50
|
-
invalid
|
51
|
-
end
|
52
|
-
|
53
|
-
def parse_project_info_into(info)
|
54
|
-
begin
|
55
|
-
info_hash = @project_parser.parse
|
56
|
-
rescue => ex
|
57
|
-
@ui.important(ex.message)
|
58
|
-
end
|
59
|
-
|
60
|
-
if info_hash
|
61
|
-
info.api_key = info_hash[:api_key] unless info.api_key_valid?
|
62
|
-
info.build_secret = info_hash[:build_secret] unless info.build_secret_valid?
|
63
|
-
info.crashlytics_path = info_hash[:crashlytics_path] unless info.crashlytics_path_valid?
|
64
|
-
info.schemes = info_hash[:schemes] unless info.schemes_valid?
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def fetch_email_into(info)
|
69
|
-
email = @user_email_fetcher.fetch
|
70
|
-
info.emails = [email] if !info.emails_valid? && email
|
71
|
-
end
|
72
|
-
|
73
|
-
def prompt_for_missing_values(info)
|
74
|
-
if !info.crashlytics_path || !info.crashlytics_path_valid?
|
75
|
-
@ui.important("A Crashlytics submit binary path couldn't be discovered from your project 🔍")
|
76
|
-
prompt_for_crashlytics_path(info)
|
77
|
-
end
|
78
|
-
|
79
|
-
if !info.api_key || !info.api_key_valid?
|
80
|
-
@ui.important("Your Fabric organization's API Key couldn't be discovered from your project 🔍")
|
81
|
-
show_fabric_org_help unless @shown_fabric_org_help
|
82
|
-
prompt_for_api_key(info)
|
83
|
-
end
|
84
|
-
|
85
|
-
if !info.build_secret || !info.build_secret_valid?
|
86
|
-
@ui.important("Your Fabric organization's Build Secret couldn't be discovered from your project 🔍")
|
87
|
-
show_fabric_org_help unless @shown_fabric_org_help
|
88
|
-
prompt_for_build_secret(info)
|
89
|
-
end
|
90
|
-
|
91
|
-
if (!info.emails || !info.emails_valid?) && !info.groups
|
92
|
-
@ui.important("Your email address couldn't be discovered from your project 🔍")
|
93
|
-
prompt_for_email(info)
|
94
|
-
end
|
95
|
-
|
96
|
-
if !info.schemes || info.schemes.empty?
|
97
|
-
@ui.important("Your scheme couldn't be discovered from your project 🔍")
|
98
|
-
prompt_for_schemes(info)
|
99
|
-
elsif info.schemes.size > 1
|
100
|
-
@ui.important("Multiple schemes were discovered from your project 🔍")
|
101
|
-
prompt_for_schemes(info)
|
102
|
-
end
|
103
|
-
|
104
|
-
info.export_method = 'development' unless info.export_method
|
105
|
-
prompt_for_export_method(info) unless info.export_method_valid?
|
106
|
-
end
|
107
|
-
|
108
|
-
def show_fabric_org_help
|
109
|
-
@ui.important("\nNavigate to https://www.fabric.io/settings/organizations, select the appropriate organization,")
|
110
|
-
@ui.important('and copy the API Key and Build Secret.')
|
111
|
-
@shown_fabric_org_help = true
|
112
|
-
end
|
113
|
-
|
114
|
-
def prompt_for_api_key(info)
|
115
|
-
loop do
|
116
|
-
info.api_key = @ui.input("Please provide your Fabric organization's API Key:").strip
|
117
|
-
break if info.api_key_valid?
|
118
|
-
@ui.message("The API Key you provided was invalid (must be 40 characters).")
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
def prompt_for_build_secret(info)
|
123
|
-
loop do
|
124
|
-
info.build_secret = @ui.input("Please provide your Fabric organization's Build Secret:").strip
|
125
|
-
break if info.build_secret_valid?
|
126
|
-
@ui.message("The Build Secret you provided was invalid (must be 64 characters).")
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def prompt_for_crashlytics_path(info)
|
131
|
-
loop do
|
132
|
-
info.crashlytics_path = @ui.input("Please provide the path to Crashlytics.framework:").strip
|
133
|
-
break if info.crashlytics_path_valid?
|
134
|
-
@ui.message("A submit binary could not be found at the framework path you provided.")
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def prompt_for_email(info)
|
139
|
-
loop do
|
140
|
-
info.emails = [@ui.input("Please enter an email address to distribute the beta to:").strip]
|
141
|
-
break if info.emails_valid?
|
142
|
-
@ui.message("You must provide an email address.")
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def prompt_for_schemes(info)
|
147
|
-
current_schemes = info.schemes
|
148
|
-
if current_schemes.nil? || current_schemes.empty?
|
149
|
-
loop do
|
150
|
-
info.schemes = [@ui.input("Please enter the name of the scheme you would like to use:").strip]
|
151
|
-
break if info.schemes_valid?
|
152
|
-
@ui.message("You must provide a scheme name.")
|
153
|
-
end
|
154
|
-
else
|
155
|
-
info.schemes = [@ui.choose("\nWhich scheme would you like to use?", current_schemes)]
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def prompt_for_export_method(info)
|
160
|
-
@ui.important("The export method you entered was not valid.")
|
161
|
-
info.export_method = @ui.choose("\nWhich export method would you like to use?", CrashlyticsBetaInfo::EXPORT_METHODS)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module Fastlane
|
2
|
-
class CrashlyticsBetaUi
|
3
|
-
def success(text)
|
4
|
-
puts(text.green)
|
5
|
-
end
|
6
|
-
|
7
|
-
def message(text)
|
8
|
-
puts(text)
|
9
|
-
end
|
10
|
-
|
11
|
-
def header(text)
|
12
|
-
FastlaneCore::UI.header(text)
|
13
|
-
end
|
14
|
-
|
15
|
-
def important(text)
|
16
|
-
puts(text.yellow)
|
17
|
-
end
|
18
|
-
|
19
|
-
def input(text)
|
20
|
-
UI.input(text)
|
21
|
-
end
|
22
|
-
|
23
|
-
def confirm(text)
|
24
|
-
UI.confirm(text)
|
25
|
-
end
|
26
|
-
|
27
|
-
def choose(text, options)
|
28
|
-
return options[0] unless UI.interactive?
|
29
|
-
message(text)
|
30
|
-
Kernel.choose(*options)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Fastlane
|
2
|
-
class CrashlyticsBetaUserEmailFetcher
|
3
|
-
def initialize(app_file_path = nil)
|
4
|
-
@app_file_config = CredentialsManager::AppfileConfig.new(app_file_path)
|
5
|
-
end
|
6
|
-
|
7
|
-
def fetch
|
8
|
-
@app_file_config.data[:itunes_connect_id] ||
|
9
|
-
@app_file_config.data[:apple_dev_portal_id] ||
|
10
|
-
@app_file_config.data[:apple_id]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'xcodeproj'
|
2
|
-
|
3
|
-
module Fastlane
|
4
|
-
class CrashlyticsProjectParser
|
5
|
-
# @param project_file_path path to a .xcodeproj file
|
6
|
-
def initialize(config = {})
|
7
|
-
FastlaneCore::Project.detect_projects(config)
|
8
|
-
@project = FastlaneCore::Project.new(config, xcodebuild_list_silent: true, xcodebuild_suppress_stderr: true)
|
9
|
-
|
10
|
-
@target_name = @project.default_build_settings(key: 'TARGETNAME')
|
11
|
-
@project_file_path = @project.is_workspace ? @project.path.gsub('xcworkspace', 'xcodeproj') : @project.path
|
12
|
-
end
|
13
|
-
|
14
|
-
def parse
|
15
|
-
results = {
|
16
|
-
schemes: @project.schemes
|
17
|
-
}
|
18
|
-
|
19
|
-
xcode_project = Xcodeproj::Project.open(@project_file_path)
|
20
|
-
target = xcode_project.targets.find { |t| t.name == @target_name }
|
21
|
-
|
22
|
-
UI.crash!("Unable to locate a target by the name of #{@target_name}") if target.nil?
|
23
|
-
|
24
|
-
scripts = target.build_phases.select { |t| t.class == Xcodeproj::Project::Object::PBXShellScriptBuildPhase }
|
25
|
-
crash_script = scripts.find { |s| includes_run_script?(s.shell_script) }
|
26
|
-
|
27
|
-
UI.user_error!("Unable to find Crashlytics Run Script Build Phase") if crash_script.nil?
|
28
|
-
|
29
|
-
script_array = crash_script.shell_script.split('\n').find { |line| includes_run_script?(line) }.split(' ')
|
30
|
-
if script_array.count == 3
|
31
|
-
results.merge!({
|
32
|
-
# The run script build phase probably refers to Fabric.framework/run, but the submit binary
|
33
|
-
# only lives in the Crashlytics.framework, so we'll substitute and try to resolve it that way.
|
34
|
-
crashlytics_path: File.dirname(script_array[0].gsub("Fabric.framework", "Crashlytics.framework")),
|
35
|
-
api_key: script_array[1],
|
36
|
-
build_secret: script_array[2]
|
37
|
-
})
|
38
|
-
end
|
39
|
-
|
40
|
-
results
|
41
|
-
end
|
42
|
-
|
43
|
-
def includes_run_script?(string)
|
44
|
-
['Fabric/run', 'Crashlytics/run', 'Fabric.framework/run', 'Crashlytics.framework/run'].any? do |script_path_fragment|
|
45
|
-
string.include?(script_path_fragment)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|