fastlane 2.96.1 → 2.97.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2b665cce0f288279dd331057c17cda386448aa3
4
- data.tar.gz: eed5202aefbbc9b821d4c0d195caf46ec6431848
3
+ metadata.gz: 789d1c33d75287dd610e4e42ef2b5d14840c0fda
4
+ data.tar.gz: 9046df5851994832385b4cf8ec7c5688a669546a
5
5
  SHA512:
6
- metadata.gz: 63c841966e36615a7ca2bfeb76cdac457884bec57ff5ac5144b5110dea2ae999fb5510eba78e9a3b579006479a200cabed8de1bda69ed17948ff5eff2d41d308
7
- data.tar.gz: 30e9bc9373d06e7cbb8ec171957c31dee13923ea89bcd5c1069b68f4f543c0be96332b65d0df6a1ef8d3870c541501131a648da1464b3f9623a0cd931a4f00d3
6
+ metadata.gz: f615ee64e50c078ec195dbe7ccf0d6cb88ca7cbd936eef9bcda4b971ad4d791a38d6b01a80d750959cf9c1f5218692fedb0fcdfad97dd4c469cb44f44a8aa116
7
+ data.tar.gz: f81ee001fe680d041bb746a8390a65d512782444b181b62d7386f3173248029b68aa489571f21126356f8cccef8c1d596ccd2f942b5545155257a9a17b4576c7
data/README.md CHANGED
@@ -32,43 +32,55 @@ 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='aaron-brager'>
36
- <a href='https://github.com/getaaron'>
37
- <img src='https://github.com/getaaron.png?size=140'>
35
+ <td id='olivier-halligon'>
36
+ <a href='https://github.com/AliSoftware'>
37
+ <img src='https://github.com/AliSoftware.png?size=140'>
38
38
  </a>
39
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
39
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
40
40
  </td>
41
- <td id='josh-holtz'>
42
- <a href='https://github.com/joshdholtz'>
43
- <img src='https://github.com/joshdholtz.png?size=140'>
41
+ <td id='jan-piotrowski'>
42
+ <a href='https://github.com/janpio'>
43
+ <img src='https://github.com/janpio.png?size=140'>
44
44
  </a>
45
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
45
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
46
46
  </td>
47
- <td id='maksym-grebenets'>
48
- <a href='https://github.com/mgrebenets'>
49
- <img src='https://github.com/mgrebenets.png?size=140'>
47
+ <td id='helmut-januschka'>
48
+ <a href='https://github.com/hjanuschka'>
49
+ <img src='https://github.com/hjanuschka.png?size=140'>
50
50
  </a>
51
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
51
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
52
52
  </td>
53
- <td id='olivier-halligon'>
54
- <a href='https://github.com/AliSoftware'>
55
- <img src='https://github.com/AliSoftware.png?size=140'>
53
+ <td id='joshua-liebowitz'>
54
+ <a href='https://github.com/taquitos'>
55
+ <img src='https://github.com/taquitos.png?size=140'>
56
56
  </a>
57
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
57
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
58
58
  </td>
59
- <td id='matthew-ellis'>
60
- <a href='https://github.com/matthewellis'>
61
- <img src='https://github.com/matthewellis.png?size=140'>
59
+ <td id='iulian-onofrei'>
60
+ <a href='https://github.com/revolter'>
61
+ <img src='https://github.com/revolter.png?size=140'>
62
62
  </a>
63
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
63
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
64
64
  </td>
65
65
  </tr>
66
66
  <tr>
67
- <td id='fumiya-nakamura'>
68
- <a href='https://github.com/nafu'>
69
- <img src='https://github.com/nafu.png?size=140'>
67
+ <td id='danielle-tomlinson'>
68
+ <a href='https://github.com/DanToml'>
69
+ <img src='https://github.com/DanToml.png?size=140'>
70
70
  </a>
71
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
71
+ <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
72
+ </td>
73
+ <td id='luka-mirosevic'>
74
+ <a href='https://github.com/lmirosevic'>
75
+ <img src='https://github.com/lmirosevic.png?size=140'>
76
+ </a>
77
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
78
+ </td>
79
+ <td id='matthew-ellis'>
80
+ <a href='https://github.com/matthewellis'>
81
+ <img src='https://github.com/matthewellis.png?size=140'>
82
+ </a>
83
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
72
84
  </td>
73
85
  <td id='stefan-natchev'>
74
86
  <a href='https://github.com/snatchev'>
@@ -82,81 +94,69 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
82
94
  </a>
83
95
  <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
84
96
  </td>
97
+ </tr>
98
+ <tr>
85
99
  <td id='jorge-revuelta-h'>
86
100
  <a href='https://github.com/minuscorp'>
87
101
  <img src='https://github.com/minuscorp.png?size=140'>
88
102
  </a>
89
103
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
90
104
  </td>
91
- <td id='manu-wallner'>
92
- <a href='https://github.com/milch'>
93
- <img src='https://github.com/milch.png?size=140'>
94
- </a>
95
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
96
- </td>
97
- </tr>
98
- <tr>
99
- <td id='kohki-miki'>
100
- <a href='https://github.com/giginet'>
101
- <img src='https://github.com/giginet.png?size=140'>
102
- </a>
103
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
104
- </td>
105
- <td id='helmut-januschka'>
106
- <a href='https://github.com/hjanuschka'>
107
- <img src='https://github.com/hjanuschka.png?size=140'>
108
- </a>
109
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
110
- </td>
111
- <td id='danielle-tomlinson'>
112
- <a href='https://github.com/DanToml'>
113
- <img src='https://github.com/DanToml.png?size=140'>
105
+ <td id='josh-holtz'>
106
+ <a href='https://github.com/joshdholtz'>
107
+ <img src='https://github.com/joshdholtz.png?size=140'>
114
108
  </a>
115
- <h4 align='center'><a href='https://twitter.com/DanToml'>Danielle Tomlinson</a></h4>
109
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
116
110
  </td>
117
- <td id='jan-piotrowski'>
118
- <a href='https://github.com/janpio'>
119
- <img src='https://github.com/janpio.png?size=140'>
111
+ <td id='jérôme-lacoste'>
112
+ <a href='https://github.com/lacostej'>
113
+ <img src='https://github.com/lacostej.png?size=140'>
120
114
  </a>
121
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
115
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
122
116
  </td>
123
- <td id='joshua-liebowitz'>
124
- <a href='https://github.com/taquitos'>
125
- <img src='https://github.com/taquitos.png?size=140'>
117
+ <td id='maksym-grebenets'>
118
+ <a href='https://github.com/mgrebenets'>
119
+ <img src='https://github.com/mgrebenets.png?size=140'>
126
120
  </a>
127
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
121
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
128
122
  </td>
129
- </tr>
130
- <tr>
131
123
  <td id='felix-krause'>
132
124
  <a href='https://github.com/KrauseFx'>
133
125
  <img src='https://github.com/KrauseFx.png?size=140'>
134
126
  </a>
135
127
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
136
128
  </td>
129
+ </tr>
130
+ <tr>
131
+ <td id='manu-wallner'>
132
+ <a href='https://github.com/milch'>
133
+ <img src='https://github.com/milch.png?size=140'>
134
+ </a>
135
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
136
+ </td>
137
+ <td id='fumiya-nakamura'>
138
+ <a href='https://github.com/nafu'>
139
+ <img src='https://github.com/nafu.png?size=140'>
140
+ </a>
141
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
142
+ </td>
137
143
  <td id='jimmy-dee'>
138
144
  <a href='https://github.com/jdee'>
139
145
  <img src='https://github.com/jdee.png?size=140'>
140
146
  </a>
141
147
  <h4 align='center'>Jimmy Dee</h4>
142
148
  </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='luka-mirosevic'>
150
- <a href='https://github.com/lmirosevic'>
151
- <img src='https://github.com/lmirosevic.png?size=140'>
149
+ <td id='aaron-brager'>
150
+ <a href='https://github.com/getaaron'>
151
+ <img src='https://github.com/getaaron.png?size=140'>
152
152
  </a>
153
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
153
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
154
154
  </td>
155
- <td id='iulian-onofrei'>
156
- <a href='https://github.com/revolter'>
157
- <img src='https://github.com/revolter.png?size=140'>
155
+ <td id='kohki-miki'>
156
+ <a href='https://github.com/giginet'>
157
+ <img src='https://github.com/giginet.png?size=140'>
158
158
  </a>
159
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
159
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
160
160
  </td>
161
161
  </tr>
162
162
  </table>
@@ -24,12 +24,13 @@ module Deliver
24
24
  def setup_deliver(file_path, data, deliver_path, options)
25
25
  File.write(file_path, data)
26
26
 
27
+ screenshots_path = options[:screenshots_path] || File.join(deliver_path, 'screenshots')
27
28
  unless options[:skip_screenshots]
28
- download_screenshots(deliver_path, options)
29
+ download_screenshots(screenshots_path, options)
29
30
 
30
31
  # Add a README to the screenshots folder
31
- FileUtils.mkdir_p(File.join(deliver_path, 'screenshots')) # just in case the fetching didn't work
32
- File.write(File.join(deliver_path, 'screenshots', 'README.txt'), File.read("#{Deliver::ROOT}/lib/assets/ScreenshotsHelp"))
32
+ FileUtils.mkdir_p(screenshots_path) # just in case the fetching didn't work
33
+ File.write(File.join(screenshots_path, 'README.txt'), File.read("#{Deliver::ROOT}/lib/assets/ScreenshotsHelp"))
33
34
  end
34
35
 
35
36
  UI.success("Successfully created new Deliverfile at path '#{file_path}'")
@@ -39,7 +40,8 @@ module Deliver
39
40
  # and screenshots folders
40
41
  def generate_deliver_file(deliver_path, options)
41
42
  v = options[:app].latest_version
42
- generate_metadata_files(v, File.join(deliver_path, 'metadata'))
43
+ metadata_path = options[:metadata_path] || File.join(deliver_path, 'metadata')
44
+ generate_metadata_files(v, metadata_path)
43
45
 
44
46
  # Generate the final Deliverfile here
45
47
  return File.read(deliverfile_path)
@@ -29,6 +29,7 @@ module Fastlane
29
29
  cmd << "--project-directory #{params[:project_directory]}" if params[:project_directory]
30
30
  cmd << "--cache-builds" if params[:cache_builds]
31
31
  cmd << "--new-resolver" if params[:new_resolver]
32
+ cmd << "--log-path #{params[:log_path]}" if params[:log_path]
32
33
 
33
34
  Actions.sh(cmd.join(' '))
34
35
  end
@@ -42,6 +43,10 @@ module Fastlane
42
43
  if command_name != "archive" && params[:output]
43
44
  UI.user_error!("Output option is available only for 'archive' command.")
44
45
  end
46
+
47
+ if params[:log_path] && !%w(build bootstrap update).include?(command_name)
48
+ UI.user_error!("Log path option is available only for 'build', 'bootstrap', and 'update' command.")
49
+ end
45
50
  end
46
51
 
47
52
  def self.description
@@ -158,7 +163,11 @@ module Fastlane
158
163
  description: "Use new resolver when resolving dependency graph",
159
164
  is_string: false,
160
165
  optional: true,
161
- type: Boolean)
166
+ type: Boolean),
167
+ FastlaneCore::ConfigItem.new(key: :log_path,
168
+ env_name: "FL_CARTHAGE_LOG_PATH",
169
+ description: "Path to the xcode build output",
170
+ optional: true)
162
171
  ]
163
172
  end
164
173
 
@@ -180,7 +189,8 @@ module Fastlane
180
189
  configuration: "Release", # Build configuration to use when building
181
190
  cache_builds: true, # By default Carthage will rebuild a dependency regardless of whether its the same resolved version as before.
182
191
  toolchain: "com.apple.dt.toolchain.Swift_2_3", # Specify the xcodebuild toolchain
183
- new_resolver: false # Use the new resolver to resolve depdendency graph
192
+ new_resolver: false, # Use the new resolver to resolve depdendency graph
193
+ log_path: "carthage.log" # Path to the xcode build output
184
194
  )'
185
195
  ]
186
196
  end
@@ -247,7 +247,7 @@ end
247
247
  To use the newly generated app in _deliver_, you need to add this line to your `Deliverfile`:
248
248
 
249
249
  ```ruby-skip-tests
250
- apple_id ENV['PRODUCE_APPLE_ID']
250
+ apple_id(ENV['PRODUCE_APPLE_ID'])
251
251
  ```
252
252
 
253
253
  This will tell _deliver_, which `App ID` to use, since the app is not yet available in the App Store.
@@ -684,7 +684,7 @@ Detailed instructions about how to set up _deliver_ and _fastlane_ in `Jenkins`
684
684
 
685
685
  _deliver_ uses the iTunes Transporter to upload metadata and binaries. In case you are behind a firewall, you can specify a different transporter protocol using
686
686
 
687
- ```
687
+ ```bash
688
688
  DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" fastlane deliver
689
689
  ```
690
690
 
@@ -30,11 +30,8 @@ module Fastlane
30
30
  # https://developer.apple.com/library/ios/qa/qa1827/_index.html
31
31
  # Attention: This is NOT the version number - but the build number
32
32
 
33
- # We do not want to run agvtool under tests to avoid output about not having a project available
34
- unless Helper.test?
35
- agv_enabled = system([command_prefix, 'agvtool what-version', command_suffix].join(' '))
36
- raise "Apple Generic Versioning is not enabled." unless agv_enabled
37
- end
33
+ agv_enabled = system([command_prefix, 'agvtool what-version', command_suffix].join(' '))
34
+ raise "Apple Generic Versioning is not enabled." unless agv_enabled
38
35
 
39
36
  command = [
40
37
  command_prefix,
@@ -43,16 +40,16 @@ module Fastlane
43
40
  command_suffix
44
41
  ].join(' ')
45
42
 
46
- if Helper.test?
47
- return Actions.lane_context[SharedValues::BUILD_NUMBER] = command
48
- else
49
- Actions.sh(command)
43
+ output = Actions.sh(command)
44
+ if output.include?('$(SRCROOT)')
45
+ UI.error('Cannot set build number with plist path containing $(SRCROOT)')
46
+ UI.error('Please remove $(SRCROOT) in your Xcode target build settings')
47
+ end
50
48
 
51
- # Store the new number in the shared hash
52
- build_number = `#{command_prefix} agvtool what-version`.split("\n").last.strip
49
+ # Store the new number in the shared hash
50
+ build_number = Actions.sh("#{command_prefix} agvtool what-version", log: false).split("\n").last.strip
53
51
 
54
- return Actions.lane_context[SharedValues::BUILD_NUMBER] = build_number
55
- end
52
+ return Actions.lane_context[SharedValues::BUILD_NUMBER] = build_number
56
53
  rescue
57
54
  UI.user_error!("Apple Generic Versioning is not enabled in this project.\nBefore being able to increment and read the version number from your Xcode project, you first need to setup your project properly. Please follow the guide at https://developer.apple.com/library/content/qa/qa1827/_index.html")
58
55
  end
@@ -2,16 +2,36 @@ module Fastlane
2
2
  module Actions
3
3
  class SayAction < Action
4
4
  def self.run(params)
5
- text = params.join(' ') if params.kind_of?(Array) # that's usually the case
6
- text = params if params.kind_of?(String)
7
- UI.user_error!("You can't call the `say` action as OneOff") unless text
5
+ text = params[:text]
6
+ text = text.join(' ') if text.kind_of?(Array)
8
7
  text = text.tr("'", '"')
9
8
 
10
- Actions.sh("say '#{text}'")
9
+ if params[:mute]
10
+ UI.message(text)
11
+ return text
12
+ else
13
+ Actions.sh("say '#{text}'")
14
+ end
11
15
  end
12
16
 
13
17
  def self.description
14
- "This action speaks out loud the given text"
18
+ "This action speaks the given text out loud"
19
+ end
20
+
21
+ def self.available_options
22
+ [
23
+ FastlaneCore::ConfigItem.new(key: :text,
24
+ description: 'Text to be spoken out loud (as string or array of strings)',
25
+ optional: false,
26
+ is_string: false),
27
+ FastlaneCore::ConfigItem.new(key: :mute,
28
+ env_name: "SAY_MUTE",
29
+ description: 'If say should be muted with text printed out',
30
+ optional: false,
31
+ is_string: false,
32
+ type: Boolean,
33
+ default_value: false)
34
+ ]
15
35
  end
16
36
 
17
37
  def self.is_supported?(platform)
@@ -71,6 +71,10 @@ module Fastlane
71
71
  env_name: "FL_SLACK_MESSAGE",
72
72
  description: "The message that should be displayed on Slack. This supports the standard Slack markup language",
73
73
  optional: true),
74
+ FastlaneCore::ConfigItem.new(key: :pretext,
75
+ env_name: "FL_SLACK_PRETEXT",
76
+ description: "This is optional text that appears above the message attachment block. This supports the standard Slack markup language",
77
+ optional: true),
74
78
  FastlaneCore::ConfigItem.new(key: :channel,
75
79
  env_name: "FL_SLACK_CHANNEL",
76
80
  description: "#channel or @username",
@@ -185,6 +189,7 @@ module Fastlane
185
189
  slack_attachment = {
186
190
  fallback: options[:message],
187
191
  text: options[:message],
192
+ pretext: options[:pretext],
188
193
  color: color,
189
194
  mrkdwn_in: ["pretext", "text", "fields", "message"],
190
195
  fields: []
@@ -75,6 +75,8 @@ module Fastlane
75
75
  [key, value]
76
76
  when :ipa
77
77
  [key, value]
78
+ when :apk
79
+ [key, value]
78
80
  when :symbols_file
79
81
  [key, value]
80
82
  when :testers_groups
@@ -94,9 +96,12 @@ module Fastlane
94
96
  end
95
97
  end]
96
98
 
97
- return params[:ipa] if Helper.test?
99
+ path = params[:ipa] || params[:apk]
100
+ UI.user_error!("No ipa or apk were given") unless path
101
+
102
+ return path if Helper.test?
98
103
 
99
- response = self.upload_build(params[:upload_url], params[:ipa], client_options)
104
+ response = self.upload_build(params[:upload_url], path, client_options)
100
105
  if parse_response(response)
101
106
  UI.success("Build URL: #{Actions.lane_context[SharedValues::TESTFAIRY_BUILD_URL]}")
102
107
  UI.success("Build successfully uploaded to TestFairy.")
@@ -144,12 +149,24 @@ module Fastlane
144
149
  end),
145
150
  FastlaneCore::ConfigItem.new(key: :ipa,
146
151
  env_name: 'TESTFAIRY_IPA_PATH',
147
- description: 'Path to your IPA file for iOS or APK for Android',
152
+ description: 'Path to your IPA file for iOS',
148
153
  default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
149
154
  default_value_dynamic: true,
155
+ optional: true,
156
+ conflicting_options: [:apk],
150
157
  verify_block: proc do |value|
151
158
  UI.user_error!("Couldn't find ipa file at path '#{value}'") unless File.exist?(value)
152
159
  end),
160
+ FastlaneCore::ConfigItem.new(key: :apk,
161
+ env_name: 'TESTFAIRY_APK_PATH',
162
+ description: 'Path to your APK file for Android',
163
+ default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH],
164
+ default_value_dynamic: true,
165
+ optional: true,
166
+ conflicting_options: [:ipa],
167
+ verify_block: proc do |value|
168
+ UI.user_error!("Couldn't find apk file at path '#{value}'") unless File.exist?(value)
169
+ end),
153
170
  # optional
154
171
  FastlaneCore::ConfigItem.new(key: :symbols_file,
155
172
  optional: true,
@@ -307,12 +307,9 @@ module Fastlane
307
307
  def say(value)
308
308
  # Overwrite this, since there is already a 'say' method defined in the Ruby standard library
309
309
  value ||= yield
310
- Actions.execute_action('say') do
311
- action_launched('say')
312
- return_value = Fastlane::Actions::SayAction.run([value])
313
- action_completed('say', status: FastlaneCore::ActionCompletionStatus::SUCCESS)
314
- return return_value
315
- end
310
+
311
+ value = { text: value } if value.kind_of?(String) || value.kind_of?(Array)
312
+ self.runner.trigger_action_by_name(:say, nil, false, value)
316
313
  end
317
314
 
318
315
  def puts(value)
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.96.1'.freeze
2
+ VERSION = '2.97.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
@@ -18,4 +18,4 @@ class Deliverfile: DeliverfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.96.1
21
+ // Generated with fastlane 2.97.0
@@ -843,7 +843,8 @@ func carthage(command: String = "bootstrap",
843
843
  configuration: String? = nil,
844
844
  toolchain: String? = nil,
845
845
  projectDirectory: String? = nil,
846
- newResolver: Bool? = nil) {
846
+ newResolver: Bool? = nil,
847
+ logPath: String? = nil) {
847
848
  let command = RubyCommand(commandID: "", methodName: "carthage", className: nil, args: [RubyCommand.Argument(name: "command", value: command),
848
849
  RubyCommand.Argument(name: "dependencies", value: dependencies),
849
850
  RubyCommand.Argument(name: "use_ssh", value: useSsh),
@@ -860,7 +861,8 @@ func carthage(command: String = "bootstrap",
860
861
  RubyCommand.Argument(name: "configuration", value: configuration),
861
862
  RubyCommand.Argument(name: "toolchain", value: toolchain),
862
863
  RubyCommand.Argument(name: "project_directory", value: projectDirectory),
863
- RubyCommand.Argument(name: "new_resolver", value: newResolver)])
864
+ RubyCommand.Argument(name: "new_resolver", value: newResolver),
865
+ RubyCommand.Argument(name: "log_path", value: logPath)])
864
866
  _ = runner.executeCommand(command)
865
867
  }
866
868
  func cert(development: Bool = false,
@@ -2697,8 +2699,10 @@ func s3(ipa: String? = nil,
2697
2699
  RubyCommand.Argument(name: "acl", value: acl)])
2698
2700
  _ = runner.executeCommand(command)
2699
2701
  }
2700
- func say() {
2701
- let command = RubyCommand(commandID: "", methodName: "say", className: nil, args: [])
2702
+ func say(text: String,
2703
+ mute: Bool = false) {
2704
+ let command = RubyCommand(commandID: "", methodName: "say", className: nil, args: [RubyCommand.Argument(name: "text", value: text),
2705
+ RubyCommand.Argument(name: "mute", value: mute)])
2702
2706
  _ = runner.executeCommand(command)
2703
2707
  }
2704
2708
  func scan(workspace: String? = scanfile.workspace,
@@ -2992,6 +2996,7 @@ func skipDocs() {
2992
2996
  _ = runner.executeCommand(command)
2993
2997
  }
2994
2998
  func slack(message: String? = nil,
2999
+ pretext: String? = nil,
2995
3000
  channel: String? = nil,
2996
3001
  useWebhookConfiguredUsernameAndIcon: Bool = false,
2997
3002
  slackUrl: String,
@@ -3004,6 +3009,7 @@ func slack(message: String? = nil,
3004
3009
  failOnError: Bool = true,
3005
3010
  linkNames: Bool = false) {
3006
3011
  let command = RubyCommand(commandID: "", methodName: "slack", className: nil, args: [RubyCommand.Argument(name: "message", value: message),
3012
+ RubyCommand.Argument(name: "pretext", value: pretext),
3007
3013
  RubyCommand.Argument(name: "channel", value: channel),
3008
3014
  RubyCommand.Argument(name: "use_webhook_configured_username_and_icon", value: useWebhookConfiguredUsernameAndIcon),
3009
3015
  RubyCommand.Argument(name: "slack_url", value: slackUrl),
@@ -3350,7 +3356,8 @@ func teamName() {
3350
3356
  _ = runner.executeCommand(command)
3351
3357
  }
3352
3358
  func testfairy(apiKey: String,
3353
- ipa: String,
3359
+ ipa: String? = nil,
3360
+ apk: String? = nil,
3354
3361
  symbolsFile: String? = nil,
3355
3362
  uploadUrl: String = "https://upload.testfairy.com",
3356
3363
  testersGroups: [String] = [],
@@ -3361,6 +3368,7 @@ func testfairy(apiKey: String,
3361
3368
  options: [String] = []) {
3362
3369
  let command = RubyCommand(commandID: "", methodName: "testfairy", className: nil, args: [RubyCommand.Argument(name: "api_key", value: apiKey),
3363
3370
  RubyCommand.Argument(name: "ipa", value: ipa),
3371
+ RubyCommand.Argument(name: "apk", value: apk),
3364
3372
  RubyCommand.Argument(name: "symbols_file", value: symbolsFile),
3365
3373
  RubyCommand.Argument(name: "upload_url", value: uploadUrl),
3366
3374
  RubyCommand.Argument(name: "testers_groups", value: testersGroups),
@@ -3927,7 +3935,7 @@ func xcov(workspace: String? = nil,
3927
3935
  coverallsServiceJobId: String? = nil,
3928
3936
  coverallsRepoToken: String? = nil,
3929
3937
  xcconfig: String? = nil,
3930
- ideFoundationPath: String = "/Applications/Xcode.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
3938
+ ideFoundationPath: String = "/Applications/Xcode92/Xcode.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
3931
3939
  legacySupport: Bool = false) {
3932
3940
  let command = RubyCommand(commandID: "", methodName: "xcov", className: nil, args: [RubyCommand.Argument(name: "workspace", value: workspace),
3933
3941
  RubyCommand.Argument(name: "project", value: project),
@@ -4033,4 +4041,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
4033
4041
  let snapshotfile: Snapshotfile = Snapshotfile()
4034
4042
  // Please don't remove the lines below
4035
4043
  // They are used to detect outdated files
4036
- // FastlaneRunnerAPIVersion [0.9.19]
4044
+ // FastlaneRunnerAPIVersion [0.9.20]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.96.1
21
+ // Generated with fastlane 2.97.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.96.1
21
+ // Generated with fastlane 2.97.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.96.1
21
+ // Generated with fastlane 2.97.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.96.1
21
+ // Generated with fastlane 2.97.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.96.1
21
+ // Generated with fastlane 2.97.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.96.1
21
+ // Generated with fastlane 2.97.0
@@ -23,7 +23,7 @@ module FastlaneCore
23
23
  def self.installed_identies(in_keychain: nil)
24
24
  install_wwdr_certificate unless wwdr_certificate_installed?
25
25
 
26
- available = list_available_identities
26
+ available = list_available_identities(in_keychain: in_keychain)
27
27
  # Match for this text against word boundaries to avoid edge cases around multiples of 10 identities!
28
28
  if /\b0 valid identities found\b/ =~ available
29
29
  UI.error([
@@ -90,7 +90,7 @@ module Commander
90
90
  raise e
91
91
  else
92
92
  action_completed(@program[:name], status: FastlaneCore::ActionCompletionStatus::INTERRUPTED, exception: e)
93
- puts("\nCancelled... use --verbose to show the stack trace")
93
+ abort("\nCancelled... use --verbose to show the stack trace")
94
94
  end
95
95
  rescue \
96
96
  OptionParser::InvalidOption,
@@ -41,8 +41,6 @@ module Spaceship
41
41
 
42
42
  attr_accessor :provider
43
43
 
44
- attr_accessor :available_providers
45
-
46
44
  # legacy support
47
45
  BasicPreferredInfoError = Spaceship::BasicPreferredInfoError
48
46
  InvalidUserCredentialsError = Spaceship::InvalidUserCredentialsError
@@ -494,12 +492,6 @@ module Spaceship
494
492
 
495
493
  provider = body["provider"]
496
494
  self.provider = Spaceship::Provider.new(provider_hash: provider) unless provider.nil?
497
-
498
- available_providers_list = body["availableProviders"].compact
499
-
500
- self.available_providers = available_providers_list.map do |provider_hash|
501
- Spaceship::Provider.new(provider_hash: provider_hash)
502
- end
503
495
  end
504
496
  end
505
497
 
@@ -87,7 +87,7 @@ module Spaceship
87
87
  teams.each_with_index do |team, i|
88
88
  puts("#{i + 1}) #{team['teamId']} \"#{team['name']}\" (#{team['type']})")
89
89
  end
90
- raise "Multiple Teams found; unable to choose, terminal not ineractive!"
90
+ raise "Multiple Teams found; unable to choose, terminal not interactive!"
91
91
  end
92
92
 
93
93
  # User Selection
@@ -202,6 +202,17 @@ module Spaceship
202
202
  handle_response(response)
203
203
  end
204
204
 
205
+ def remove_testers_from_testflight(app_id: nil, tester_ids: nil)
206
+ assert_required_params(__method__, binding)
207
+ url = "providers/#{team_id}/apps/#{app_id}/deleteTesters"
208
+ response = request(:post) do |req|
209
+ req.url(url)
210
+ req.body = tester_ids.map { |i| { "id" => i } }.to_json
211
+ req.headers['Content-Type'] = 'application/json'
212
+ end
213
+ handle_response(response)
214
+ end
215
+
205
216
  def search_for_tester_in_app(app_id: nil, text: nil)
206
217
  assert_required_params(__method__, binding)
207
218
  text = CGI.escape(text)
@@ -261,6 +272,14 @@ module Spaceship
261
272
  handle_response(response)
262
273
  end
263
274
 
275
+ def builds_for_group(app_id: nil, group_id: nil)
276
+ assert_required_params(__method__, binding)
277
+
278
+ url = "providers/#{team_id}/apps/#{app_id}/groups/#{group_id}/builds"
279
+ response = request(:get, url)
280
+ handle_response(response)
281
+ end
282
+
264
283
  ##
265
284
  # @!group AppTestInfo
266
285
  ##
@@ -1,4 +1,5 @@
1
1
  require_relative 'base'
2
+ require_relative 'build'
2
3
 
3
4
  module Spaceship::TestFlight
4
5
  class Group < Base
@@ -104,6 +105,11 @@ module Spaceship::TestFlight
104
105
  is_active
105
106
  end
106
107
 
108
+ def builds
109
+ builds = client.builds_for_group(app_id: self.app_id, group_id: self.id)
110
+ builds.map { |b| Spaceship::TestFlight::Build.new(b) }
111
+ end
112
+
107
113
  def self.perform_for_groups_in_app(app: nil, groups: nil, &block)
108
114
  if groups.nil?
109
115
  default_external_group = app.default_external_group
@@ -109,6 +109,10 @@ module Spaceship
109
109
  return testers_matching_text
110
110
  end
111
111
 
112
+ def self.remove_testers_from_testflight(app_id: nil, tester_ids: nil)
113
+ client.remove_testers_from_testflight(app_id: app_id, tester_ids: tester_ids)
114
+ end
115
+
112
116
  def self.create_app_level_tester(app_id: nil, first_name: nil, last_name: nil, email: nil)
113
117
  client.create_app_level_tester(app_id: app_id,
114
118
  first_name: first_name,
@@ -120,6 +124,10 @@ module Spaceship
120
124
  client.delete_tester_from_app(app_id: app_id, tester_id: self.tester_id)
121
125
  end
122
126
 
127
+ def remove_from_testflight!(app_id: nil)
128
+ client.remove_testers_from_testflight(app_id: app_id, tester_ids: [self.tester_id])
129
+ end
130
+
123
131
  def resend_invite(app_id: nil)
124
132
  client.resend_invite_to_external_tester(app_id: app_id, tester_id: self.tester_id)
125
133
  end
@@ -65,7 +65,7 @@ module Spaceship
65
65
  puts("Looking for iTunes Connect Team with name #{t_name}") if Spaceship::Globals.verbose?
66
66
 
67
67
  teams.each do |t|
68
- t_id = t['contentProvider']['contentProviderId'].to_s if t['contentProvider']['name'].casecmp(t_name.downcase).zero?
68
+ t_id = t['contentProvider']['contentProviderId'].to_s if t['contentProvider']['name'].casecmp(t_name).zero?
69
69
  end
70
70
 
71
71
  puts("Could not find team with name '#{t_name}', trying to fallback to default team") if t_id.length.zero?
@@ -78,7 +78,7 @@ module Spaceship
78
78
 
79
79
  # actually set the team id here
80
80
  self.team_id = t_id
81
- return
81
+ return self.team_id
82
82
  end
83
83
 
84
84
  # user didn't specify a team... #thisiswhywecanthavenicethings
@@ -105,7 +105,7 @@ module Spaceship
105
105
  unless Spaceship::Client::UserInterface.interactive?
106
106
  puts("Multiple teams found on iTunes Connect, Your Terminal is running in non-interactive mode! Cannot continue from here.")
107
107
  puts("Please check that you set FASTLANE_ITC_TEAM_ID or FASTLANE_ITC_TEAM_NAME to the right value.")
108
- raise "Multiple iTunes Connect Teams found; unable to choose, terminal not ineractive!"
108
+ raise "Multiple iTunes Connect Teams found; unable to choose, terminal not interactive!"
109
109
  end
110
110
 
111
111
  selected = ($stdin.gets || '').strip.to_i - 1
@@ -113,7 +113,7 @@ module Spaceship
113
113
 
114
114
  if team_to_use
115
115
  self.team_id = team_to_use['contentProvider']['contentProviderId'].to_s # actually set the team id here
116
- break
116
+ return self.team_id
117
117
  end
118
118
  end
119
119
  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.96.1
4
+ version: 2.97.0
5
5
  platform: ruby
6
6
  authors:
7
- - Kohki Miki
7
+ - Danielle Tomlinson
8
+ - Joshua Liebowitz
8
9
  - Andrew McBurney
9
- - Jimmy Dee
10
- - Matthew Ellis
11
- - Helmut Januschka
12
- - Olivier Halligon
13
- - Luka Mirosevic
14
- - Aaron Brager
10
+ - Manu Wallner
15
11
  - Jérôme Lacoste
16
- - Joshua Liebowitz
12
+ - Aaron Brager
13
+ - Kohki Miki
14
+ - Felix Krause
15
+ - Iulian Onofrei
17
16
  - Fumiya Nakamura
18
- - Jan Piotrowski
19
- - Danielle Tomlinson
20
- - Jorge Revuelta H
21
17
  - Maksym Grebenets
22
- - Manu Wallner
23
- - Iulian Onofrei
24
- - Felix Krause
25
18
  - Josh Holtz
19
+ - Jorge Revuelta H
20
+ - Matthew Ellis
21
+ - Jimmy Dee
22
+ - Luka Mirosevic
23
+ - Jan Piotrowski
26
24
  - Stefan Natchev
25
+ - Helmut Januschka
26
+ - Olivier Halligon
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
30
- date: 2018-05-22 00:00:00.000000000 Z
30
+ date: 2018-06-04 00:00:00.000000000 Z
31
31
  dependencies:
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: slack-notifier
@@ -481,7 +481,7 @@ dependencies:
481
481
  requirements:
482
482
  - - ">="
483
483
  - !ruby/object:Gem::Version
484
- version: 1.1.0
484
+ version: 1.2.1
485
485
  - - "<"
486
486
  - !ruby/object:Gem::Version
487
487
  version: 2.0.0
@@ -491,7 +491,7 @@ dependencies:
491
491
  requirements:
492
492
  - - ">="
493
493
  - !ruby/object:Gem::Version
494
- version: 1.1.0
494
+ version: 1.2.1
495
495
  - - "<"
496
496
  - !ruby/object:Gem::Version
497
497
  version: 2.0.0