@@ -5,10 +5,10 @@ use std::sync::atomic::{AtomicBool, Ordering};
5
5
use std:: { env, fs, time} ;
6
6
7
7
use super :: custom:: { Dockerfile , PreBuild } ;
8
- use super :: engine:: * ;
9
8
use super :: image:: PossibleImage ;
10
9
use super :: Image ;
11
10
use super :: PROVIDED_IMAGES ;
11
+ use super :: { engine:: * , ProvidedImage } ;
12
12
use crate :: cargo:: CargoMetadata ;
13
13
use crate :: config:: Config ;
14
14
use crate :: errors:: * ;
@@ -26,6 +26,11 @@ pub use super::custom::CROSS_CUSTOM_DOCKERFILE_IMAGE_PREFIX;
26
26
pub const CROSS_IMAGE : & str = "ghcr.io/cross-rs" ;
27
27
// note: this is the most common base image for our images
28
28
pub const UBUNTU_BASE : & str = "ubuntu:20.04" ;
29
+ pub const DEFAULT_IMAGE_VERSION : & str = if crate :: commit_info ( ) . is_empty ( ) {
30
+ env ! ( "CARGO_PKG_VERSION" )
31
+ } else {
32
+ "main"
33
+ } ;
29
34
30
35
#[ derive( Debug ) ]
31
36
pub struct DockerOptions {
@@ -1228,23 +1233,30 @@ pub enum GetImageError {
1228
1233
Other ( eyre:: Report ) ,
1229
1234
}
1230
1235
1231
- /// Simpler version of [get_image]
1232
- pub fn get_image_name (
1236
+ fn get_target_name ( target : & Target , uses_zig : bool ) -> & str {
1237
+ if uses_zig {
1238
+ "zig"
1239
+ } else {
1240
+ target. triple ( )
1241
+ }
1242
+ }
1243
+
1244
+ fn get_user_image (
1233
1245
config : & Config ,
1234
1246
target : & Target ,
1235
1247
uses_zig : bool ,
1236
- ) -> Result < String , GetImageError > {
1237
- if let Some ( image) = config. image ( target) . map_err ( GetImageError :: Other ) ? {
1238
- return Ok ( image. name ) ;
1248
+ ) -> Result < Option < PossibleImage > , GetImageError > {
1249
+ let mut image = config. image ( target) . map_err ( GetImageError :: Other ) ?;
1250
+ if image. is_none ( ) && uses_zig {
1251
+ image = config. zig_image ( target) . map_err ( GetImageError :: Other ) ?;
1239
1252
}
1240
1253
1241
- let target_name = match uses_zig {
1242
- true => match config. zig_image ( target) . map_err ( GetImageError :: Other ) ? {
1243
- Some ( image) => return Ok ( image. name ) ,
1244
- None => "zig" ,
1245
- } ,
1246
- false => target. triple ( ) ,
1247
- } ;
1254
+ Ok ( image)
1255
+ }
1256
+
1257
+ fn get_provided_images_for_target (
1258
+ target_name : & str ,
1259
+ ) -> Result < Vec < & ' static ProvidedImage > , GetImageError > {
1248
1260
let compatible = PROVIDED_IMAGES
1249
1261
. iter ( )
1250
1262
. filter ( |p| p. name == target_name)
@@ -1254,52 +1266,41 @@ pub fn get_image_name(
1254
1266
return Err ( GetImageError :: NoCompatibleImages ( target_name. to_owned ( ) ) ) ;
1255
1267
}
1256
1268
1257
- let version = if crate :: commit_info ( ) . is_empty ( ) {
1258
- env ! ( "CARGO_PKG_VERSION" )
1259
- } else {
1260
- "main"
1261
- } ;
1269
+ Ok ( compatible)
1270
+ }
1271
+
1272
+ /// Simpler version of [get_image]
1273
+ pub fn get_image_name (
1274
+ config : & Config ,
1275
+ target : & Target ,
1276
+ uses_zig : bool ,
1277
+ ) -> Result < String , GetImageError > {
1278
+ if let Some ( image) = get_user_image ( config, target, uses_zig) ? {
1279
+ return Ok ( image. name ) ;
1280
+ }
1262
1281
1282
+ let target_name = get_target_name ( target, uses_zig) ;
1283
+ let compatible = get_provided_images_for_target ( target_name) ?;
1263
1284
Ok ( compatible
1264
1285
. first ( )
1265
1286
. expect ( "should not be empty" )
1266
- . image_name ( CROSS_IMAGE , version ) )
1287
+ . default_image_name ( ) )
1267
1288
}
1268
1289
1269
1290
pub fn get_image (
1270
1291
config : & Config ,
1271
1292
target : & Target ,
1272
1293
uses_zig : bool ,
1273
1294
) -> Result < PossibleImage , GetImageError > {
1274
- if let Some ( image) = config . image ( target) . map_err ( GetImageError :: Other ) ? {
1295
+ if let Some ( image) = get_user_image ( config , target, uses_zig ) ? {
1275
1296
return Ok ( image) ;
1276
1297
}
1277
1298
1278
- let target_name = match uses_zig {
1279
- true => match config. zig_image ( target) . map_err ( GetImageError :: Other ) ? {
1280
- Some ( image) => return Ok ( image) ,
1281
- None => "zig" ,
1282
- } ,
1283
- false => target. triple ( ) ,
1284
- } ;
1285
- let compatible = PROVIDED_IMAGES
1286
- . iter ( )
1287
- . filter ( |p| p. name == target_name)
1288
- . collect :: < Vec < _ > > ( ) ;
1289
-
1290
- if compatible. is_empty ( ) {
1291
- return Err ( GetImageError :: NoCompatibleImages ( target_name. to_owned ( ) ) ) ;
1292
- }
1293
-
1294
- let version = if crate :: commit_info ( ) . is_empty ( ) {
1295
- env ! ( "CARGO_PKG_VERSION" )
1296
- } else {
1297
- "main"
1298
- } ;
1299
-
1300
- let pick = if compatible. len ( ) == 1 {
1299
+ let target_name = get_target_name ( target, uses_zig) ;
1300
+ let compatible = get_provided_images_for_target ( target_name) ?;
1301
+ let pick = if let [ first] = compatible[ ..] {
1301
1302
// If only one match, use that
1302
- compatible . first ( ) . expect ( "should not be empty" )
1303
+ first
1303
1304
} else if compatible
1304
1305
. iter ( )
1305
1306
. filter ( |provided| provided. sub . is_none ( ) )
@@ -1323,23 +1324,20 @@ pub fn get_image(
1323
1324
"candidates: {}" ,
1324
1325
compatible
1325
1326
. iter( )
1326
- . map( |provided| format!(
1327
- "\" {}\" " ,
1328
- provided. image_name( CROSS_IMAGE , version)
1329
- ) )
1327
+ . map( |provided| format!( "\" {}\" " , provided. default_image_name( ) ) )
1330
1328
. collect:: <Vec <_>>( )
1331
1329
. join( ", " )
1332
1330
)
1333
1331
} ) ,
1334
1332
) ) ;
1335
1333
} ;
1336
1334
1337
- let mut image: PossibleImage = pick. image_name ( CROSS_IMAGE , version) . into ( ) ;
1338
-
1335
+ let image_name = pick. default_image_name ( ) ;
1339
1336
if pick. platforms . is_empty ( ) {
1340
- return Err ( GetImageError :: SpecifiedImageNoPlatform ( image . to_string ( ) ) ) ;
1341
- } ;
1337
+ return Err ( GetImageError :: SpecifiedImageNoPlatform ( image_name ) ) ;
1338
+ }
1342
1339
1340
+ let mut image: PossibleImage = image_name. into ( ) ;
1343
1341
image. toolchain = pick. platforms . to_vec ( ) ;
1344
1342
Ok ( image)
1345
1343
}
0 commit comments