fastlane 2.215.1 → 2.217.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +90 -90
  3. data/deliver/lib/deliver/app_screenshot.rb +7 -0
  4. data/deliver/lib/deliver/runner.rb +2 -1
  5. data/deliver/lib/deliver/upload_metadata.rb +58 -13
  6. data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +1 -1
  7. data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +6 -2
  8. data/fastlane/lib/fastlane/actions/git_branch.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/install_on_device.rb +1 -1
  10. data/fastlane/lib/fastlane/actions/nexus_upload.rb +1 -0
  11. data/fastlane/lib/fastlane/actions/notarize.rb +17 -2
  12. data/fastlane/lib/fastlane/actions/slather.rb +17 -4
  13. data/fastlane/lib/fastlane/helper/git_helper.rb +3 -0
  14. data/fastlane/lib/fastlane/lane.rb +9 -1
  15. data/fastlane/lib/fastlane/runner.rb +1 -1
  16. data/fastlane/lib/fastlane/version.rb +1 -1
  17. data/fastlane/swift/Deliverfile.swift +1 -1
  18. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  19. data/fastlane/swift/Fastlane.swift +46 -6
  20. data/fastlane/swift/Gymfile.swift +1 -1
  21. data/fastlane/swift/GymfileProtocol.swift +1 -1
  22. data/fastlane/swift/Matchfile.swift +1 -1
  23. data/fastlane/swift/MatchfileProtocol.swift +13 -1
  24. data/fastlane/swift/Precheckfile.swift +1 -1
  25. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  26. data/fastlane/swift/Scanfile.swift +1 -1
  27. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  28. data/fastlane/swift/Screengrabfile.swift +1 -1
  29. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  30. data/fastlane/swift/Snapshotfile.swift +1 -1
  31. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  32. data/fastlane/swift/formatting/Brewfile.lock.json +18 -28
  33. data/fastlane_core/lib/fastlane_core/cert_checker.rb +1 -1
  34. data/fastlane_core/lib/fastlane_core/project.rb +4 -0
  35. data/fastlane_core/lib/fastlane_core/queue_worker.rb +1 -1
  36. data/gym/lib/gym/module.rb +13 -2
  37. data/gym/lib/gym/options.rb +1 -1
  38. data/match/lib/match/options.rb +13 -0
  39. data/match/lib/match/runner.rb +11 -5
  40. data/match/lib/match/storage/git_storage.rb +9 -1
  41. data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +1 -1
  42. data/snapshot/lib/assets/SnapshotHelper.swift +13 -9
  43. data/snapshot/lib/snapshot/reports_generator.rb +48 -7
  44. data/spaceship/lib/spaceship/connect_api/api_client.rb +2 -1
  45. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +2 -0
  46. data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +4 -4
  47. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +2 -2
  48. data/spaceship/lib/spaceship/connect_api/models/device.rb +2 -2
  49. data/spaceship/lib/spaceship/connect_api/models/profile.rb +3 -2
  50. data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +14 -8
  51. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +0 -3
  52. data/supply/lib/supply/uploader.rb +28 -13
  53. data/trainer/lib/trainer/xcresult.rb +1 -1
  54. metadata +27 -30
  55. data/fastlane/lib/fastlane/.features.rb.swp +0 -0
  56. data/fastlane_core/lib/fastlane_core/.env.rb.swp +0 -0
  57. data/supply/lib/supply/.client.rb.swp +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 90b70a3377c5e98064852a2d2f67302571be0e2aa8a94c4f8effffe6630a0cd6
4
- data.tar.gz: 9d5bb689fc03ea7b1677f61e20156f3ac38a06a2e5e810b9efef220c73093d2d
3
+ metadata.gz: e01e5f95c0f041f81a6d2865261a7bf02a4edc77c8e3e7d0d42fdccc93a9eab3
4
+ data.tar.gz: 2f9e98e9d81c4035378505cbf6e3d18cffd680ed3d3c6d8bab31b3be8e7f9a70
5
5
  SHA512:
6
- metadata.gz: 27668df1eb437b1d7214f4fb6e8e1863a6829eab0b1b0d5e1cd9b468794589777d203e76f2bc4ab07cacf84bc4ff0812509b7cf3ad28e82edeeff30b50567075
7
- data.tar.gz: fdb19f03765fd55b2eba65dd5cfa7ae5f1b0162d44a48d37e06b0bc07dbde16b8cc7830399d7ced1e946fd365d77c4245067f44db5a336af1f2eea2ad57df4d9
6
+ metadata.gz: 0e43d45ef9b768b1eba630e1148a9f31f7b356a63977fea8fa45262c0d18a0e952c36e7208654f2b11dcfcb207a2a753b2b7e5820d9a9b209f87954f8048414b
7
+ data.tar.gz: 2177260881cd3aab9d3b7b5542cfc526a4140eb5707108ea346146a2e2da19b3edf627d8013aa7b71b07df5df0a9571d5d0af474dd611f0871cf9339cc6addf9
data/README.md CHANGED
@@ -35,49 +35,23 @@ 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='manu-wallner'>
39
- <a href='https://github.com/milch'>
40
- <img src='https://github.com/milch.png' width='140px;'>
41
- </a>
42
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
43
- </td>
44
- <td id='jan-piotrowski'>
45
- <a href='https://github.com/janpio'>
46
- <img src='https://github.com/janpio.png' width='140px;'>
47
- </a>
48
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
49
- </td>
50
- <td id='manish-rathi'>
51
- <a href='https://github.com/crazymanish'>
52
- <img src='https://github.com/crazymanish.png' width='140px;'>
53
- </a>
54
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
55
- </td>
56
- <td id='łukasz-grabowski'>
57
- <a href='https://github.com/lucgrabowski'>
58
- <img src='https://github.com/lucgrabowski.png' width='140px;'>
59
- </a>
60
- <h4 align='center'>Łukasz Grabowski</h4>
61
- </td>
62
- <td id='kohki-miki'>
63
- <a href='https://github.com/giginet'>
64
- <img src='https://github.com/giginet.png' width='140px;'>
65
- </a>
66
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
67
- </td>
68
- </tr>
69
- <tr>
70
38
  <td id='jimmy-dee'>
71
39
  <a href='https://github.com/jdee'>
72
40
  <img src='https://github.com/jdee.png' width='140px;'>
73
41
  </a>
74
42
  <h4 align='center'>Jimmy Dee</h4>
75
43
  </td>
76
- <td id='aaron-brager'>
77
- <a href='https://github.com/getaaron'>
78
- <img src='https://github.com/getaaron.png' width='140px;'>
44
+ <td id='andrew-mcburney'>
45
+ <a href='https://github.com/armcburney'>
46
+ <img src='https://github.com/armcburney.png' width='140px;'>
79
47
  </a>
80
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
49
+ </td>
50
+ <td id='joshua-liebowitz'>
51
+ <a href='https://github.com/taquitos'>
52
+ <img src='https://github.com/taquitos.png' width='140px;'>
53
+ </a>
54
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
81
55
  </td>
82
56
  <td id='max-ott'>
83
57
  <a href='https://github.com/max-ott'>
@@ -85,25 +59,19 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
85
59
  </a>
86
60
  <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
87
61
  </td>
88
- <td id='felix-krause'>
89
- <a href='https://github.com/KrauseFx'>
90
- <img src='https://github.com/KrauseFx.png' width='140px;'>
91
- </a>
92
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
93
- </td>
94
- <td id='iulian-onofrei'>
95
- <a href='https://github.com/revolter'>
96
- <img src='https://github.com/revolter.png' width='140px;'>
62
+ <td id='jan-piotrowski'>
63
+ <a href='https://github.com/janpio'>
64
+ <img src='https://github.com/janpio.png' width='140px;'>
97
65
  </a>
98
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
66
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
99
67
  </td>
100
68
  </tr>
101
69
  <tr>
102
- <td id='jérôme-lacoste'>
103
- <a href='https://github.com/lacostej'>
104
- <img src='https://github.com/lacostej.png' width='140px;'>
70
+ <td id='olivier-halligon'>
71
+ <a href='https://github.com/AliSoftware'>
72
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
105
73
  </a>
106
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
74
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
107
75
  </td>
108
76
  <td id='josh-holtz'>
109
77
  <a href='https://github.com/joshdholtz'>
@@ -111,23 +79,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
111
79
  </a>
112
80
  <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
113
81
  </td>
114
- <td id='matthew-ellis'>
115
- <a href='https://github.com/matthewellis'>
116
- <img src='https://github.com/matthewellis.png' width='140px;'>
82
+ <td id='aaron-brager'>
83
+ <a href='https://github.com/getaaron'>
84
+ <img src='https://github.com/getaaron.png' width='140px;'>
117
85
  </a>
118
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
119
87
  </td>
120
- <td id='maksym-grebenets'>
121
- <a href='https://github.com/mgrebenets'>
122
- <img src='https://github.com/mgrebenets.png' width='140px;'>
88
+ <td id='roger-oba'>
89
+ <a href='https://github.com/rogerluan'>
90
+ <img src='https://github.com/rogerluan.png' width='140px;'>
123
91
  </a>
124
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
92
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
125
93
  </td>
126
- <td id='daniel-jankowski'>
127
- <a href='https://github.com/mollyIV'>
128
- <img src='https://github.com/mollyIV.png' width='140px;'>
94
+ <td id='matthew-ellis'>
95
+ <a href='https://github.com/matthewellis'>
96
+ <img src='https://github.com/matthewellis.png' width='140px;'>
129
97
  </a>
130
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
98
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
131
99
  </td>
132
100
  </tr>
133
101
  <tr>
@@ -137,55 +105,87 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
137
105
  </a>
138
106
  <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
139
107
  </td>
140
- <td id='luka-mirosevic'>
141
- <a href='https://github.com/lmirosevic'>
142
- <img src='https://github.com/lmirosevic.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;'>
143
111
  </a>
144
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
145
113
  </td>
146
- <td id='olivier-halligon'>
147
- <a href='https://github.com/AliSoftware'>
148
- <img src='https://github.com/AliSoftware.png' width='140px;'>
114
+ <td id='danielle-tomlinson'>
115
+ <a href='https://github.com/endocrimes'>
116
+ <img src='https://github.com/endocrimes.png' width='140px;'>
149
117
  </a>
150
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
151
119
  </td>
120
+ <td id='kohki-miki'>
121
+ <a href='https://github.com/giginet'>
122
+ <img src='https://github.com/giginet.png' width='140px;'>
123
+ </a>
124
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
125
+ </td>
126
+ <td id='manu-wallner'>
127
+ <a href='https://github.com/milch'>
128
+ <img src='https://github.com/milch.png' width='140px;'>
129
+ </a>
130
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
131
+ </td>
132
+ </tr>
133
+ <tr>
152
134
  <td id='jorge-revuelta-h'>
153
135
  <a href='https://github.com/minuscorp'>
154
136
  <img src='https://github.com/minuscorp.png' width='140px;'>
155
137
  </a>
156
138
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
157
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>
158
146
  <td id='fumiya-nakamura'>
159
147
  <a href='https://github.com/nafu'>
160
148
  <img src='https://github.com/nafu.png' width='140px;'>
161
149
  </a>
162
150
  <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
163
151
  </td>
152
+ <td id='stefan-natchev'>
153
+ <a href='https://github.com/snatchev'>
154
+ <img src='https://github.com/snatchev.png' width='140px;'>
155
+ </a>
156
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
157
+ </td>
158
+ <td id='luka-mirosevic'>
159
+ <a href='https://github.com/lmirosevic'>
160
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
161
+ </a>
162
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
163
+ </td>
164
164
  </tr>
165
165
  <tr>
166
- <td id='danielle-tomlinson'>
167
- <a href='https://github.com/endocrimes'>
168
- <img src='https://github.com/endocrimes.png' width='140px;'>
166
+ <td id='manish-rathi'>
167
+ <a href='https://github.com/crazymanish'>
168
+ <img src='https://github.com/crazymanish.png' width='140px;'>
169
169
  </a>
170
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
170
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
171
171
  </td>
172
- <td id='andrew-mcburney'>
173
- <a href='https://github.com/armcburney'>
174
- <img src='https://github.com/armcburney.png' width='140px;'>
172
+ <td id='jérôme-lacoste'>
173
+ <a href='https://github.com/lacostej'>
174
+ <img src='https://github.com/lacostej.png' width='140px;'>
175
175
  </a>
176
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
177
177
  </td>
178
- <td id='stefan-natchev'>
179
- <a href='https://github.com/snatchev'>
180
- <img src='https://github.com/snatchev.png' width='140px;'>
178
+ <td id='daniel-jankowski'>
179
+ <a href='https://github.com/mollyIV'>
180
+ <img src='https://github.com/mollyIV.png' width='140px;'>
181
181
  </a>
182
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
183
183
  </td>
184
- <td id='joshua-liebowitz'>
185
- <a href='https://github.com/taquitos'>
186
- <img src='https://github.com/taquitos.png' width='140px;'>
184
+ <td id='felix-krause'>
185
+ <a href='https://github.com/KrauseFx'>
186
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
187
187
  </a>
188
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
188
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
189
189
  </td>
190
190
  <td id='helmut-januschka'>
191
191
  <a href='https://github.com/hjanuschka'>
@@ -195,11 +195,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
195
195
  </td>
196
196
  </tr>
197
197
  <tr>
198
- <td id='roger-oba'>
199
- <a href='https://github.com/rogerluan'>
200
- <img src='https://github.com/rogerluan.png' width='140px;'>
198
+ <td id='iulian-onofrei'>
199
+ <a href='https://github.com/revolter'>
200
+ <img src='https://github.com/revolter.png' width='140px;'>
201
201
  </a>
202
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
202
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
203
203
  </td>
204
204
  </table>
205
205
 
@@ -69,6 +69,8 @@ module Deliver
69
69
  IOS_APPLE_WATCH_SERIES4 = "iOS-Apple-Watch-Series4"
70
70
  # Apple Watch Series 7
71
71
  IOS_APPLE_WATCH_SERIES7 = "iOS-Apple-Watch-Series7"
72
+ # Apple Watch Ultra
73
+ IOS_APPLE_WATCH_ULTRA = "iOS-Apple-Watch-Ultra"
72
74
 
73
75
  # Apple TV
74
76
  APPLE_TV = "Apple-TV"
@@ -128,6 +130,7 @@ module Deliver
128
130
  ScreenSize::IOS_APPLE_WATCH => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_3,
129
131
  ScreenSize::IOS_APPLE_WATCH_SERIES4 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_4,
130
132
  ScreenSize::IOS_APPLE_WATCH_SERIES7 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_7,
133
+ ScreenSize::IOS_APPLE_WATCH_ULTRA => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_ULTRA,
131
134
  ScreenSize::APPLE_TV => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_APPLE_TV
132
135
  }
133
136
  return matching[self.screen_size]
@@ -165,6 +168,7 @@ module Deliver
165
168
  ScreenSize::IOS_APPLE_WATCH => "Watch",
166
169
  ScreenSize::IOS_APPLE_WATCH_SERIES4 => "Watch Series4",
167
170
  ScreenSize::IOS_APPLE_WATCH_SERIES7 => "Watch Series7",
171
+ ScreenSize::IOS_APPLE_WATCH_ULTRA => "Watch Ultra",
168
172
  ScreenSize::APPLE_TV => "Apple TV"
169
173
  }
170
174
  return matching[self.screen_size]
@@ -340,6 +344,9 @@ module Deliver
340
344
  ScreenSize::IOS_APPLE_WATCH_SERIES7 => [
341
345
  [396, 484]
342
346
  ],
347
+ ScreenSize::IOS_APPLE_WATCH_ULTRA => [
348
+ [410, 502]
349
+ ],
343
350
  ScreenSize::APPLE_TV => [
344
351
  [1920, 1080],
345
352
  [3840, 2160]
@@ -231,7 +231,8 @@ module Deliver
231
231
 
232
232
  unless result
233
233
  transporter_errors = transporter.displayable_errors
234
- UI.user_error!("Error uploading ipa file: \n #{transporter_errors}")
234
+ file_type = platform == "osx" ? "pkg" : "ipa"
235
+ UI.user_error!("Error uploading #{file_type} file: \n #{transporter_errors}")
235
236
  end
236
237
  end
237
238
 
@@ -89,7 +89,8 @@ module Deliver
89
89
  enabled_languages = detect_languages(options)
90
90
 
91
91
  app_store_version_localizations = verify_available_version_languages!(options, app, enabled_languages) unless options[:edit_live]
92
- app_info_localizations = verify_available_info_languages!(options, app, enabled_languages) unless options[:edit_live]
92
+ app_info = fetch_edit_app_info(app)
93
+ app_info_localizations = verify_available_info_languages!(options, app, app_info, enabled_languages) unless options[:edit_live] || !updating_localized_app_info?(options, app, app_info)
93
94
 
94
95
  if options[:edit_live]
95
96
  # not all values are editable when using live_version
@@ -211,18 +212,19 @@ module Deliver
211
212
  store_version_worker.start
212
213
 
213
214
  # Update app info localizations
214
- app_info_worker = FastlaneCore::QueueWorker.new do |app_info_localization|
215
- attributes = localized_info_attributes_by_locale[app_info_localization.locale]
216
- if attributes
217
- UI.message("Uploading metadata to App Store Connect for localized info '#{app_info_localization.locale}'")
218
- app_info_localization.update(attributes: attributes)
215
+ if app_info_localizations
216
+ app_info_worker = FastlaneCore::QueueWorker.new do |app_info_localization|
217
+ attributes = localized_info_attributes_by_locale[app_info_localization.locale]
218
+ if attributes
219
+ UI.message("Uploading metadata to App Store Connect for localized info '#{app_info_localization.locale}'")
220
+ app_info_localization.update(attributes: attributes)
221
+ end
219
222
  end
223
+ app_info_worker.batch_enqueue(app_info_localizations)
224
+ app_info_worker.start
220
225
  end
221
- app_info_worker.batch_enqueue(app_info_localizations)
222
- app_info_worker.start
223
226
 
224
227
  # Update categories
225
- app_info = fetch_edit_app_info(app)
226
228
  if app_info
227
229
  category_id_map = {}
228
230
 
@@ -437,6 +439,12 @@ module Deliver
437
439
  end
438
440
  end
439
441
 
442
+ def fetch_live_app_info(app, wait_time: 10)
443
+ retry_if_nil("Cannot find live app info", wait_time: wait_time) do
444
+ app.fetch_live_app_info
445
+ end
446
+ end
447
+
440
448
  def retry_if_nil(message, tries: 5, wait_time: 10)
441
449
  loop do
442
450
  tries -= 1
@@ -451,12 +459,49 @@ module Deliver
451
459
  end
452
460
  end
453
461
 
454
- # Finding languages to enable
455
- def verify_available_info_languages!(options, app, languages)
456
- app_info = fetch_edit_app_info(app)
462
+ # Checking if the metadata to update includes localised App Info
463
+ def updating_localized_app_info?(options, app, app_info)
464
+ app_info ||= fetch_live_app_info(app)
465
+ unless app_info
466
+ UI.important("Can't find edit or live App info. Skipping upload.")
467
+ return false
468
+ end
469
+ localizations = app_info.get_app_info_localizations
470
+
471
+ LOCALISED_APP_VALUES.keys.each do |key|
472
+ current = options[key]
473
+ next unless current
474
+
475
+ unless current.kind_of?(Hash)
476
+ UI.error("Error with provided '#{key}'. Must be a hash, the key being the language.")
477
+ next
478
+ end
479
+
480
+ current.each do |language, value|
481
+ strip_value = value.to_s.strip
482
+ next if strip_value.empty?
483
+
484
+ app_info_locale = localizations.find { |l| l.locale == language }
485
+ next if app_info_locale.nil?
457
486
 
487
+ begin
488
+ current_value = app_info_locale.public_send(key.to_sym)
489
+ rescue NoMethodError
490
+ next
491
+ end
492
+
493
+ return true if current_value != strip_value
494
+ end
495
+ end
496
+
497
+ UI.message('No changes to localized App Info detected. Skipping upload.')
498
+ return false
499
+ end
500
+
501
+ # Finding languages to enable
502
+ def verify_available_info_languages!(options, app, app_info, languages)
458
503
  unless app_info
459
- UI.user_error!("Cannot update languages - could not find an editable info")
504
+ UI.user_error!("Cannot update languages - could not find an editable 'App Info'. Verify that your app is in one of the editable states in App Store Connect")
460
505
  return
461
506
  end
462
507
 
@@ -441,7 +441,7 @@ fastlane deliver submit_build --build_number 830 --submission_information "{\"ex
441
441
 
442
442
  ### App Privacy Details
443
443
 
444
- Starting on December 8, 2020, Apple announced that developers are required to provide app privacy details that will help users understand an app's privacy practies. _deliver_ does not allow for updating of this information but this can be done with the _upload_app_privacy_details_to_app_store_ action. More information on [Uploading App Privacy Details](https://docs.fastlane.tools/uploading-app-privacy-details)
444
+ Starting on December 8, 2020, Apple announced that developers are required to provide app privacy details that will help users understand an app's privacy practices. _deliver_ does not allow for updating of this information but this can be done with the _upload_app_privacy_details_to_app_store_ action. More information on [Uploading App Privacy Details](https://docs.fastlane.tools/uploading-app-privacy-details)
445
445
 
446
446
  # Credentials
447
447
 
@@ -179,6 +179,12 @@ This can be done using the `--track_promote_to` parameter. The `--track_promote_
179
179
  Before performing a new APK upload you may want to check existing track version codes or release names, or you may simply want to provide an informational lane that displays the currently promoted version codes or release name for the production track. You can use the `google_play_track_version_codes` action to retrieve existing version codes for a package and track. You can use the `google_play_track_release_names` action to retrieve existing release names for a package and track.
180
180
  For more information, see the `fastlane action google_play_track_version_codes` and `fastlane action google_play_track_release_names` help output.
181
181
 
182
+ ## Parallel uploads
183
+
184
+ By default _supply_ will spawn 10 threads to upload the metadata concurrently (_images, screenshots, texts_). If you want to change this, set either `DELIVER_NUMBER_OF_THREADS` or `FL_NUMBER_OF_THREADS` environment variable to any value between 1 and 10.
185
+
186
+ If you want _supply_ to upload with more than 10 threads in parallel then you need to **additionally** set `FL_MAX_NUMBER_OF_THREADS` environment variable to the max number of parallel upload threads you wish to have (**Warning ⚠️** use this at your own risk!).
187
+
182
188
  ## Migration from AndroidPublisherV2 to AndroidPublisherV3 in _fastlane_ 2.135.0
183
189
 
184
190
  ### New Options
@@ -200,5 +206,3 @@ For more information, see the `fastlane action google_play_track_version_codes`
200
206
  - Google Play will automatically remove releases that are superseded now
201
207
  - `:deactivate_on_promote`
202
208
  - Google Play will automatically deactivate a release from its previous track on promote
203
-
204
- :
@@ -16,7 +16,7 @@ module Fastlane
16
16
  end
17
17
 
18
18
  def self.details
19
- "If no branch could be found, this action will return an empty string. This is a wrapper for the internal action Actions.git_branch"
19
+ "If no branch could be found, this action will return an empty string. If `FL_GIT_BRANCH_DONT_USE_ENV_VARS` is `true`, it'll ignore CI ENV vars. This is a wrapper for the internal action Actions.git_branch"
20
20
  end
21
21
 
22
22
  def self.available_options
@@ -68,7 +68,7 @@ module Fastlane
68
68
  end
69
69
 
70
70
  def self.details
71
- "Installs the ipa on the device. If no id is given, the first found iOS device will be used. Works via USB or Wi-Fi. This requires `ios-deploy` to be installed. Please have a look at [ios-deploy](https://github.com/ios-control/ios-deploy). To quickly install it, use `npm -g i ios-deploy`"
71
+ "Installs the ipa on the device. If no id is given, the first found iOS device will be used. Works via USB or Wi-Fi. This requires `ios-deploy` to be installed. Please have a look at [ios-deploy](https://github.com/ios-control/ios-deploy). To quickly install it, use `brew install ios-deploy`"
72
72
  end
73
73
 
74
74
  def self.is_supported?(platform)
@@ -139,6 +139,7 @@ module Fastlane
139
139
  FastlaneCore::ConfigItem.new(key: :password,
140
140
  env_name: "FL_NEXUS_PASSWORD",
141
141
  description: "Nexus password",
142
+ sensitive: true,
142
143
  optional: false),
143
144
  FastlaneCore::ConfigItem.new(key: :ssl_verify,
144
145
  env_name: "FL_NEXUS_SSL_VERIFY",
@@ -85,9 +85,9 @@ module Fastlane
85
85
  notarization_info = JSON.parse(submit_response)
86
86
 
87
87
  # Staple
88
+ submission_id = notarization_info["id"]
88
89
  case notarization_info['status']
89
90
  when 'Accepted'
90
- submission_id = notarization_info["id"]
91
91
  UI.success("Successfully uploaded package to notarization service with request identifier #{submission_id}")
92
92
 
93
93
  if skip_stapling
@@ -100,7 +100,22 @@ module Fastlane
100
100
  UI.success("Successfully notarized and stapled package")
101
101
  end
102
102
  when 'Invalid'
103
- UI.user_error!("Could not notarize package with message '#{notarization_info['statusSummary']}'")
103
+ if submission_id && print_log
104
+ log_request_parts = [
105
+ "xcrun notarytool log #{submission_id}"
106
+ ] + auth_parts
107
+ log_request_command = log_request_parts.join(' ')
108
+ log_request_response = Actions.sh(
109
+ log_request_command,
110
+ log: verbose,
111
+ error_callback: lambda { |msg|
112
+ UI.error("Error requesting the notarization log: #{msg}")
113
+ }
114
+ )
115
+ UI.user_error!("Could not notarize package with message '#{log_request_response}'")
116
+ else
117
+ UI.user_error!("Could not notarize package. To see the error, please set 'print_log' to true.")
118
+ end
104
119
  else
105
120
  UI.crash!("Could not notarize package with status '#{notarization_info['status']}'")
106
121
  end
@@ -35,7 +35,8 @@ module Fastlane
35
35
  binary_basename: '--binary-basename',
36
36
  arch: '--arch',
37
37
  source_files: '--source-files',
38
- decimals: '--decimals'
38
+ decimals: '--decimals',
39
+ ymlfile: '--ymlfile'
39
40
  }.freeze
40
41
 
41
42
  def self.run(params)
@@ -51,8 +52,8 @@ module Fastlane
51
52
  sh(command)
52
53
  end
53
54
 
54
- def self.has_config_file
55
- File.file?('.slather.yml')
55
+ def self.has_config_file?(params)
56
+ params[:ymlfile] ? File.file?(params[:ymlfile]) : File.file?('.slather.yml')
56
57
  end
57
58
 
58
59
  def self.slather_version
@@ -64,12 +65,20 @@ module Fastlane
64
65
  Gem::Version.new('2.4.1') <= Gem::Version.new(slather_version)
65
66
  end
66
67
 
68
+ def self.ymlfile_available?
69
+ Gem::Version.new('2.8.0') <= Gem::Version.new(slather_version)
70
+ end
71
+
67
72
  def self.validate_params!(params)
68
73
  if params[:configuration]
69
74
  UI.user_error!('configuration option is available since version 2.4.1') unless configuration_available?
70
75
  end
71
76
 
72
- if params[:proj] || has_config_file
77
+ if params[:ymlfile]
78
+ UI.user_error!('ymlfile option is available since version 2.8.0') unless ymlfile_available?
79
+ end
80
+
81
+ if params[:proj] || has_config_file?(params)
73
82
  true
74
83
  else
75
84
  UI.user_error!("You have to provide a project with `:proj` or use a .slather.yml")
@@ -285,6 +294,10 @@ module Fastlane
285
294
  description: "The amount of decimals to use for % coverage reporting",
286
295
  skip_type_validation: true, # allow Integer, String
287
296
  default_value: false,
297
+ optional: true),
298
+ FastlaneCore::ConfigItem.new(key: :ymlfile,
299
+ env_name: "FL_SLATHER_YMLFILE",
300
+ description: "Relative path to a file used in place of '.slather.yml'",
288
301
  optional: true)
289
302
  ]
290
303
  end
@@ -121,7 +121,10 @@ module Fastlane
121
121
 
122
122
  # Returns the current git branch, or "HEAD" if it's not checked out to any branch
123
123
  # Can be replaced using the environment variable `GIT_BRANCH`
124
+ # unless `FL_GIT_BRANCH_DONT_USE_ENV_VARS` is `true`
124
125
  def self.git_branch
126
+ return self.git_branch_name_using_HEAD if FastlaneCore::Env.truthy?('FL_GIT_BRANCH_DONT_USE_ENV_VARS')
127
+
125
128
  env_name = SharedValues::GIT_BRANCH_ENV_VARS.find { |env_var| FastlaneCore::Env.truthy?(env_var) }
126
129
  ENV.fetch(env_name.to_s) do
127
130
  self.git_branch_name_using_HEAD
@@ -24,11 +24,19 @@ module Fastlane
24
24
  self.platform = platform
25
25
  self.name = name
26
26
  self.description = description
27
- self.block = block
27
+ # We want to support _both_ lanes expecting a `Hash` (like `lane :foo do |options|`), and lanes expecting
28
+ # keyword parameters (like `lane :foo do |param1:, param2:, param3: 'default value'|`)
29
+ block_expects_keywords = !block.nil? && block.parameters.any? { |type, _| [:key, :keyreq].include?(type) }
30
+ # Conversion of the `Hash` parameters (passed by `Lane#call`) into keywords has to be explicit in Ruby 3
31
+ # https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/
32
+ self.block = block_expects_keywords ? proc { |options| block.call(**options) } : block
28
33
  self.is_private = is_private
29
34
  end
30
35
 
31
36
  # Execute this lane
37
+ #
38
+ # @param [Hash] parameters The Hash of parameters to pass to the lane
39
+ #
32
40
  def call(parameters)
33
41
  block.call(parameters || {})
34
42
  end
@@ -15,7 +15,7 @@ module Fastlane
15
15
 
16
16
  # This will take care of executing **one** lane. That's when the user triggers a lane from the CLI for example
17
17
  # This method is **not** executed when switching a lane
18
- # @param lane_name The name of the lane to execute
18
+ # @param lane The name of the lane to execute
19
19
  # @param platform The name of the platform to execute
20
20
  # @param parameters [Hash] The parameters passed from the command line to the lane
21
21
  def execute(lane, platform = nil, parameters = nil)
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.215.1'.freeze
2
+ VERSION = '2.217.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 = '1.50.2'.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.215.1
20
+ // Generated with fastlane 2.217.0
@@ -264,4 +264,4 @@ public extension DeliverfileProtocol {
264
264
 
265
265
  // Please don't remove the lines below
266
266
  // They are used to detect outdated files
267
- // FastlaneRunnerAPIVersion [0.9.119]
267
+ // FastlaneRunnerAPIVersion [0.9.121]