fastlane 2.238.0 → 2.239.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -96
  3. data/bin/fastlane +2 -2
  4. data/deliver/lib/deliver/html_generator.rb +1 -1
  5. data/deliver/lib/deliver/options.rb +8 -0
  6. data/deliver/lib/deliver/upload_metadata.rb +22 -0
  7. data/deliver/lib/deliver/upload_screenshots.rb +12 -4
  8. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -2
  9. data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +6 -0
  10. data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
  11. data/fastlane/lib/fastlane/helper/sh_helper.rb +9 -1
  12. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  13. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +5 -1
  14. data/fastlane/lib/fastlane/version.rb +1 -1
  15. data/fastlane/swift/Deliverfile.swift +1 -1
  16. data/fastlane/swift/DeliverfileProtocol.swift +8 -1
  17. data/fastlane/swift/Fastlane.swift +38 -2
  18. data/fastlane/swift/Gymfile.swift +1 -1
  19. data/fastlane/swift/GymfileProtocol.swift +1 -1
  20. data/fastlane/swift/Matchfile.swift +1 -1
  21. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  22. data/fastlane/swift/Precheckfile.swift +1 -1
  23. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  24. data/fastlane/swift/Scanfile.swift +1 -1
  25. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  26. data/fastlane/swift/Screengrabfile.swift +1 -1
  27. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  28. data/fastlane/swift/Snapshotfile.swift +1 -1
  29. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  30. data/match/lib/match/nuke.rb +2 -2
  31. data/match/lib/match/storage/git_storage.rb +1 -4
  32. data/match/lib/match/storage/google_cloud_storage.rb +6 -1
  33. data/pem/lib/pem/manager.rb +5 -1
  34. data/pem/lib/pem/options.rb +6 -0
  35. data/pilot/lib/pilot/build_manager.rb +32 -0
  36. data/pilot/lib/pilot/options.rb +8 -0
  37. data/sigh/lib/assets/resign.sh +21 -9
  38. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +16 -0
  39. data/spaceship/lib/spaceship/connect_api/models/routing_app_coverage.rb +75 -0
  40. data/spaceship/lib/spaceship/connect_api/token.rb +6 -1
  41. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +45 -0
  42. data/spaceship/lib/spaceship/connect_api.rb +1 -0
  43. data/supply/lib/supply/client.rb +6 -0
  44. data/supply/lib/supply/reader.rb +15 -0
  45. metadata +26 -42
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b83a11ad4335b1a3c678c4a6d0f1aea9f6eb7ccd2fdda1392621a24be1ebc1b9
4
- data.tar.gz: 40445027ea32c6b0a7d7c761f3aaa148ada6ac0d868f9d1212e68b1c0ff99940
3
+ metadata.gz: bc5b46c829520975d6ad2871bf94e7bc3df0f4d2863dcbed323e2b22c2205931
4
+ data.tar.gz: 98f468374c8356ba200173ef637157a9e33747d4a46f3b89b70d4bc407367c47
5
5
  SHA512:
6
- metadata.gz: 915bb8bfd75b4e65b00c6213c861261aaa0b7e3b4ec5aaadc2c4029d90386d8682240628434983ec8891f5399798e584be4410ed1f37a11deb22d24cf61549e4
7
- data.tar.gz: 206b83080b67e0feadc08b65e59e577ee63be8972826a17dc80ac102aeede7da6b11fe67f9b9c53c2ec6052ded492ae2850b78baecb8faa321dbe8904d079e74
6
+ metadata.gz: c03a7a56e6229a7c03f053340e74c8f146c1e4b0149dc0523d75370fa5d755f77c571e0c7a974c955c42fab6fd8d1668823dde0cd031a573e2b1340105c76f69
7
+ data.tar.gz: bc86b7ea3505cf0fd59c0d22ab2ae3324f16b77170abfa4fffcae1cce948d561ea4c436b92cca599d67838e3d6ab59328e42a418be04f4abef90a1d9378b5a26
data/README.md CHANGED
@@ -36,23 +36,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
36
36
  <!-- This table is regenerated and resorted on each release -->
37
37
  <table id='team'>
38
38
  <tr>
39
- <td id='iulian-onofrei'>
40
- <a href='https://github.com/revolter'>
41
- <img src='https://github.com/revolter.png' width='140px;'>
42
- </a>
43
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
44
- </td>
45
39
  <td id='helmut-januschka'>
46
40
  <a href='https://github.com/hjanuschka'>
47
41
  <img src='https://github.com/hjanuschka.png' width='140px;'>
48
42
  </a>
49
43
  <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
50
44
  </td>
51
- <td id='kohki-miki'>
52
- <a href='https://github.com/giginet'>
53
- <img src='https://github.com/giginet.png' width='140px;'>
45
+ <td id='josh-holtz'>
46
+ <a href='https://github.com/joshdholtz'>
47
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
54
48
  </a>
55
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
49
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
56
50
  </td>
57
51
  <td id='felix-krause'>
58
52
  <a href='https://github.com/KrauseFx'>
@@ -60,75 +54,81 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
60
54
  </a>
61
55
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
62
56
  </td>
63
- <td id='olivier-halligon'>
64
- <a href='https://github.com/AliSoftware'>
65
- <img src='https://github.com/AliSoftware.png' width='140px;'>
57
+ <td id='kohki-miki'>
58
+ <a href='https://github.com/giginet'>
59
+ <img src='https://github.com/giginet.png' width='140px;'>
66
60
  </a>
67
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
61
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
62
+ </td>
63
+ <td id='andrew-mcburney'>
64
+ <a href='https://github.com/armcburney'>
65
+ <img src='https://github.com/armcburney.png' width='140px;'>
66
+ </a>
67
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
68
68
  </td>
69
69
  </tr>
70
70
  <tr>
71
- <td id='stefan-natchev'>
72
- <a href='https://github.com/snatchev'>
73
- <img src='https://github.com/snatchev.png' width='140px;'>
71
+ <td id='roger-oba'>
72
+ <a href='https://github.com/rogerluan'>
73
+ <img src='https://github.com/rogerluan.png' width='140px;'>
74
74
  </a>
75
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
75
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
76
76
  </td>
77
- <td id='łukasz-grabowski'>
78
- <a href='https://github.com/lucgrabowski'>
79
- <img src='https://github.com/lucgrabowski.png' width='140px;'>
77
+ <td id='max-ott'>
78
+ <a href='https://github.com/max-ott'>
79
+ <img src='https://github.com/max-ott.png' width='140px;'>
80
80
  </a>
81
- <h4 align='center'>Łukasz Grabowski</h4>
81
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
82
82
  </td>
83
- <td id='luka-mirosevic'>
84
- <a href='https://github.com/lmirosevic'>
85
- <img src='https://github.com/lmirosevic.png' width='140px;'>
83
+ <td id='aaron-brager'>
84
+ <a href='https://github.com/getaaron'>
85
+ <img src='https://github.com/getaaron.png' width='140px;'>
86
86
  </a>
87
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
87
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
88
88
  </td>
89
- <td id='joshua-liebowitz'>
90
- <a href='https://github.com/taquitos'>
91
- <img src='https://github.com/taquitos.png' width='140px;'>
89
+ <td id='matthew-ellis'>
90
+ <a href='https://github.com/matthewellis'>
91
+ <img src='https://github.com/matthewellis.png' width='140px;'>
92
92
  </a>
93
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
93
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
94
94
  </td>
95
- <td id='daniel-jankowski'>
96
- <a href='https://github.com/mollyIV'>
97
- <img src='https://github.com/mollyIV.png' width='140px;'>
95
+ <td id='iulian-onofrei'>
96
+ <a href='https://github.com/revolter'>
97
+ <img src='https://github.com/revolter.png' width='140px;'>
98
98
  </a>
99
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
99
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
100
100
  </td>
101
101
  </tr>
102
102
  <tr>
103
+ <td id='danielle-tomlinson'>
104
+ <a href='https://github.com/endocrimes'>
105
+ <img src='https://github.com/endocrimes.png' width='140px;'>
106
+ </a>
107
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
108
+ </td>
103
109
  <td id='fumiya-nakamura'>
104
110
  <a href='https://github.com/nafu'>
105
111
  <img src='https://github.com/nafu.png' width='140px;'>
106
112
  </a>
107
113
  <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
108
114
  </td>
109
- <td id='manish-rathi'>
110
- <a href='https://github.com/crazymanish'>
111
- <img src='https://github.com/crazymanish.png' width='140px;'>
112
- </a>
113
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
114
- </td>
115
- <td id='maksym-grebenets'>
116
- <a href='https://github.com/mgrebenets'>
117
- <img src='https://github.com/mgrebenets.png' width='140px;'>
115
+ <td id='olivier-halligon'>
116
+ <a href='https://github.com/AliSoftware'>
117
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
118
118
  </a>
119
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
119
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
120
120
  </td>
121
- <td id='matthew-ellis'>
122
- <a href='https://github.com/matthewellis'>
123
- <img src='https://github.com/matthewellis.png' width='140px;'>
121
+ <td id='jérôme-lacoste'>
122
+ <a href='https://github.com/lacostej'>
123
+ <img src='https://github.com/lacostej.png' width='140px;'>
124
124
  </a>
125
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
125
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
126
126
  </td>
127
- <td id='satoshi-namai'>
128
- <a href='https://github.com/ainame'>
129
- <img src='https://github.com/ainame.png' width='140px;'>
127
+ <td id='manu-wallner'>
128
+ <a href='https://github.com/milch'>
129
+ <img src='https://github.com/milch.png' width='140px;'>
130
130
  </a>
131
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
131
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
132
132
  </td>
133
133
  </tr>
134
134
  <tr>
@@ -138,75 +138,75 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
138
138
  </a>
139
139
  <h4 align='center'>Jimmy Dee</h4>
140
140
  </td>
141
- <td id='manu-wallner'>
142
- <a href='https://github.com/milch'>
143
- <img src='https://github.com/milch.png' width='140px;'>
141
+ <td id='satoshi-namai'>
142
+ <a href='https://github.com/ainame'>
143
+ <img src='https://github.com/ainame.png' width='140px;'>
144
144
  </a>
145
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
145
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
146
146
  </td>
147
- <td id='andrew-mcburney'>
148
- <a href='https://github.com/armcburney'>
149
- <img src='https://github.com/armcburney.png' width='140px;'>
147
+ <td id='łukasz-grabowski'>
148
+ <a href='https://github.com/lucgrabowski'>
149
+ <img src='https://github.com/lucgrabowski.png' width='140px;'>
150
150
  </a>
151
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
151
+ <h4 align='center'>Łukasz Grabowski</h4>
152
152
  </td>
153
- <td id='jan-piotrowski'>
154
- <a href='https://github.com/janpio'>
155
- <img src='https://github.com/janpio.png' width='140px;'>
153
+ <td id='stefan-natchev'>
154
+ <a href='https://github.com/snatchev'>
155
+ <img src='https://github.com/snatchev.png' width='140px;'>
156
156
  </a>
157
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
157
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
158
158
  </td>
159
- <td id='jorge-revuelta-h'>
160
- <a href='https://github.com/minuscorp'>
161
- <img src='https://github.com/minuscorp.png' width='140px;'>
159
+ <td id='manish-rathi'>
160
+ <a href='https://github.com/crazymanish'>
161
+ <img src='https://github.com/crazymanish.png' width='140px;'>
162
162
  </a>
163
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
163
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
164
164
  </td>
165
165
  </tr>
166
166
  <tr>
167
- <td id='jérôme-lacoste'>
168
- <a href='https://github.com/lacostej'>
169
- <img src='https://github.com/lacostej.png' width='140px;'>
167
+ <td id='joshua-liebowitz'>
168
+ <a href='https://github.com/taquitos'>
169
+ <img src='https://github.com/taquitos.png' width='140px;'>
170
170
  </a>
171
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
171
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
172
172
  </td>
173
- <td id='connor-tumbleson'>
174
- <a href='https://github.com/ibotpeaches'>
175
- <img src='https://github.com/ibotpeaches.png' width='140px;'>
173
+ <td id='daniel-jankowski'>
174
+ <a href='https://github.com/mollyIV'>
175
+ <img src='https://github.com/mollyIV.png' width='140px;'>
176
176
  </a>
177
- <h4 align='center'><a href='https://twitter.com/ibotpeaches'>Connor Tumbleson</a></h4>
177
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
178
178
  </td>
179
- <td id='roger-oba'>
180
- <a href='https://github.com/rogerluan'>
181
- <img src='https://github.com/rogerluan.png' width='140px;'>
179
+ <td id='jorge-revuelta-h'>
180
+ <a href='https://github.com/minuscorp'>
181
+ <img src='https://github.com/minuscorp.png' width='140px;'>
182
182
  </a>
183
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
183
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
184
184
  </td>
185
- <td id='aaron-brager'>
186
- <a href='https://github.com/getaaron'>
187
- <img src='https://github.com/getaaron.png' width='140px;'>
185
+ <td id='jan-piotrowski'>
186
+ <a href='https://github.com/janpio'>
187
+ <img src='https://github.com/janpio.png' width='140px;'>
188
188
  </a>
189
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
189
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
190
190
  </td>
191
- <td id='max-ott'>
192
- <a href='https://github.com/max-ott'>
193
- <img src='https://github.com/max-ott.png' width='140px;'>
191
+ <td id='connor-tumbleson'>
192
+ <a href='https://github.com/ibotpeaches'>
193
+ <img src='https://github.com/ibotpeaches.png' width='140px;'>
194
194
  </a>
195
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
195
+ <h4 align='center'><a href='https://twitter.com/ibotpeaches'>Connor Tumbleson</a></h4>
196
196
  </td>
197
197
  </tr>
198
198
  <tr>
199
- <td id='josh-holtz'>
200
- <a href='https://github.com/joshdholtz'>
201
- <img src='https://github.com/joshdholtz.png' width='140px;'>
199
+ <td id='maksym-grebenets'>
200
+ <a href='https://github.com/mgrebenets'>
201
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
202
202
  </a>
203
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
203
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
204
204
  </td>
205
- <td id='danielle-tomlinson'>
206
- <a href='https://github.com/endocrimes'>
207
- <img src='https://github.com/endocrimes.png' width='140px;'>
205
+ <td id='luka-mirosevic'>
206
+ <a href='https://github.com/lmirosevic'>
207
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
208
208
  </a>
209
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
209
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
210
210
  </td>
211
211
  </table>
212
212
 
data/bin/fastlane CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if RUBY_VERSION < '3.0.0'
4
- abort("fastlane requires Ruby 3.0.0 or higher")
3
+ if RUBY_VERSION < '3.1.0'
4
+ abort("fastlane requires Ruby 3.1.0 or higher")
5
5
  end
6
6
 
7
7
  def self.windows?
@@ -24,7 +24,7 @@ module Deliver
24
24
  UI.important("Verifying the upload via the HTML file can be disabled by either adding")
25
25
  UI.important("`force true` to your Deliverfile or using `fastlane deliver --force`")
26
26
 
27
- system("open '#{html_path}'")
27
+ system("open", html_path)
28
28
  okay = UI.confirm("Does the Preview on path '#{html_path}' look okay for you?")
29
29
 
30
30
  if okay
@@ -420,6 +420,14 @@ module Deliver
420
420
  env_name: "DELIVER_APP_REVIEW_ATTACHMENT_FILE",
421
421
  description: "Metadata: Path to the app review attachment file",
422
422
  optional: true),
423
+ FastlaneCore::ConfigItem.new(key: :routing_app_coverage_file,
424
+ env_name: "DELIVER_ROUTING_APP_COVERAGE_FILE",
425
+ description: "Metadata: Path to the routing app coverage file (`.geojson`) that is required for routing apps",
426
+ optional: true,
427
+ verify_block: proc do |value|
428
+ UI.user_error!("Could not find routing app coverage file at path '#{File.expand_path(value)}'") unless File.exist?(value)
429
+ UI.user_error!("Routing app coverage file must be a .geojson file") unless File.extname(value).casecmp(".geojson").zero?
430
+ end),
423
431
  # Localised
424
432
  FastlaneCore::ConfigItem.new(key: :description,
425
433
  description: "Metadata: The localised app description",
@@ -357,6 +357,7 @@ module Deliver
357
357
  review_information(version)
358
358
  app_clip_review_information(version)
359
359
  review_attachment_file(version)
360
+ routing_app_coverage_file(version)
360
361
  app_rating(app_info)
361
362
  end
362
363
 
@@ -766,6 +767,27 @@ module Deliver
766
767
  end
767
768
  end
768
769
 
770
+ def routing_app_coverage_file(version)
771
+ # Skip logic entirely if no coverage file passed. So status-quo stays the same.
772
+ return unless options[:routing_app_coverage_file]
773
+
774
+ routing_app_coverage =
775
+ begin
776
+ version.fetch_routing_app_coverage
777
+ rescue => error
778
+ UI.error("Error fetching routing app coverage - #{error.message}")
779
+ nil
780
+ end
781
+
782
+ if routing_app_coverage
783
+ UI.message("Removing previous routing app coverage file from App Store Connect")
784
+ routing_app_coverage.delete!
785
+ end
786
+
787
+ UI.message("Uploading routing app coverage file to App Store Connect")
788
+ version.upload_routing_app_coverage(path: options[:routing_app_coverage_file])
789
+ end
790
+
769
791
  def app_rating(app_info)
770
792
  return unless options[:app_rating_config_path]
771
793
 
@@ -171,13 +171,17 @@ module Deliver
171
171
  def wait_for_complete(iterator, timeout_seconds)
172
172
  start_time = Time.now
173
173
  loop do
174
+ # App Store Connect publishes a screenshot's `sourceFileChecksum` asynchronously,
175
+ # shortly after its state becomes COMPLETE. (#30094)
176
+ number_of_screenshots_missing_checksum = 0
174
177
  states = iterator.each_app_screenshot.map { |_, _, app_screenshot| app_screenshot }.each_with_object({}) do |app_screenshot, hash|
175
178
  state = app_screenshot.asset_delivery_state['state']
176
179
  hash[state] ||= 0
177
180
  hash[state] += 1
181
+ number_of_screenshots_missing_checksum += 1 if state == 'COMPLETE' && app_screenshot.source_file_checksum.nil?
178
182
  end
179
183
 
180
- is_processing = states.fetch('UPLOAD_COMPLETE', 0) > 0
184
+ is_processing = states.fetch('UPLOAD_COMPLETE', 0) > 0 || number_of_screenshots_missing_checksum > 0
181
185
  return states unless is_processing
182
186
 
183
187
  if Time.now - start_time > timeout_seconds
@@ -185,7 +189,11 @@ module Deliver
185
189
  return states
186
190
  end
187
191
 
188
- UI.verbose("There are still incomplete screenshots - #{states}")
192
+ if number_of_screenshots_missing_checksum > 0
193
+ UI.verbose("There are still incomplete screenshots - #{states}, missing checksum: #{number_of_screenshots_missing_checksum}")
194
+ else
195
+ UI.verbose("There are still incomplete screenshots - #{states}")
196
+ end
189
197
  sleep(5)
190
198
  end
191
199
  end
@@ -205,9 +213,9 @@ module Deliver
205
213
  UI.user_error!("Failed verification of all screenshots uploaded... #{incomplete_screenshot_count} incomplete screenshot(s) still exist")
206
214
  else
207
215
  UI.error("Failed to upload all screenshots... Tries remaining: #{tries}")
208
- # Delete bad entries before retry
216
+ # Delete bad entries before retry (not complete OR missing checksum)
209
217
  iterator.each_app_screenshot do |_, _, app_screenshot|
210
- app_screenshot.delete! unless app_screenshot.complete?
218
+ app_screenshot.delete! unless app_screenshot.complete? && !app_screenshot.source_file_checksum.nil?
211
219
  end
212
220
  upload_screenshots(localizations, screenshots_per_language, timeout_seconds, tries: tries)
213
221
  end
@@ -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], params[:app_path])
40
+ changelog = Actions.git_log_last_commits(params[:pretty], params[:commits_count], params[:matching_pattern], 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], params[:app_path])
42
+ changelog = Actions.git_log_between(params[:pretty], from, to, params[:matching_pattern], 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
@@ -104,6 +104,10 @@ module Fastlane
104
104
  description: 'The format applied to each commit while generating the collected value',
105
105
  optional: true,
106
106
  default_value: '%B'),
107
+ FastlaneCore::ConfigItem.new(key: :matching_pattern,
108
+ env_name: 'FL_CHANGELOG_FROM_GIT_COMMITS_MATCHING_PATTERN',
109
+ description: 'A regexp pattern to filter only the commits matching the pattern',
110
+ optional: true),
107
111
  FastlaneCore::ConfigItem.new(key: :date_format,
108
112
  env_name: 'FL_CHANGELOG_FROM_GIT_COMMITS_DATE_FORMAT',
109
113
  description: 'The date format applied to each commit while generating the collected value',
@@ -179,6 +183,7 @@ module Fastlane
179
183
  pretty: "- (%ae) %s", # Optional, lets you provide a custom format to apply to each commit when generating the changelog text
180
184
  date_format: "short", # Optional, lets you provide an additional date format to dates within the pretty-formatted string
181
185
  match_lightweight_tag: false, # Optional, lets you ignore lightweight (non-annotated) tags when searching for the last tag
186
+ matching_pattern: "[.*?].*", # Optional, lets you filter out commits not matching the regex pattern
182
187
  merge_commit_filtering: "exclude_merges" # Optional, lets you filter out merge commits
183
188
  )'
184
189
  ]
@@ -74,6 +74,12 @@ If you want to generate a Website Push certificate:
74
74
  fastlane pem --website_push
75
75
  ```
76
76
 
77
+ If you want to generate a VoIP Services certificate (the type PushKit requires):
78
+
79
+ ```no-highlight
80
+ fastlane pem --voip_push
81
+ ```
82
+
77
83
  Set a password for your `p12` file:
78
84
 
79
85
  ```no-highlight
@@ -9,9 +9,10 @@ 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, app_path)
12
+ def self.git_log_between(pretty_format, from, to, matching_pattern, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
13
13
  command = %w(git log)
14
14
  command << "--pretty=#{pretty_format}"
15
+ command << "--grep=#{matching_pattern}" if matching_pattern
15
16
  command << "--date=#{date_format}" if date_format
16
17
  command << '--ancestry-path' if ancestry_path
17
18
  command << "#{from}...#{to}"
@@ -24,9 +25,10 @@ module Fastlane
24
25
  nil
25
26
  end
26
27
 
27
- def self.git_log_last_commits(pretty_format, commit_count, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
28
+ def self.git_log_last_commits(pretty_format, commit_count, matching_pattern, merge_commit_filtering, date_format = nil, ancestry_path, app_path)
28
29
  command = %w(git log)
29
30
  command << "--pretty=#{pretty_format}"
31
+ command << "--grep=#{matching_pattern}" if matching_pattern
30
32
  command << "--date=#{date_format}" if date_format
31
33
  command << '--ancestry-path' if ancestry_path
32
34
  command << '-n' << commit_count.to_s
@@ -51,15 +51,23 @@ module Fastlane
51
51
  # sh "ls -la /Applications/Xcode\ 7.3.1.app"
52
52
  # sh "ls", "-la", "/Applications/Xcode 7.3.1.app"
53
53
  # sh({ "FOO" => "Hello" }, "echo $FOO")
54
+ sanitized_output = false
54
55
  Open3.popen2e(*command) do |stdin, io, thread|
55
56
  io.sync = true
56
57
  io.each do |line|
57
- UI.command_output(line.strip) if print_command_output
58
+ if print_command_output
59
+ # Ensure the string being stripped is in valid UTF-8 format; Otherwise warn at the end
60
+ text = line.encode('UTF-8', invalid: :replace)
61
+ UI.command_output(text.strip)
62
+ sanitized_output = true if text != line
63
+ end
58
64
  result << line
59
65
  end
60
66
  exit_status = thread.value
61
67
  end
62
68
 
69
+ UI.important("Command output wasn't valid UTF-8 and was sanitized. Please report the issue.") if sanitized_output
70
+
63
71
  # Checking Process::Status#exitstatus instead of #success? makes for more
64
72
  # testable code. (Tests mock exitstatus only.) This is also consistent
65
73
  # with previous implementations of sh and... probably portable to all
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.files = Dir["lib/**/*"] + %w(README.md LICENSE)
16
16
  spec.require_paths = ['lib']
17
17
  spec.metadata['rubygems_mfa_required'] = 'true'
18
- spec.required_ruby_version = '>= 3.0'
18
+ spec.required_ruby_version = '>= 3.1'
19
19
 
20
20
  # Don't add a dependency to fastlane or fastlane_re
21
21
  # since this would cause a circular dependency
@@ -3,7 +3,7 @@ require:
3
3
  - rubocop/require_tools
4
4
  - rubocop-performance
5
5
  AllCops:
6
- TargetRubyVersion: 3.0
6
+ TargetRubyVersion: 3.1
7
7
  SuggestExtensions: false
8
8
  NewCops: enable
9
9
  Include:
@@ -21,6 +21,10 @@ AllCops:
21
21
  - "**/*.provisionprofile"
22
22
  Lint/ErbNewArguments:
23
23
  Enabled: false
24
+ Style/HashSyntax:
25
+ EnforcedShorthandSyntax: either
26
+ Naming/BlockForwarding:
27
+ EnforcedStyle: explicit
24
28
  Style/SlicingWithRange:
25
29
  Enabled: false
26
30
  Style/MultipleComparison:
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.238.0'.freeze
2
+ VERSION = '2.239.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.238.0
20
+ // Generated with fastlane 2.239.0
@@ -179,6 +179,9 @@ public protocol DeliverfileProtocol: AnyObject {
179
179
  /// Metadata: Path to the app review attachment file
180
180
  var appReviewAttachmentFile: String? { get }
181
181
 
182
+ /// Metadata: Path to the routing app coverage file (`.geojson`) that is required for routing apps
183
+ var routingAppCoverageFile: String? { get }
184
+
182
185
  /// Metadata: The localised app description
183
186
  var description: [String: Any]? { get }
184
187
 
@@ -465,6 +468,10 @@ public extension DeliverfileProtocol {
465
468
  return nil
466
469
  }
467
470
 
471
+ var routingAppCoverageFile: String? {
472
+ return nil
473
+ }
474
+
468
475
  var description: [String: Any]? {
469
476
  return nil
470
477
  }
@@ -532,4 +539,4 @@ public extension DeliverfileProtocol {
532
539
 
533
540
  // Please don't remove the lines below
534
541
  // They are used to detect outdated files
535
- // FastlaneRunnerAPIVersion [0.9.152]
542
+ // FastlaneRunnerAPIVersion [0.9.153]