fastlane 2.221.1 → 2.223.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +98 -98
  3. data/deliver/lib/deliver/options.rb +1 -1
  4. data/deliver/lib/deliver/runner.rb +11 -2
  5. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -3
  7. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -0
  8. data/fastlane/lib/fastlane/actions/download_dsyms.rb +2 -2
  9. data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +16 -1
  10. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
  11. data/fastlane/lib/fastlane/actions/set_changelog.rb +3 -3
  12. data/fastlane/lib/fastlane/actions/slack.rb +9 -2
  13. data/fastlane/lib/fastlane/actions/testfairy.rb +9 -1
  14. data/fastlane/lib/fastlane/fast_file.rb +8 -2
  15. data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
  16. data/fastlane/lib/fastlane/notification/slack.rb +3 -2
  17. data/fastlane/lib/fastlane/version.rb +1 -1
  18. data/fastlane/swift/Deliverfile.swift +1 -1
  19. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  20. data/fastlane/swift/Fastlane.swift +81 -21
  21. data/fastlane/swift/Gymfile.swift +1 -1
  22. data/fastlane/swift/GymfileProtocol.swift +5 -1
  23. data/fastlane/swift/Matchfile.swift +1 -1
  24. data/fastlane/swift/MatchfileProtocol.swift +5 -1
  25. data/fastlane/swift/Precheckfile.swift +1 -1
  26. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  27. data/fastlane/swift/Scanfile.swift +1 -1
  28. data/fastlane/swift/ScanfileProtocol.swift +5 -1
  29. data/fastlane/swift/Screengrabfile.swift +1 -1
  30. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  31. data/fastlane/swift/Snapshotfile.swift +1 -1
  32. data/fastlane/swift/SnapshotfileProtocol.swift +5 -1
  33. data/fastlane/swift/formatting/Brewfile.lock.json +24 -19
  34. data/fastlane/swift/formatting/Rakefile +1 -0
  35. data/fastlane_core/lib/fastlane_core/project.rb +1 -0
  36. data/gym/lib/gym/generators/build_command_generator.rb +1 -1
  37. data/gym/lib/gym/options.rb +10 -1
  38. data/match/lib/match/change_password.rb +2 -1
  39. data/match/lib/match/encryption/encryption.rb +2 -2
  40. data/match/lib/match/encryption/openssl.rb +10 -5
  41. data/match/lib/match/importer.rb +2 -1
  42. data/match/lib/match/nuke.rb +2 -1
  43. data/match/lib/match/options.rb +5 -0
  44. data/match/lib/match/runner.rb +2 -1
  45. data/pilot/lib/pilot/build_manager.rb +9 -0
  46. data/scan/lib/scan/module.rb +1 -1
  47. data/scan/lib/scan/options.rb +10 -1
  48. data/snapshot/lib/snapshot/options.rb +9 -0
  49. data/spaceship/lib/spaceship/connect_api/models/app.rb +10 -0
  50. data/spaceship/lib/spaceship/connect_api/models/app_availability.rb +23 -0
  51. data/spaceship/lib/spaceship/connect_api/models/territory_availability.rb +62 -0
  52. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +9 -0
  53. data/spaceship/lib/spaceship/connect_api.rb +2 -0
  54. data/spaceship/lib/spaceship/tunes/application.rb +1 -1
  55. data/spaceship/lib/spaceship/tunes/tunes_client.rb +2 -0
  56. data/trainer/lib/trainer/test_parser.rb +27 -2
  57. metadata +22 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f07b93540a18ca9244d03f38d6b42715da53a5f3a1d2e01ae0ca07f55b8bbfc
4
- data.tar.gz: 02a85c5ddcb83eb661020c053b2c33411d0f2b4e69bf309a2f5dff62c7376b11
3
+ metadata.gz: 32c31c8cdb5d22c28c22c8c5e87a18bb2b68312b36ea0b313e5da9cfb5ae599d
4
+ data.tar.gz: 6248f389a595ffe2b5769b9f948e24f4e350ec086e989205708c0cfa4155301f
5
5
  SHA512:
6
- metadata.gz: f36be8c3a80185881f79dd332a09e51e3d6a5b512e5571a2dc8c5eb70f38bc0c74cfa862329befbc43f8f4c0fd771ed40a579b23371d12463a1a27921b1e1e85
7
- data.tar.gz: aabf80f68459a5dbffd434963f317755828a18d81ed00e4d5a2a9f0fc6123eeb48d1066b2b4517a6c69ba10252e4a03ea55acf28442d886b23fb243f9a20263c
6
+ metadata.gz: db33d67f27de67d2d5a33a0de04eec412405e6d01f4f879bda83475ff75fd546a61ebe0240011ba9ff9ec992a45347bf5fd6e859da1123529d9cead052ef77eb
7
+ data.tar.gz: 2caa48a245eeaf5a7a85c2c35c7cb32b8c1871b37a106fb124c995e3951bd7b781d51c3bf269d85ca4e34e4cc85be5fae538e896a24c5d20a6d4ae63ce6ae237
data/README.md CHANGED
@@ -35,49 +35,55 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
35
  <!-- This table is regenerated and resorted on each release -->
36
36
  <table id='team'>
37
37
  <tr>
38
- <td id='matthew-ellis'>
39
- <a href='https://github.com/matthewellis'>
40
- <img src='https://github.com/matthewellis.png' width='140px;'>
38
+ <td id='iulian-onofrei'>
39
+ <a href='https://github.com/revolter'>
40
+ <img src='https://github.com/revolter.png' width='140px;'>
41
41
  </a>
42
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
43
43
  </td>
44
- <td id='roger-oba'>
45
- <a href='https://github.com/rogerluan'>
46
- <img src='https://github.com/rogerluan.png' width='140px;'>
44
+ <td id='josh-holtz'>
45
+ <a href='https://github.com/joshdholtz'>
46
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
47
47
  </a>
48
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
49
49
  </td>
50
- <td id='luka-mirosevic'>
51
- <a href='https://github.com/lmirosevic'>
52
- <img src='https://github.com/lmirosevic.png' width='140px;'>
50
+ <td id='kohki-miki'>
51
+ <a href='https://github.com/giginet'>
52
+ <img src='https://github.com/giginet.png' width='140px;'>
53
53
  </a>
54
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
54
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
55
55
  </td>
56
- <td id='daniel-jankowski'>
57
- <a href='https://github.com/mollyIV'>
58
- <img src='https://github.com/mollyIV.png' width='140px;'>
56
+ <td id='łukasz-grabowski'>
57
+ <a href='https://github.com/lucgrabowski'>
58
+ <img src='https://github.com/lucgrabowski.png' width='140px;'>
59
59
  </a>
60
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
60
+ <h4 align='center'>Łukasz Grabowski</h4>
61
+ </td>
62
+ <td id='manu-wallner'>
63
+ <a href='https://github.com/milch'>
64
+ <img src='https://github.com/milch.png' width='140px;'>
65
+ </a>
66
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
61
67
  </td>
68
+ </tr>
69
+ <tr>
62
70
  <td id='fumiya-nakamura'>
63
71
  <a href='https://github.com/nafu'>
64
72
  <img src='https://github.com/nafu.png' width='140px;'>
65
73
  </a>
66
74
  <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
67
75
  </td>
68
- </tr>
69
- <tr>
70
- <td id='olivier-halligon'>
71
- <a href='https://github.com/AliSoftware'>
72
- <img src='https://github.com/AliSoftware.png' width='140px;'>
76
+ <td id='stefan-natchev'>
77
+ <a href='https://github.com/snatchev'>
78
+ <img src='https://github.com/snatchev.png' width='140px;'>
73
79
  </a>
74
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
80
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
75
81
  </td>
76
- <td id='danielle-tomlinson'>
77
- <a href='https://github.com/endocrimes'>
78
- <img src='https://github.com/endocrimes.png' width='140px;'>
82
+ <td id='jan-piotrowski'>
83
+ <a href='https://github.com/janpio'>
84
+ <img src='https://github.com/janpio.png' width='140px;'>
79
85
  </a>
80
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
81
87
  </td>
82
88
  <td id='felix-krause'>
83
89
  <a href='https://github.com/KrauseFx'>
@@ -85,69 +91,51 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
85
91
  </a>
86
92
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
87
93
  </td>
88
- <td id='kohki-miki'>
89
- <a href='https://github.com/giginet'>
90
- <img src='https://github.com/giginet.png' width='140px;'>
91
- </a>
92
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
93
- </td>
94
- <td id='jimmy-dee'>
95
- <a href='https://github.com/jdee'>
96
- <img src='https://github.com/jdee.png' width='140px;'>
94
+ <td id='olivier-halligon'>
95
+ <a href='https://github.com/AliSoftware'>
96
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
97
97
  </a>
98
- <h4 align='center'>Jimmy Dee</h4>
98
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
99
99
  </td>
100
100
  </tr>
101
101
  <tr>
102
- <td id='manish-rathi'>
103
- <a href='https://github.com/crazymanish'>
104
- <img src='https://github.com/crazymanish.png' width='140px;'>
102
+ <td id='roger-oba'>
103
+ <a href='https://github.com/rogerluan'>
104
+ <img src='https://github.com/rogerluan.png' width='140px;'>
105
105
  </a>
106
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
106
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
107
107
  </td>
108
- <td id='jorge-revuelta-h'>
109
- <a href='https://github.com/minuscorp'>
110
- <img src='https://github.com/minuscorp.png' width='140px;'>
108
+ <td id='maksym-grebenets'>
109
+ <a href='https://github.com/mgrebenets'>
110
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
111
111
  </a>
112
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
113
113
  </td>
114
- <td id='jan-piotrowski'>
115
- <a href='https://github.com/janpio'>
116
- <img src='https://github.com/janpio.png' width='140px;'>
114
+ <td id='luka-mirosevic'>
115
+ <a href='https://github.com/lmirosevic'>
116
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
117
117
  </a>
118
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
119
119
  </td>
120
- <td id='jérôme-lacoste'>
121
- <a href='https://github.com/lacostej'>
122
- <img src='https://github.com/lacostej.png' width='140px;'>
120
+ <td id='max-ott'>
121
+ <a href='https://github.com/max-ott'>
122
+ <img src='https://github.com/max-ott.png' width='140px;'>
123
123
  </a>
124
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
124
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
125
125
  </td>
126
- <td id='andrew-mcburney'>
127
- <a href='https://github.com/armcburney'>
128
- <img src='https://github.com/armcburney.png' width='140px;'>
126
+ <td id='joshua-liebowitz'>
127
+ <a href='https://github.com/taquitos'>
128
+ <img src='https://github.com/taquitos.png' width='140px;'>
129
129
  </a>
130
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
130
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
131
131
  </td>
132
132
  </tr>
133
133
  <tr>
134
- <td id='josh-holtz'>
135
- <a href='https://github.com/joshdholtz'>
136
- <img src='https://github.com/joshdholtz.png' width='140px;'>
137
- </a>
138
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
139
- </td>
140
- <td id='łukasz-grabowski'>
141
- <a href='https://github.com/lucgrabowski'>
142
- <img src='https://github.com/lucgrabowski.png' width='140px;'>
143
- </a>
144
- <h4 align='center'>Łukasz Grabowski</h4>
145
- </td>
146
- <td id='satoshi-namai'>
147
- <a href='https://github.com/ainame'>
148
- <img src='https://github.com/ainame.png' width='140px;'>
134
+ <td id='matthew-ellis'>
135
+ <a href='https://github.com/matthewellis'>
136
+ <img src='https://github.com/matthewellis.png' width='140px;'>
149
137
  </a>
150
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
138
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
151
139
  </td>
152
140
  <td id='aaron-brager'>
153
141
  <a href='https://github.com/getaaron'>
@@ -155,25 +143,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
155
143
  </a>
156
144
  <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
157
145
  </td>
158
- <td id='iulian-onofrei'>
159
- <a href='https://github.com/revolter'>
160
- <img src='https://github.com/revolter.png' width='140px;'>
146
+ <td id='danielle-tomlinson'>
147
+ <a href='https://github.com/endocrimes'>
148
+ <img src='https://github.com/endocrimes.png' width='140px;'>
161
149
  </a>
162
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
163
151
  </td>
164
- </tr>
165
- <tr>
166
- <td id='maksym-grebenets'>
167
- <a href='https://github.com/mgrebenets'>
168
- <img src='https://github.com/mgrebenets.png' width='140px;'>
152
+ <td id='andrew-mcburney'>
153
+ <a href='https://github.com/armcburney'>
154
+ <img src='https://github.com/armcburney.png' width='140px;'>
169
155
  </a>
170
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
171
157
  </td>
172
- <td id='stefan-natchev'>
173
- <a href='https://github.com/snatchev'>
174
- <img src='https://github.com/snatchev.png' width='140px;'>
158
+ <td id='jorge-revuelta-h'>
159
+ <a href='https://github.com/minuscorp'>
160
+ <img src='https://github.com/minuscorp.png' width='140px;'>
175
161
  </a>
176
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
163
+ </td>
164
+ </tr>
165
+ <tr>
166
+ <td id='daniel-jankowski'>
167
+ <a href='https://github.com/mollyIV'>
168
+ <img src='https://github.com/mollyIV.png' width='140px;'>
169
+ </a>
170
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
177
171
  </td>
178
172
  <td id='helmut-januschka'>
179
173
  <a href='https://github.com/hjanuschka'>
@@ -181,25 +175,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
181
175
  </a>
182
176
  <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
183
177
  </td>
184
- <td id='manu-wallner'>
185
- <a href='https://github.com/milch'>
186
- <img src='https://github.com/milch.png' width='140px;'>
178
+ <td id='satoshi-namai'>
179
+ <a href='https://github.com/ainame'>
180
+ <img src='https://github.com/ainame.png' width='140px;'>
187
181
  </a>
188
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
189
183
  </td>
190
- <td id='max-ott'>
191
- <a href='https://github.com/max-ott'>
192
- <img src='https://github.com/max-ott.png' width='140px;'>
184
+ <td id='manish-rathi'>
185
+ <a href='https://github.com/crazymanish'>
186
+ <img src='https://github.com/crazymanish.png' width='140px;'>
193
187
  </a>
194
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
188
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
189
+ </td>
190
+ <td id='jérôme-lacoste'>
191
+ <a href='https://github.com/lacostej'>
192
+ <img src='https://github.com/lacostej.png' width='140px;'>
193
+ </a>
194
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  <tr>
198
- <td id='joshua-liebowitz'>
199
- <a href='https://github.com/taquitos'>
200
- <img src='https://github.com/taquitos.png' width='140px;'>
198
+ <td id='jimmy-dee'>
199
+ <a href='https://github.com/jdee'>
200
+ <img src='https://github.com/jdee.png' width='140px;'>
201
201
  </a>
202
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
202
+ <h4 align='center'>Jimmy Dee</h4>
203
203
  </td>
204
204
  </table>
205
205
 
@@ -99,7 +99,7 @@ module Deliver
99
99
  optional: true,
100
100
  default_value: "ios",
101
101
  verify_block: proc do |value|
102
- UI.user_error!("The platform can only be ios, appletvos, or osx") unless %('ios', 'appletvos', 'osx').include?(value)
102
+ UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
103
103
  end),
104
104
 
105
105
  # live version
@@ -172,7 +172,7 @@ module Deliver
172
172
  transporter = transporter_for_selected_team
173
173
 
174
174
  case platform
175
- when "ios", "appletvos"
175
+ when "ios", "appletvos", "xros"
176
176
  package_path = FastlaneCore::IpaUploadPackageBuilder.new.generate(
177
177
  app_id: Deliver.cache[:app].id,
178
178
  ipa_path: ipa_path,
@@ -209,7 +209,7 @@ module Deliver
209
209
  transporter = transporter_for_selected_team
210
210
 
211
211
  case platform
212
- when "ios", "appletvos"
212
+ when "ios", "appletvos", "xros"
213
213
  package_path = FastlaneCore::IpaUploadPackageBuilder.new.generate(
214
214
  app_id: Deliver.cache[:app].id,
215
215
  ipa_path: ipa_path,
@@ -264,6 +264,7 @@ module Deliver
264
264
  private
265
265
 
266
266
  # If App Store Connect API token, use token.
267
+ # If api_key is specified and it is an Individual API Key, don't use token but use username.
267
268
  # If itc_provider was explicitly specified, use it.
268
269
  # If there are multiple teams, infer the provider from the selected team name.
269
270
  # If there are fewer than two teams, don't infer the provider.
@@ -280,6 +281,14 @@ module Deliver
280
281
  api_key
281
282
  end
282
283
 
284
+ # Currently no kind of transporters accept an Individual API Key. Use username and app-specific password instead.
285
+ # See https://github.com/fastlane/fastlane/issues/22115
286
+ is_individual_key = !api_key.nil? && api_key[:issuer_id].nil?
287
+ if is_individual_key
288
+ api_key = nil
289
+ api_token = nil
290
+ end
291
+
283
292
  unless api_token.nil?
284
293
  api_token.refresh! if api_token.expired?
285
294
  return FastlaneCore::ItunesTransporter.new(nil, nil, false, nil, api_token.text, altool_compatible_command: true, api_key: api_key)
@@ -186,7 +186,7 @@ module Fastlane
186
186
  optional: true,
187
187
  default_value: "ios",
188
188
  verify_block: proc do |value|
189
- UI.user_error!("The platform can only be ios, appletvos, or osx") unless %('ios', 'appletvos', 'osx').include?(value)
189
+ UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
190
190
  end),
191
191
  FastlaneCore::ConfigItem.new(key: :team_name,
192
192
  short_option: "-e",
@@ -37,9 +37,9 @@ module Fastlane
37
37
 
38
38
  Dir.chdir(params[:path]) do
39
39
  if params[:commits_count]
40
- changelog = Actions.git_log_last_commits(params[:pretty], params[:commits_count], merge_commit_filtering, params[:date_format], params[:ancestry_path])
40
+ changelog = Actions.git_log_last_commits(params[:pretty], params[:commits_count], merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
41
41
  else
42
- changelog = Actions.git_log_between(params[:pretty], from, to, merge_commit_filtering, params[:date_format], params[:ancestry_path])
42
+ changelog = Actions.git_log_between(params[:pretty], from, to, merge_commit_filtering, params[:date_format], params[:ancestry_path], params[:app_path])
43
43
  end
44
44
 
45
45
  changelog = changelog.gsub("\n\n", "\n") if changelog # as there are duplicate newlines
@@ -147,7 +147,11 @@ module Fastlane
147
147
  verify_block: proc do |value|
148
148
  matches_option = GIT_MERGE_COMMIT_FILTERING_OPTIONS.any? { |opt| opt.to_s == value }
149
149
  UI.user_error!("Valid values for :merge_commit_filtering are #{GIT_MERGE_COMMIT_FILTERING_OPTIONS.map { |o| "'#{o}'" }.join(', ')}") unless matches_option
150
- end)
150
+ end),
151
+ FastlaneCore::ConfigItem.new(key: :app_path,
152
+ env_name: 'FL_CHANGELOG_FROM_GIT_COMMITS_APP_PATH',
153
+ description: "Scopes the changelog to a specific subdirectory of the repository",
154
+ optional: true)
151
155
  ]
152
156
  end
153
157
 
@@ -374,6 +374,7 @@ The available options:
374
374
 
375
375
  - 'ios'
376
376
  - 'appletvos'
377
+ - 'xros'
377
378
  - 'osx'
378
379
 
379
380
 
@@ -290,7 +290,7 @@ module Fastlane
290
290
  FastlaneCore::ConfigItem.new(key: :platform,
291
291
  short_option: "-p",
292
292
  env_name: "DOWNLOAD_DSYMS_PLATFORM",
293
- description: "The app platform for dSYMs you wish to download (ios, appletvos)",
293
+ description: "The app platform for dSYMs you wish to download (ios, xros, appletvos)",
294
294
  default_value: :ios),
295
295
  FastlaneCore::ConfigItem.new(key: :version,
296
296
  short_option: "-v",
@@ -351,7 +351,7 @@ module Fastlane
351
351
  end
352
352
 
353
353
  def self.is_supported?(platform)
354
- [:ios, :appletvos].include?(platform)
354
+ [:ios, :appletvos, :xros].include?(platform)
355
355
  end
356
356
 
357
357
  def self.example_code
@@ -23,7 +23,9 @@ module Fastlane
23
23
  # Manual post processing trying to ignore certain file paths
24
24
  if (ignore_files = params[:ignore_files])
25
25
  repo_status = repo_status.lines.reject do |line|
26
- path = line.split(' ').last
26
+ path = path_from_git_status_line(line)
27
+ next if path.empty?
28
+
27
29
  was_found = ignore_files.include?(path)
28
30
 
29
31
  UI.message("Ignoring '#{path}'") if was_found
@@ -54,6 +56,19 @@ module Fastlane
54
56
  end
55
57
  end
56
58
 
59
+ def self.path_from_git_status_line(line)
60
+ # Extract the file path from the line based on https://git-scm.com/docs/git-status#_output.
61
+ # The first two characters indicate the status of the file path (e.g. ' M')
62
+ # M App/script.sh
63
+ #
64
+ # If the file path is renamed, the original path is also included in the line (e.g. 'R ORIG_PATH -> PATH')
65
+ # R App/script.sh -> App/script_renamed.sh
66
+ #
67
+ path = line.match(/^.. (.* -> )?(.*)$/)[2]
68
+ path = path.delete_prefix('"').delete_suffix('"')
69
+ return path
70
+ end
71
+
57
72
  def self.description
58
73
  "Raises an exception if there are uncommitted git changes"
59
74
  end
@@ -83,7 +83,7 @@ module Fastlane
83
83
  optional: true,
84
84
  default_value: "ios",
85
85
  verify_block: proc do |value|
86
- UI.user_error!("The platform can only be ios, osx, or appletvos") unless %('osx', ios', 'appletvos').include?(value)
86
+ UI.user_error!("The platform can only be ios, osx, xros or appletvos") unless %('osx', ios', 'appletvos', 'xros').include?(value)
87
87
  end),
88
88
  FastlaneCore::ConfigItem.new(key: :initial_build_number,
89
89
  env_name: "INITIAL_BUILD_NUMBER",
@@ -169,10 +169,10 @@ module Fastlane
169
169
  end),
170
170
  FastlaneCore::ConfigItem.new(key: :platform,
171
171
  env_name: "FL_SET_CHANGELOG_PLATFORM",
172
- description: "The platform of the app (ios, appletvos, mac)",
172
+ description: "The platform of the app (ios, appletvos, xros, mac)",
173
173
  default_value: "ios",
174
174
  verify_block: proc do |value|
175
- available = ['ios', 'appletvos', 'mac']
175
+ available = ['ios', 'appletvos', 'xros', 'mac']
176
176
  UI.user_error!("Invalid platform '#{value}', must be #{available.join(', ')}") unless available.include?(value)
177
177
  end)
178
178
  ]
@@ -183,7 +183,7 @@ module Fastlane
183
183
  end
184
184
 
185
185
  def self.is_supported?(platform)
186
- [:ios, :appletvos, :mac].include?(platform)
186
+ [:ios, :appletvos, :xros, :mac].include?(platform)
187
187
  end
188
188
 
189
189
  def self.example_code
@@ -27,6 +27,7 @@ module Fastlane
27
27
  slack_attachment = self.class.generate_slack_attachments(options)
28
28
  link_names = options[:link_names]
29
29
  icon_url = options[:use_webhook_configured_username_and_icon] ? nil : options[:icon_url]
30
+ icon_emoji = options[:use_webhook_configured_username_and_icon] ? nil : options[:icon_emoji]
30
31
 
31
32
  post_message(
32
33
  channel: channel,
@@ -34,16 +35,18 @@ module Fastlane
34
35
  attachments: [slack_attachment],
35
36
  link_names: link_names,
36
37
  icon_url: icon_url,
38
+ icon_emoji: icon_emoji,
37
39
  fail_on_error: options[:fail_on_error]
38
40
  )
39
41
  end
40
42
 
41
- def post_message(channel:, username:, attachments:, link_names:, icon_url:, fail_on_error:)
43
+ def post_message(channel:, username:, attachments:, link_names:, icon_url:, icon_emoji:, fail_on_error:)
42
44
  @notifier.post_to_legacy_incoming_webhook(
43
45
  channel: channel,
44
46
  username: username,
45
47
  link_names: link_names,
46
48
  icon_url: icon_url,
49
+ icon_emoji: icon_emoji,
47
50
  attachments: attachments
48
51
  )
49
52
  UI.success('Successfully sent Slack notification')
@@ -211,9 +214,13 @@ module Fastlane
211
214
  optional: true),
212
215
  FastlaneCore::ConfigItem.new(key: :icon_url,
213
216
  env_name: "FL_SLACK_ICON_URL",
214
- description: "Overrides the webhook's image property if use_webhook_configured_username_and_icon is false",
217
+ description: "Specifies a URL of an image to use as the photo of the message. Overrides the webhook's image property if use_webhook_configured_username_and_icon is false",
215
218
  default_value: "https://fastlane.tools/assets/img/fastlane_icon.png",
216
219
  optional: true),
220
+ FastlaneCore::ConfigItem.new(key: :icon_emoji,
221
+ env_name: "FL_SLACK_ICON_EMOJI",
222
+ description: "Specifies an emoji (using colon shortcodes, eg. :white_check_mark:) to use as the photo of the message. Overrides the webhook's image property if use_webhook_configured_username_and_icon is false. This parameter takes precedence over icon_url",
223
+ optional: true),
217
224
  FastlaneCore::ConfigItem.new(key: :payload,
218
225
  env_name: "FL_SLACK_PAYLOAD",
219
226
  description: "Add additional information to this post. payload must be a hash containing any key with any value",
@@ -96,6 +96,8 @@ module Fastlane
96
96
  [key, options_to_client.call(value).join(',')]
97
97
  when :custom
98
98
  [key, value]
99
+ when :tags
100
+ [key, value.join(',')]
99
101
  else
100
102
  UI.user_error!("Unknown parameter: #{key}")
101
103
  end
@@ -241,7 +243,13 @@ module Fastlane
241
243
  env_name: "FL_TESTFAIRY_TIMEOUT",
242
244
  description: "Request timeout in seconds",
243
245
  type: Integer,
244
- optional: true)
246
+ optional: true),
247
+ FastlaneCore::ConfigItem.new(key: :tags,
248
+ optional: true,
249
+ env_name: "FL_TESTFAIRY_TAGS",
250
+ description: "Custom tags that can be used to organize your builds",
251
+ type: Array,
252
+ default_value: [])
245
253
  ]
246
254
  end
247
255
 
@@ -218,7 +218,9 @@ module Fastlane
218
218
  end
219
219
 
220
220
  def self.sh(*command, step_name: nil, log: true, error_callback: nil, &b)
221
- command_header = log ? step_name || Actions.shell_command_from_args(*command) : "shell command"
221
+ command_header = step_name
222
+ command_header ||= log ? Actions.shell_command_from_args(*command) : "shell command"
223
+
222
224
  Actions.execute_action(command_header) do
223
225
  Actions.sh_no_action(*command, log: log, error_callback: error_callback, &b)
224
226
  end
@@ -343,7 +345,11 @@ module Fastlane
343
345
  # Update the repo if it's eligible for caching but the version isn't specified
344
346
  UI.message("Fetching remote git branches and updating git repo...")
345
347
  Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
346
- Actions.sh("cd #{clone_folder.shellescape} && git fetch --all --quiet && git checkout #{checkout_param.shellescape} #{checkout_path} && git reset --hard && git rebase")
348
+ command = "cd #{clone_folder.shellescape} && git fetch --all --quiet && git checkout #{checkout_param.shellescape} #{checkout_path} && git reset --hard"
349
+ # Check if checked out "branch" is actually a branch or a tag
350
+ current_branch = Actions.sh("cd #{clone_folder.shellescape} && git rev-parse --abbrev-ref HEAD")
351
+ command << " && git rebase" unless current_branch.strip.eql?("HEAD")
352
+ Actions.sh(command)
347
353
  end
348
354
  else
349
355
  begin
@@ -9,13 +9,14 @@ module Fastlane
9
9
  end.freeze
10
10
  end
11
11
 
12
- def self.git_log_between(pretty_format, from, to, merge_commit_filtering, date_format = nil, ancestry_path)
12
+ def self.git_log_between(pretty_format, from, to, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
13
13
  command = %w(git log)
14
14
  command << "--pretty=#{pretty_format}"
15
15
  command << "--date=#{date_format}" if date_format
16
16
  command << '--ancestry-path' if ancestry_path
17
17
  command << "#{from}...#{to}"
18
18
  command << git_log_merge_commit_filtering_option(merge_commit_filtering)
19
+ command << app_path if app_path
19
20
  # "*command" syntax expands "command" array into variable arguments, which
20
21
  # will then be individually shell-escaped by Actions.sh.
21
22
  Actions.sh(*command.compact, log: false).chomp
@@ -23,13 +24,14 @@ module Fastlane
23
24
  nil
24
25
  end
25
26
 
26
- def self.git_log_last_commits(pretty_format, commit_count, merge_commit_filtering, date_format = nil, ancestry_path)
27
+ def self.git_log_last_commits(pretty_format, commit_count, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
27
28
  command = %w(git log)
28
29
  command << "--pretty=#{pretty_format}"
29
30
  command << "--date=#{date_format}" if date_format
30
31
  command << '--ancestry-path' if ancestry_path
31
32
  command << '-n' << commit_count.to_s
32
33
  command << git_log_merge_commit_filtering_option(merge_commit_filtering)
34
+ command << app_path if app_path
33
35
  Actions.sh(*command.compact, log: false).chomp
34
36
  rescue
35
37
  nil
@@ -8,16 +8,17 @@ module Fastlane
8
8
  end
9
9
  end
10
10
 
11
- # Overriding channel, icon_url and username is only supported in legacy incoming webhook.
11
+ # Overriding channel, icon_url, icon_emoji and username is only supported in legacy incoming webhook.
12
12
  # Also note that the use of attachments has been discouraged by Slack, in favor of Block Kit.
13
13
  # https://api.slack.com/legacy/custom-integrations/messaging/webhooks
14
- def post_to_legacy_incoming_webhook(channel:, username:, attachments:, link_names:, icon_url:)
14
+ def post_to_legacy_incoming_webhook(channel:, username:, attachments:, link_names:, icon_url:, icon_emoji:)
15
15
  @client.post(@webhook_url) do |request|
16
16
  request.headers['Content-Type'] = 'application/json'
17
17
  request.body = {
18
18
  channel: channel,
19
19
  username: username,
20
20
  icon_url: icon_url,
21
+ icon_emoji: icon_emoji,
21
22
  attachments: attachments,
22
23
  link_names: link_names
23
24
  }.to_json
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.221.1'.freeze
2
+ VERSION = '2.223.0'.freeze
3
3
  SUMMARY = "The easiest way to build and release mobile apps.".freeze
4
4
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
5
5
  MINIMUM_XCODE_RELEASE = "7.0".freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.221.1
20
+ // Generated with fastlane 2.223.0