fastlane 2.99.1 → 2.100.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 +74 -74
- data/deliver/lib/deliver/html_generator.rb +2 -1
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +2 -2
- data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +1 -1
- data/fastlane/lib/fastlane/actions/github_api.rb +2 -2
- data/fastlane/lib/fastlane/actions/jira.rb +14 -1
- data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +1 -0
- data/fastlane/lib/fastlane/actions/pod_push.rb +1 -0
- data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +22 -4
- data/fastlane/lib/fastlane/actions/run_tests.rb +5 -0
- data/fastlane/lib/fastlane/actions/sonar.rb +7 -1
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +14 -0
- data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +11 -3
- data/fastlane/lib/fastlane/helper/podspec_helper.rb +1 -1
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +1 -0
- data/fastlane/lib/fastlane/swift_lane_manager.rb +4 -0
- data/fastlane/lib/fastlane/version.rb +1 -1
- data/fastlane/swift/Deliverfile.swift +1 -1
- data/fastlane/swift/Fastlane.swift +18 -6
- 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
- data/fastlane/swift/SnapshotfileProtocol.swift +3 -1
- data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +23 -0
- data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +1 -1
- data/pilot/lib/pilot/options.rb +1 -1
- data/produce/lib/produce/developer_center.rb +2 -2
- data/snapshot/lib/assets/SnapshotHelper.swift +2 -2
- data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +11 -0
- data/snapshot/lib/snapshot/options.rb +7 -0
- data/snapshot/lib/snapshot/test_command_generator.rb +1 -1
- data/snapshot/lib/snapshot/test_command_generator_base.rb +18 -1
- data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +1 -1
- data/spaceship/README.md +1 -1
- data/spaceship/lib/spaceship/portal/app_service.rb +1 -1
- data/spaceship/lib/spaceship/portal/portal_client.rb +0 -1
- data/spaceship/lib/spaceship/tunes/app_ratings.rb +1 -1
- data/spaceship/lib/spaceship/tunes/spaceship.rb +2 -2
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -2
- data/supply/lib/supply/client.rb +10 -1
- data/supply/lib/supply/uploader.rb +7 -4
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 603c6c4c52a4b7e3ee28a74647967d1a164d57ec
|
4
|
+
data.tar.gz: a16ae832039304eeb3a65d8329cc5c2bfd40539f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9a120cf0031540c113f5b796351f02988ef8868edb67c7cf1941371459ba6a8f36140293ecd4f76476856ade5a7c7287f743c63c13cfeabbd3b14ce780a73bd
|
7
|
+
data.tar.gz: 9165f7db15d367bcf5a9503a7a2d304f6c141d56873f8e7104abe5c927ad788717bac03775b84cc4a7e0506b2957d31c3cef592937addadade8ade982d419c8c
|
data/README.md
CHANGED
@@ -32,17 +32,49 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
32
32
|
|
33
33
|
<table id='team'>
|
34
34
|
<tr>
|
35
|
+
<td id='jorge-revuelta-h'>
|
36
|
+
<a href='https://github.com/minuscorp'>
|
37
|
+
<img src='https://github.com/minuscorp.png?size=140'>
|
38
|
+
</a>
|
39
|
+
<h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
|
40
|
+
</td>
|
41
|
+
<td id='maksym-grebenets'>
|
42
|
+
<a href='https://github.com/mgrebenets'>
|
43
|
+
<img src='https://github.com/mgrebenets.png?size=140'>
|
44
|
+
</a>
|
45
|
+
<h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
|
46
|
+
</td>
|
35
47
|
<td id='danielle-tomlinson'>
|
36
48
|
<a href='https://github.com/DanToml'>
|
37
49
|
<img src='https://github.com/DanToml.png?size=140'>
|
38
50
|
</a>
|
39
51
|
<h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
|
40
52
|
</td>
|
41
|
-
<td id='
|
42
|
-
<a href='https://github.com/
|
43
|
-
<img src='https://github.com/
|
53
|
+
<td id='matthew-ellis'>
|
54
|
+
<a href='https://github.com/matthewellis'>
|
55
|
+
<img src='https://github.com/matthewellis.png?size=140'>
|
44
56
|
</a>
|
45
|
-
<h4 align='center'>
|
57
|
+
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
58
|
+
</td>
|
59
|
+
<td id='helmut-januschka'>
|
60
|
+
<a href='https://github.com/hjanuschka'>
|
61
|
+
<img src='https://github.com/hjanuschka.png?size=140'>
|
62
|
+
</a>
|
63
|
+
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
64
|
+
</td>
|
65
|
+
</tr>
|
66
|
+
<tr>
|
67
|
+
<td id='luka-mirosevic'>
|
68
|
+
<a href='https://github.com/lmirosevic'>
|
69
|
+
<img src='https://github.com/lmirosevic.png?size=140'>
|
70
|
+
</a>
|
71
|
+
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
72
|
+
</td>
|
73
|
+
<td id='andrew-mcburney'>
|
74
|
+
<a href='https://github.com/AndrewMcBurney'>
|
75
|
+
<img src='https://github.com/AndrewMcBurney.png?size=140'>
|
76
|
+
</a>
|
77
|
+
<h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
|
46
78
|
</td>
|
47
79
|
<td id='olivier-halligon'>
|
48
80
|
<a href='https://github.com/AliSoftware'>
|
@@ -50,31 +82,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
50
82
|
</a>
|
51
83
|
<h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
|
52
84
|
</td>
|
53
|
-
<td id='
|
54
|
-
<a href='https://github.com/
|
55
|
-
<img src='https://github.com/
|
85
|
+
<td id='aaron-brager'>
|
86
|
+
<a href='https://github.com/getaaron'>
|
87
|
+
<img src='https://github.com/getaaron.png?size=140'>
|
56
88
|
</a>
|
57
|
-
<h4 align='center'><a href='https://twitter.com/
|
89
|
+
<h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
|
58
90
|
</td>
|
59
|
-
<td id='
|
60
|
-
<a href='https://github.com/
|
61
|
-
<img src='https://github.com/
|
91
|
+
<td id='kohki-miki'>
|
92
|
+
<a href='https://github.com/giginet'>
|
93
|
+
<img src='https://github.com/giginet.png?size=140'>
|
62
94
|
</a>
|
63
|
-
<h4 align='center'><a href='https://twitter.com/
|
95
|
+
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
64
96
|
</td>
|
65
97
|
</tr>
|
66
98
|
<tr>
|
67
|
-
<td id='
|
68
|
-
<a href='https://github.com/
|
69
|
-
<img src='https://github.com/
|
99
|
+
<td id='jérôme-lacoste'>
|
100
|
+
<a href='https://github.com/lacostej'>
|
101
|
+
<img src='https://github.com/lacostej.png?size=140'>
|
70
102
|
</a>
|
71
|
-
<h4 align='center'><a href='https://twitter.com/
|
103
|
+
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
72
104
|
</td>
|
73
|
-
<td id='
|
74
|
-
<a href='https://github.com/
|
75
|
-
<img src='https://github.com/
|
105
|
+
<td id='iulian-onofrei'>
|
106
|
+
<a href='https://github.com/revolter'>
|
107
|
+
<img src='https://github.com/revolter.png?size=140'>
|
76
108
|
</a>
|
77
|
-
<h4 align='center'><a href='https://twitter.com/
|
109
|
+
<h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
|
78
110
|
</td>
|
79
111
|
<td id='joshua-liebowitz'>
|
80
112
|
<a href='https://github.com/taquitos'>
|
@@ -82,37 +114,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
82
114
|
</a>
|
83
115
|
<h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
|
84
116
|
</td>
|
85
|
-
<td id='
|
86
|
-
<a href='https://github.com/
|
87
|
-
<img src='https://github.com/
|
117
|
+
<td id='stefan-natchev'>
|
118
|
+
<a href='https://github.com/snatchev'>
|
119
|
+
<img src='https://github.com/snatchev.png?size=140'>
|
88
120
|
</a>
|
89
|
-
<h4 align='center'><a href='https://twitter.com/
|
121
|
+
<h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
|
90
122
|
</td>
|
91
|
-
<td id='
|
92
|
-
<a href='https://github.com/
|
93
|
-
<img src='https://github.com/
|
123
|
+
<td id='jimmy-dee'>
|
124
|
+
<a href='https://github.com/jdee'>
|
125
|
+
<img src='https://github.com/jdee.png?size=140'>
|
94
126
|
</a>
|
95
|
-
<h4 align='center'
|
127
|
+
<h4 align='center'>Jimmy Dee</h4>
|
96
128
|
</td>
|
97
129
|
</tr>
|
98
130
|
<tr>
|
99
|
-
<td id='
|
100
|
-
<a href='https://github.com/
|
101
|
-
<img src='https://github.com/
|
102
|
-
</a>
|
103
|
-
<h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
|
104
|
-
</td>
|
105
|
-
<td id='aaron-brager'>
|
106
|
-
<a href='https://github.com/getaaron'>
|
107
|
-
<img src='https://github.com/getaaron.png?size=140'>
|
131
|
+
<td id='manu-wallner'>
|
132
|
+
<a href='https://github.com/milch'>
|
133
|
+
<img src='https://github.com/milch.png?size=140'>
|
108
134
|
</a>
|
109
|
-
<h4 align='center'><a href='https://twitter.com/
|
135
|
+
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
110
136
|
</td>
|
111
|
-
<td id='
|
112
|
-
<a href='https://github.com/
|
113
|
-
<img src='https://github.com/
|
137
|
+
<td id='fumiya-nakamura'>
|
138
|
+
<a href='https://github.com/nafu'>
|
139
|
+
<img src='https://github.com/nafu.png?size=140'>
|
114
140
|
</a>
|
115
|
-
<h4 align='center'><a href='https://twitter.com/
|
141
|
+
<h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
|
116
142
|
</td>
|
117
143
|
<td id='felix-krause'>
|
118
144
|
<a href='https://github.com/KrauseFx'>
|
@@ -120,6 +146,12 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
120
146
|
</a>
|
121
147
|
<h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
|
122
148
|
</td>
|
149
|
+
<td id='jan-piotrowski'>
|
150
|
+
<a href='https://github.com/janpio'>
|
151
|
+
<img src='https://github.com/janpio.png?size=140'>
|
152
|
+
</a>
|
153
|
+
<h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
|
154
|
+
</td>
|
123
155
|
<td id='josh-holtz'>
|
124
156
|
<a href='https://github.com/joshdholtz'>
|
125
157
|
<img src='https://github.com/joshdholtz.png?size=140'>
|
@@ -127,38 +159,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
|
|
127
159
|
<h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
|
128
160
|
</td>
|
129
161
|
</tr>
|
130
|
-
<tr>
|
131
|
-
<td id='kohki-miki'>
|
132
|
-
<a href='https://github.com/giginet'>
|
133
|
-
<img src='https://github.com/giginet.png?size=140'>
|
134
|
-
</a>
|
135
|
-
<h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
|
136
|
-
</td>
|
137
|
-
<td id='helmut-januschka'>
|
138
|
-
<a href='https://github.com/hjanuschka'>
|
139
|
-
<img src='https://github.com/hjanuschka.png?size=140'>
|
140
|
-
</a>
|
141
|
-
<h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
|
142
|
-
</td>
|
143
|
-
<td id='jérôme-lacoste'>
|
144
|
-
<a href='https://github.com/lacostej'>
|
145
|
-
<img src='https://github.com/lacostej.png?size=140'>
|
146
|
-
</a>
|
147
|
-
<h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
|
148
|
-
</td>
|
149
|
-
<td id='manu-wallner'>
|
150
|
-
<a href='https://github.com/milch'>
|
151
|
-
<img src='https://github.com/milch.png?size=140'>
|
152
|
-
</a>
|
153
|
-
<h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
|
154
|
-
</td>
|
155
|
-
<td id='luka-mirosevic'>
|
156
|
-
<a href='https://github.com/lmirosevic'>
|
157
|
-
<img src='https://github.com/lmirosevic.png?size=140'>
|
158
|
-
</a>
|
159
|
-
<h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
|
160
|
-
</td>
|
161
|
-
</tr>
|
162
162
|
</table>
|
163
163
|
|
164
164
|
Special thanks to all [contributors](https://github.com/fastlane/fastlane/graphs/contributors) for extending and improving _fastlane_.
|
@@ -9,7 +9,8 @@ module Deliver
|
|
9
9
|
|
10
10
|
def run(options, screenshots)
|
11
11
|
begin
|
12
|
-
|
12
|
+
fastlane_path = FastlaneCore::FastlaneFolder.path
|
13
|
+
html_path = self.render(options, screenshots, fastlane_path)
|
13
14
|
rescue => ex
|
14
15
|
UI.error(ex.inspect)
|
15
16
|
UI.error(ex.backtrace.join("\n"))
|
@@ -120,7 +120,7 @@ module Fastlane
|
|
120
120
|
#####################################################
|
121
121
|
|
122
122
|
def self.description
|
123
|
-
"Download dSYM files from
|
123
|
+
"Download dSYM files from App Store Connect for Bitcode apps"
|
124
124
|
end
|
125
125
|
|
126
126
|
def self.details
|
@@ -135,7 +135,7 @@ module Fastlane
|
|
135
135
|
SAMPLE
|
136
136
|
|
137
137
|
[
|
138
|
-
"This action downloads dSYM files from
|
138
|
+
"This action downloads dSYM files from App Store Connect after the ipa gets re-compiled by Apple. Useful if you have Bitcode enabled.".markdown_preserve_newlines,
|
139
139
|
sample
|
140
140
|
].join("\n")
|
141
141
|
end
|
@@ -9,7 +9,7 @@ module Fastlane
|
|
9
9
|
branch = params[:branch]
|
10
10
|
branch_expr = /#{branch}/
|
11
11
|
if Actions.git_branch =~ branch_expr
|
12
|
-
UI.success("Git branch
|
12
|
+
UI.success("Git branch matches `#{branch}`, all good! 💪")
|
13
13
|
else
|
14
14
|
UI.user_error!("Git is not on a branch matching `#{branch}`. Current branch is `#{Actions.git_branch}`! Please ensure the repo is checked out to the correct branch.")
|
15
15
|
end
|
@@ -16,7 +16,7 @@ module Fastlane
|
|
16
16
|
headers = construct_headers(params[:api_token], params[:headers])
|
17
17
|
payload = construct_body(params[:body], params[:raw_body])
|
18
18
|
error_handlers = params[:error_handlers] || {}
|
19
|
-
secure = params[:secure]
|
19
|
+
secure = params[:secure]
|
20
20
|
|
21
21
|
response = call_endpoint(
|
22
22
|
url,
|
@@ -140,7 +140,7 @@ module Fastlane
|
|
140
140
|
FastlaneCore::ConfigItem.new(key: :secure,
|
141
141
|
env_name: "FL_GITHUB_API_SECURE",
|
142
142
|
description: "Optionally disable secure requests (ssl_verify_peer)",
|
143
|
-
|
143
|
+
type: Boolean,
|
144
144
|
default_value: true,
|
145
145
|
optional: true)
|
146
146
|
]
|
@@ -6,8 +6,8 @@ module Fastlane
|
|
6
6
|
require 'jira-ruby'
|
7
7
|
|
8
8
|
site = params[:url]
|
9
|
-
context_path = ""
|
10
9
|
auth_type = :basic
|
10
|
+
context_path = params[:context_path]
|
11
11
|
username = params[:username]
|
12
12
|
password = params[:password]
|
13
13
|
ticket_id = params[:ticket_id]
|
@@ -43,6 +43,11 @@ module Fastlane
|
|
43
43
|
verify_block: proc do |value|
|
44
44
|
UI.user_error!("No url for Jira given, pass using `url: 'url'`") if value.to_s.length == 0
|
45
45
|
end),
|
46
|
+
FastlaneCore::ConfigItem.new(key: :context_path,
|
47
|
+
env_name: "FL_JIRA_CONTEXT_PATH",
|
48
|
+
description: "Appends to the url (ex: \"/jira\")",
|
49
|
+
optional: true,
|
50
|
+
default_value: ""),
|
46
51
|
FastlaneCore::ConfigItem.new(key: :username,
|
47
52
|
env_name: "FL_JIRA_USERNAME",
|
48
53
|
description: "Username for JIRA instance",
|
@@ -90,6 +95,14 @@ module Fastlane
|
|
90
95
|
password: "Your password",
|
91
96
|
ticket_id: "Ticket ID, i.e. IOS-123",
|
92
97
|
comment_text: "Text to post as a comment"
|
98
|
+
)',
|
99
|
+
'jira(
|
100
|
+
url: "https://yourserverdomain.com",
|
101
|
+
context_path: "/jira",
|
102
|
+
username: "Your username",
|
103
|
+
password: "Your password",
|
104
|
+
ticket_id: "Ticket ID, i.e. IOS-123",
|
105
|
+
comment_text: "Text to post as a comment"
|
93
106
|
)'
|
94
107
|
]
|
95
108
|
end
|
@@ -61,6 +61,7 @@ module Fastlane
|
|
61
61
|
description: "The sources of repos you want the pod spec to lint with, separated by commas",
|
62
62
|
optional: true,
|
63
63
|
is_string: false,
|
64
|
+
type: Array,
|
64
65
|
verify_block: proc do |value|
|
65
66
|
UI.user_error!("Sources must be an array.") unless value.kind_of?(Array)
|
66
67
|
end),
|
@@ -80,6 +80,7 @@ module Fastlane
|
|
80
80
|
description: "The sources of repos you want the pod spec to lint with, separated by commas",
|
81
81
|
optional: true,
|
82
82
|
is_string: false,
|
83
|
+
type: Array,
|
83
84
|
verify_block: proc do |value|
|
84
85
|
UI.user_error!("Sources must be an array.") unless value.kind_of?(Array)
|
85
86
|
end),
|
@@ -2,13 +2,31 @@ module Fastlane
|
|
2
2
|
module Actions
|
3
3
|
class ResetSimulatorContentsAction < Action
|
4
4
|
def self.run(params)
|
5
|
+
ios_versions = params[:ios]
|
6
|
+
|
5
7
|
if Helper.xcode_at_least?("9")
|
6
|
-
|
7
|
-
|
8
|
+
reset_xcode9_and_higher(ios_versions)
|
9
|
+
else
|
10
|
+
reset_up_to_xcode8(ios_versions)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.reset_xcode9_and_higher(ios_versions)
|
15
|
+
UI.verbose("Resetting simulator contents for Xcode 9 and later")
|
16
|
+
simulators = FastlaneCore::DeviceManager.simulators('iOS')
|
17
|
+
if ios_versions
|
18
|
+
simulators.select! { |s| ios_versions.include?(s.os_version) }
|
19
|
+
end
|
20
|
+
simulators.each do |simulator|
|
21
|
+
FastlaneCore::Simulator.reset(udid: simulator.udid)
|
8
22
|
end
|
23
|
+
UI.success('Simulators reset')
|
24
|
+
end
|
9
25
|
|
10
|
-
|
11
|
-
|
26
|
+
def self.reset_up_to_xcode8(ios_versions)
|
27
|
+
UI.verbose("Resetting simulator contents for Xcode 8 and earlier")
|
28
|
+
if ios_versions
|
29
|
+
ios_versions.each do |os_version|
|
12
30
|
FastlaneCore::Simulator.reset_all_by_version(os_version: os_version)
|
13
31
|
end
|
14
32
|
else
|
@@ -22,6 +22,11 @@ module Fastlane
|
|
22
22
|
Scan::Manager.new.work(values)
|
23
23
|
|
24
24
|
return true
|
25
|
+
rescue FastlaneCore::Interface::FastlaneBuildFailure => ex
|
26
|
+
# Specifically catching FastlaneBuildFailure to prevent build/compile errors from being
|
27
|
+
# silenced when :fail_build is set to false
|
28
|
+
# :fail_build should only suppress testing failures
|
29
|
+
raise ex
|
25
30
|
rescue => ex
|
26
31
|
if values[:fail_build]
|
27
32
|
raise ex
|
@@ -19,6 +19,7 @@ module Fastlane
|
|
19
19
|
sonar_scanner_args << "-Dsonar.language=\"#{params[:project_language]}\"" if params[:project_language]
|
20
20
|
sonar_scanner_args << "-Dsonar.sourceEncoding=\"#{params[:source_encoding]}\"" if params[:source_encoding]
|
21
21
|
sonar_scanner_args << "-Dsonar.login=\"#{params[:sonar_login]}\"" if params[:sonar_login]
|
22
|
+
sonar_scanner_args << "-Dsonar.host.url=\"#{params[:sonar_url]}\"" if params[:sonar_url]
|
22
23
|
sonar_scanner_args << params[:sonar_runner_args] if params[:sonar_runner_args]
|
23
24
|
|
24
25
|
command = [
|
@@ -91,7 +92,12 @@ module Fastlane
|
|
91
92
|
description: "Pass the Sonar Login token (e.g: xxxxxxprivate_token_XXXXbXX7e)",
|
92
93
|
optional: true,
|
93
94
|
is_string: true,
|
94
|
-
sensitive: true)
|
95
|
+
sensitive: true),
|
96
|
+
FastlaneCore::ConfigItem.new(key: :sonar_url,
|
97
|
+
env_name: "FL_SONAR_URL",
|
98
|
+
description: "Pass the url of the Sonar server",
|
99
|
+
optional: true,
|
100
|
+
is_string: true)
|
95
101
|
]
|
96
102
|
end
|
97
103
|
|
@@ -18,6 +18,9 @@ module Fastlane
|
|
18
18
|
dsym_paths << params[:dsym_path] if params[:dsym_path]
|
19
19
|
dsym_paths += Actions.lane_context[SharedValues::DSYM_PATHS] if Actions.lane_context[SharedValues::DSYM_PATHS]
|
20
20
|
|
21
|
+
# Allows adding of additional multiple dsym_paths since :dsym_path can be autoset by other actions
|
22
|
+
dsym_paths += params[:dsym_paths] if params[:dsym_paths]
|
23
|
+
|
21
24
|
if dsym_paths.count == 0
|
22
25
|
UI.error("Couldn't find any dSYMs, please pass them using the dsym_path option")
|
23
26
|
return nil
|
@@ -151,6 +154,17 @@ module Fastlane
|
|
151
154
|
UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
152
155
|
UI.user_error!("Symbolication file needs to be dSYM or zip") unless value.end_with?(".zip", ".dSYM")
|
153
156
|
end),
|
157
|
+
FastlaneCore::ConfigItem.new(key: :dsym_paths,
|
158
|
+
env_name: "FL_UPLOAD_SYMBOLS_TO_CRASHLYTICS_DSYM_PATHS",
|
159
|
+
description: "Paths to the DSYM files or zips to upload",
|
160
|
+
optional: true,
|
161
|
+
type: Array,
|
162
|
+
verify_block: proc do |values|
|
163
|
+
values.each do |value|
|
164
|
+
UI.user_error!("Couldn't find file at path '#{File.expand_path(value)}'") unless File.exist?(value)
|
165
|
+
UI.user_error!("Symbolication file needs to be dSYM or zip") unless value.end_with?(".zip", ".dSYM")
|
166
|
+
end
|
167
|
+
end),
|
154
168
|
FastlaneCore::ConfigItem.new(key: :api_token,
|
155
169
|
env_name: "CRASHLYTICS_API_TOKEN",
|
156
170
|
sensitive: true,
|
@@ -8,8 +8,13 @@ module Fastlane
|
|
8
8
|
path = params[:crashlytics_path]
|
9
9
|
|
10
10
|
# Finding submit binary inside of given Crashlytics path (for backwards compatability)
|
11
|
-
if path
|
12
|
-
|
11
|
+
if path
|
12
|
+
if File.basename(path) != "submit"
|
13
|
+
path = Dir[File.join(path, '**', 'submit')].last
|
14
|
+
UI.verbose(":crashlytics_path passed through parameters did not point to a submit binary. Using this submit binary on that path instead: '#{path}'")
|
15
|
+
else
|
16
|
+
UI.verbose("Using :crashlytics_path passed in through parameters: '#{path}'")
|
17
|
+
end
|
13
18
|
end
|
14
19
|
|
15
20
|
# Check for submit binary outside of Crashlytics.framework (for Crashlytics 3.4.1 and over)
|
@@ -20,7 +25,7 @@ module Fastlane
|
|
20
25
|
path ||= Dir["./**/Crashlytics.framework/submit"].last
|
21
26
|
|
22
27
|
if path && path.downcase.include?("crashlytics.framework")
|
23
|
-
UI.deprecated("Crashlytics has
|
28
|
+
UI.deprecated("Crashlytics has moved the submit binary outside of Crashlytics.framework directory as of 3.4.1. Please change :crashlytics_path to `<PODS_ROOT>/Crashlytics/submit`")
|
24
29
|
end
|
25
30
|
|
26
31
|
return path
|
@@ -31,6 +36,9 @@ module Fastlane
|
|
31
36
|
unless submit_binary
|
32
37
|
UI.user_error!("Couldn't find Crashlytics' submit binary in current directory. Make sure to add the 'Crashlytics' pod to your 'Podfile' and run `pod update`")
|
33
38
|
end
|
39
|
+
if File.basename(submit_binary) != "submit"
|
40
|
+
UI.user_error!("Invalid crashlytics path was detected with '#{submit_binary}'. Path must point to the `submit` binary (example: './Pods/Crashlytics/submit')")
|
41
|
+
end
|
34
42
|
submit_binary = "Crashlytics.framework/submit" if Helper.test?
|
35
43
|
|
36
44
|
command = []
|
@@ -10,7 +10,7 @@ module Fastlane
|
|
10
10
|
def initialize(path = nil, require_variable_prefix = true)
|
11
11
|
version_var_name = 'version'
|
12
12
|
variable_prefix = require_variable_prefix ? /\w\./ : //
|
13
|
-
@version_regex = /^(?<begin>[^#]*#{variable_prefix}#{version_var_name}\s*=\s*['"])(?<value>(?<major>[0-9]+)(\.(?<minor>[0-9]+))?(\.(?<patch>[0-9]+))?(?<appendix>(\.[0-9]+)*)?)(?<end>['"])/i
|
13
|
+
@version_regex = /^(?<begin>[^#]*#{variable_prefix}#{version_var_name}\s*=\s*['"])(?<value>(?<major>[0-9]+)(\.(?<minor>[0-9]+))?(\.(?<patch>[0-9]+))?(?<appendix>(\.[0-9]+)*)?(-(?<prerelease>(.+)))?)(?<end>['"])/i
|
14
14
|
|
15
15
|
return unless (path || '').length > 0
|
16
16
|
UI.user_error!("Could not find podspec file at path '#{path}'") unless File.exist?(path)
|
@@ -10,6 +10,10 @@ module Fastlane
|
|
10
10
|
UI.user_error!("lane must be a string") unless lane.kind_of?(String) || lane.nil?
|
11
11
|
UI.user_error!("parameters must be a hash") unless parameters.kind_of?(Hash) || parameters.nil?
|
12
12
|
|
13
|
+
# Sets environment variable and lane context for lane name
|
14
|
+
ENV["FASTLANE_LANE_NAME"] = lane
|
15
|
+
Actions.lane_context[Actions::SharedValues::LANE_NAME] = lane
|
16
|
+
|
13
17
|
# xcodeproj has a bug in certain versions that causes it to change directories
|
14
18
|
# and not return to the original working directory
|
15
19
|
# https://github.com/CocoaPods/Xcodeproj/issues/426
|
@@ -724,6 +724,7 @@ func captureIosScreenshots(workspace: String? = nil,
|
|
724
724
|
numberOfRetries: Int = 1,
|
725
725
|
stopAfterFirstError: Bool = false,
|
726
726
|
derivedDataPath: String? = nil,
|
727
|
+
resultBundle: Bool = false,
|
727
728
|
testTargetName: String? = nil,
|
728
729
|
namespaceLogFiles: String? = nil,
|
729
730
|
concurrentSimulators: Bool = true) {
|
@@ -756,6 +757,7 @@ func captureIosScreenshots(workspace: String? = nil,
|
|
756
757
|
RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
|
757
758
|
RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
|
758
759
|
RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
|
760
|
+
RubyCommand.Argument(name: "result_bundle", value: resultBundle),
|
759
761
|
RubyCommand.Argument(name: "test_target_name", value: testTargetName),
|
760
762
|
RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
|
761
763
|
RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
|
@@ -790,6 +792,7 @@ func captureScreenshots(workspace: String? = nil,
|
|
790
792
|
numberOfRetries: Int = 1,
|
791
793
|
stopAfterFirstError: Bool = false,
|
792
794
|
derivedDataPath: String? = nil,
|
795
|
+
resultBundle: Bool = false,
|
793
796
|
testTargetName: String? = nil,
|
794
797
|
namespaceLogFiles: String? = nil,
|
795
798
|
concurrentSimulators: Bool = true) {
|
@@ -822,6 +825,7 @@ func captureScreenshots(workspace: String? = nil,
|
|
822
825
|
RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
|
823
826
|
RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
|
824
827
|
RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
|
828
|
+
RubyCommand.Argument(name: "result_bundle", value: resultBundle),
|
825
829
|
RubyCommand.Argument(name: "test_target_name", value: testTargetName),
|
826
830
|
RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
|
827
831
|
RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
|
@@ -1968,11 +1972,13 @@ func jazzy(config: String? = nil) {
|
|
1968
1972
|
_ = runner.executeCommand(command)
|
1969
1973
|
}
|
1970
1974
|
func jira(url: String,
|
1975
|
+
contextPath: String = "",
|
1971
1976
|
username: String,
|
1972
1977
|
password: String,
|
1973
1978
|
ticketId: String,
|
1974
1979
|
commentText: String) {
|
1975
1980
|
let command = RubyCommand(commandID: "", methodName: "jira", className: nil, args: [RubyCommand.Argument(name: "url", value: url),
|
1981
|
+
RubyCommand.Argument(name: "context_path", value: contextPath),
|
1976
1982
|
RubyCommand.Argument(name: "username", value: username),
|
1977
1983
|
RubyCommand.Argument(name: "password", value: password),
|
1978
1984
|
RubyCommand.Argument(name: "ticket_id", value: ticketId),
|
@@ -2340,7 +2346,7 @@ func pluginScores(outputPath: String,
|
|
2340
2346
|
func podLibLint(useBundleExec: Bool = true,
|
2341
2347
|
verbose: String? = nil,
|
2342
2348
|
allowWarnings: String? = nil,
|
2343
|
-
sources: String? = nil,
|
2349
|
+
sources: [String]? = nil,
|
2344
2350
|
useLibraries: Bool = false,
|
2345
2351
|
failFast: Bool = false,
|
2346
2352
|
`private`: Bool = false,
|
@@ -2360,7 +2366,7 @@ func podPush(useBundleExec: Bool = false,
|
|
2360
2366
|
repo: String? = nil,
|
2361
2367
|
allowWarnings: String? = nil,
|
2362
2368
|
useLibraries: String? = nil,
|
2363
|
-
sources: String? = nil,
|
2369
|
+
sources: [String]? = nil,
|
2364
2370
|
swiftVersion: String? = nil,
|
2365
2371
|
verbose: Bool = false) {
|
2366
2372
|
let command = RubyCommand(commandID: "", methodName: "pod_push", className: nil, args: [RubyCommand.Argument(name: "use_bundle_exec", value: useBundleExec),
|
@@ -3134,6 +3140,7 @@ func snapshot(workspace: String? = snapshotfile.workspace,
|
|
3134
3140
|
numberOfRetries: Int = snapshotfile.numberOfRetries,
|
3135
3141
|
stopAfterFirstError: Bool = snapshotfile.stopAfterFirstError,
|
3136
3142
|
derivedDataPath: String? = snapshotfile.derivedDataPath,
|
3143
|
+
resultBundle: Bool = snapshotfile.resultBundle,
|
3137
3144
|
testTargetName: String? = snapshotfile.testTargetName,
|
3138
3145
|
namespaceLogFiles: String? = snapshotfile.namespaceLogFiles,
|
3139
3146
|
concurrentSimulators: Bool = snapshotfile.concurrentSimulators) {
|
@@ -3166,6 +3173,7 @@ func snapshot(workspace: String? = snapshotfile.workspace,
|
|
3166
3173
|
RubyCommand.Argument(name: "number_of_retries", value: numberOfRetries),
|
3167
3174
|
RubyCommand.Argument(name: "stop_after_first_error", value: stopAfterFirstError),
|
3168
3175
|
RubyCommand.Argument(name: "derived_data_path", value: derivedDataPath),
|
3176
|
+
RubyCommand.Argument(name: "result_bundle", value: resultBundle),
|
3169
3177
|
RubyCommand.Argument(name: "test_target_name", value: testTargetName),
|
3170
3178
|
RubyCommand.Argument(name: "namespace_log_files", value: namespaceLogFiles),
|
3171
3179
|
RubyCommand.Argument(name: "concurrent_simulators", value: concurrentSimulators)])
|
@@ -3179,7 +3187,8 @@ func sonar(projectConfigurationPath: String? = nil,
|
|
3179
3187
|
projectLanguage: String? = nil,
|
3180
3188
|
sourceEncoding: String? = nil,
|
3181
3189
|
sonarRunnerArgs: String? = nil,
|
3182
|
-
sonarLogin: String? = nil
|
3190
|
+
sonarLogin: String? = nil,
|
3191
|
+
sonarUrl: String? = nil) {
|
3183
3192
|
let command = RubyCommand(commandID: "", methodName: "sonar", className: nil, args: [RubyCommand.Argument(name: "project_configuration_path", value: projectConfigurationPath),
|
3184
3193
|
RubyCommand.Argument(name: "project_key", value: projectKey),
|
3185
3194
|
RubyCommand.Argument(name: "project_name", value: projectName),
|
@@ -3188,7 +3197,8 @@ func sonar(projectConfigurationPath: String? = nil,
|
|
3188
3197
|
RubyCommand.Argument(name: "project_language", value: projectLanguage),
|
3189
3198
|
RubyCommand.Argument(name: "source_encoding", value: sourceEncoding),
|
3190
3199
|
RubyCommand.Argument(name: "sonar_runner_args", value: sonarRunnerArgs),
|
3191
|
-
RubyCommand.Argument(name: "sonar_login", value: sonarLogin)
|
3200
|
+
RubyCommand.Argument(name: "sonar_login", value: sonarLogin),
|
3201
|
+
RubyCommand.Argument(name: "sonar_url", value: sonarUrl)])
|
3192
3202
|
_ = runner.executeCommand(command)
|
3193
3203
|
}
|
3194
3204
|
func splunkmint(dsym: String? = nil,
|
@@ -3581,13 +3591,15 @@ func updateUrlSchemes(path: String,
|
|
3581
3591
|
RubyCommand.Argument(name: "update_url_schemes", value: updateUrlSchemes)])
|
3582
3592
|
_ = runner.executeCommand(command)
|
3583
3593
|
}
|
3584
|
-
func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/
|
3594
|
+
func uploadSymbolsToCrashlytics(dsymPath: String = "./spec/fixtures/dSYM/Themoji2.dSYM",
|
3595
|
+
dsymPaths: [String]? = nil,
|
3585
3596
|
apiToken: String? = nil,
|
3586
3597
|
gspPath: String? = nil,
|
3587
3598
|
binaryPath: String? = nil,
|
3588
3599
|
platform: String = "ios",
|
3589
3600
|
dsymWorkerThreads: Int = 1) {
|
3590
3601
|
let command = RubyCommand(commandID: "", methodName: "upload_symbols_to_crashlytics", className: nil, args: [RubyCommand.Argument(name: "dsym_path", value: dsymPath),
|
3602
|
+
RubyCommand.Argument(name: "dsym_paths", value: dsymPaths),
|
3591
3603
|
RubyCommand.Argument(name: "api_token", value: apiToken),
|
3592
3604
|
RubyCommand.Argument(name: "gsp_path", value: gspPath),
|
3593
3605
|
RubyCommand.Argument(name: "binary_path", value: binaryPath),
|
@@ -4051,4 +4063,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
|
|
4051
4063
|
let snapshotfile: Snapshotfile = Snapshotfile()
|
4052
4064
|
// Please don't remove the lines below
|
4053
4065
|
// They are used to detect outdated files
|
4054
|
-
// FastlaneRunnerAPIVersion [0.9.
|
4066
|
+
// FastlaneRunnerAPIVersion [0.9.23]
|
@@ -28,6 +28,7 @@ protocol SnapshotfileProtocol: class {
|
|
28
28
|
var numberOfRetries: Int { get }
|
29
29
|
var stopAfterFirstError: Bool { get }
|
30
30
|
var derivedDataPath: String? { get }
|
31
|
+
var resultBundle: Bool { get }
|
31
32
|
var testTargetName: String? { get }
|
32
33
|
var namespaceLogFiles: String? { get }
|
33
34
|
var concurrentSimulators: Bool { get }
|
@@ -63,6 +64,7 @@ extension SnapshotfileProtocol {
|
|
63
64
|
var numberOfRetries: Int { return 1 }
|
64
65
|
var stopAfterFirstError: Bool { return false }
|
65
66
|
var derivedDataPath: String? { return nil }
|
67
|
+
var resultBundle: Bool { return false }
|
66
68
|
var testTargetName: String? { return nil }
|
67
69
|
var namespaceLogFiles: String? { return nil }
|
68
70
|
var concurrentSimulators: Bool { return true }
|
@@ -70,4 +72,4 @@ extension SnapshotfileProtocol {
|
|
70
72
|
|
71
73
|
// Please don't remove the lines below
|
72
74
|
// They are used to detect outdated files
|
73
|
-
// FastlaneRunnerAPIVersion [0.9.
|
75
|
+
// FastlaneRunnerAPIVersion [0.9.4]
|
@@ -19,6 +19,10 @@ module FastlaneCore
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def action_launched(launch_context: nil)
|
22
|
+
unless did_show_message?
|
23
|
+
show_message
|
24
|
+
end
|
25
|
+
|
22
26
|
if @launch_event_sent || launch_context.p_hash.nil?
|
23
27
|
return
|
24
28
|
end
|
@@ -40,6 +44,25 @@ module FastlaneCore
|
|
40
44
|
def action_completed(completion_context: nil)
|
41
45
|
end
|
42
46
|
|
47
|
+
def show_message
|
48
|
+
UI.message("Sending anonymous analytics information")
|
49
|
+
UI.message("Learn more at https://docs.fastlane.tools/#metrics")
|
50
|
+
UI.message("No personal or sensitive data is sent.")
|
51
|
+
UI.message("You can disable this by adding `opt_out_usage` at the top of your Fastfile")
|
52
|
+
end
|
53
|
+
|
54
|
+
def did_show_message?
|
55
|
+
file_name = ".did_show_opt_info"
|
56
|
+
|
57
|
+
new_path = File.join(FastlaneCore.fastlane_user_dir, file_name)
|
58
|
+
did_show = File.exist?(new_path)
|
59
|
+
|
60
|
+
return did_show if did_show
|
61
|
+
|
62
|
+
File.write(new_path, '1')
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
43
66
|
def finalize_session
|
44
67
|
@threads.map(&:join)
|
45
68
|
end
|
@@ -43,7 +43,7 @@ module FastlaneCore
|
|
43
43
|
|
44
44
|
begin
|
45
45
|
# rubocop:disable Security/Eval
|
46
|
-
|
46
|
+
eval(content) # this is okay in this case
|
47
47
|
# rubocop:enable Security/Eval
|
48
48
|
|
49
49
|
print_resulting_config_values unless skip_printing_values # only on success
|
data/pilot/lib/pilot/options.rb
CHANGED
@@ -77,7 +77,7 @@ module Pilot
|
|
77
77
|
deprecated: true,
|
78
78
|
short_option: "-x",
|
79
79
|
env_name: "PILOT_UPDATE_BUILD_INFO_ON_UPLOAD",
|
80
|
-
description: "Update build info immediately after validation. This is deprecated and will be removed in a future release.
|
80
|
+
description: "Update build info immediately after validation. This is deprecated and will be removed in a future release. App Store Connect no longer supports setting build info until after build processing has completed, which is when build info is updated by default",
|
81
81
|
is_string: false,
|
82
82
|
default_value: false),
|
83
83
|
FastlaneCore::ConfigItem.new(key: :apple_id,
|
@@ -81,8 +81,8 @@ module Produce
|
|
81
81
|
app_service = Spaceship.app_service
|
82
82
|
enabled_clean_options = {}
|
83
83
|
|
84
|
-
# "
|
85
|
-
config_enabled_services = Produce.config[:enable_services] || Produce.config[:
|
84
|
+
# "enabled_features" was deprecated in favor of "enable_services"
|
85
|
+
config_enabled_services = Produce.config[:enable_services] || Produce.config[:enabled_features]
|
86
86
|
|
87
87
|
config_enabled_services.each do |k, v|
|
88
88
|
if k.to_sym == :data_protection
|
@@ -257,7 +257,7 @@ private extension XCUIElementQuery {
|
|
257
257
|
}
|
258
258
|
|
259
259
|
var deviceStatusBars: XCUIElementQuery {
|
260
|
-
let deviceWidth = XCUIApplication().frame.width
|
260
|
+
let deviceWidth = XCUIApplication().windows.firstMatch.frame.width
|
261
261
|
|
262
262
|
let isStatusBar = NSPredicate { (evaluatedObject, _) in
|
263
263
|
guard let element = evaluatedObject as? XCUIElementAttributes else { return false }
|
@@ -277,4 +277,4 @@ private extension CGFloat {
|
|
277
277
|
|
278
278
|
// Please don't remove the lines below
|
279
279
|
// They are used to detect outdated configuration files
|
280
|
-
// SnapshotHelperVersion [1.
|
280
|
+
// SnapshotHelperVersion [1.11]
|
@@ -10,6 +10,17 @@ module Snapshot
|
|
10
10
|
UI.verbose("Patching simulator to work with secure text fields")
|
11
11
|
|
12
12
|
Helper.backticks("defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0", print: FastlaneCore::Globals.verbose?)
|
13
|
+
|
14
|
+
# For > Xcode 9
|
15
|
+
# https://stackoverflow.com/questions/38010494/is-it-possible-to-toggle-software-keyboard-via-the-code-in-ui-test/47820883#47820883
|
16
|
+
Helper.backticks("/usr/libexec/PlistBuddy "\
|
17
|
+
"-c \"Print :DevicePreferences\" ~/Library/Preferences/com.apple.iphonesimulator.plist | "\
|
18
|
+
"perl -lne 'print $1 if /^ (\\S*) =/' | while read -r a; do /usr/libexec/PlistBuddy "\
|
19
|
+
"-c \"Set :DevicePreferences:$a:ConnectHardwareKeyboard false\" "\
|
20
|
+
"~/Library/Preferences/com.apple.iphonesimulator.plist "\
|
21
|
+
"|| /usr/libexec/PlistBuddy "\
|
22
|
+
"-c \"Add :DevicePreferences:$a:ConnectHardwareKeyboard bool false\" "\
|
23
|
+
"~/Library/Preferences/com.apple.iphonesimulator.plist; done", print: FastlaneCore::Globals.verbose?)
|
13
24
|
end
|
14
25
|
end
|
15
26
|
end
|
@@ -195,6 +195,13 @@ module Snapshot
|
|
195
195
|
env_name: "SNAPSHOT_DERIVED_DATA_PATH",
|
196
196
|
description: "The directory where build products and other derived data will go",
|
197
197
|
optional: true),
|
198
|
+
FastlaneCore::ConfigItem.new(key: :result_bundle,
|
199
|
+
short_option: "-z",
|
200
|
+
env_name: "SNAPSHOT_RESULT_BUNDLE",
|
201
|
+
is_string: false,
|
202
|
+
description: "Should an Xcode result bundle be generated in the output directory",
|
203
|
+
default_value: false,
|
204
|
+
optional: true),
|
198
205
|
FastlaneCore::ConfigItem.new(key: :test_target_name,
|
199
206
|
env_name: "SNAPSHOT_TEST_TARGET_NAME",
|
200
207
|
description: "The name of the target you want to test (if you desire to override the Target Application from Xcode)",
|
@@ -11,7 +11,7 @@ module Snapshot
|
|
11
11
|
def generate(devices: nil, language: nil, locale: nil, log_path: nil)
|
12
12
|
parts = prefix
|
13
13
|
parts << "xcodebuild"
|
14
|
-
parts += options
|
14
|
+
parts += options(language, locale)
|
15
15
|
parts += destination(devices)
|
16
16
|
parts += build_settings
|
17
17
|
parts += actions
|
@@ -17,12 +17,15 @@ module Snapshot
|
|
17
17
|
UI.user_error!("No project/workspace found")
|
18
18
|
end
|
19
19
|
|
20
|
-
def options
|
20
|
+
def options(language, locale)
|
21
21
|
config = Snapshot.config
|
22
|
+
result_bundle_path = resolve_result_bundle_path(language, locale) if config[:result_bundle]
|
23
|
+
|
22
24
|
options = []
|
23
25
|
options += project_path_array
|
24
26
|
options << "-sdk '#{config[:sdk]}'" if config[:sdk]
|
25
27
|
options << "-derivedDataPath '#{derived_data_path}'"
|
28
|
+
options << "-resultBundlePath '#{result_bundle_path}'" if result_bundle_path
|
26
29
|
options << config[:xcargs] if config[:xcargs]
|
27
30
|
return options
|
28
31
|
end
|
@@ -80,6 +83,20 @@ module Snapshot
|
|
80
83
|
Snapshot.cache[:derived_data_path] ||= (Snapshot.config[:derived_data_path] || Dir.mktmpdir("snapshot_derived"))
|
81
84
|
end
|
82
85
|
|
86
|
+
def resolve_result_bundle_path(language, locale)
|
87
|
+
Snapshot.cache[:result_bundle_path] = {}
|
88
|
+
language_key = locale || language
|
89
|
+
|
90
|
+
unless Snapshot.cache[:result_bundle_path][language_key]
|
91
|
+
path = File.join(Snapshot.config[:output_directory], "test_output", language_key, Snapshot.config[:scheme]) + ".test_result"
|
92
|
+
if File.directory?(path)
|
93
|
+
FileUtils.remove_dir(path)
|
94
|
+
end
|
95
|
+
Snapshot.cache[:result_bundle_path][language_key] = path
|
96
|
+
end
|
97
|
+
return Snapshot.cache[:result_bundle_path][language_key]
|
98
|
+
end
|
99
|
+
|
83
100
|
def initialize
|
84
101
|
not_implemented(__method__)
|
85
102
|
end
|
@@ -12,7 +12,7 @@ module Snapshot
|
|
12
12
|
def generate(device_type: nil, language: nil, locale: nil)
|
13
13
|
parts = prefix
|
14
14
|
parts << "xcodebuild"
|
15
|
-
parts += options
|
15
|
+
parts += options(language, locale)
|
16
16
|
parts += destination(device_type)
|
17
17
|
parts += build_settings
|
18
18
|
parts += actions
|
data/spaceship/README.md
CHANGED
@@ -109,7 +109,7 @@ This requires you to install `pry` using `sudo gem install pry`. `pry` is not in
|
|
109
109
|
|
110
110
|
## App Store Connect API
|
111
111
|
|
112
|
-
##### Open [
|
112
|
+
##### Open [AppStoreConnect.md](docs/AppStoreConnect.md) for code samples
|
113
113
|
|
114
114
|
## 2 Step Verification
|
115
115
|
|
@@ -63,7 +63,7 @@ module Spaceship
|
|
63
63
|
PushNotification = AppService.new_service("push")
|
64
64
|
SiriKit = AppService.new_service("SI015DKUHP")
|
65
65
|
VPNConfiguration = AppService.new_service("V66P55NK2I")
|
66
|
-
Wallet = AppService.new_service("
|
66
|
+
Wallet = AppService.new_service("pass")
|
67
67
|
WirelessAccessory = AppService.new_service("WC421J6T7P")
|
68
68
|
|
69
69
|
constants.each do |c|
|
@@ -2,7 +2,7 @@ require_relative 'app_review'
|
|
2
2
|
|
3
3
|
module Spaceship
|
4
4
|
module Tunes
|
5
|
-
# Represents app ratings from
|
5
|
+
# Represents app ratings from App Store Connect
|
6
6
|
class AppRatings < TunesBase
|
7
7
|
# @return (Spaceship::Tunes::Application) A reference to the application
|
8
8
|
# this version is for
|
@@ -29,8 +29,8 @@ module Spaceship
|
|
29
29
|
# If the user is in multiple teams, a team selection is shown.
|
30
30
|
# The user can then select a team by entering the number
|
31
31
|
#
|
32
|
-
# @param team_id (String) (optional): The ID of
|
33
|
-
# @param team_name (String) (optional): The name of
|
32
|
+
# @param team_id (String) (optional): The ID of an App Store Connect team
|
33
|
+
# @param team_name (String) (optional): The name of an App Store Connect team
|
34
34
|
def select_team(team_id: nil, team_name: nil)
|
35
35
|
@client.select_team(team_id: team_id, team_name: team_name)
|
36
36
|
end
|
@@ -56,8 +56,8 @@ module Spaceship
|
|
56
56
|
# Shows a team selection for the user in the terminal. This should not be
|
57
57
|
# called on CI systems
|
58
58
|
#
|
59
|
-
# @param team_id (String) (optional): The ID of
|
60
|
-
# @param team_name (String) (optional): The name of
|
59
|
+
# @param team_id (String) (optional): The ID of an App Store Connect team
|
60
|
+
# @param team_name (String) (optional): The name of an App Store Connect team
|
61
61
|
def select_team(team_id: nil, team_name: nil)
|
62
62
|
t_id = (team_id || ENV['FASTLANE_ITC_TEAM_ID'] || '').strip
|
63
63
|
t_name = (team_name || ENV['FASTLANE_ITC_TEAM_NAME'] || '').strip
|
data/supply/lib/supply/client.rb
CHANGED
@@ -156,7 +156,7 @@ module Supply
|
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
|
-
# Get a list of all
|
159
|
+
# Get a list of all APK version codes - returns the list of version codes
|
160
160
|
def apks_version_codes
|
161
161
|
ensure_active_edit!
|
162
162
|
|
@@ -165,6 +165,15 @@ module Supply
|
|
165
165
|
return Array(result.apks).map(&:version_code)
|
166
166
|
end
|
167
167
|
|
168
|
+
# Get a list of all AAB version codes - returns the list of version codes
|
169
|
+
def aab_version_codes
|
170
|
+
ensure_active_edit!
|
171
|
+
|
172
|
+
result = call_google_api { android_publisher.list_edit_bundles(current_package_name, current_edit.id) }
|
173
|
+
|
174
|
+
return Array(result.bundles).map(&:version_code)
|
175
|
+
end
|
176
|
+
|
168
177
|
# Get a list of all apk listings (changelogs) - returns the list
|
169
178
|
def apk_listings(apk_version_code)
|
170
179
|
ensure_active_edit!
|
@@ -66,13 +66,16 @@ module Supply
|
|
66
66
|
client.apks_version_codes.each do |apk_version_code|
|
67
67
|
upload_changelog(language, apk_version_code)
|
68
68
|
end
|
69
|
+
client.aab_version_codes.each do |aab_version_code|
|
70
|
+
upload_changelog(language, aab_version_code)
|
71
|
+
end
|
69
72
|
end
|
70
73
|
|
71
|
-
def upload_changelog(language,
|
72
|
-
path = File.join(metadata_path, language, Supply::CHANGELOGS_FOLDER_NAME, "#{
|
74
|
+
def upload_changelog(language, version_code)
|
75
|
+
path = File.join(metadata_path, language, Supply::CHANGELOGS_FOLDER_NAME, "#{version_code}.txt")
|
73
76
|
if File.exist?(path)
|
74
|
-
UI.message("Updating changelog for code version '#{
|
75
|
-
apk_listing = ApkListing.new(File.read(path, encoding: 'UTF-8'), language,
|
77
|
+
UI.message("Updating changelog for code version '#{version_code}' and language '#{language}'...")
|
78
|
+
apk_listing = ApkListing.new(File.read(path, encoding: 'UTF-8'), language, version_code)
|
76
79
|
client.update_apk_listing_for_language(apk_listing)
|
77
80
|
end
|
78
81
|
end
|
metadata
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.100.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Aaron Brager
|
8
|
+
- Jorge Revuelta H
|
9
|
+
- Joshua Liebowitz
|
10
|
+
- Maksym Grebenets
|
7
11
|
- Jimmy Dee
|
8
|
-
-
|
12
|
+
- Helmut Januschka
|
13
|
+
- Fumiya Nakamura
|
9
14
|
- Stefan Natchev
|
10
|
-
-
|
15
|
+
- Andrew McBurney
|
16
|
+
- Josh Holtz
|
17
|
+
- Luka Mirosevic
|
11
18
|
- Manu Wallner
|
12
|
-
-
|
19
|
+
- Kohki Miki
|
20
|
+
- Olivier Halligon
|
13
21
|
- Jan Piotrowski
|
14
|
-
- Aaron Brager
|
15
22
|
- Iulian Onofrei
|
16
|
-
- Danielle Tomlinson
|
17
|
-
- Fumiya Nakamura
|
18
|
-
- Olivier Halligon
|
19
|
-
- Helmut Januschka
|
20
|
-
- Luka Mirosevic
|
21
|
-
- Maksym Grebenets
|
22
|
-
- Jorge Revuelta H
|
23
23
|
- Matthew Ellis
|
24
|
+
- Danielle Tomlinson
|
25
|
+
- Felix Krause
|
24
26
|
- Jérôme Lacoste
|
25
|
-
- Andrew McBurney
|
26
|
-
- Kohki Miki
|
27
27
|
autorequire:
|
28
28
|
bindir: bin
|
29
29
|
cert_chain: []
|
30
|
-
date: 2018-07-
|
30
|
+
date: 2018-07-19 00:00:00.000000000 Z
|
31
31
|
dependencies:
|
32
32
|
- !ruby/object:Gem::Dependency
|
33
33
|
name: slack-notifier
|