fastlane 2.224.0 → 2.226.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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +96 -96
  3. data/deliver/lib/deliver/options.rb +1 -1
  4. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
  5. data/fastlane/lib/fastlane/actions/import_from_git.rb +11 -4
  6. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
  7. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  8. data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
  9. data/fastlane/lib/fastlane/actions/testfairy.rb +36 -2
  10. data/fastlane/lib/fastlane/fast_file.rb +9 -6
  11. data/fastlane/lib/fastlane/version.rb +1 -1
  12. data/fastlane/swift/Deliverfile.swift +1 -1
  13. data/fastlane/swift/DeliverfileProtocol.swift +1 -1
  14. data/fastlane/swift/Fastlane.swift +20 -4
  15. data/fastlane/swift/Gymfile.swift +1 -1
  16. data/fastlane/swift/GymfileProtocol.swift +1 -1
  17. data/fastlane/swift/Matchfile.swift +1 -1
  18. data/fastlane/swift/MatchfileProtocol.swift +1 -1
  19. data/fastlane/swift/Precheckfile.swift +1 -1
  20. data/fastlane/swift/PrecheckfileProtocol.swift +1 -1
  21. data/fastlane/swift/Scanfile.swift +1 -1
  22. data/fastlane/swift/ScanfileProtocol.swift +1 -1
  23. data/fastlane/swift/Screengrabfile.swift +1 -1
  24. data/fastlane/swift/ScreengrabfileProtocol.swift +1 -1
  25. data/fastlane/swift/Snapshotfile.swift +1 -1
  26. data/fastlane/swift/SnapshotfileProtocol.swift +1 -1
  27. data/fastlane/swift/formatting/Brewfile.lock.json +15 -25
  28. data/precheck/lib/precheck/options.rb +1 -1
  29. data/produce/lib/produce/options.rb +1 -1
  30. data/spaceship/lib/spaceship/client.rb +123 -22
  31. data/spaceship/lib/spaceship/errors.rb +15 -0
  32. data/supply/lib/supply/uploader.rb +8 -4
  33. metadata +36 -22
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '03087b990116a12305e2b3d126a79e15c3e363f3e8601024507f9104c04de546'
4
- data.tar.gz: 7a5d5d31f16469a2b34e902407db12cae37ff17a03e2f244d72ba2027f65ec37
3
+ metadata.gz: '0924a4ae4adee9710990cc67bf6bd16a817bb84d849d747f725e4dea8ad29548'
4
+ data.tar.gz: 3ae95f0859f02531ae57cd5381b6e5a295e64c899a487cbcea074ecfa196e646
5
5
  SHA512:
6
- metadata.gz: 22a7c5805f0811df1d989d32e178264b668acee3d2047944e5fb2457a055b352c5684b7ad0c6335c33051bda2e516b06a62a2d50c6b8a26303c3f3043468b509
7
- data.tar.gz: 5daafa423e4afb1e8a52031b01756f5d2564bbee30140ce171747005a0de73b54f4042272022337ef3a2ee44d474fdf849cacd1548bf1b937783438b905d3480
6
+ metadata.gz: bd1fc74b283c81699207cfc9261827986150a2066903ab12b762acb95e6ac00c5304da48b366e8817761fbe6377169f0742e392ac8fb355905b7fb94cd2af668
7
+ data.tar.gz: 1671c16656f5b3a71ba26432aba6c8491339c8c205fadf8cc968ddf576ea0b9c55ecb693a47e4d1663d11c456041d9d25b27b3ca63de6b6cce61a7556124ff02
data/README.md CHANGED
@@ -35,49 +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='manu-wallner'>
39
- <a href='https://github.com/milch'>
40
- <img src='https://github.com/milch.png' width='140px;'>
41
- </a>
42
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
43
- </td>
44
- <td id='helmut-januschka'>
45
- <a href='https://github.com/hjanuschka'>
46
- <img src='https://github.com/hjanuschka.png' width='140px;'>
47
- </a>
48
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
49
- </td>
50
- <td id='max-ott'>
51
- <a href='https://github.com/max-ott'>
52
- <img src='https://github.com/max-ott.png' width='140px;'>
53
- </a>
54
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
55
- </td>
56
- <td id='olivier-halligon'>
57
- <a href='https://github.com/AliSoftware'>
58
- <img src='https://github.com/AliSoftware.png' width='140px;'>
59
- </a>
60
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
61
- </td>
62
- <td id='felix-krause'>
63
- <a href='https://github.com/KrauseFx'>
64
- <img src='https://github.com/KrauseFx.png' width='140px;'>
65
- </a>
66
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
67
- </td>
68
- </tr>
69
- <tr>
70
- <td id='danielle-tomlinson'>
71
- <a href='https://github.com/endocrimes'>
72
- <img src='https://github.com/endocrimes.png' width='140px;'>
38
+ <td id='jimmy-dee'>
39
+ <a href='https://github.com/jdee'>
40
+ <img src='https://github.com/jdee.png' width='140px;'>
73
41
  </a>
74
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
42
+ <h4 align='center'>Jimmy Dee</h4>
75
43
  </td>
76
- <td id='andrew-mcburney'>
77
- <a href='https://github.com/armcburney'>
78
- <img src='https://github.com/armcburney.png' width='140px;'>
44
+ <td id='stefan-natchev'>
45
+ <a href='https://github.com/snatchev'>
46
+ <img src='https://github.com/snatchev.png' width='140px;'>
79
47
  </a>
80
- <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
48
+ <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
81
49
  </td>
82
50
  <td id='josh-holtz'>
83
51
  <a href='https://github.com/joshdholtz'>
@@ -91,69 +59,63 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
91
59
  </a>
92
60
  <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
93
61
  </td>
94
- <td id='fumiya-nakamura'>
95
- <a href='https://github.com/nafu'>
96
- <img src='https://github.com/nafu.png' width='140px;'>
97
- </a>
98
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
99
- </td>
100
- </tr>
101
- <tr>
102
- <td id='jorge-revuelta-h'>
103
- <a href='https://github.com/minuscorp'>
104
- <img src='https://github.com/minuscorp.png' width='140px;'>
105
- </a>
106
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
107
- </td>
108
62
  <td id='roger-oba'>
109
63
  <a href='https://github.com/rogerluan'>
110
64
  <img src='https://github.com/rogerluan.png' width='140px;'>
111
65
  </a>
112
66
  <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
113
67
  </td>
68
+ </tr>
69
+ <tr>
114
70
  <td id='satoshi-namai'>
115
71
  <a href='https://github.com/ainame'>
116
72
  <img src='https://github.com/ainame.png' width='140px;'>
117
73
  </a>
118
74
  <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
119
75
  </td>
120
- <td id='matthew-ellis'>
121
- <a href='https://github.com/matthewellis'>
122
- <img src='https://github.com/matthewellis.png' width='140px;'>
76
+ <td id='daniel-jankowski'>
77
+ <a href='https://github.com/mollyIV'>
78
+ <img src='https://github.com/mollyIV.png' width='140px;'>
123
79
  </a>
124
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
80
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
125
81
  </td>
126
- <td id='kohki-miki'>
127
- <a href='https://github.com/giginet'>
128
- <img src='https://github.com/giginet.png' width='140px;'>
82
+ <td id='aaron-brager'>
83
+ <a href='https://github.com/getaaron'>
84
+ <img src='https://github.com/getaaron.png' width='140px;'>
129
85
  </a>
130
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
86
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
131
87
  </td>
132
- </tr>
133
- <tr>
134
- <td id='jimmy-dee'>
135
- <a href='https://github.com/jdee'>
136
- <img src='https://github.com/jdee.png' width='140px;'>
88
+ <td id='olivier-halligon'>
89
+ <a href='https://github.com/AliSoftware'>
90
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
137
91
  </a>
138
- <h4 align='center'>Jimmy Dee</h4>
92
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
139
93
  </td>
140
- <td id='stefan-natchev'>
141
- <a href='https://github.com/snatchev'>
142
- <img src='https://github.com/snatchev.png' width='140px;'>
94
+ <td id='andrew-mcburney'>
95
+ <a href='https://github.com/armcburney'>
96
+ <img src='https://github.com/armcburney.png' width='140px;'>
143
97
  </a>
144
- <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
98
+ <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
145
99
  </td>
146
- <td id='manish-rathi'>
147
- <a href='https://github.com/crazymanish'>
148
- <img src='https://github.com/crazymanish.png' width='140px;'>
100
+ </tr>
101
+ <tr>
102
+ <td id='danielle-tomlinson'>
103
+ <a href='https://github.com/endocrimes'>
104
+ <img src='https://github.com/endocrimes.png' width='140px;'>
149
105
  </a>
150
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
106
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
151
107
  </td>
152
- <td id='daniel-jankowski'>
153
- <a href='https://github.com/mollyIV'>
154
- <img src='https://github.com/mollyIV.png' width='140px;'>
108
+ <td id='kohki-miki'>
109
+ <a href='https://github.com/giginet'>
110
+ <img src='https://github.com/giginet.png' width='140px;'>
155
111
  </a>
156
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
112
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
113
+ </td>
114
+ <td id='manu-wallner'>
115
+ <a href='https://github.com/milch'>
116
+ <img src='https://github.com/milch.png' width='140px;'>
117
+ </a>
118
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
157
119
  </td>
158
120
  <td id='luka-mirosevic'>
159
121
  <a href='https://github.com/lmirosevic'>
@@ -161,25 +123,31 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
161
123
  </a>
162
124
  <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
163
125
  </td>
126
+ <td id='felix-krause'>
127
+ <a href='https://github.com/KrauseFx'>
128
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
129
+ </a>
130
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
131
+ </td>
164
132
  </tr>
165
133
  <tr>
166
- <td id='jérôme-lacoste'>
167
- <a href='https://github.com/lacostej'>
168
- <img src='https://github.com/lacostej.png' width='140px;'>
134
+ <td id='helmut-januschka'>
135
+ <a href='https://github.com/hjanuschka'>
136
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
169
137
  </a>
170
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
138
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
171
139
  </td>
172
- <td id='łukasz-grabowski'>
173
- <a href='https://github.com/lucgrabowski'>
174
- <img src='https://github.com/lucgrabowski.png' width='140px;'>
140
+ <td id='max-ott'>
141
+ <a href='https://github.com/max-ott'>
142
+ <img src='https://github.com/max-ott.png' width='140px;'>
175
143
  </a>
176
- <h4 align='center'>Łukasz Grabowski</h4>
144
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
177
145
  </td>
178
- <td id='aaron-brager'>
179
- <a href='https://github.com/getaaron'>
180
- <img src='https://github.com/getaaron.png' width='140px;'>
146
+ <td id='jorge-revuelta-h'>
147
+ <a href='https://github.com/minuscorp'>
148
+ <img src='https://github.com/minuscorp.png' width='140px;'>
181
149
  </a>
182
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
183
151
  </td>
184
152
  <td id='jan-piotrowski'>
185
153
  <a href='https://github.com/janpio'>
@@ -187,20 +155,52 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
187
155
  </a>
188
156
  <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
189
157
  </td>
190
- <td id='iulian-onofrei'>
191
- <a href='https://github.com/revolter'>
192
- <img src='https://github.com/revolter.png' width='140px;'>
158
+ <td id='manish-rathi'>
159
+ <a href='https://github.com/crazymanish'>
160
+ <img src='https://github.com/crazymanish.png' width='140px;'>
193
161
  </a>
194
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
195
163
  </td>
196
164
  </tr>
197
165
  <tr>
166
+ <td id='łukasz-grabowski'>
167
+ <a href='https://github.com/lucgrabowski'>
168
+ <img src='https://github.com/lucgrabowski.png' width='140px;'>
169
+ </a>
170
+ <h4 align='center'>Łukasz Grabowski</h4>
171
+ </td>
172
+ <td id='matthew-ellis'>
173
+ <a href='https://github.com/matthewellis'>
174
+ <img src='https://github.com/matthewellis.png' width='140px;'>
175
+ </a>
176
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
177
+ </td>
178
+ <td id='jérôme-lacoste'>
179
+ <a href='https://github.com/lacostej'>
180
+ <img src='https://github.com/lacostej.png' width='140px;'>
181
+ </a>
182
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
183
+ </td>
198
184
  <td id='maksym-grebenets'>
199
185
  <a href='https://github.com/mgrebenets'>
200
186
  <img src='https://github.com/mgrebenets.png' width='140px;'>
201
187
  </a>
202
188
  <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
203
189
  </td>
190
+ <td id='iulian-onofrei'>
191
+ <a href='https://github.com/revolter'>
192
+ <img src='https://github.com/revolter.png' width='140px;'>
193
+ </a>
194
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
195
+ </td>
196
+ </tr>
197
+ <tr>
198
+ <td id='fumiya-nakamura'>
199
+ <a href='https://github.com/nafu'>
200
+ <img src='https://github.com/nafu.png' width='140px;'>
201
+ </a>
202
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
203
+ </td>
204
204
  </table>
205
205
 
206
206
  Special thanks to all [contributors](https://github.com/fastlane/fastlane/graphs/contributors) for extending and improving _fastlane_.
@@ -99,7 +99,7 @@ module Deliver
99
99
  optional: true,
100
100
  default_value: "ios",
101
101
  verify_block: proc do |value|
102
- UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
102
+ UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %w(ios appletvos xros osx).include?(value)
103
103
  end),
104
104
 
105
105
  # live version
@@ -186,7 +186,7 @@ module Fastlane
186
186
  optional: true,
187
187
  default_value: "ios",
188
188
  verify_block: proc do |value|
189
- UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
189
+ UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %w(ios appletvos xros osx).include?(value)
190
190
  end),
191
191
  FastlaneCore::ConfigItem.new(key: :team_name,
192
192
  short_option: "-e",
@@ -30,9 +30,10 @@ module Fastlane
30
30
  default_value: 'HEAD',
31
31
  optional: true),
32
32
  FastlaneCore::ConfigItem.new(key: :dependencies,
33
- description: "The array of additional Fastfiles in the repository",
34
- default_value: [],
35
- optional: true),
33
+ description: "The array of additional Fastfiles in the repository",
34
+ default_value: [],
35
+ type: Array,
36
+ optional: true),
36
37
  FastlaneCore::ConfigItem.new(key: :path,
37
38
  description: "The path of the Fastfile in the repository",
38
39
  default_value: 'fastlane/Fastfile',
@@ -43,6 +44,11 @@ module Fastlane
43
44
  optional: true),
44
45
  FastlaneCore::ConfigItem.new(key: :cache_path,
45
46
  description: "The path to a directory where the repository should be cloned into. Defaults to `nil`, which causes the repository to be cloned on every call, to a temporary directory",
47
+ optional: true),
48
+ FastlaneCore::ConfigItem.new(key: :git_extra_headers,
49
+ description: "An optional list of custom HTTP headers to access the git repo (`Authorization: Basic <YOUR BASE64 KEY>`, `Cache-Control: no-cache`, etc.)",
50
+ default_value: [],
51
+ type: Array,
46
52
  optional: true)
47
53
  ]
48
54
  end
@@ -68,7 +74,8 @@ module Fastlane
68
74
  branch: "HEAD", # The branch to checkout on the repository.
69
75
  path: "fastlane/Fastfile", # The path of the Fastfile in the repository.
70
76
  version: [">= 1.1.0", "< 2.0.0"], # The version to checkout on the repository. Multiple conditions can be used to select the latest version within constraints.
71
- cache_path: "~/.cache/fastlane/imported" # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
77
+ cache_path: "~/.cache/fastlane/imported", # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
78
+ git_extra_headers: ["Authorization: Basic <YOUR BASE64 KEY>", "Cache-Control: no-cache"]
72
79
  )'
73
80
  ]
74
81
  end
@@ -83,7 +83,7 @@ module Fastlane
83
83
  optional: true,
84
84
  default_value: "ios",
85
85
  verify_block: proc do |value|
86
- UI.user_error!("The platform can only be ios, osx, xros or appletvos") unless %('osx', ios', 'appletvos', 'xros').include?(value)
86
+ UI.user_error!("The platform can only be ios, osx, xros or appletvos") unless %w(osx ios appletvos xros).include?(value)
87
87
  end),
88
88
  FastlaneCore::ConfigItem.new(key: :initial_build_number,
89
89
  env_name: "INITIAL_BUILD_NUMBER",
@@ -58,7 +58,7 @@ module Fastlane
58
58
  optional: true,
59
59
  default_value: platform.empty? ? "ios" : platform,
60
60
  verify_block: proc do |value|
61
- UI.user_error!("The platform can only be ios or mac") unless %('ios', 'mac').include?(value)
61
+ UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
62
62
  end),
63
63
  FastlaneCore::ConfigItem.new(key: :udid,
64
64
  env_name: "FL_REGISTER_DEVICE_UDID",
@@ -160,7 +160,7 @@ module Fastlane
160
160
  optional: true,
161
161
  default_value: platform.empty? ? "ios" : platform,
162
162
  verify_block: proc do |value|
163
- UI.user_error!("The platform can only be ios or mac") unless %('ios', 'mac').include?(value)
163
+ UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
164
164
  end)
165
165
  ]
166
166
  end
@@ -98,6 +98,14 @@ module Fastlane
98
98
  [key, value]
99
99
  when :tags
100
100
  [key, value.join(',')]
101
+ when :folder_name
102
+ [key, value]
103
+ when :landing_page_mode
104
+ [key, value]
105
+ when :upload_to_saucelabs
106
+ [key, value]
107
+ when :platform
108
+ [key, value]
101
109
  else
102
110
  UI.user_error!("Unknown parameter: #{key}")
103
111
  end
@@ -237,7 +245,7 @@ module Fastlane
237
245
  FastlaneCore::ConfigItem.new(key: :custom,
238
246
  optional: true,
239
247
  env_name: "FL_TESTFAIRY_CUSTOM",
240
- description: "Array of custom options. Contact support@testfairy.com for more information",
248
+ description: "Array of custom options. Contact support for more information",
241
249
  default_value: ''),
242
250
  FastlaneCore::ConfigItem.new(key: :timeout,
243
251
  env_name: "FL_TESTFAIRY_TIMEOUT",
@@ -249,7 +257,33 @@ module Fastlane
249
257
  env_name: "FL_TESTFAIRY_TAGS",
250
258
  description: "Custom tags that can be used to organize your builds",
251
259
  type: Array,
252
- default_value: [])
260
+ default_value: []),
261
+ FastlaneCore::ConfigItem.new(key: :folder_name,
262
+ optional: true,
263
+ env_name: "FL_TESTFAIRY_FOLDER_NAME",
264
+ description: "Name of the dashboard folder that contains this app",
265
+ default_value: ''),
266
+ FastlaneCore::ConfigItem.new(key: :landing_page_mode,
267
+ optional: true,
268
+ env_name: "FL_TESTFAIRY_LANDING_PAGE_MODE",
269
+ description: "Visibility of build landing after upload. Can be 'open' or 'closed'",
270
+ default_value: 'open',
271
+ verify_block: proc do |value|
272
+ UI.user_error!("The landing page mode can only be open or closed") unless %w(open closed).include?(value)
273
+ end),
274
+ FastlaneCore::ConfigItem.new(key: :upload_to_saucelabs,
275
+ optional: true,
276
+ env_name: "FL_TESTFAIRY_UPLOAD_TO_SAUCELABS",
277
+ description: "Upload file directly to Sauce Labs. It can be 'on' or 'off'",
278
+ default_value: 'off',
279
+ verify_block: proc do |value|
280
+ UI.user_error!("The upload to Sauce Labs can only be on or off") unless %w(on off).include?(value)
281
+ end),
282
+ FastlaneCore::ConfigItem.new(key: :platform,
283
+ optional: true,
284
+ env_name: "FL_TESTFAIRY_PLATFORM",
285
+ description: "Use if upload build is not iOS or Android. Contact support for more information",
286
+ default_value: '')
253
287
  ]
254
288
  end
255
289
 
@@ -278,7 +278,8 @@ module Fastlane
278
278
  # @param version [String, Array] Version requirement for repo tags
279
279
  # @param dependencies [Array] An optional array of additional Fastfiles in the repository
280
280
  # @param cache_path [String] An optional path to a directory where the repository should be cloned into
281
- def import_from_git(url: nil, branch: 'HEAD', path: 'fastlane/Fastfile', version: nil, dependencies: [], cache_path: nil) # rubocop:disable Metrics/PerceivedComplexity
281
+ # @param git_extra_headers [Array] An optional array of custom HTTP headers to access the git repo (`Authorization: Basic <YOUR BASE64 KEY>`, `Cache-Control: no-cache`, etc.)
282
+ def import_from_git(url: nil, branch: 'HEAD', path: 'fastlane/Fastfile', version: nil, dependencies: [], cache_path: nil, git_extra_headers: []) # rubocop:disable Metrics/PerceivedComplexity
282
283
  UI.user_error!("Please pass a path to the `import_from_git` action") if url.to_s.length == 0
283
284
 
284
285
  Actions.execute_action('import_from_git') do
@@ -297,8 +298,6 @@ module Fastlane
297
298
  import_block = proc do |target_path|
298
299
  clone_folder = File.join(target_path, repo_name)
299
300
 
300
- branch_option = "--branch #{branch}" if branch != 'HEAD'
301
-
302
301
  checkout_dependencies = dependencies.map(&:shellescape).join(" ")
303
302
 
304
303
  # If the current call is eligible for caching, we check out all the
@@ -309,12 +308,16 @@ module Fastlane
309
308
  if Dir[clone_folder].empty?
310
309
  UI.message("Cloning remote git repo...")
311
310
  Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
311
+ command = ['git', 'clone', url, clone_folder, '--no-checkout']
312
312
  # When using cached clones, we need the entire repository history
313
313
  # so we can switch between tags or branches instantly, or else,
314
314
  # it would defeat the caching's purpose.
315
- depth = is_eligible_for_caching ? "" : "--depth 1"
316
-
317
- Actions.sh("git clone #{url.shellescape} #{clone_folder.shellescape} #{depth} --no-checkout #{branch_option}")
315
+ command += ['--depth', '1'] unless is_eligible_for_caching
316
+ command += ['--branch', branch] unless branch == 'HEAD'
317
+ git_extra_headers.each do |header|
318
+ command += ['--config', "http.extraHeader=#{header}"]
319
+ end
320
+ Actions.sh(*command)
318
321
  end
319
322
  end
320
323
 
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.224.0'.freeze
2
+ VERSION = '2.226.0'.freeze
3
3
  SUMMARY = "The easiest way to build and release mobile apps.".freeze
4
4
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
5
5
  MINIMUM_XCODE_RELEASE = "7.0".freeze
@@ -17,4 +17,4 @@ public class Deliverfile: DeliverfileProtocol {
17
17
  // during the `init` process, and you won't see this message
18
18
  }
19
19
 
20
- // Generated with fastlane 2.224.0
20
+ // Generated with fastlane 2.226.0
@@ -272,4 +272,4 @@ public extension DeliverfileProtocol {
272
272
 
273
273
  // Please don't remove the lines below
274
274
  // They are used to detect outdated files
275
- // FastlaneRunnerAPIVersion [0.9.130]
275
+ // FastlaneRunnerAPIVersion [0.9.132]
@@ -11602,9 +11602,13 @@ public func teamName() {
11602
11602
  - autoUpdate: Allows an easy upgrade of all users to the current version. To enable set to 'on'
11603
11603
  - notify: Send email to testers
11604
11604
  - options: Array of options (shake,video_only_wifi,anonymous)
11605
- - custom: Array of custom options. Contact support@testfairy.com for more information
11605
+ - custom: Array of custom options. Contact support for more information
11606
11606
  - timeout: Request timeout in seconds
11607
11607
  - tags: Custom tags that can be used to organize your builds
11608
+ - folderName: Name of the dashboard folder that contains this app
11609
+ - landingPageMode: Visibility of build landing after upload. Can be 'open' or 'closed'
11610
+ - uploadToSaucelabs: Upload file directly to Sauce Labs. It can be 'on' or 'off'
11611
+ - platform: Use if upload build is not iOS or Android. Contact support for more information
11608
11612
 
11609
11613
  You can retrieve your API key on [your settings page](https://free.testfairy.com/settings/)
11610
11614
  */
@@ -11621,7 +11625,11 @@ public func testfairy(apiKey: String,
11621
11625
  options: [String] = [],
11622
11626
  custom: String = "",
11623
11627
  timeout: OptionalConfigValue<Int?> = .fastlaneDefault(nil),
11624
- tags: [String] = [])
11628
+ tags: [String] = [],
11629
+ folderName: String = "",
11630
+ landingPageMode: String = "open",
11631
+ uploadToSaucelabs: String = "off",
11632
+ platform: String = "")
11625
11633
  {
11626
11634
  let apiKeyArg = RubyCommand.Argument(name: "api_key", value: apiKey, type: nil)
11627
11635
  let ipaArg = ipa.asRubyArgument(name: "ipa", type: nil)
@@ -11637,6 +11645,10 @@ public func testfairy(apiKey: String,
11637
11645
  let customArg = RubyCommand.Argument(name: "custom", value: custom, type: nil)
11638
11646
  let timeoutArg = timeout.asRubyArgument(name: "timeout", type: nil)
11639
11647
  let tagsArg = RubyCommand.Argument(name: "tags", value: tags, type: nil)
11648
+ let folderNameArg = RubyCommand.Argument(name: "folder_name", value: folderName, type: nil)
11649
+ let landingPageModeArg = RubyCommand.Argument(name: "landing_page_mode", value: landingPageMode, type: nil)
11650
+ let uploadToSaucelabsArg = RubyCommand.Argument(name: "upload_to_saucelabs", value: uploadToSaucelabs, type: nil)
11651
+ let platformArg = RubyCommand.Argument(name: "platform", value: platform, type: nil)
11640
11652
  let array: [RubyCommand.Argument?] = [apiKeyArg,
11641
11653
  ipaArg,
11642
11654
  apkArg,
@@ -11650,7 +11662,11 @@ public func testfairy(apiKey: String,
11650
11662
  optionsArg,
11651
11663
  customArg,
11652
11664
  timeoutArg,
11653
- tagsArg]
11665
+ tagsArg,
11666
+ folderNameArg,
11667
+ landingPageModeArg,
11668
+ uploadToSaucelabsArg,
11669
+ platformArg]
11654
11670
  let args: [RubyCommand.Argument] = array
11655
11671
  .filter { $0?.value != nil }
11656
11672
  .compactMap { $0 }
@@ -13861,4 +13877,4 @@ public let snapshotfile: Snapshotfile = .init()
13861
13877
 
13862
13878
  // Please don't remove the lines below
13863
13879
  // They are used to detect outdated files
13864
- // FastlaneRunnerAPIVersion [0.9.183]
13880
+ // FastlaneRunnerAPIVersion [0.9.185]
@@ -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.224.0
20
+ // Generated with fastlane 2.226.0
@@ -212,4 +212,4 @@ public extension GymfileProtocol {
212
212
 
213
213
  // Please don't remove the lines below
214
214
  // They are used to detect outdated files
215
- // FastlaneRunnerAPIVersion [0.9.133]
215
+ // FastlaneRunnerAPIVersion [0.9.135]
@@ -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.224.0
20
+ // Generated with fastlane 2.226.0
@@ -232,4 +232,4 @@ public extension MatchfileProtocol {
232
232
 
233
233
  // Please don't remove the lines below
234
234
  // They are used to detect outdated files
235
- // FastlaneRunnerAPIVersion [0.9.127]
235
+ // FastlaneRunnerAPIVersion [0.9.129]
@@ -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.224.0
20
+ // Generated with fastlane 2.226.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.126]
55
+ // FastlaneRunnerAPIVersion [0.9.128]
@@ -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.224.0
20
+ // Generated with fastlane 2.226.0
@@ -324,4 +324,4 @@ public extension ScanfileProtocol {
324
324
 
325
325
  // Please don't remove the lines below
326
326
  // They are used to detect outdated files
327
- // FastlaneRunnerAPIVersion [0.9.138]
327
+ // FastlaneRunnerAPIVersion [0.9.140]
@@ -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.224.0
20
+ // Generated with fastlane 2.226.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.128]
99
+ // FastlaneRunnerAPIVersion [0.9.130]
@@ -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.224.0
20
+ // Generated with fastlane 2.226.0
@@ -208,4 +208,4 @@ public extension SnapshotfileProtocol {
208
208
 
209
209
  // Please don't remove the lines below
210
210
  // They are used to detect outdated files
211
- // FastlaneRunnerAPIVersion [0.9.122]
211
+ // FastlaneRunnerAPIVersion [0.9.124]
@@ -2,50 +2,40 @@
2
2
  "entries": {
3
3
  "brew": {
4
4
  "swiftformat": {
5
- "version": "0.54.5",
5
+ "version": "0.54.6",
6
6
  "bottle": {
7
7
  "rebuild": 0,
8
8
  "root_url": "https://ghcr.io/v2/homebrew/core",
9
9
  "files": {
10
10
  "arm64_sequoia": {
11
11
  "cellar": ":any_skip_relocation",
12
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d",
13
- "sha256": "3fc57cb9abcbfd64106a3b16f51c8851c9877327553ec5fd9b21683d42b3c18d"
12
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:fda0a46091e8c4a1a913e08e29a92159ed747d83403508e0b5408e88e68cdf0c",
13
+ "sha256": "fda0a46091e8c4a1a913e08e29a92159ed747d83403508e0b5408e88e68cdf0c"
14
14
  },
15
15
  "arm64_sonoma": {
16
16
  "cellar": ":any_skip_relocation",
17
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee",
18
- "sha256": "4d1f7565498827bbc53230f01c2fca4a7d082f4ae16d32ae568ba633c090c6ee"
17
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:2c937e3425e9b44a73eb5ae4a83604b4476f901866014c01c1ebd3f3a8d9c198",
18
+ "sha256": "2c937e3425e9b44a73eb5ae4a83604b4476f901866014c01c1ebd3f3a8d9c198"
19
19
  },
20
20
  "arm64_ventura": {
21
21
  "cellar": ":any_skip_relocation",
22
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c",
23
- "sha256": "416b54dc7938754980f9b2d732254ce7a36c401c2df3b68eba47f54db9bb956c"
24
- },
25
- "arm64_monterey": {
26
- "cellar": ":any_skip_relocation",
27
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4",
28
- "sha256": "3b14b0bacb0938c650e2d0d30d1f546ea7bac4feac510be16f09a89abd9f95d4"
22
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:d68be9490bce8cb196933f1f421f791b0b9758a759956edfaf166f88dfca78e1",
23
+ "sha256": "d68be9490bce8cb196933f1f421f791b0b9758a759956edfaf166f88dfca78e1"
29
24
  },
30
25
  "sonoma": {
31
26
  "cellar": ":any_skip_relocation",
32
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19",
33
- "sha256": "445a0e38bda1f1dbda7c34dbb75a1b4432c5f0de7f9fa8bd4e03a9220b9bda19"
27
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:784d61fca33bdbbdf96f8f23db2a0ea849ef62cb251eedfe83863869db84359b",
28
+ "sha256": "784d61fca33bdbbdf96f8f23db2a0ea849ef62cb251eedfe83863869db84359b"
34
29
  },
35
30
  "ventura": {
36
31
  "cellar": ":any_skip_relocation",
37
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a",
38
- "sha256": "508b2e8000078773c7884e17b8d1ca711f4313ba14ff0000f7a28af68b02e71a"
39
- },
40
- "monterey": {
41
- "cellar": ":any_skip_relocation",
42
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e",
43
- "sha256": "8c367a76ca05ba07ffc38a6bb2f5ee0231d363655ed982284afcb4d685fa524e"
32
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:7845bd9bf8f0f94980f38d0ac322a5ee41bde07d18ec0c93a343c4aa7d2606fe",
33
+ "sha256": "7845bd9bf8f0f94980f38d0ac322a5ee41bde07d18ec0c93a343c4aa7d2606fe"
44
34
  },
45
35
  "x86_64_linux": {
46
36
  "cellar": "/home/linuxbrew/.linuxbrew/Cellar",
47
- "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662",
48
- "sha256": "8e8abc969e1b10e7411a92717703c8cd944c7a3f3fd04e2d232918971ae14662"
37
+ "url": "https://ghcr.io/v2/homebrew/core/swiftformat/blobs/sha256:14756d1f83aedf183be980541393c3e4d9cfa47dee3dbfdb665a3461f5045e13",
38
+ "sha256": "14756d1f83aedf183be980541393c3e4d9cfa47dee3dbfdb665a3461f5045e13"
49
39
  }
50
40
  }
51
41
  }
@@ -87,12 +77,12 @@
87
77
  "macOS": "13.6"
88
78
  },
89
79
  "sonoma": {
90
- "HOMEBREW_VERSION": "4.4.0",
80
+ "HOMEBREW_VERSION": "4.4.1",
91
81
  "HOMEBREW_PREFIX": "/opt/homebrew",
92
82
  "Homebrew/homebrew-core": "api",
93
83
  "CLT": "16.0.0.0.1.1724870825",
94
84
  "Xcode": "15.4",
95
- "macOS": "14.6.1"
85
+ "macOS": "14.7"
96
86
  }
97
87
  }
98
88
  }
@@ -84,7 +84,7 @@ module Precheck
84
84
  optional: true,
85
85
  default_value: "ios",
86
86
  verify_block: proc do |value|
87
- UI.user_error!("The platform can only be ios, appletvos, or osx") unless %('ios', 'appletvos', 'osx').include?(value)
87
+ UI.user_error!("The platform can only be ios, appletvos, or osx") unless %w(ios appletvos osx).include?(value)
88
88
  end),
89
89
  FastlaneCore::ConfigItem.new(key: :default_rule_level,
90
90
  short_option: "-r",
@@ -54,7 +54,7 @@ module Produce
54
54
  optional: true,
55
55
  default_value: "ios",
56
56
  verify_block: proc do |value|
57
- UI.user_error!("The platform can only be ios or osx") unless %('ios', 'osx', 'tvos').include?(value)
57
+ UI.user_error!("The platform can only be ios or osx") unless %w(ios osx tvos).include?(value)
58
58
  end),
59
59
  FastlaneCore::ConfigItem.new(key: :platforms,
60
60
  short_option: "-J",
@@ -450,6 +450,94 @@ module Spaceship
450
450
  return false
451
451
  end
452
452
 
453
+ def do_sirp(user, password, modified_cookie)
454
+ require 'fastlane-sirp'
455
+ require 'base64'
456
+
457
+ client = SIRP::Client.new(2048)
458
+ a = client.start_authentication
459
+
460
+ data = {
461
+ a: Base64.strict_encode64(to_byte(a)),
462
+ accountName: user,
463
+ protocols: ['s2k', 's2k_fo']
464
+ }
465
+
466
+ response = request(:post) do |req|
467
+ req.url("https://idmsa.apple.com/appleauth/auth/signin/init")
468
+ req.body = data.to_json
469
+ req.headers['Content-Type'] = 'application/json'
470
+ req.headers['X-Requested-With'] = 'XMLHttpRequest'
471
+ req.headers['X-Apple-Widget-Key'] = self.itc_service_key
472
+ req.headers['Accept'] = 'application/json, text/javascript'
473
+ req.headers["Cookie"] = modified_cookie if modified_cookie
474
+ end
475
+
476
+ puts("Received SIRP signin init response: #{response.body}") if Spaceship::Globals.verbose?
477
+
478
+ body = response.body
479
+ iterations = body["iteration"]
480
+ salt = Base64.strict_decode64(body["salt"])
481
+ b = Base64.strict_decode64(body["b"])
482
+ c = body["c"]
483
+
484
+ key_length = 32
485
+ encrypted_password = pbkdf2(password, salt, iterations, key_length)
486
+
487
+ m1 = client.process_challenge(
488
+ user,
489
+ to_hex(encrypted_password),
490
+ to_hex(salt),
491
+ to_hex(b),
492
+ is_password_encrypted: true
493
+ )
494
+ m2 = client.H_AMK
495
+
496
+ if m1 == false
497
+ puts("Error processing SIRP challenge") if Spaceship::Globals.verbose?
498
+ raise SIRPAuthenticationError
499
+ end
500
+
501
+ data = {
502
+ accountName: user,
503
+ c: c,
504
+ m1: Base64.encode64(to_byte(m1)).strip,
505
+ m2: Base64.encode64(to_byte(m2)).strip,
506
+ rememberMe: false
507
+ }
508
+
509
+ hashcash = self.fetch_hashcash
510
+
511
+ response = request(:post) do |req|
512
+ req.url("https://idmsa.apple.com/appleauth/auth/signin/complete?isRememberMeEnabled=false")
513
+ req.body = data.to_json
514
+ req.headers['Content-Type'] = 'application/json'
515
+ req.headers['X-Requested-With'] = 'XMLHttpRequest'
516
+ req.headers['X-Apple-Widget-Key'] = self.itc_service_key
517
+ req.headers['Accept'] = 'application/json, text/javascript'
518
+ req.headers["Cookie"] = modified_cookie if modified_cookie
519
+ req.headers["X-Apple-HC"] = hashcash if hashcash
520
+ end
521
+
522
+ puts("Completed SIRP authentication with status of #{response.status}") if Spaceship::Globals.verbose?
523
+
524
+ return response
525
+ end
526
+
527
+ def pbkdf2(password, salt, iterations, key_length, digest = OpenSSL::Digest::SHA256.new)
528
+ require 'openssl'
529
+ password = OpenSSL::Digest::SHA256.digest(password)
530
+ OpenSSL::PKCS5.pbkdf2_hmac(password, salt, iterations, key_length, digest)
531
+ end
532
+
533
+ def to_hex(str)
534
+ str.unpack1('H*')
535
+ end
536
+
537
+ def to_byte(str)
538
+ [str].pack('H*')
539
+ end
540
+
453
541
  # This method is used for both the Apple Dev Portal and App Store Connect
454
542
  # This will also handle 2 step verification and 2 factor authentication
455
543
  #
@@ -465,12 +553,6 @@ module Spaceship
465
553
  # If the session is valid no need to attempt to generate a new one.
466
554
  return true if has_valid_session
467
555
 
468
- data = {
469
- accountName: user,
470
- password: password,
471
- rememberMe: true
472
- }
473
-
474
556
  begin
475
557
  # The below workaround is only needed for 2 step verified machines
476
558
  # Due to escaping of cookie values we have a little workaround here
@@ -491,22 +573,7 @@ module Spaceship
491
573
  modified_cookie.gsub!(unescaped_important_cookie, escaped_important_cookie)
492
574
  end
493
575
 
494
- # Fixes issue https://github.com/fastlane/fastlane/issues/21071
495
- # On 2023-02-23, Apple added a custom implementation
496
- # of hashcash to their auth flow
497
- # hashcash = nil
498
- hashcash = self.fetch_hashcash
499
-
500
- response = request(:post) do |req|
501
- req.url("https://idmsa.apple.com/appleauth/auth/signin")
502
- req.body = data.to_json
503
- req.headers['Content-Type'] = 'application/json'
504
- req.headers['X-Requested-With'] = 'XMLHttpRequest'
505
- req.headers['X-Apple-Widget-Key'] = self.itc_service_key
506
- req.headers['Accept'] = 'application/json, text/javascript'
507
- req.headers["Cookie"] = modified_cookie if modified_cookie
508
- req.headers["X-Apple-HC"] = hashcash if hashcash
509
- end
576
+ response = perform_login_method(user, password, modified_cookie)
510
577
  rescue UnauthorizedAccessError
511
578
  raise InvalidUserCredentialsError.new, "Invalid username and password combination. Used '#{user}' as the username."
512
579
  end
@@ -552,6 +619,40 @@ module Spaceship
552
619
  end
553
620
  # rubocop:enable Metrics/PerceivedComplexity
554
621
 
622
+ def perform_login_method(user, password, modified_cookie)
623
+ do_legacy_signin = ENV['FASTLANE_USE_LEGACY_PRE_SIRP_AUTH']
624
+ if do_legacy_signin
625
+ puts("Starting legacy Apple ID login") if Spaceship::Globals.verbose?
626
+
627
+ # Fixes issue https://github.com/fastlane/fastlane/issues/21071
628
+ # On 2023-02-23, Apple added a custom implementation
629
+ # of hashcash to their auth flow
630
+ # hashcash = nil
631
+ hashcash = self.fetch_hashcash
632
+
633
+ data = {
634
+ accountName: user,
635
+ password: password,
636
+ rememberMe: true
637
+ }
638
+
639
+ return request(:post) do |req|
640
+ req.url("https://idmsa.apple.com/appleauth/auth/signin")
641
+ req.body = data.to_json
642
+ req.headers['Content-Type'] = 'application/json'
643
+ req.headers['X-Requested-With'] = 'XMLHttpRequest'
644
+ req.headers['X-Apple-Widget-Key'] = self.itc_service_key
645
+ req.headers['Accept'] = 'application/json, text/javascript'
646
+ req.headers["Cookie"] = modified_cookie if modified_cookie
647
+ req.headers["X-Apple-HC"] = hashcash if hashcash
648
+ end
649
+ else
650
+ # Fixes issue https://github.com/fastlane/fastlane/issues/26368#issuecomment-2424190032
651
+ puts("Starting SIRP Apple ID login") if Spaceship::Globals.verbose?
652
+ return do_sirp(user, password, modified_cookie)
653
+ end
654
+ end
655
+
555
656
  def fetch_hashcash
556
657
  response = request(:get, "https://idmsa.apple.com/appleauth/auth/signin?widgetKey=#{self.itc_service_key}")
557
658
  headers = response.headers
@@ -43,6 +43,21 @@ module Spaceship
43
43
  end
44
44
  end
45
45
 
46
+ # User doesn't have enough permission for given action
47
+ class SIRPAuthenticationError < BasicPreferredInfoError
48
+ TITLE = 'Authentication issue validating secrets:'.freeze
49
+
50
+ def preferred_error_info
51
+ message ? [TITLE, message] : nil
52
+ end
53
+
54
+ # We don't want to show similar GitHub issues, as the error message
55
+ # should be pretty clear
56
+ def show_github_issues
57
+ false
58
+ end
59
+ end
60
+
46
61
  # Raised when 429 is received from App Store Connect
47
62
  class TooManyRequestsError < BasicPreferredInfoError
48
63
  attr_reader :retry_after
@@ -106,14 +106,14 @@ module Supply
106
106
  end
107
107
  end
108
108
 
109
- def fetch_track_and_release!(track, version_code, status = nil)
109
+ def fetch_track_and_release!(track, version_code, statuses = nil)
110
110
  tracks = client.tracks(track)
111
111
  return nil, nil if tracks.empty?
112
112
 
113
113
  track = tracks.first
114
114
  releases = track.releases
115
115
 
116
- releases = releases.select { |r| r.status == status } if status
116
+ releases = releases.select { |r| statuses.include?(r.status) } unless statuses.nil? || statuses.empty?
117
117
  releases = releases.select { |r| (r.version_codes || []).map(&:to_s).include?(version_code.to_s) } if version_code
118
118
 
119
119
  if releases.size > 1
@@ -124,7 +124,7 @@ module Supply
124
124
  end
125
125
 
126
126
  def update_rollout
127
- track, release = fetch_track_and_release!(Supply.config[:track], Supply.config[:version_code], Supply::ReleaseStatus::IN_PROGRESS)
127
+ track, release = fetch_track_and_release!(Supply.config[:track], Supply.config[:version_code], [Supply::ReleaseStatus::IN_PROGRESS, Supply::ReleaseStatus::DRAFT])
128
128
  UI.user_error!("Unable to find the requested track - '#{Supply.config[:track]}'") unless track
129
129
  UI.user_error!("Unable to find the requested release on track - '#{Supply.config[:track]}'") unless release
130
130
 
@@ -135,7 +135,11 @@ module Supply
135
135
  if track && release
136
136
  completed = Supply.config[:rollout].to_f == 1
137
137
  release.user_fraction = completed ? nil : Supply.config[:rollout]
138
- release.status = Supply::ReleaseStatus::COMPLETED if completed
138
+ if Supply.config[:release_status]
139
+ release.status = Supply.config[:release_status]
140
+ else
141
+ release.status = completed ? Supply::ReleaseStatus::COMPLETED : Supply::ReleaseStatus::IN_PROGRESS
142
+ end
139
143
 
140
144
  # Deleted other version codes if completed because only allowed on completed version in a release
141
145
  track.releases.delete_if { |r| !(r.version_codes || []).map(&:to_s).include?(version_code) } if completed
metadata CHANGED
@@ -1,39 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.224.0
4
+ version: 2.226.0
5
5
  platform: ruby
6
6
  authors:
7
- - Maksym Grebenets
7
+ - Roger Oba
8
+ - Luka Mirosevic
9
+ - Daniel Jankowski
10
+ - Max Ott
11
+ - Joshua Liebowitz
12
+ - Jorge Revuelta H
13
+ - Łukasz Grabowski
14
+ - Danielle Tomlinson
8
15
  - Aaron Brager
16
+ - Jan Piotrowski
9
17
  - Iulian Onofrei
18
+ - Kohki Miki
19
+ - Maksym Grebenets
20
+ - Stefan Natchev
10
21
  - Andrew McBurney
11
- - Daniel Jankowski
12
- - Manu Wallner
22
+ - Jimmy Dee
23
+ - Matthew Ellis
24
+ - Satoshi Namai
13
25
  - Felix Krause
14
- - Jérôme Lacoste
15
26
  - Helmut Januschka
16
- - Max Ott
17
- - Satoshi Namai
18
- - Josh Holtz
19
- - Kohki Miki
20
27
  - Manish Rathi
21
- - Jorge Revuelta H
22
28
  - Fumiya Nakamura
23
- - Łukasz Grabowski
24
- - Jimmy Dee
29
+ - Josh Holtz
30
+ - Jérôme Lacoste
31
+ - Manu Wallner
25
32
  - Olivier Halligon
26
- - Stefan Natchev
27
- - Jan Piotrowski
28
- - Joshua Liebowitz
29
- - Luka Mirosevic
30
- - Matthew Ellis
31
- - Danielle Tomlinson
32
- - Roger Oba
33
33
  autorequire:
34
34
  bindir: bin
35
35
  cert_chain: []
36
- date: 2024-10-03 00:00:00.000000000 Z
36
+ date: 2024-12-10 00:00:00.000000000 Z
37
37
  dependencies:
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: addressable
@@ -293,6 +293,20 @@ dependencies:
293
293
  - - "<"
294
294
  - !ruby/object:Gem::Version
295
295
  version: 3.0.0
296
+ - !ruby/object:Gem::Dependency
297
+ name: fastlane-sirp
298
+ requirement: !ruby/object:Gem::Requirement
299
+ requirements:
300
+ - - ">="
301
+ - !ruby/object:Gem::Version
302
+ version: 1.0.0
303
+ type: :runtime
304
+ prerelease: false
305
+ version_requirements: !ruby/object:Gem::Requirement
306
+ requirements:
307
+ - - ">="
308
+ - !ruby/object:Gem::Version
309
+ version: 1.0.0
296
310
  - !ruby/object:Gem::Dependency
297
311
  name: gh_inspector
298
312
  requirement: !ruby/object:Gem::Requirement
@@ -713,14 +727,14 @@ dependencies:
713
727
  requirements:
714
728
  - - "~>"
715
729
  - !ruby/object:Gem::Version
716
- version: 0.3.0
730
+ version: 0.4.0
717
731
  type: :runtime
718
732
  prerelease: false
719
733
  version_requirements: !ruby/object:Gem::Requirement
720
734
  requirements:
721
735
  - - "~>"
722
736
  - !ruby/object:Gem::Version
723
- version: 0.3.0
737
+ version: 0.4.0
724
738
  description: The easiest way to automate beta deployments and releases for your iOS
725
739
  and Android apps
726
740
  email: