fastlane 2.238.0 → 2.240.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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +98 -98
  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/runner.rb +5 -4
  7. data/deliver/lib/deliver/upload_metadata.rb +22 -0
  8. data/deliver/lib/deliver/upload_screenshots.rb +12 -4
  9. data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +3 -1
  10. data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +7 -2
  11. data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +6 -0
  12. data/fastlane/lib/fastlane/actions/lcov.rb +3 -1
  13. data/fastlane/lib/fastlane/actions/spaceship_logs.rb +4 -2
  14. data/fastlane/lib/fastlane/actions/swiftlint.rb +6 -3
  15. data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +3 -1
  16. data/fastlane/lib/fastlane/helper/git_helper.rb +4 -2
  17. data/fastlane/lib/fastlane/helper/sh_helper.rb +9 -1
  18. data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +1 -1
  19. data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +5 -1
  20. data/fastlane/lib/fastlane/version.rb +1 -1
  21. data/fastlane/swift/Deliverfile.swift +1 -1
  22. data/fastlane/swift/DeliverfileProtocol.swift +8 -1
  23. data/fastlane/swift/Fastlane.swift +75 -3
  24. data/fastlane/swift/Gymfile.swift +1 -1
  25. data/fastlane/swift/GymfileProtocol.swift +8 -1
  26. data/fastlane/swift/Matchfile.swift +1 -1
  27. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  28. data/fastlane/swift/Precheckfile.swift +1 -1
  29. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  30. data/fastlane/swift/Scanfile.swift +1 -1
  31. data/fastlane/swift/ScanfileProtocol.swift +8 -1
  32. data/fastlane/swift/Screengrabfile.swift +1 -1
  33. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  34. data/fastlane/swift/Snapshotfile.swift +1 -1
  35. data/fastlane/swift/SnapshotfileProtocol.swift +8 -1
  36. data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +20 -7
  37. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +1 -1
  38. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +16 -13
  39. data/fastlane_core/lib/fastlane_core/project.rb +19 -0
  40. data/gym/lib/gym/options.rb +5 -0
  41. data/match/lib/match/nuke.rb +2 -2
  42. data/match/lib/match/storage/git_storage.rb +1 -4
  43. data/match/lib/match/storage/google_cloud_storage.rb +6 -1
  44. data/pem/lib/pem/manager.rb +5 -1
  45. data/pem/lib/pem/options.rb +6 -0
  46. data/pilot/lib/pilot/build_manager.rb +32 -0
  47. data/pilot/lib/pilot/options.rb +8 -0
  48. data/scan/lib/scan/options.rb +5 -0
  49. data/sigh/lib/assets/resign.sh +21 -9
  50. data/snapshot/lib/snapshot/options.rb +5 -0
  51. data/spaceship/lib/spaceship/client.rb +137 -15
  52. data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +16 -0
  53. data/spaceship/lib/spaceship/connect_api/models/routing_app_coverage.rb +75 -0
  54. data/spaceship/lib/spaceship/connect_api/token.rb +6 -1
  55. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +45 -0
  56. data/spaceship/lib/spaceship/connect_api.rb +1 -0
  57. data/spaceship/lib/spaceship/du/upload_file.rb +4 -3
  58. data/supply/lib/supply/client.rb +6 -0
  59. data/supply/lib/supply/reader.rb +15 -0
  60. data/trainer/lib/trainer/xcresult/helper.rb +27 -13
  61. metadata +34 -50
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b83a11ad4335b1a3c678c4a6d0f1aea9f6eb7ccd2fdda1392621a24be1ebc1b9
4
- data.tar.gz: 40445027ea32c6b0a7d7c761f3aaa148ada6ac0d868f9d1212e68b1c0ff99940
3
+ metadata.gz: 7467cf01821db5d82582d55e830e209b07d0c3ed4793686fb31e91bba27b66a1
4
+ data.tar.gz: b517b0bdb057a42827caa42ba504cd450d3e40169c8191c280cee8c6ab2544b8
5
5
  SHA512:
6
- metadata.gz: 915bb8bfd75b4e65b00c6213c861261aaa0b7e3b4ec5aaadc2c4029d90386d8682240628434983ec8891f5399798e584be4410ed1f37a11deb22d24cf61549e4
7
- data.tar.gz: 206b83080b67e0feadc08b65e59e577ee63be8972826a17dc80ac102aeede7da6b11fe67f9b9c53c2ec6052ded492ae2850b78baecb8faa321dbe8904d079e74
6
+ metadata.gz: 683a57ea89b9bf4ae28def60d5bbfaa5221081dac34e840bf4c597f3788f7b8c295237a0862847a519aedd28ef51ffa7fb4da1a576afd2654e5548761ccf4b51
7
+ data.tar.gz: 9c436bf7d1ba66d55a8d68aeb38caf6d3c1d56fd5c48c90cd5642865163d80ddbe367f0b9cc4ddd18477b9f95d40ed733b9965cc42a9f16928774c490114ebd7
data/README.md CHANGED
@@ -36,75 +36,81 @@ 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;'>
39
+ <td id='danielle-tomlinson'>
40
+ <a href='https://github.com/endocrimes'>
41
+ <img src='https://github.com/endocrimes.png' width='140px;'>
42
42
  </a>
43
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
43
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
44
44
  </td>
45
- <td id='helmut-januschka'>
46
- <a href='https://github.com/hjanuschka'>
47
- <img src='https://github.com/hjanuschka.png' width='140px;'>
45
+ <td id='connor-tumbleson'>
46
+ <a href='https://github.com/ibotpeaches'>
47
+ <img src='https://github.com/ibotpeaches.png' width='140px;'>
48
48
  </a>
49
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
49
+ <h4 align='center'><a href='https://twitter.com/ibotpeaches'>Connor Tumbleson</a></h4>
50
50
  </td>
51
- <td id='kohki-miki'>
52
- <a href='https://github.com/giginet'>
53
- <img src='https://github.com/giginet.png' width='140px;'>
51
+ <td id='luka-mirosevic'>
52
+ <a href='https://github.com/lmirosevic'>
53
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
54
54
  </a>
55
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
55
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
56
56
  </td>
57
- <td id='felix-krause'>
58
- <a href='https://github.com/KrauseFx'>
59
- <img src='https://github.com/KrauseFx.png' width='140px;'>
57
+ <td id='iulian-onofrei'>
58
+ <a href='https://github.com/revolter'>
59
+ <img src='https://github.com/revolter.png' width='140px;'>
60
60
  </a>
61
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
61
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
62
62
  </td>
63
- <td id='olivier-halligon'>
64
- <a href='https://github.com/AliSoftware'>
65
- <img src='https://github.com/AliSoftware.png' width='140px;'>
63
+ <td id='fumiya-nakamura'>
64
+ <a href='https://github.com/nafu'>
65
+ <img src='https://github.com/nafu.png' width='140px;'>
66
66
  </a>
67
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
67
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</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='jérôme-lacoste'>
72
+ <a href='https://github.com/lacostej'>
73
+ <img src='https://github.com/lacostej.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/lacostej'>Jérôme Lacoste</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='aaron-brager'>
78
+ <a href='https://github.com/getaaron'>
79
+ <img src='https://github.com/getaaron.png' width='140px;'>
80
80
  </a>
81
- <h4 align='center'>Łukasz Grabowski</h4>
81
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</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='jimmy-dee'>
84
+ <a href='https://github.com/jdee'>
85
+ <img src='https://github.com/jdee.png' width='140px;'>
86
86
  </a>
87
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
87
+ <h4 align='center'>Jimmy Dee</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='roger-oba'>
90
+ <a href='https://github.com/rogerluan'>
91
+ <img src='https://github.com/rogerluan.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/rogerluan_'>Roger Oba</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='matthew-ellis'>
96
+ <a href='https://github.com/matthewellis'>
97
+ <img src='https://github.com/matthewellis.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/mellis1995'>Matthew Ellis</a></h4>
100
100
  </td>
101
101
  </tr>
102
102
  <tr>
103
- <td id='fumiya-nakamura'>
104
- <a href='https://github.com/nafu'>
105
- <img src='https://github.com/nafu.png' width='140px;'>
103
+ <td id='max-ott'>
104
+ <a href='https://github.com/max-ott'>
105
+ <img src='https://github.com/max-ott.png' width='140px;'>
106
106
  </a>
107
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
107
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
108
+ </td>
109
+ <td id='daniel-jankowski'>
110
+ <a href='https://github.com/mollyIV'>
111
+ <img src='https://github.com/mollyIV.png' width='140px;'>
112
+ </a>
113
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
108
114
  </td>
109
115
  <td id='manish-rathi'>
110
116
  <a href='https://github.com/crazymanish'>
@@ -112,17 +118,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
112
118
  </a>
113
119
  <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
114
120
  </td>
115
- <td id='maksym-grebenets'>
116
- <a href='https://github.com/mgrebenets'>
117
- <img src='https://github.com/mgrebenets.png' width='140px;'>
118
- </a>
119
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
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='manu-wallner'>
122
+ <a href='https://github.com/milch'>
123
+ <img src='https://github.com/milch.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/acrooow'>Manu Wallner</a></h4>
126
126
  </td>
127
127
  <td id='satoshi-namai'>
128
128
  <a href='https://github.com/ainame'>
@@ -132,23 +132,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
132
132
  </td>
133
133
  </tr>
134
134
  <tr>
135
- <td id='jimmy-dee'>
136
- <a href='https://github.com/jdee'>
137
- <img src='https://github.com/jdee.png' width='140px;'>
135
+ <td id='maksym-grebenets'>
136
+ <a href='https://github.com/mgrebenets'>
137
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
138
138
  </a>
139
- <h4 align='center'>Jimmy Dee</h4>
139
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></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='olivier-halligon'>
142
+ <a href='https://github.com/AliSoftware'>
143
+ <img src='https://github.com/AliSoftware.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/aligatr'>Olivier Halligon</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='josh-holtz'>
148
+ <a href='https://github.com/joshdholtz'>
149
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
150
150
  </a>
151
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
151
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
152
152
  </td>
153
153
  <td id='jan-piotrowski'>
154
154
  <a href='https://github.com/janpio'>
@@ -156,57 +156,57 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
156
156
  </a>
157
157
  <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</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='felix-krause'>
160
+ <a href='https://github.com/KrauseFx'>
161
+ <img src='https://github.com/KrauseFx.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/KrauseFx'>Felix Krause</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='łukasz-grabowski'>
174
+ <a href='https://github.com/lucgrabowski'>
175
+ <img src='https://github.com/lucgrabowski.png' width='140px;'>
176
176
  </a>
177
- <h4 align='center'><a href='https://twitter.com/ibotpeaches'>Connor Tumbleson</a></h4>
177
+ <h4 align='center'>Łukasz Grabowski</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='helmut-januschka'>
180
+ <a href='https://github.com/hjanuschka'>
181
+ <img src='https://github.com/hjanuschka.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/hjanuschka'>Helmut Januschka</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='stefan-natchev'>
186
+ <a href='https://github.com/snatchev'>
187
+ <img src='https://github.com/snatchev.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/snatchev'>Stefan Natchev</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='kohki-miki'>
192
+ <a href='https://github.com/giginet'>
193
+ <img src='https://github.com/giginet.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/giginet'>Kohki Miki</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='jorge-revuelta-h'>
200
+ <a href='https://github.com/minuscorp'>
201
+ <img src='https://github.com/minuscorp.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/minuscorp'>Jorge Revuelta H</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='andrew-mcburney'>
206
+ <a href='https://github.com/armcburney'>
207
+ <img src='https://github.com/armcburney.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/armcburney'>Andrew McBurney</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",
@@ -1,3 +1,4 @@
1
+ require 'tmpdir'
1
2
  require 'precheck/options'
2
3
  require 'precheck/runner'
3
4
  require 'fastlane_core/configuration/configuration'
@@ -196,7 +197,7 @@ module Deliver
196
197
  package_path = FastlaneCore::IpaUploadPackageBuilder.new.generate(
197
198
  app_id: Deliver.cache[:app].id,
198
199
  ipa_path: ipa_path,
199
- package_path: "/tmp",
200
+ package_path: Dir.tmpdir,
200
201
  platform: platform
201
202
  )
202
203
  result = transporter.verify(package_path: package_path, asset_path: ipa_path, platform: platform)
@@ -204,7 +205,7 @@ module Deliver
204
205
  package_path = FastlaneCore::PkgUploadPackageBuilder.new.generate(
205
206
  app_id: Deliver.cache[:app].id,
206
207
  pkg_path: pkg_path,
207
- package_path: "/tmp",
208
+ package_path: Dir.tmpdir,
208
209
  platform: platform
209
210
  )
210
211
  result = transporter.verify(package_path: package_path, asset_path: pkg_path, platform: platform)
@@ -233,7 +234,7 @@ module Deliver
233
234
  package_path = FastlaneCore::IpaUploadPackageBuilder.new.generate(
234
235
  app_id: Deliver.cache[:app].id,
235
236
  ipa_path: ipa_path,
236
- package_path: "/tmp",
237
+ package_path: Dir.tmpdir,
237
238
  platform: platform
238
239
  )
239
240
  result = transporter.upload(package_path: package_path, asset_path: ipa_path, platform: platform)
@@ -241,7 +242,7 @@ module Deliver
241
242
  package_path = FastlaneCore::PkgUploadPackageBuilder.new.generate(
242
243
  app_id: Deliver.cache[:app].id,
243
244
  pkg_path: pkg_path,
244
- package_path: "/tmp",
245
+ package_path: Dir.tmpdir,
245
246
  platform: platform
246
247
  )
247
248
  result = transporter.upload(package_path: package_path, asset_path: pkg_path, platform: platform)
@@ -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
@@ -1,8 +1,10 @@
1
+ require 'tmpdir'
2
+
1
3
  module Fastlane
2
4
  module Actions
3
5
  class BuildAndUploadToAppetizeAction < Action
4
6
  def self.run(params)
5
- tmp_path = "/tmp/fastlane_build"
7
+ tmp_path = File.join(Dir.tmpdir, "fastlane_build")
6
8
 
7
9
  xcodebuild_configs = params[:xcodebuild]
8
10
  xcodebuild_configs[:sdk] = "iphonesimulator"
@@ -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
@@ -1,3 +1,5 @@
1
+ require 'tmpdir'
2
+
1
3
  module Fastlane
2
4
  module Actions
3
5
  class LcovAction < Action
@@ -42,7 +44,7 @@ module Fastlane
42
44
  end
43
45
 
44
46
  def self.gen_cov(options)
45
- tmp_cov_file = "/tmp/coverage.info"
47
+ tmp_cov_file = File.join(Dir.tmpdir, "coverage.info")
46
48
  output_dir = options[:output_dir]
47
49
  derived_data_path = derived_data_dir(options)
48
50
 
@@ -1,3 +1,5 @@
1
+ require 'tmpdir'
2
+
1
3
  module Fastlane
2
4
  module Actions
3
5
  class SpaceshipLogsAction < Action
@@ -8,8 +10,8 @@ module Fastlane
8
10
  copy_to_path = params[:copy_to_path]
9
11
  copy_to_clipboard = params[:copy_to_clipboard]
10
12
 
11
- # Get log files
12
- files = Dir.glob("/tmp/spaceship*.log").sort_by { |f| File.mtime(f) }.reverse
13
+ # Get log files, from wherever Spaceship::Client#logger writes them.
14
+ files = Dir.glob(File.join(Dir.tmpdir, "spaceship*.log")).sort_by { |f| File.mtime(f) }.reverse
13
15
 
14
16
  if files.size == 0
15
17
  UI.message("No Spaceship log files found")
@@ -44,7 +44,10 @@ module Fastlane
44
44
  begin
45
45
  Actions.sh(command)
46
46
  rescue
47
- handle_swiftlint_error(params[:ignore_exit_status], $?.exitstatus)
47
+ # $? is the status of the last subprocess this thread ran, not
48
+ # necessarily this one: nil when the command never launched, and stale
49
+ # when something else ran in between. Only report it when it is there.
50
+ handle_swiftlint_error(params[:ignore_exit_status], $?&.exitstatus)
48
51
  raise if params[:raise_if_swiftlint_error]
49
52
  end
50
53
  end
@@ -248,10 +251,10 @@ module Fastlane
248
251
  end
249
252
 
250
253
  UI.important("")
251
- UI.important("SwiftLint finished with exit code #{exit_status}, #{failure_suffix}")
254
+ UI.important("SwiftLint finished with exit code #{exit_status || 'unknown'}, #{failure_suffix}")
252
255
  UI.important(secondary_message)
253
256
  UI.important("")
254
- UI.user_error!("SwiftLint finished with errors (exit code: #{exit_status})") unless ignore_exit_status
257
+ UI.user_error!("SwiftLint finished with errors (exit code: #{exit_status || 'unknown'})") unless ignore_exit_status
255
258
  end
256
259
  end
257
260
  end
@@ -1,5 +1,7 @@
1
1
  # coding: utf-8
2
2
 
3
+ require 'tmpdir'
4
+
3
5
  module Fastlane
4
6
  module Actions
5
7
  module SharedValues
@@ -146,7 +148,7 @@ module Fastlane
146
148
  FastlaneCore::ConfigItem.new(key: :certificate,
147
149
  env_name: "FL_PROJECT_PROVISIONING_CERTIFICATE_PATH",
148
150
  description: "Path to apple root certificate",
149
- default_value: "/tmp/AppleIncRootCertificate.cer"),
151
+ default_value: File.join(Dir.tmpdir, "AppleIncRootCertificate.cer")),
150
152
  FastlaneCore::ConfigItem.new(key: :code_signing_identity,
151
153
  env_name: "FL_PROJECT_PROVISIONING_CODE_SIGN_IDENTITY",
152
154
  description: "Code sign identity for build configuration",
@@ -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