fastlane 2.198.1 → 2.199.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +98 -98
  3. data/deliver/lib/deliver/app_screenshot_iterator.rb +1 -1
  4. data/fastlane/lib/.DS_Store +0 -0
  5. data/fastlane/lib/fastlane/.DS_Store +0 -0
  6. data/fastlane/lib/fastlane/actions/.DS_Store +0 -0
  7. data/fastlane/lib/fastlane/actions/download_dsyms.rb +25 -26
  8. data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +18 -1
  10. data/fastlane/lib/fastlane/actions/xcversion.rb +18 -3
  11. data/fastlane/lib/fastlane/documentation/docs_generator.rb +17 -12
  12. data/fastlane/lib/fastlane/version.rb +1 -1
  13. data/fastlane/swift/Deliverfile.swift +1 -1
  14. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  15. data/fastlane/swift/Fastlane.swift +18 -13
  16. data/fastlane/swift/Gymfile.swift +1 -1
  17. data/fastlane/swift/GymfileProtocol.swift +1 -1
  18. data/fastlane/swift/Matchfile.swift +1 -1
  19. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  20. data/fastlane/swift/Precheckfile.swift +1 -1
  21. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  22. data/fastlane/swift/Runner.swift +3 -7
  23. data/fastlane/swift/Scanfile.swift +1 -1
  24. data/fastlane/swift/ScanfileProtocol.swift +3 -3
  25. data/fastlane/swift/Screengrabfile.swift +1 -1
  26. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  27. data/fastlane/swift/Snapshotfile.swift +1 -1
  28. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  29. data/fastlane/swift/formatting/Brewfile.lock.json +13 -13
  30. data/scan/lib/scan/options.rb +2 -2
  31. data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +1 -1
  32. data/spaceship/lib/spaceship/client.rb +35 -15
  33. data/spaceship/lib/spaceship/commands_generator.rb +1 -1
  34. data/spaceship/lib/spaceship/connect_api/response.rb +13 -0
  35. data/spaceship/lib/spaceship/globals.rb +9 -0
  36. data/spaceship/lib/spaceship/spaceauth_runner.rb +1 -1
  37. data/trainer/lib/.DS_Store +0 -0
  38. metadata +24 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 77c8ce8c71c7b69c8de6e7e869ffdff958573d7d17dd7d1243851319694c32ec
4
- data.tar.gz: 34d6fcfc8ca0405372ef957f33a536564833b63306a87287ac64a9594d055192
3
+ metadata.gz: fcbdda77dc3e29ac8d1ce7440033a3f95f610e367bbffb6cd9156899993b8311
4
+ data.tar.gz: 7eb108144336aa3038db856ae2ac36894095db6e8bf57b1dceb39b2b2e079abd
5
5
  SHA512:
6
- metadata.gz: 28443bb0c1c1360ede7cd0629321d7be3625aad5e0cee136815327d3809e9bccd137a312175ffdd51d4963b505683215cf59ad5704ad9ceab628b2ec49dcb12d
7
- data.tar.gz: cbe5f2c64bd811f20a257f916c0c9bf64667f388582b2900f68bea33c0335ef1b79bd33c12873f3ecfc709a9515a548f0f67cb5ae5c266d4bf343c205e249096
6
+ metadata.gz: 666df49eb19bb007a66bb4105ceb30330c609bd3d1105ed4a6ce295b48a7bdc01335199ec0a59d50fc75ff166d6f66155dbc336f4cfe71b65798a95f330b044c
7
+ data.tar.gz: a451304146470f1a8da8c2cdec8329a02b73bba9262641161eb0b884581d48b9cae404ad01e08bdf32d9ab58314bdaf4b645a61c4e50cc8aedf5d9113d2aa015
data/README.md CHANGED
@@ -35,29 +35,17 @@ 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='maksym-grebenets'>
39
- <a href='https://github.com/mgrebenets'>
40
- <img src='https://github.com/mgrebenets.png' width='140px;'>
41
- </a>
42
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
43
- </td>
44
- <td id='aaron-brager'>
45
- <a href='https://github.com/getaaron'>
46
- <img src='https://github.com/getaaron.png' width='140px;'>
47
- </a>
48
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
49
- </td>
50
- <td id='andrew-mcburney'>
51
- <a href='https://github.com/armcburney'>
52
- <img src='https://github.com/armcburney.png' width='140px;'>
38
+ <td id='manish-rathi'>
39
+ <a href='https://github.com/crazymanish'>
40
+ <img src='https://github.com/crazymanish.png' width='140px;'>
53
41
  </a>
54
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
55
43
  </td>
56
- <td id='fumiya-nakamura'>
57
- <a href='https://github.com/nafu'>
58
- <img src='https://github.com/nafu.png' width='140px;'>
44
+ <td id='satoshi-namai'>
45
+ <a href='https://github.com/ainame'>
46
+ <img src='https://github.com/ainame.png' width='140px;'>
59
47
  </a>
60
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
61
49
  </td>
62
50
  <td id='matthew-ellis'>
63
51
  <a href='https://github.com/matthewellis'>
@@ -65,133 +53,145 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
65
53
  </a>
66
54
  <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
67
55
  </td>
56
+ <td id='helmut-januschka'>
57
+ <a href='https://github.com/hjanuschka'>
58
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
59
+ </a>
60
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
61
+ </td>
62
+ <td id='iulian-onofrei'>
63
+ <a href='https://github.com/revolter'>
64
+ <img src='https://github.com/revolter.png' width='140px;'>
65
+ </a>
66
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
67
+ </td>
68
68
  </tr>
69
69
  <tr>
70
- <td id='jérôme-lacoste'>
71
- <a href='https://github.com/lacostej'>
72
- <img src='https://github.com/lacostej.png' width='140px;'>
70
+ <td id='stefan-natchev'>
71
+ <a href='https://github.com/snatchev'>
72
+ <img src='https://github.com/snatchev.png' width='140px;'>
73
73
  </a>
74
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
74
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
75
75
  </td>
76
- <td id='felix-krause'>
77
- <a href='https://github.com/KrauseFx'>
78
- <img src='https://github.com/KrauseFx.png' width='140px;'>
76
+ <td id='andrew-mcburney'>
77
+ <a href='https://github.com/armcburney'>
78
+ <img src='https://github.com/armcburney.png' width='140px;'>
79
79
  </a>
80
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
80
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
81
81
  </td>
82
- <td id='olivier-halligon'>
83
- <a href='https://github.com/AliSoftware'>
84
- <img src='https://github.com/AliSoftware.png' width='140px;'>
82
+ <td id='daniel-jankowski'>
83
+ <a href='https://github.com/mollyIV'>
84
+ <img src='https://github.com/mollyIV.png' width='140px;'>
85
85
  </a>
86
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
87
87
  </td>
88
- <td id='jan-piotrowski'>
89
- <a href='https://github.com/janpio'>
90
- <img src='https://github.com/janpio.png' width='140px;'>
88
+ <td id='max-ott'>
89
+ <a href='https://github.com/max-ott'>
90
+ <img src='https://github.com/max-ott.png' width='140px;'>
91
91
  </a>
92
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
92
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
93
93
  </td>
94
- <td id='satoshi-namai'>
95
- <a href='https://github.com/ainame'>
96
- <img src='https://github.com/ainame.png' width='140px;'>
94
+ <td id='joshua-liebowitz'>
95
+ <a href='https://github.com/taquitos'>
96
+ <img src='https://github.com/taquitos.png' width='140px;'>
97
97
  </a>
98
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
98
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
99
99
  </td>
100
100
  </tr>
101
101
  <tr>
102
- <td id='manish-rathi'>
103
- <a href='https://github.com/crazymanish'>
104
- <img src='https://github.com/crazymanish.png' width='140px;'>
102
+ <td id='olivier-halligon'>
103
+ <a href='https://github.com/AliSoftware'>
104
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
105
105
  </a>
106
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
106
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
107
107
  </td>
108
- <td id='helmut-januschka'>
109
- <a href='https://github.com/hjanuschka'>
110
- <img src='https://github.com/hjanuschka.png' width='140px;'>
108
+ <td id='aaron-brager'>
109
+ <a href='https://github.com/getaaron'>
110
+ <img src='https://github.com/getaaron.png' width='140px;'>
111
111
  </a>
112
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
113
113
  </td>
114
- <td id='manu-wallner'>
115
- <a href='https://github.com/milch'>
116
- <img src='https://github.com/milch.png' width='140px;'>
114
+ <td id='felix-krause'>
115
+ <a href='https://github.com/KrauseFx'>
116
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
117
117
  </a>
118
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
119
119
  </td>
120
- <td id='roger-oba'>
121
- <a href='https://github.com/rogerluan'>
122
- <img src='https://github.com/rogerluan.png' width='140px;'>
120
+ <td id='danielle-tomlinson'>
121
+ <a href='https://github.com/endocrimes'>
122
+ <img src='https://github.com/endocrimes.png' width='140px;'>
123
123
  </a>
124
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
124
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
125
125
  </td>
126
- <td id='iulian-onofrei'>
127
- <a href='https://github.com/revolter'>
128
- <img src='https://github.com/revolter.png' width='140px;'>
126
+ <td id='josh-holtz'>
127
+ <a href='https://github.com/joshdholtz'>
128
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
129
129
  </a>
130
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
130
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
131
131
  </td>
132
132
  </tr>
133
133
  <tr>
134
+ <td id='jorge-revuelta-h'>
135
+ <a href='https://github.com/minuscorp'>
136
+ <img src='https://github.com/minuscorp.png' width='140px;'>
137
+ </a>
138
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
139
+ </td>
134
140
  <td id='jimmy-dee'>
135
141
  <a href='https://github.com/jdee'>
136
142
  <img src='https://github.com/jdee.png' width='140px;'>
137
143
  </a>
138
144
  <h4 align='center'>Jimmy Dee</h4>
139
145
  </td>
140
- <td id='joshua-liebowitz'>
141
- <a href='https://github.com/taquitos'>
142
- <img src='https://github.com/taquitos.png' width='140px;'>
143
- </a>
144
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
145
- </td>
146
- <td id='max-ott'>
147
- <a href='https://github.com/max-ott'>
148
- <img src='https://github.com/max-ott.png' width='140px;'>
146
+ <td id='manu-wallner'>
147
+ <a href='https://github.com/milch'>
148
+ <img src='https://github.com/milch.png' width='140px;'>
149
149
  </a>
150
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
151
151
  </td>
152
- <td id='stefan-natchev'>
153
- <a href='https://github.com/snatchev'>
154
- <img src='https://github.com/snatchev.png' width='140px;'>
152
+ <td id='kohki-miki'>
153
+ <a href='https://github.com/giginet'>
154
+ <img src='https://github.com/giginet.png' width='140px;'>
155
155
  </a>
156
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
157
157
  </td>
158
- <td id='luka-mirosevic'>
159
- <a href='https://github.com/lmirosevic'>
160
- <img src='https://github.com/lmirosevic.png' width='140px;'>
158
+ <td id='jérôme-lacoste'>
159
+ <a href='https://github.com/lacostej'>
160
+ <img src='https://github.com/lacostej.png' width='140px;'>
161
161
  </a>
162
- <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
163
163
  </td>
164
164
  </tr>
165
165
  <tr>
166
- <td id='kohki-miki'>
167
- <a href='https://github.com/giginet'>
168
- <img src='https://github.com/giginet.png' width='140px;'>
166
+ <td id='maksym-grebenets'>
167
+ <a href='https://github.com/mgrebenets'>
168
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
169
169
  </a>
170
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
170
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
171
171
  </td>
172
- <td id='jorge-revuelta-h'>
173
- <a href='https://github.com/minuscorp'>
174
- <img src='https://github.com/minuscorp.png' width='140px;'>
172
+ <td id='roger-oba'>
173
+ <a href='https://github.com/rogerluan'>
174
+ <img src='https://github.com/rogerluan.png' width='140px;'>
175
175
  </a>
176
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
176
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
177
177
  </td>
178
- <td id='josh-holtz'>
179
- <a href='https://github.com/joshdholtz'>
180
- <img src='https://github.com/joshdholtz.png' width='140px;'>
178
+ <td id='jan-piotrowski'>
179
+ <a href='https://github.com/janpio'>
180
+ <img src='https://github.com/janpio.png' width='140px;'>
181
181
  </a>
182
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
182
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
183
183
  </td>
184
- <td id='danielle-tomlinson'>
185
- <a href='https://github.com/endocrimes'>
186
- <img src='https://github.com/endocrimes.png' width='140px;'>
184
+ <td id='fumiya-nakamura'>
185
+ <a href='https://github.com/nafu'>
186
+ <img src='https://github.com/nafu.png' width='140px;'>
187
187
  </a>
188
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
188
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
189
189
  </td>
190
- <td id='daniel-jankowski'>
191
- <a href='https://github.com/mollyIV'>
192
- <img src='https://github.com/mollyIV.png' width='140px;'>
190
+ <td id='luka-mirosevic'>
191
+ <a href='https://github.com/lmirosevic'>
192
+ <img src='https://github.com/lmirosevic.png' width='140px;'>
193
193
  </a>
194
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
194
+ <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
195
195
  </td>
196
196
  </tr>
197
197
  </table>
@@ -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
 
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)
@@ -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
@@ -50,6 +50,10 @@ module Fastlane
50
50
  set_build_setting(config, "PROVISIONING_PROFILE_SPECIFIER", params[:profile_name])
51
51
  UI.important("Set Provisioning Profile name to: #{params[:profile_name]} for target: #{target.name} for build configuration: #{config.name}")
52
52
  end
53
+ if params[:entitlements_file_path]
54
+ set_build_setting(config, "CODE_SIGN_ENTITLEMENTS", params[:entitlements_file_path])
55
+ UI.important("Set Entitlements file path to: #{params[:entitlements_file_path]} for target: #{target.name} for build configuration: #{config.name}")
56
+ end
53
57
  # Since Xcode 8, this is no longer needed, you simply use PROVISIONING_PROFILE_SPECIFIER
54
58
  if params[:profile_uuid]
55
59
  set_build_setting(config, "PROVISIONING_PROFILE", params[:profile_uuid])
@@ -143,6 +147,10 @@ module Fastlane
143
147
  env_name: "FL_CODE_SIGN_IDENTITY",
144
148
  description: "Code signing identity type (iPhone Developer, iPhone Distribution)",
145
149
  optional: true),
150
+ FastlaneCore::ConfigItem.new(key: :entitlements_file_path,
151
+ env_name: "FL_CODE_SIGN_ENTITLEMENTS_FILE_PATH",
152
+ description: "Path to your entitlements file",
153
+ optional: true),
146
154
  FastlaneCore::ConfigItem.new(key: :profile_name,
147
155
  env_name: "FL_PROVISIONING_PROFILE_SPECIFIER",
148
156
  description: "Provisioning profile name to use for code signing",
@@ -172,6 +180,15 @@ module Fastlane
172
180
  update_code_signing_settings(
173
181
  use_automatic_signing: true,
174
182
  path: "demo-project/demo/demo.xcodeproj"
183
+ )',
184
+ ' # more advanced manual code signing
185
+ update_code_signing_settings(
186
+ use_automatic_signing: true,
187
+ path: "demo-project/demo/demo.xcodeproj",
188
+ team_id: "QABC123DEV",
189
+ bundle_identifier: "com.demoapp.QABC123DEV",
190
+ profile_name: "Demo App Deployment Profile",
191
+ entitlements_file_path: "Demo App/generated/New.entitlements"
175
192
  )'
176
193
  ]
177
194
  end
@@ -185,7 +202,7 @@ module Fastlane
185
202
  end
186
203
 
187
204
  def self.authors
188
- ["mathiasAichinger", "hjanuschka", "p4checo", "portellaa", "aeons", "att55"]
205
+ ["mathiasAichinger", "hjanuschka", "p4checo", "portellaa", "aeons", "att55", "abcdev"]
189
206
  end
190
207
 
191
208
  def self.is_supported?(platform)
@@ -5,6 +5,7 @@ module Fastlane
5
5
  Actions.verify_gem!('xcode-install')
6
6
 
7
7
  version = params[:version]
8
+
8
9
  xcode = Helper::XcversionHelper.find_xcode(version)
9
10
  UI.user_error!("Cannot find an installed Xcode satisfying '#{version}'") if xcode.nil?
10
11
 
@@ -14,16 +15,29 @@ module Fastlane
14
15
  ENV["DEVELOPER_DIR"] = File.join(xcode.path, "/Contents/Developer")
15
16
  end
16
17
 
18
+ def self.read_xcode_version_file
19
+ xcode_version_paths = Dir.glob(".xcode-version")
20
+
21
+ if xcode_version_paths.first
22
+ return File.read(xcode_version_paths.first).strip
23
+ end
24
+
25
+ return nil
26
+ end
27
+
17
28
  def self.description
18
29
  "Select an Xcode to use by version specifier"
19
30
  end
20
31
 
21
32
  def self.details
22
- "Finds and selects a version of an installed Xcode that best matches the provided [`Gem::Version` requirement specifier](http://www.rubydoc.info/github/rubygems/rubygems/Gem/Version)"
33
+ [
34
+ "Finds and selects a version of an installed Xcode that best matches the provided [`Gem::Version` requirement specifier](http://www.rubydoc.info/github/rubygems/rubygems/Gem/Version)",
35
+ "You can either manually provide a specific version using `version:` or you make use of the `.xcode-version` file."
36
+ ].join("\n")
23
37
  end
24
38
 
25
39
  def self.authors
26
- ["oysta"]
40
+ ["oysta", "rogerluan"]
27
41
  end
28
42
 
29
43
  def self.available_options
@@ -31,7 +45,8 @@ module Fastlane
31
45
  FastlaneCore::ConfigItem.new(key: :version,
32
46
  env_name: "FL_XCODE_VERSION",
33
47
  description: "The version of Xcode to select specified as a Gem::Version requirement string (e.g. '~> 7.1.0')",
34
- optional: false,
48
+ default_value: self.read_xcode_version_file,
49
+ default_value_dynamic: true,
35
50
  verify_block: Helper::XcversionHelper::Verify.method(:requirement))
36
51
  ]
37
52
  end
@@ -4,21 +4,18 @@ module Fastlane
4
4
  output_path ||= File.join(FastlaneCore::FastlaneFolder.path || '.', 'README.md')
5
5
 
6
6
  output = ["fastlane documentation"]
7
- output << "================"
7
+ output << "----"
8
+ output << ""
8
9
 
9
10
  output << "# Installation"
10
11
  output << ""
11
12
  output << "Make sure you have the latest version of the Xcode command line tools installed:"
12
13
  output << ""
13
- output << "```"
14
+ output << "```sh"
14
15
  output << "xcode-select --install"
15
16
  output << "```"
16
17
  output << ""
17
- output << "Install _fastlane_ using"
18
- output << "```"
19
- output << "[sudo] gem install fastlane -NV"
20
- output << "```"
21
- output << "or alternatively using `brew install fastlane`"
18
+ output << "For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane)"
22
19
  output << ""
23
20
  output << "# Available Actions"
24
21
 
@@ -32,7 +29,10 @@ module Fastlane
32
29
  next
33
30
  end
34
31
 
35
- output << "## #{formatted_platform(platform)}" if platform
32
+ if platform
33
+ output << ""
34
+ output << "## #{formatted_platform(platform)}"
35
+ end
36
36
 
37
37
  lanes.each do |lane_name, lane|
38
38
  next if lane.is_private
@@ -45,8 +45,10 @@ module Fastlane
45
45
  end
46
46
 
47
47
  output << "This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run."
48
- output << "More information about fastlane can be found on [fastlane.tools](https://fastlane.tools)."
49
- output << "The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools)."
48
+ output << ""
49
+ output << "More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools)."
50
+ output << ""
51
+ output << "The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools)."
50
52
  output << ""
51
53
 
52
54
  begin
@@ -78,10 +80,13 @@ module Fastlane
78
80
  full_name = [platform, lane].reject(&:nil?).join(' ')
79
81
 
80
82
  output = []
83
+ output << ""
81
84
  output << "### #{full_name}"
85
+ output << ""
86
+ output << "```sh"
87
+ output << "[bundle exec] fastlane #{full_name}"
82
88
  output << "```"
83
- output << "fastlane #{full_name}"
84
- output << "```"
89
+ output << ""
85
90
  output << description
86
91
  output
87
92
  end
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.198.1'.freeze
2
+ VERSION = '2.199.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '1.12.1'.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.198.1
20
+ // Generated with fastlane 2.199.0
@@ -260,4 +260,4 @@ public extension DeliverfileProtocol {
260
260
 
261
261
  // Please don't remove the lines below
262
262
  // They are used to detect outdated files
263
- // FastlaneRunnerAPIVersion [0.9.88]
263
+ // FastlaneRunnerAPIVersion [0.9.89]
@@ -4323,7 +4323,7 @@ public func ensureNoDebugCode(text: String,
4323
4323
 
4324
4324
  If building your app requires a specific version of Xcode, you can invoke this command before using gym.
4325
4325
  For example, to ensure that a beta version of Xcode is not accidentally selected to build, which would make uploading to TestFlight fail.
4326
- You can either manually provide a specific version using `version: ` or you make use of the `.xcode-version` file.
4326
+ You can either manually provide a specific version using `version:` or you make use of the `.xcode-version` file.
4327
4327
  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`).
4328
4328
  */
4329
4329
  public func ensureXcodeVersion(version: OptionalConfigValue<String?> = .fastlaneDefault(nil),
@@ -8536,8 +8536,8 @@ public func rubyVersion() {
8536
8536
  - project: Path to the project file
8537
8537
  - packagePath: Path to the Swift Package
8538
8538
  - scheme: The project's scheme. Make sure it's marked as `Shared`
8539
- - device: The name of the simulator type you want to run tests on (e.g. 'iPhone 6')
8540
- - devices: Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air'])
8539
+ - device: The name of the simulator type you want to run tests on (e.g. 'iPhone 6' or 'iPhone SE (2nd generation) (14.5)')
8540
+ - devices: Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air', 'iPhone SE (2nd generation) (14.5)'])
8541
8541
  - skipDetectDevices: Should skip auto detecting of devices if none were specified
8542
8542
  - ensureDevicesFound: Should fail if devices not found
8543
8543
  - forceQuitSimulator: Enabling this option will automatically killall Simulator processes before the run
@@ -8941,8 +8941,8 @@ public func say(text: [String],
8941
8941
  - project: Path to the project file
8942
8942
  - packagePath: Path to the Swift Package
8943
8943
  - scheme: The project's scheme. Make sure it's marked as `Shared`
8944
- - device: The name of the simulator type you want to run tests on (e.g. 'iPhone 6')
8945
- - devices: Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air'])
8944
+ - device: The name of the simulator type you want to run tests on (e.g. 'iPhone 6' or 'iPhone SE (2nd generation) (14.5)')
8945
+ - devices: Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air', 'iPhone SE (2nd generation) (14.5)'])
8946
8946
  - skipDetectDevices: Should skip auto detecting of devices if none were specified
8947
8947
  - ensureDevicesFound: Should fail if devices not found
8948
8948
  - forceQuitSimulator: Enabling this option will automatically killall Simulator processes before the run
@@ -11549,6 +11549,7 @@ public func updateAppIdentifier(xcodeproj: String,
11549
11549
  - targets: Specify targets you want to toggle the signing mech. (default to all targets)
11550
11550
  - buildConfigurations: Specify build_configurations you want to toggle the signing mech. (default to all configurations)
11551
11551
  - codeSignIdentity: Code signing identity type (iPhone Developer, iPhone Distribution)
11552
+ - entitlementsFilePath: Path to your entitlements file
11552
11553
  - profileName: Provisioning profile name to use for code signing
11553
11554
  - profileUuid: Provisioning profile UUID to use for code signing
11554
11555
  - bundleIdentifier: Application Product Bundle Identifier
@@ -11563,6 +11564,7 @@ public func updateCodeSigningSettings(path: String,
11563
11564
  targets: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
11564
11565
  buildConfigurations: OptionalConfigValue<[String]?> = .fastlaneDefault(nil),
11565
11566
  codeSignIdentity: OptionalConfigValue<String?> = .fastlaneDefault(nil),
11567
+ entitlementsFilePath: OptionalConfigValue<String?> = .fastlaneDefault(nil),
11566
11568
  profileName: OptionalConfigValue<String?> = .fastlaneDefault(nil),
11567
11569
  profileUuid: OptionalConfigValue<String?> = .fastlaneDefault(nil),
11568
11570
  bundleIdentifier: OptionalConfigValue<String?> = .fastlaneDefault(nil))
@@ -11573,6 +11575,7 @@ public func updateCodeSigningSettings(path: String,
11573
11575
  let targetsArg = targets.asRubyArgument(name: "targets", type: nil)
11574
11576
  let buildConfigurationsArg = buildConfigurations.asRubyArgument(name: "build_configurations", type: nil)
11575
11577
  let codeSignIdentityArg = codeSignIdentity.asRubyArgument(name: "code_sign_identity", type: nil)
11578
+ let entitlementsFilePathArg = entitlementsFilePath.asRubyArgument(name: "entitlements_file_path", type: nil)
11576
11579
  let profileNameArg = profileName.asRubyArgument(name: "profile_name", type: nil)
11577
11580
  let profileUuidArg = profileUuid.asRubyArgument(name: "profile_uuid", type: nil)
11578
11581
  let bundleIdentifierArg = bundleIdentifier.asRubyArgument(name: "bundle_identifier", type: nil)
@@ -11582,6 +11585,7 @@ public func updateCodeSigningSettings(path: String,
11582
11585
  targetsArg,
11583
11586
  buildConfigurationsArg,
11584
11587
  codeSignIdentityArg,
11588
+ entitlementsFilePathArg,
11585
11589
  profileNameArg,
11586
11590
  profileUuidArg,
11587
11591
  bundleIdentifierArg]
@@ -13174,6 +13178,7 @@ public func xctool() {
13174
13178
  - parameter version: The version of Xcode to select specified as a Gem::Version requirement string (e.g. '~> 7.1.0')
13175
13179
 
13176
13180
  Finds and selects a version of an installed Xcode that best matches the provided [`Gem::Version` requirement specifier](http://www.rubydoc.info/github/rubygems/rubygems/Gem/Version)
13181
+ You can either manually provide a specific version using `version:` or you make use of the `.xcode-version` file.
13177
13182
  */
13178
13183
  public func xcversion(version: String) {
13179
13184
  let versionArg = RubyCommand.Argument(name: "version", value: version, type: nil)
@@ -13272,14 +13277,14 @@ func parseInt(fromString: String, function: String = #function) -> Int {
13272
13277
  return NSString(string: fromString.trimmingCharacters(in: .punctuationCharacters)).integerValue
13273
13278
  }
13274
13279
 
13275
- public let deliverfile = Deliverfile()
13276
- public let gymfile = Gymfile()
13277
- public let matchfile = Matchfile()
13278
- public let precheckfile = Precheckfile()
13279
- public let scanfile = Scanfile()
13280
- public let screengrabfile = Screengrabfile()
13281
- public let snapshotfile = Snapshotfile()
13280
+ public let deliverfile: Deliverfile = .init()
13281
+ public let gymfile: Gymfile = .init()
13282
+ public let matchfile: Matchfile = .init()
13283
+ public let precheckfile: Precheckfile = .init()
13284
+ public let scanfile: Scanfile = .init()
13285
+ public let screengrabfile: Screengrabfile = .init()
13286
+ public let snapshotfile: Snapshotfile = .init()
13282
13287
 
13283
13288
  // Please don't remove the lines below
13284
13289
  // They are used to detect outdated files
13285
- // FastlaneRunnerAPIVersion [0.9.141]
13290
+ // FastlaneRunnerAPIVersion [0.9.142]
@@ -17,4 +17,4 @@ public class Gymfile: GymfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.198.1
20
+ // Generated with fastlane 2.199.0
@@ -200,4 +200,4 @@ public extension GymfileProtocol {
200
200
 
201
201
  // Please don't remove the lines below
202
202
  // They are used to detect outdated files
203
- // FastlaneRunnerAPIVersion [0.9.91]
203
+ // FastlaneRunnerAPIVersion [0.9.92]
@@ -17,4 +17,4 @@ public class Matchfile: MatchfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.198.1
20
+ // Generated with fastlane 2.199.0
@@ -192,4 +192,4 @@ public extension MatchfileProtocol {
192
192
 
193
193
  // Please don't remove the lines below
194
194
  // They are used to detect outdated files
195
- // FastlaneRunnerAPIVersion [0.9.85]
195
+ // FastlaneRunnerAPIVersion [0.9.86]
@@ -17,4 +17,4 @@ public class Precheckfile: PrecheckfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.198.1
20
+ // Generated with fastlane 2.199.0
@@ -52,4 +52,4 @@ public extension PrecheckfileProtocol {
52
52
 
53
53
  // Please don't remove the lines below
54
54
  // They are used to detect outdated files
55
- // FastlaneRunnerAPIVersion [0.9.84]
55
+ // FastlaneRunnerAPIVersion [0.9.85]
@@ -10,13 +10,9 @@
10
10
 
11
11
  import Foundation
12
12
 
13
- let logger: Logger = {
14
- Logger()
15
- }()
13
+ let logger: Logger = .init()
16
14
 
17
- let runner: Runner = {
18
- Runner()
19
- }()
15
+ let runner: Runner = .init()
20
16
 
21
17
  func desc(_: String) {
22
18
  // no-op, this is handled in fastlane/lane_list.rb
@@ -71,7 +67,7 @@ class Runner {
71
67
 
72
68
  let runLoop = RunLoop.current
73
69
  let timeoutDate = Date(timeInterval: TimeInterval(timeout), since: Date())
74
- var fulfilled: Bool = false
70
+ var fulfilled = false
75
71
  let _expression = memoizedClosure(expression)
76
72
  repeat {
77
73
  do {
@@ -17,4 +17,4 @@ public class Scanfile: ScanfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.198.1
20
+ // Generated with fastlane 2.199.0
@@ -14,10 +14,10 @@ public protocol ScanfileProtocol: class {
14
14
  /// The project's scheme. Make sure it's marked as `Shared`
15
15
  var scheme: String? { get }
16
16
 
17
- /// The name of the simulator type you want to run tests on (e.g. 'iPhone 6')
17
+ /// The name of the simulator type you want to run tests on (e.g. 'iPhone 6' or 'iPhone SE (2nd generation) (14.5)')
18
18
  var device: String? { get }
19
19
 
20
- /// Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air'])
20
+ /// Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air', 'iPhone SE (2nd generation) (14.5)'])
21
21
  var devices: [String]? { get }
22
22
 
23
23
  /// Should skip auto detecting of devices if none were specified
@@ -296,4 +296,4 @@ public extension ScanfileProtocol {
296
296
 
297
297
  // Please don't remove the lines below
298
298
  // They are used to detect outdated files
299
- // FastlaneRunnerAPIVersion [0.9.96]
299
+ // FastlaneRunnerAPIVersion [0.9.97]
@@ -17,4 +17,4 @@ public class Screengrabfile: ScreengrabfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.198.1
20
+ // Generated with fastlane 2.199.0
@@ -96,4 +96,4 @@ public extension ScreengrabfileProtocol {
96
96
 
97
97
  // Please don't remove the lines below
98
98
  // They are used to detect outdated files
99
- // FastlaneRunnerAPIVersion [0.9.86]
99
+ // FastlaneRunnerAPIVersion [0.9.87]
@@ -17,4 +17,4 @@ public class Snapshotfile: SnapshotfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.198.1
20
+ // Generated with fastlane 2.199.0
@@ -200,4 +200,4 @@ public extension SnapshotfileProtocol {
200
200
 
201
201
  // Please don't remove the lines below
202
202
  // They are used to detect outdated files
203
- // FastlaneRunnerAPIVersion [0.9.80]
203
+ // FastlaneRunnerAPIVersion [0.9.81]
@@ -2,35 +2,35 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.48.18",
5
+ "version": "0.49.1",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
10
  "arm64_monterey": {
11
11
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:adbb11cdda0596a1f40e920f826a2e1ffe6aeb1643c43ddb108f25f30755be39",
13
- "sha256": "adbb11cdda0596a1f40e920f826a2e1ffe6aeb1643c43ddb108f25f30755be39"
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:c43caffb4d2cf9546b0a8fa732ffe5d95b1b1fd7ab03f1c5da39c8e7a0e8ecb4",
13
+ "sha256": "c43caffb4d2cf9546b0a8fa732ffe5d95b1b1fd7ab03f1c5da39c8e7a0e8ecb4"
14
14
  },
15
15
  "arm64_big_sur": {
16
16
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:74691b21c40d34459c5825306828039bdbdfdd02c80d1cea5c449c3f59760ab1",
18
- "sha256": "74691b21c40d34459c5825306828039bdbdfdd02c80d1cea5c449c3f59760ab1"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:ad0ce5fc15fe1d339d366ece18694fdc1d14021684462a126ed20b537a1a9bf5",
18
+ "sha256": "ad0ce5fc15fe1d339d366ece18694fdc1d14021684462a126ed20b537a1a9bf5"
19
19
  },
20
20
  "monterey": {
21
21
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:14e4b90f29b55b06c92f90b6e81e8dd55c54ff258ee8b0bab2bb479ce0cc8daf",
23
- "sha256": "14e4b90f29b55b06c92f90b6e81e8dd55c54ff258ee8b0bab2bb479ce0cc8daf"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:33652b8015d31dbe45e00bdc598f1b228cb63c7083b90137fdec66318a88010f",
23
+ "sha256": "33652b8015d31dbe45e00bdc598f1b228cb63c7083b90137fdec66318a88010f"
24
24
  },
25
25
  "big_sur": {
26
26
  "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:73f0497b504f87159bc2d133371014e0372799d89f62bc78068b3b5427ae614f",
28
- "sha256": "73f0497b504f87159bc2d133371014e0372799d89f62bc78068b3b5427ae614f"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:f0ad88e5594a6a3e5a35834a9a22473a05511375942dbb046d1085cc537d60b8",
28
+ "sha256": "f0ad88e5594a6a3e5a35834a9a22473a05511375942dbb046d1085cc537d60b8"
29
29
  },
30
30
  "catalina": {
31
31
  "cellar": ":any_skip_relocation",
32
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:11543d157b589acdf9de93133a68fa32aa00372b574a64c40292aead20f6f6cb",
33
- "sha256": "11543d157b589acdf9de93133a68fa32aa00372b574a64c40292aead20f6f6cb"
32
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:564f5daf9cd82407843aed590bd4190f3e5aaa73a30b3bc8ae07135f1319ac97",
33
+ "sha256": "564f5daf9cd82407843aed590bd4190f3e5aaa73a30b3bc8ae07135f1319ac97"
34
34
  }
35
35
  }
36
36
  }
@@ -56,9 +56,9 @@
56
56
  "macOS": "11.6"
57
57
  },
58
58
  "monterey": {
59
- "HOMEBREW_VERSION": "3.3.4-45-gf1121fc",
59
+ "HOMEBREW_VERSION": "3.3.7-38-g6295b08",
60
60
  "HOMEBREW_PREFIX": "/opt/homebrew",
61
- "Homebrew/homebrew-core": "1a81a8d5115937649ea67e238c9b8cb94a571592",
61
+ "Homebrew/homebrew-core": "e340d22f5ef83cf4acc489b34e2478426dbf53b9",
62
62
  "CLT": "13.1.0.0.1.1633545042",
63
63
  "Xcode": "13.1",
64
64
  "macOS": "12.0.1"
@@ -60,7 +60,7 @@ module Scan
60
60
  optional: true,
61
61
  is_string: true,
62
62
  env_name: "SCAN_DEVICE",
63
- description: "The name of the simulator type you want to run tests on (e.g. 'iPhone 6')",
63
+ description: "The name of the simulator type you want to run tests on (e.g. 'iPhone 6' or 'iPhone SE (2nd generation) (14.5)')",
64
64
  conflicting_options: [:devices],
65
65
  conflict_block: proc do |value|
66
66
  UI.user_error!("You can't use 'device' and 'devices' options in one run")
@@ -70,7 +70,7 @@ module Scan
70
70
  is_string: false,
71
71
  env_name: "SCAN_DEVICES",
72
72
  type: Array,
73
- description: "Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air'])",
73
+ description: "Array of devices to run the tests on (e.g. ['iPhone 6', 'iPad Air', 'iPhone SE (2nd generation) (14.5)'])",
74
74
  conflicting_options: [:device],
75
75
  conflict_block: proc do |value|
76
76
  UI.user_error!("You can't use 'device' and 'devices' options in one run")
@@ -123,7 +123,7 @@ module Snapshot
123
123
  # Simulator could stil be booting with Apple logo
124
124
  # Need to wait "some amount of time" until home screen shows
125
125
  boot_sleep = ENV["SNAPSHOT_SIMULATOR_WAIT_FOR_BOOT_TIMEOUT"].to_i || 10
126
- UI.message("Waiting #{boot_sleep} seconds for device to fully boot before overriding status bar... Set 'SNAPSHOT_SIMULATOR_WAIT_FOR_BOOT_TIMEOUT' environemnt variable to adjust timeout")
126
+ UI.message("Waiting #{boot_sleep} seconds for device to fully boot before overriding status bar... Set 'SNAPSHOT_SIMULATOR_WAIT_FOR_BOOT_TIMEOUT' environment variable to adjust timeout")
127
127
  sleep(boot_sleep) if boot_sleep > 0
128
128
 
129
129
  UI.message("Overriding Status Bar")
@@ -391,10 +391,11 @@ module Spaceship
391
391
 
392
392
  keychain_entry = CredentialsManager::AccountManager.new(user: user, password: password)
393
393
  user ||= keychain_entry.user
394
- password = keychain_entry.password
394
+ password = keychain_entry.password(ask_if_missing: !Spaceship::Globals.check_session)
395
395
  end
396
396
 
397
397
  if user.to_s.strip.empty? || password.to_s.strip.empty?
398
+ exit_with_session_state(user, false) if Spaceship::Globals.check_session
398
399
  raise NoUserCredentialsError.new, "No login data provided"
399
400
  end
400
401
 
@@ -413,21 +414,16 @@ module Spaceship
413
414
  end
414
415
  end
415
416
 
416
- # This method is used for both the Apple Dev Portal and App Store Connect
417
- # This will also handle 2 step verification and 2 factor authentication
417
+ # Check if we have a cached/valid session
418
418
  #
419
- # It is called in `send_login_request` of sub classes (which the method `login`, above, transferred over to via `do_login`)
420
- # rubocop:disable Metrics/PerceivedComplexity
421
- def send_shared_login_request(user, password)
422
- # Check if we have a cached/valid session
423
- #
424
- # Background:
425
- # December 4th 2017 Apple introduced a rate limit - which is of course fine by itself -
426
- # but unfortunately also rate limits successful logins. If you call multiple tools in a
427
- # lane (e.g. call match 5 times), this would lock you out of the account for a while.
428
- # By loading existing sessions and checking if they're valid, we're sending less login requests.
429
- # More context on why this change was necessary https://github.com/fastlane/fastlane/pull/11108
430
- #
419
+ # Background:
420
+ # December 4th 2017 Apple introduced a rate limit - which is of course fine by itself -
421
+ # but unfortunately also rate limits successful logins. If you call multiple tools in a
422
+ # lane (e.g. call match 5 times), this would lock you out of the account for a while.
423
+ # By loading existing sessions and checking if they're valid, we're sending less login requests.
424
+ # More context on why this change was necessary https://github.com/fastlane/fastlane/pull/11108
425
+ #
426
+ def has_valid_session
431
427
  # If there was a successful manual login before, we have a session on disk
432
428
  if load_session_from_file
433
429
  # Check if the session is still valid here
@@ -462,6 +458,23 @@ module Spaceship
462
458
  #
463
459
  # After this point, we sure have no valid session any more and have to create a new one
464
460
  #
461
+ return false
462
+ end
463
+
464
+ # This method is used for both the Apple Dev Portal and App Store Connect
465
+ # This will also handle 2 step verification and 2 factor authentication
466
+ #
467
+ # It is called in `send_login_request` of sub classes (which the method `login`, above, transferred over to via `do_login`)
468
+ # rubocop:disable Metrics/PerceivedComplexity
469
+ def send_shared_login_request(user, password)
470
+ # Check if the cache or FASTLANE_SESSION is still valid
471
+ has_valid_session = self.has_valid_session
472
+
473
+ # Exit if `--check_session` flag was passed
474
+ exit_with_session_state(user, has_valid_session) if Spaceship::Globals.check_session
475
+
476
+ # If the session is valid no need to attempt to generate a new one.
477
+ return true if has_valid_session
465
478
 
466
479
  data = {
467
480
  accountName: user,
@@ -566,6 +579,13 @@ module Spaceship
566
579
  return false
567
580
  end
568
581
 
582
+ # This method is used to log if the session is valid or not and then exit
583
+ # It is called when the `--check_session` flag is passed
584
+ def exit_with_session_state(user, has_valid_session)
585
+ puts("#{has_valid_session ? 'Valid' : 'No valid'} session found (#{user}). Exiting.")
586
+ exit(has_valid_session)
587
+ end
588
+
569
589
  def itc_service_key
570
590
  return @service_key if @service_key
571
591
 
@@ -41,7 +41,7 @@ module Spaceship
41
41
  c.syntax = 'fastlane spaceship spaceauth'
42
42
  c.description = 'Authentication helper for spaceship/fastlane to work with Apple 2-Step/2FA'
43
43
  c.option('--copy_to_clipboard', 'Whether the session string should be copied to clipboard. For more info see https://docs.fastlane.tools/best-practices/continuous-integration/#storing-a-manually-verified-session-using-spaceauth`')
44
-
44
+ c.option('--check_session', 'Check to see if there is a valid session (either in the cache or via FASTLANE_SESSION). Sets the exit code to 0 if the session is valid or 1 if not.') { Spaceship::Globals.check_session = true }
45
45
  c.action do |args, options|
46
46
  Spaceship::SpaceauthRunner.new(username: options.user, copy_to_clipboard: options.copy_to_clipboard).run
47
47
  end
@@ -64,6 +64,19 @@ module Spaceship
64
64
  yield(model)
65
65
  end
66
66
  end
67
+
68
+ def all_pages_each(&block)
69
+ to_models.each do |model|
70
+ yield(model)
71
+ end
72
+
73
+ resp = self
74
+ loop do
75
+ resp = resp.next_page
76
+ break if resp.nil?
77
+ resp.each(&block)
78
+ end
79
+ end
67
80
  end
68
81
  end
69
82
  end
@@ -1,5 +1,9 @@
1
1
  module Spaceship
2
2
  class Globals
3
+ class << self
4
+ attr_writer(:check_session)
5
+ end
6
+
3
7
  # if spaceship is run with a FastlaneCore available respect the global state there
4
8
  # otherwise fallback to $verbose
5
9
  def self.verbose?
@@ -8,5 +12,10 @@ module Spaceship
8
12
  end
9
13
  return $verbose
10
14
  end
15
+
16
+ # if spaceship is run with the --check_session flag this value will be set to true
17
+ def self.check_session
18
+ return @check_session
19
+ end
11
20
  end
12
21
  end
@@ -16,7 +16,7 @@ module Spaceship
16
16
 
17
17
  def run
18
18
  begin
19
- puts("Logging into to App Store Connect (#{@username})...")
19
+ puts("Logging into to App Store Connect (#{@username})...") unless Spaceship::Globals.check_session
20
20
  Spaceship::Tunes.login(@username)
21
21
  puts("Successfully logged in to App Store Connect".green)
22
22
  puts("")
Binary file
metadata CHANGED
@@ -1,38 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.198.1
4
+ version: 2.199.0
5
5
  platform: ruby
6
6
  authors:
7
- - Daniel Jankowski
8
- - Helmut Januschka
9
- - Aaron Brager
10
- - Felix Krause
11
- - Joshua Liebowitz
12
- - Andrew McBurney
13
- - Satoshi Namai
14
7
  - Iulian Onofrei
15
- - Max Ott
16
8
  - Fumiya Nakamura
17
- - Luka Mirosevic
18
- - Kohki Miki
19
- - Manish Rathi
9
+ - Aaron Brager
20
10
  - Olivier Halligon
21
- - Stefan Natchev
11
+ - Helmut Januschka
22
12
  - Manu Wallner
13
+ - Luka Mirosevic
14
+ - Jérôme Lacoste
15
+ - Jimmy Dee
16
+ - Felix Krause
17
+ - Maksym Grebenets
18
+ - Daniel Jankowski
19
+ - Danielle Tomlinson
20
+ - Satoshi Namai
23
21
  - Matthew Ellis
24
22
  - Roger Oba
23
+ - Manish Rathi
24
+ - Jorge Revuelta H
25
25
  - Josh Holtz
26
+ - Joshua Liebowitz
27
+ - Kohki Miki
28
+ - Max Ott
29
+ - Andrew McBurney
26
30
  - Jan Piotrowski
27
- - Jimmy Dee
28
- - Danielle Tomlinson
29
- - Maksym Grebenets
30
- - Jérôme Lacoste
31
- - Jorge Revuelta H
31
+ - Stefan Natchev
32
32
  autorequire:
33
33
  bindir: bin
34
34
  cert_chain: []
35
- date: 2021-11-17 00:00:00.000000000 Z
35
+ date: 2021-12-10 00:00:00.000000000 Z
36
36
  dependencies:
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: xcodeproj
@@ -993,6 +993,7 @@ files:
993
993
  - deliver/lib/deliver/upload_price_tier.rb
994
994
  - deliver/lib/deliver/upload_screenshots.rb
995
995
  - fastlane/README.md
996
+ - fastlane/lib/.DS_Store
996
997
  - fastlane/lib/assets/ActionDetails.md.erb
997
998
  - fastlane/lib/assets/Actions.md.erb
998
999
  - fastlane/lib/assets/AppfileTemplate
@@ -1011,8 +1012,10 @@ files:
1011
1012
  - fastlane/lib/assets/s3_plist_template.erb
1012
1013
  - fastlane/lib/assets/s3_version_template.erb
1013
1014
  - fastlane/lib/fastlane.rb
1015
+ - fastlane/lib/fastlane/.DS_Store
1014
1016
  - fastlane/lib/fastlane/action.rb
1015
1017
  - fastlane/lib/fastlane/action_collector.rb
1018
+ - fastlane/lib/fastlane/actions/.DS_Store
1016
1019
  - fastlane/lib/fastlane/actions/README.md
1017
1020
  - fastlane/lib/fastlane/actions/actions_helper.rb
1018
1021
  - fastlane/lib/fastlane/actions/adb.rb
@@ -1836,6 +1839,7 @@ files:
1836
1839
  - supply/lib/supply/release_listing.rb
1837
1840
  - supply/lib/supply/setup.rb
1838
1841
  - supply/lib/supply/uploader.rb
1842
+ - trainer/lib/.DS_Store
1839
1843
  homepage: https://fastlane.tools
1840
1844
  licenses:
1841
1845
  - MIT
@@ -1866,6 +1870,7 @@ require_paths:
1866
1870
  - snapshot/lib
1867
1871
  - spaceship/lib
1868
1872
  - supply/lib
1873
+ - trainer/lib
1869
1874
  required_ruby_version: !ruby/object:Gem::Requirement
1870
1875
  requirements:
1871
1876
  - - ">="