@@ -18,9 +18,28 @@ use crate::{
18
18
error:: { ForemanError , ForemanResult } ,
19
19
fs,
20
20
paths:: ForemanPaths ,
21
- tool_provider:: ToolProvider ,
21
+ tool_provider:: { Release , ToolProvider } ,
22
22
} ;
23
23
24
+ fn choose_asset ( release : & Release , platform_keywords : & [ & str ] ) -> Option < usize > {
25
+ log:: trace!(
26
+ "Checking for name with compatible os/arch pair from platform-derived list: {:?}" ,
27
+ platform_keywords
28
+ ) ;
29
+ let asset_index = platform_keywords. iter ( ) . find_map ( |keyword| {
30
+ release
31
+ . assets
32
+ . iter ( )
33
+ . position ( |asset| asset. name . contains ( keyword) )
34
+ } ) ?;
35
+
36
+ log:: debug!(
37
+ "Found matching artifact: {}" ,
38
+ release. assets[ asset_index] . name
39
+ ) ;
40
+ Some ( asset_index)
41
+ }
42
+
24
43
/// Contains the current state of all of the tools that Foreman manages.
25
44
#[ derive( Debug , PartialEq , Serialize , Deserialize ) ]
26
45
pub struct ToolCache {
@@ -109,11 +128,7 @@ impl ToolCache {
109
128
Version :: parse ( & release. tag_name [ 1 ..] ) . ok ( )
110
129
} ) ?;
111
130
112
- let asset_index = release. assets . iter ( ) . position ( |asset| {
113
- platform_keywords ( )
114
- . iter ( )
115
- . any ( |keyword| asset. name . contains ( keyword) )
116
- } ) ?;
131
+ let asset_index = choose_asset ( & release, platform_keywords ( ) ) ?;
117
132
118
133
Some ( ( version, asset_index, release) )
119
134
} )
@@ -223,8 +238,63 @@ fn tool_identifier_to_exe_name(tool: &ToolSpec, version: &Version) -> String {
223
238
mod test {
224
239
use tempfile:: tempdir;
225
240
241
+ use crate :: tool_provider:: ReleaseAsset ;
242
+
226
243
use super :: * ;
227
244
245
+ // Regression test for LUAFDN-1041, based on the release that surfaced it
246
+ #[ test]
247
+ fn select_correct_asset ( ) {
248
+ let release = Release {
249
+ prerelease : false ,
250
+ tag_name : "v0.5.2" . to_string ( ) ,
251
+ assets : vec ! [
252
+ ReleaseAsset {
253
+ name: "tool-linux.zip" . to_string( ) ,
254
+ url: "https://example.com/some/repo/releases/assets/1" . to_string( ) ,
255
+ } ,
256
+ ReleaseAsset {
257
+ name: "tool-macos-arm64.zip" . to_string( ) ,
258
+ url: "https://example.com/some/repo/releases/assets/2" . to_string( ) ,
259
+ } ,
260
+ ReleaseAsset {
261
+ name: "tool-macos-x86_64.zip" . to_string( ) ,
262
+ url: "https://example.com/some/repo/releases/assets/3" . to_string( ) ,
263
+ } ,
264
+ ReleaseAsset {
265
+ name: "tool-win64.zip" . to_string( ) ,
266
+ url: "https://example.com/some/repo/releases/assets/4" . to_string( ) ,
267
+ } ,
268
+ ] ,
269
+ } ;
270
+ assert_eq ! (
271
+ choose_asset( & release, & [ "win32" , "win64" , "windows" ] ) ,
272
+ Some ( 3 )
273
+ ) ;
274
+ assert_eq ! (
275
+ choose_asset(
276
+ & release,
277
+ & [ "macos-x86_64" , "darwin-x86_64" , "macos" , "darwin" ]
278
+ ) ,
279
+ Some ( 2 )
280
+ ) ;
281
+ assert_eq ! (
282
+ choose_asset(
283
+ & release,
284
+ & [
285
+ "macos-arm64" ,
286
+ "darwin-arm64" ,
287
+ "macos-x86_64" ,
288
+ "darwin-x86_64" ,
289
+ "macos" ,
290
+ "darwin" ,
291
+ ]
292
+ ) ,
293
+ Some ( 1 )
294
+ ) ;
295
+ assert_eq ! ( choose_asset( & release, & [ "linux" ] ) , Some ( 0 ) ) ;
296
+ }
297
+
228
298
mod load {
229
299
use super :: * ;
230
300
0 commit comments