fastlane 2.197.0 → 2.200.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +72 -72
  4. data/cert/lib/cert/runner.rb +5 -2
  5. data/deliver/lib/deliver/app_screenshot.rb +8 -0
  6. data/deliver/lib/deliver/app_screenshot_iterator.rb +1 -1
  7. data/deliver/lib/deliver/runner.rb +1 -1
  8. data/fastlane/lib/.DS_Store +0 -0
  9. data/fastlane/lib/fastlane/.DS_Store +0 -0
  10. data/fastlane/lib/fastlane/actions/.DS_Store +0 -0
  11. data/fastlane/lib/fastlane/actions/download_dsyms.rb +26 -27
  12. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/get_push_certificate.rb +1 -1
  14. data/fastlane/lib/fastlane/actions/get_version_number.rb +7 -2
  15. data/fastlane/lib/fastlane/actions/notarize.rb +29 -11
  16. data/fastlane/lib/fastlane/actions/set_github_release.rb +11 -5
  17. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +18 -1
  18. data/fastlane/lib/fastlane/actions/xcversion.rb +18 -3
  19. data/fastlane/lib/fastlane/documentation/docs_generator.rb +17 -12
  20. data/fastlane/lib/fastlane/version.rb +1 -1
  21. data/fastlane/swift/Actions.swift +1 -1
  22. data/fastlane/swift/Appfile.swift +1 -1
  23. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  24. data/fastlane/swift/ControlCommand.swift +1 -1
  25. data/fastlane/swift/Deliverfile.swift +2 -2
  26. data/fastlane/swift/DeliverfileProtocol.swift +2 -2
  27. data/fastlane/swift/Fastlane.swift +65 -20
  28. data/fastlane/swift/Gymfile.swift +2 -2
  29. data/fastlane/swift/GymfileProtocol.swift +6 -2
  30. data/fastlane/swift/LaneFileProtocol.swift +1 -1
  31. data/fastlane/swift/MainProcess.swift +1 -1
  32. data/fastlane/swift/Matchfile.swift +2 -2
  33. data/fastlane/swift/MatchfileProtocol.swift +2 -2
  34. data/fastlane/swift/OptionalConfigValue.swift +1 -1
  35. data/fastlane/swift/Plugins.swift +1 -1
  36. data/fastlane/swift/Precheckfile.swift +2 -2
  37. data/fastlane/swift/PrecheckfileProtocol.swift +2 -2
  38. data/fastlane/swift/RubyCommand.swift +1 -1
  39. data/fastlane/swift/RubyCommandable.swift +1 -1
  40. data/fastlane/swift/Runner.swift +4 -8
  41. data/fastlane/swift/RunnerArgument.swift +1 -1
  42. data/fastlane/swift/Scanfile.swift +2 -2
  43. data/fastlane/swift/ScanfileProtocol.swift +4 -4
  44. data/fastlane/swift/Screengrabfile.swift +2 -2
  45. data/fastlane/swift/ScreengrabfileProtocol.swift +2 -2
  46. data/fastlane/swift/Snapshotfile.swift +2 -2
  47. data/fastlane/swift/SnapshotfileProtocol.swift +2 -2
  48. data/fastlane/swift/SocketClient.swift +1 -1
  49. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  50. data/fastlane/swift/SocketResponse.swift +1 -1
  51. data/fastlane/swift/formatting/Brewfile.lock.json +23 -18
  52. data/fastlane/swift/main.swift +1 -1
  53. data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +10 -5
  54. data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +41 -7
  55. data/gym/lib/gym/generators/build_command_generator.rb +2 -2
  56. data/gym/lib/gym/options.rb +6 -0
  57. data/match/lib/match/nuke.rb +79 -1
  58. data/match/lib/match/spaceship_ensure.rb +1 -0
  59. data/pem/lib/pem/manager.rb +29 -6
  60. data/pem/lib/pem/options.rb +9 -0
  61. data/pilot/lib/pilot/build_manager.rb +1 -1
  62. data/scan/lib/scan/options.rb +2 -2
  63. data/scan/lib/scan/runner.rb +2 -2
  64. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +1 -1
  65. data/spaceship/lib/spaceship/client.rb +35 -15
  66. data/spaceship/lib/spaceship/commands_generator.rb +1 -1
  67. data/spaceship/lib/spaceship/connect_api/models/app.rb +43 -0
  68. data/spaceship/lib/spaceship/connect_api/models/app_info.rb +1 -0
  69. data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +2 -0
  70. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +3 -0
  71. data/spaceship/lib/spaceship/connect_api/models/review_submission.rb +73 -0
  72. data/spaceship/lib/spaceship/connect_api/models/review_submission_item.rb +40 -0
  73. data/spaceship/lib/spaceship/connect_api/response.rb +13 -0
  74. data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +83 -0
  75. data/spaceship/lib/spaceship/connect_api.rb +2 -0
  76. data/spaceship/lib/spaceship/globals.rb +9 -0
  77. data/spaceship/lib/spaceship/spaceauth_runner.rb +1 -1
  78. data/supply/lib/supply/options.rb +8 -0
  79. data/supply/lib/supply/uploader.rb +6 -2
  80. data/trainer/lib/.DS_Store +0 -0
  81. metadata +25 -19
  82. data/spaceship/lib/spaceship/connect_api/models/.build.rb.swp +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 471eff584bf9045c8387208af74f22d6556be211f98a16272b726d7354d7a12e
4
- data.tar.gz: 66f352f900ba8669eb12a16d83f31b28372173207ef2c077312a029548429efd
3
+ metadata.gz: 1f80e15767a649f85c39e5b6d1cd2f0f8e4dee37c81a2c1e38c7b90673c04d68
4
+ data.tar.gz: 41955caa65ee85fe319708bae375070d44562db6717307eebe28b57be5e6f280
5
5
  SHA512:
6
- metadata.gz: a4fc178fa1af1418d7967d29085def077bd3887d3922c4d1308781930ced91ed858d2b3b0032ae2b9116316c32ebba6ae3ee25fd4e4380a336a4e3c8874852fd
7
- data.tar.gz: 354898d403d3829ecbf42627d8b6fe549a78374aa2412c568a53e2dd66b84f8a220e5a480f5e0b7d92c6e89d844b53de9b25cba961d1b9b4976291061e08673e
6
+ metadata.gz: ed42b7966058076011ee4a18eee35e70457f75f80b014623b9097289798304f62fb030ec16befa57c8bc39b0e9e2eb40745bff8341193cdcd32dcc4eaef8d8e0
7
+ data.tar.gz: 3ae156afb0514a3a9d6e310b4610655f421b76e297aece23615c72598af7f4b2dfe7e6bc3ca5658a08aedd5060cba71718dfd049654662f9172ed0d7dc030638
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2021 The Fastlane Authors
3
+ Copyright (c) 2015-2022 The Fastlane Authors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -35,36 +35,36 @@ 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='josh-holtz'>
39
- <a href='https://github.com/joshdholtz'>
40
- <img src='https://github.com/joshdholtz.png' width='140px;'>
41
- </a>
42
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
43
- </td>
44
- <td id='fumiya-nakamura'>
45
- <a href='https://github.com/nafu'>
46
- <img src='https://github.com/nafu.png' width='140px;'>
47
- </a>
48
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
49
- </td>
50
38
  <td id='danielle-tomlinson'>
51
39
  <a href='https://github.com/endocrimes'>
52
40
  <img src='https://github.com/endocrimes.png' width='140px;'>
53
41
  </a>
54
42
  <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
55
43
  </td>
56
- <td id='maksym-grebenets'>
57
- <a href='https://github.com/mgrebenets'>
58
- <img src='https://github.com/mgrebenets.png' width='140px;'>
59
- </a>
60
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
61
- </td>
62
44
  <td id='satoshi-namai'>
63
45
  <a href='https://github.com/ainame'>
64
46
  <img src='https://github.com/ainame.png' width='140px;'>
65
47
  </a>
66
48
  <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
67
49
  </td>
50
+ <td id='jorge-revuelta-h'>
51
+ <a href='https://github.com/minuscorp'>
52
+ <img src='https://github.com/minuscorp.png' width='140px;'>
53
+ </a>
54
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
55
+ </td>
56
+ <td id='jérôme-lacoste'>
57
+ <a href='https://github.com/lacostej'>
58
+ <img src='https://github.com/lacostej.png' width='140px;'>
59
+ </a>
60
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
61
+ </td>
62
+ <td id='jan-piotrowski'>
63
+ <a href='https://github.com/janpio'>
64
+ <img src='https://github.com/janpio.png' width='140px;'>
65
+ </a>
66
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
67
+ </td>
68
68
  </tr>
69
69
  <tr>
70
70
  <td id='roger-oba'>
@@ -73,11 +73,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
73
73
  </a>
74
74
  <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
75
75
  </td>
76
- <td id='matthew-ellis'>
77
- <a href='https://github.com/matthewellis'>
78
- <img src='https://github.com/matthewellis.png' width='140px;'>
76
+ <td id='kohki-miki'>
77
+ <a href='https://github.com/giginet'>
78
+ <img src='https://github.com/giginet.png' width='140px;'>
79
79
  </a>
80
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
80
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
81
81
  </td>
82
82
  <td id='olivier-halligon'>
83
83
  <a href='https://github.com/AliSoftware'>
@@ -91,31 +91,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
91
91
  </a>
92
92
  <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
93
93
  </td>
94
- <td id='daniel-jankowski'>
95
- <a href='https://github.com/mollyIV'>
96
- <img src='https://github.com/mollyIV.png' width='140px;'>
94
+ <td id='manish-rathi'>
95
+ <a href='https://github.com/crazymanish'>
96
+ <img src='https://github.com/crazymanish.png' width='140px;'>
97
97
  </a>
98
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
98
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
99
99
  </td>
100
100
  </tr>
101
101
  <tr>
102
- <td id='jan-piotrowski'>
103
- <a href='https://github.com/janpio'>
104
- <img src='https://github.com/janpio.png' width='140px;'>
102
+ <td id='matthew-ellis'>
103
+ <a href='https://github.com/matthewellis'>
104
+ <img src='https://github.com/matthewellis.png' width='140px;'>
105
105
  </a>
106
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
106
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
107
107
  </td>
108
- <td id='jorge-revuelta-h'>
109
- <a href='https://github.com/minuscorp'>
110
- <img src='https://github.com/minuscorp.png' width='140px;'>
108
+ <td id='joshua-liebowitz'>
109
+ <a href='https://github.com/taquitos'>
110
+ <img src='https://github.com/taquitos.png' width='140px;'>
111
111
  </a>
112
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
113
113
  </td>
114
- <td id='kohki-miki'>
115
- <a href='https://github.com/giginet'>
116
- <img src='https://github.com/giginet.png' width='140px;'>
114
+ <td id='josh-holtz'>
115
+ <a href='https://github.com/joshdholtz'>
116
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
117
117
  </a>
118
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
119
119
  </td>
120
120
  <td id='aaron-brager'>
121
121
  <a href='https://github.com/getaaron'>
@@ -123,43 +123,43 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
123
123
  </a>
124
124
  <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
125
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>
126
134
  <td id='luka-mirosevic'>
127
135
  <a href='https://github.com/lmirosevic'>
128
136
  <img src='https://github.com/lmirosevic.png' width='140px;'>
129
137
  </a>
130
138
  <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
131
139
  </td>
132
- </tr>
133
- <tr>
140
+ <td id='daniel-jankowski'>
141
+ <a href='https://github.com/mollyIV'>
142
+ <img src='https://github.com/mollyIV.png' width='140px;'>
143
+ </a>
144
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
145
+ </td>
134
146
  <td id='felix-krause'>
135
147
  <a href='https://github.com/KrauseFx'>
136
148
  <img src='https://github.com/KrauseFx.png' width='140px;'>
137
149
  </a>
138
150
  <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
139
151
  </td>
140
- <td id='jérôme-lacoste'>
141
- <a href='https://github.com/lacostej'>
142
- <img src='https://github.com/lacostej.png' width='140px;'>
143
- </a>
144
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
145
- </td>
146
- <td id='jimmy-dee'>
147
- <a href='https://github.com/jdee'>
148
- <img src='https://github.com/jdee.png' width='140px;'>
149
- </a>
150
- <h4 align='center'>Jimmy Dee</h4>
151
- </td>
152
- <td id='manish-rathi'>
153
- <a href='https://github.com/crazymanish'>
154
- <img src='https://github.com/crazymanish.png' width='140px;'>
152
+ <td id='stefan-natchev'>
153
+ <a href='https://github.com/snatchev'>
154
+ <img src='https://github.com/snatchev.png' width='140px;'>
155
155
  </a>
156
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
157
157
  </td>
158
- <td id='joshua-liebowitz'>
159
- <a href='https://github.com/taquitos'>
160
- <img src='https://github.com/taquitos.png' width='140px;'>
158
+ <td id='iulian-onofrei'>
159
+ <a href='https://github.com/revolter'>
160
+ <img src='https://github.com/revolter.png' width='140px;'>
161
161
  </a>
162
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
163
163
  </td>
164
164
  </tr>
165
165
  <tr>
@@ -175,23 +175,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
175
175
  </a>
176
176
  <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</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='fumiya-nakamura'>
179
+ <a href='https://github.com/nafu'>
180
+ <img src='https://github.com/nafu.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/nafu003'>Fumiya Nakamura</a></h4>
183
183
  </td>
184
- <td id='iulian-onofrei'>
185
- <a href='https://github.com/revolter'>
186
- <img src='https://github.com/revolter.png' width='140px;'>
184
+ <td id='jimmy-dee'>
185
+ <a href='https://github.com/jdee'>
186
+ <img src='https://github.com/jdee.png' width='140px;'>
187
187
  </a>
188
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
188
+ <h4 align='center'>Jimmy Dee</h4>
189
189
  </td>
190
- <td id='manu-wallner'>
191
- <a href='https://github.com/milch'>
192
- <img src='https://github.com/milch.png' width='140px;'>
190
+ <td id='maksym-grebenets'>
191
+ <a href='https://github.com/mgrebenets'>
192
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
193
193
  </a>
194
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
194
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  </table>
@@ -154,8 +154,11 @@ module Cert
154
154
  when :developer_id_kext
155
155
  return Spaceship::ConnectAPI::Certificate::CertificateType::DEVELOPER_ID_KEXT
156
156
  when :developer_id_installer
157
- raise "Cannot do with ASC API?"
158
- # return Spaceship.certificate.developer_id_installer
157
+ if !Spaceship::ConnectAPI.token.nil?
158
+ raise "As of 2021-11-09, the App Store Connect API does not allow accessing DEVELOPER_ID_INSTALLER with the API Key. Please file an issue on GitHub if this has changed and needs to be updated"
159
+ else
160
+ return Spaceship::ConnectAPI::Certificate::CertificateType::DEVELOPER_ID_INSTALLER
161
+ end
159
162
  else
160
163
  UI.user_error("Unaccepted value for :type - #{Cert.config[:type]}")
161
164
  end
@@ -63,6 +63,8 @@ module Deliver
63
63
  IOS_APPLE_WATCH = "iOS-Apple-Watch"
64
64
  # Apple Watch Series 4
65
65
  IOS_APPLE_WATCH_SERIES4 = "iOS-Apple-Watch-Series4"
66
+ # Apple Watch Series 7
67
+ IOS_APPLE_WATCH_SERIES7 = "iOS-Apple-Watch-Series7"
66
68
 
67
69
  # Apple TV
68
70
  APPLE_TV = "Apple-TV"
@@ -117,6 +119,7 @@ module Deliver
117
119
  ScreenSize::MAC => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_DESKTOP,
118
120
  ScreenSize::IOS_APPLE_WATCH => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_3,
119
121
  ScreenSize::IOS_APPLE_WATCH_SERIES4 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_4,
122
+ ScreenSize::IOS_APPLE_WATCH_SERIES7 => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_WATCH_SERIES_7,
120
123
  ScreenSize::APPLE_TV => Spaceship::ConnectAPI::AppScreenshotSet::DisplayType::APP_APPLE_TV
121
124
  }
122
125
  return matching[self.screen_size]
@@ -151,6 +154,7 @@ module Deliver
151
154
  ScreenSize::MAC => "Mac",
152
155
  ScreenSize::IOS_APPLE_WATCH => "Watch",
153
156
  ScreenSize::IOS_APPLE_WATCH_SERIES4 => "Watch Series4",
157
+ ScreenSize::IOS_APPLE_WATCH_SERIES7 => "Watch Series7",
154
158
  ScreenSize::APPLE_TV => "Apple TV"
155
159
  }
156
160
  return matching[self.screen_size]
@@ -313,6 +317,9 @@ module Deliver
313
317
  ScreenSize::IOS_APPLE_WATCH_SERIES4 => [
314
318
  [368, 448]
315
319
  ],
320
+ ScreenSize::IOS_APPLE_WATCH_SERIES7 => [
321
+ [396, 484]
322
+ ],
316
323
  ScreenSize::APPLE_TV => [
317
324
  [1920, 1080],
318
325
  [3840, 2160]
@@ -324,6 +331,7 @@ module Deliver
324
331
  is_3rd_gen = [
325
332
  "iPad Pro (12.9-inch) (3rd generation)", # Default simulator has this name
326
333
  "iPad Pro (12.9-inch) (4th generation)", # Default simulator has this name
334
+ "iPad Pro (12.9-inch) (5th generation)", # Default simulator has this name
327
335
  "IPAD_PRO_3GEN_129", # Screenshots downloaded from App Store Connect has this name
328
336
  "ipadPro129" # Legacy: screenshots downloaded from iTunes Connect used to have this name
329
337
  ].any? { |key| filename.include?(key) }
@@ -80,7 +80,7 @@ module Deliver
80
80
  screenshots_per_display_type = screenshots_for_language.reject { |screenshot| screenshot.device_type.nil? }.group_by(&:device_type)
81
81
 
82
82
  screenshots_per_display_type.each do |display_type, screenshots|
83
- # create AppScreenshotSet for given display_type if it doesn't exsit
83
+ # create AppScreenshotSet for given display_type if it doesn't exist
84
84
  app_screenshot_set = (app_screenshot_set_per_locale_and_display_type[language] || {})[display_type]
85
85
  app_screenshot_set ||= localization.create_app_screenshot_set(attributes: { screenshotDisplayType: display_type })
86
86
 
@@ -186,7 +186,7 @@ module Deliver
186
186
  end
187
187
 
188
188
  transporter = transporter_for_selected_team
189
- result = transporter.upload(package_path: package_path)
189
+ result = transporter.upload(package_path: package_path, asset_path: upload_ipa || upload_pkg)
190
190
 
191
191
  unless result
192
192
  transporter_errors = transporter.displayable_errors
Binary file
Binary file
@@ -75,10 +75,11 @@ module Fastlane
75
75
 
76
76
  filter = { app: app.id }
77
77
  filter["preReleaseVersion.platform"] = platform
78
- build_resps = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion,buildBundles").all_pages
79
- builds = build_resps.flat_map(&:to_models)
78
+ filter["preReleaseVersion.version"] = version if version
79
+ filter["version"] = build_number if build_number
80
+ build_resp = Spaceship::ConnectAPI.get_builds(filter: filter, sort: "-uploadedDate", includes: "preReleaseVersion,buildBundles")
80
81
 
81
- builds.each do |build|
82
+ build_resp.all_pages_each do |build|
82
83
  asc_app_version = build.app_version
83
84
  asc_build_number = build.version
84
85
  uploaded_date = DateTime.parse(build.uploaded_date)
@@ -100,7 +101,7 @@ module Fastlane
100
101
 
101
102
  if after_uploaded_date && after_uploaded_date >= uploaded_date
102
103
  UI.verbose("Upload date #{after_uploaded_date} not reached: #{uploaded_date}")
103
- next
104
+ break
104
105
  end
105
106
 
106
107
  message = []
@@ -114,39 +115,37 @@ module Fastlane
114
115
  end
115
116
 
116
117
  UI.verbose("Build_version: #{asc_build_number} matches #{build_number}, grabbing dsym_url") if build_number
117
-
118
- build.build_bundles&.each do |build_bundle|
119
- download_dsym(build_bundle: build_bundle, build: build, app: app, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
120
- end
118
+ download_dsym(build: build, app: app, wait_for_dsym_processing: wait_for_dsym_processing, wait_timeout: wait_timeout, output_directory: output_directory)
121
119
  end
122
120
  end
123
121
 
124
- def self.download_dsym(build_bundle: nil, build: nil, app: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
122
+ def self.download_dsym(build: nil, app: nil, wait_for_dsym_processing: nil, wait_timeout: nil, output_directory: nil)
125
123
  start = Time.now
126
- download_url = nil
124
+ dsym_urls = []
127
125
 
128
126
  loop do
129
- download_url = build_bundle.dsym_url
130
-
131
- unless download_url
132
- if !wait_for_dsym_processing || (Time.now - start) > wait_timeout
133
- # In some cases, AppStoreConnect does not process the dSYMs, thus no error should be thrown.
134
- UI.message("Could not find any dSYM for #{build.version} (#{build.app_version})")
135
- else
136
- UI.message("Waiting for dSYM file to appear...")
137
- sleep(30)
138
- next
139
- end
127
+ build_bundles = build.build_bundles.select { |b| b.includes_symbols == true }
128
+ dsym_urls = build_bundles.map(&:dsym_url).compact
129
+
130
+ break if build_bundles.count == dsym_urls.count
131
+
132
+ if !wait_for_dsym_processing || (Time.now - start) > wait_timeout
133
+ # In some cases, AppStoreConnect does not process the dSYMs, thus no error should be thrown.
134
+ UI.message("Could not find any dSYM for #{build.version} (#{build.app_version})")
135
+ break
136
+ else
137
+ UI.message("Waiting for dSYM file to appear...")
138
+ sleep(30) unless FastlaneCore::Helper.is_test?
139
+ build = Spaceship::ConnectAPI::Build.get(build_id: build.id)
140
140
  end
141
-
142
- break
143
141
  end
144
142
 
145
- if download_url
146
- self.download(download_url, build, app, output_directory)
147
- return if build.version
148
- else
143
+ if dsym_urls.count == 0
149
144
  UI.message("No dSYM URL for #{build.version} (#{build.app_version})")
145
+ else
146
+ dsym_urls.each do |url|
147
+ self.download(url, build, app, output_directory)
148
+ end
150
149
  end
151
150
  end
152
151
  # rubocop:enable Metrics/PerceivedComplexity
@@ -75,7 +75,7 @@ module Fastlane
75
75
  [
76
76
  "If building your app requires a specific version of Xcode, you can invoke this command before using gym.",
77
77
  "For example, to ensure that a beta version of Xcode is not accidentally selected to build, which would make uploading to TestFlight fail.",
78
- "You can either manually provide a specific version using `version: ` or you make use of the `.xcode-version` file.",
78
+ "You can either manually provide a specific version using `version:` or you make use of the `.xcode-version` file.",
79
79
  "Using the `strict` parameter, you can either verify the full set of version numbers strictly (i.e. `11.3.1`) or only a subset of them (i.e. `11.3` or `11`)."
80
80
  ].join("\n")
81
81
  end
@@ -60,7 +60,7 @@ module Fastlane
60
60
  end
61
61
 
62
62
  def self.is_supported?(platform)
63
- platform == :ios
63
+ [:ios, :mac].include?(platform)
64
64
  end
65
65
 
66
66
  def self.example_code
@@ -109,8 +109,10 @@ module Fastlane
109
109
  options = plist_files.keys
110
110
  selected = UI.select("What build configuration would you like to use?", options)
111
111
  plist_file = plist_files[selected]
112
- else
112
+ elsif plist_files_count > 0
113
113
  plist_file = plist_files.values.first
114
+ else
115
+ return nil
114
116
  end
115
117
 
116
118
  # $(SRCROOT) is the path of where the XcodeProject is
@@ -131,9 +133,12 @@ module Fastlane
131
133
  end
132
134
 
133
135
  def self.get_version_number_from_plist!(plist_file)
136
+ return '$(MARKETING_VERSION)' if plist_file.nil?
137
+
134
138
  plist = Xcodeproj::Plist.read_from_path(plist_file)
135
139
  UI.user_error!("Unable to read plist: #{plist_file}") unless plist
136
140
 
141
+ return '${MARKETING_VERSION}' if plist["CFBundleShortVersionString"].nil?
137
142
  plist["CFBundleShortVersionString"]
138
143
  end
139
144
 
@@ -146,7 +151,7 @@ module Fastlane
146
151
  end
147
152
 
148
153
  def self.details
149
- "This action will return the current version number set on your project."
154
+ "This action will return the current version number set on your project. It first looks in the plist and then for '$(MARKETING_VERSION)' in the build settings."
150
155
  end
151
156
 
152
157
  def self.available_options
@@ -5,6 +5,7 @@ module Fastlane
5
5
  def self.run(params)
6
6
  package_path = params[:package]
7
7
  bundle_id = params[:bundle_id]
8
+ skip_stapling = params[:skip_stapling]
8
9
  try_early_stapling = params[:try_early_stapling]
9
10
  print_log = params[:print_log]
10
11
  verbose = params[:verbose]
@@ -38,13 +39,13 @@ module Fastlane
38
39
  UI.user_error!('Could not read bundle identifier, provide as a parameter') unless bundle_id
39
40
 
40
41
  if use_notarytool
41
- notarytool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
42
+ notarytool(params, package_path, bundle_id, skip_stapling, print_log, verbose, api_key, compressed_package_path)
42
43
  else
43
- altool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
44
+ altool(params, package_path, bundle_id, try_early_stapling, skip_stapling, print_log, verbose, api_key, compressed_package_path)
44
45
  end
45
46
  end
46
47
 
47
- def self.notarytool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
48
+ def self.notarytool(params, package_path, bundle_id, skip_stapling, print_log, verbose, api_key, compressed_package_path)
48
49
  temp_file = nil
49
50
 
50
51
  # Create authorization part of command with either API Key or Apple ID
@@ -89,10 +90,15 @@ module Fastlane
89
90
  submission_id = notarization_info["id"]
90
91
  UI.success("Successfully uploaded package to notarization service with request identifier #{submission_id}")
91
92
 
92
- UI.message('Stapling package')
93
- self.staple(package_path, verbose)
93
+ if skip_stapling
94
+ UI.success("Successfully notarized artifact")
95
+ else
96
+ UI.message('Stapling package')
94
97
 
95
- UI.success("Successfully notarized and stapled package")
98
+ self.staple(package_path, verbose)
99
+
100
+ UI.success("Successfully notarized and stapled package")
101
+ end
96
102
  when 'Invalid'
97
103
  UI.user_error!("Could not notarize package with message '#{notarization_info['statusSummary']}'")
98
104
  else
@@ -102,7 +108,7 @@ module Fastlane
102
108
  temp_file.delete if temp_file
103
109
  end
104
110
 
105
- def self.altool(params, package_path, bundle_id, try_early_stapling, print_log, verbose, api_key, compressed_package_path)
111
+ def self.altool(params, package_path, bundle_id, try_early_stapling, skip_stapling, print_log, verbose, api_key, compressed_package_path)
106
112
  UI.message('Uploading package to notarization service, might take a while')
107
113
 
108
114
  notarization_upload_command = "xcrun altool --notarize-app -t osx -f \"#{compressed_package_path || package_path}\" --primary-bundle-id #{bundle_id} --output-format xml"
@@ -133,7 +139,7 @@ module Fastlane
133
139
  while notarization_info.empty? || (notarization_info['Status'] == 'in progress')
134
140
  if notarization_info.empty?
135
141
  UI.message('Waiting to query request status')
136
- elsif try_early_stapling
142
+ elsif try_early_stapling && !skip_stapling
137
143
  UI.message('Request in progress, trying early staple')
138
144
 
139
145
  begin
@@ -182,11 +188,15 @@ module Fastlane
182
188
 
183
189
  case notarization_info['Status']
184
190
  when 'success'
185
- UI.message('Stapling package')
191
+ if skip_stapling
192
+ UI.success("Successfully notarized artifact#{log_suffix}")
193
+ else
194
+ UI.message('Stapling package')
186
195
 
187
- self.staple(package_path, verbose)
196
+ self.staple(package_path, verbose)
188
197
 
189
- UI.success("Successfully notarized and stapled package#{log_suffix}")
198
+ UI.success("Successfully notarized and stapled package#{log_suffix}")
199
+ end
190
200
  when 'invalid'
191
201
  UI.user_error!("Could not notarize package with message '#{notarization_info['Status Message']}'#{log_suffix}")
192
202
  else
@@ -262,6 +272,14 @@ module Fastlane
262
272
  env_name: 'FL_NOTARIZE_TRY_EARLY_STAPLING',
263
273
  description: 'Whether to try early stapling while the notarization request is in progress',
264
274
  optional: true,
275
+ conflicting_options: [:skip_stapling],
276
+ default_value: false,
277
+ type: Boolean),
278
+ FastlaneCore::ConfigItem.new(key: :skip_stapling,
279
+ env_name: 'FL_NOTARIZE_SKIP_STAPLING',
280
+ description: 'Do not staple the notarization ticket to the artifact; useful for single file executables and ZIP archives',
281
+ optional: true,
282
+ conflicting_options: [:try_early_stapling],
265
283
  default_value: false,
266
284
  type: Boolean),
267
285
  FastlaneCore::ConfigItem.new(key: :bundle_id,
@@ -19,11 +19,12 @@ module Fastlane
19
19
 
20
20
  payload = {
21
21
  'tag_name' => params[:tag_name],
22
- 'name' => params[:name],
23
- 'body' => params[:description],
24
22
  'draft' => !!params[:is_draft],
25
- 'prerelease' => !!params[:is_prerelease]
23
+ 'prerelease' => !!params[:is_prerelease],
24
+ 'generate_release_notes' => !!params[:is_generate_release_notes]
26
25
  }
26
+ payload['name'] = params[:name] if params[:name]
27
+ payload['body'] = params[:description] if params[:description]
27
28
  payload['target_commitish'] = params[:commitish] if params[:commitish]
28
29
 
29
30
  GithubApiAction.run(
@@ -48,8 +49,7 @@ module Fastlane
48
49
  UI.user_error!("You are not authorized to access #{repo_name}, please make sure you provided a valid API token (GITHUB_API_TOKEN)")
49
50
  end,
50
51
  '*' => proc do |result|
51
- UI.error("GitHub responded with #{result[:status]}:#{result[:body]}")
52
- return nil
52
+ UI.user_error!("GitHub responded with #{result[:status]}:#{result[:body]}")
53
53
  end
54
54
  }
55
55
  ) do |result|
@@ -221,6 +221,12 @@ module Fastlane
221
221
  optional: true,
222
222
  default_value: false,
223
223
  type: Boolean),
224
+ FastlaneCore::ConfigItem.new(key: :is_generate_release_notes,
225
+ env_name: "FL_SET_GITHUB_RELEASE_IS_GENERATE_RELEASE_NOTES",
226
+ description: "Whether the name and body of this release should be generated automatically",
227
+ optional: true,
228
+ default_value: false,
229
+ type: Boolean),
224
230
  FastlaneCore::ConfigItem.new(key: :upload_assets,
225
231
  env_name: "FL_SET_GITHUB_RELEASE_UPLOAD_ASSETS",
226
232
  description: "Path to assets to be uploaded with the release",