@@ -5,10 +5,10 @@ use std::sync::atomic::{AtomicBool, Ordering};
55use std:: { env, fs, time} ;
66
77use super :: custom:: { Dockerfile , PreBuild } ;
8- use super :: engine:: * ;
98use super :: image:: PossibleImage ;
109use super :: Image ;
1110use super :: PROVIDED_IMAGES ;
11+ use super :: { engine:: * , ProvidedImage } ;
1212use crate :: cargo:: CargoMetadata ;
1313use crate :: config:: Config ;
1414use crate :: errors:: * ;
@@ -26,6 +26,11 @@ pub use super::custom::CROSS_CUSTOM_DOCKERFILE_IMAGE_PREFIX;
2626pub const CROSS_IMAGE : & str = "ghcr.io/cross-rs" ;
2727// note: this is the most common base image for our images
2828pub 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+ } ;
2934
3035#[ derive( Debug ) ]
3136pub struct DockerOptions {
@@ -1228,23 +1233,30 @@ pub enum GetImageError {
12281233 Other ( eyre:: Report ) ,
12291234}
12301235
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 (
12331245 config : & Config ,
12341246 target : & Target ,
12351247 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 ) ?;
12391252 }
12401253
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 > {
12481260 let compatible = PROVIDED_IMAGES
12491261 . iter ( )
12501262 . filter ( |p| p. name == target_name)
@@ -1254,52 +1266,41 @@ pub fn get_image_name(
12541266 return Err ( GetImageError :: NoCompatibleImages ( target_name. to_owned ( ) ) ) ;
12551267 }
12561268
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+ }
12621281
1282+ let target_name = get_target_name ( target, uses_zig) ;
1283+ let compatible = get_provided_images_for_target ( target_name) ?;
12631284 Ok ( compatible
12641285 . first ( )
12651286 . expect ( "should not be empty" )
1266- . image_name ( CROSS_IMAGE , version ) )
1287+ . default_image_name ( ) )
12671288}
12681289
12691290pub fn get_image (
12701291 config : & Config ,
12711292 target : & Target ,
12721293 uses_zig : bool ,
12731294) -> 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 ) ? {
12751296 return Ok ( image) ;
12761297 }
12771298
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[ ..] {
13011302 // If only one match, use that
1302- compatible . first ( ) . expect ( "should not be empty" )
1303+ first
13031304 } else if compatible
13041305 . iter ( )
13051306 . filter ( |provided| provided. sub . is_none ( ) )
@@ -1323,23 +1324,20 @@ pub fn get_image(
13231324 "candidates: {}" ,
13241325 compatible
13251326 . iter( )
1326- . map( |provided| format!(
1327- "\" {}\" " ,
1328- provided. image_name( CROSS_IMAGE , version)
1329- ) )
1327+ . map( |provided| format!( "\" {}\" " , provided. default_image_name( ) ) )
13301328 . collect:: <Vec <_>>( )
13311329 . join( ", " )
13321330 )
13331331 } ) ,
13341332 ) ) ;
13351333 } ;
13361334
1337- let mut image: PossibleImage = pick. image_name ( CROSS_IMAGE , version) . into ( ) ;
1338-
1335+ let image_name = pick. default_image_name ( ) ;
13391336 if pick. platforms . is_empty ( ) {
1340- return Err ( GetImageError :: SpecifiedImageNoPlatform ( image . to_string ( ) ) ) ;
1341- } ;
1337+ return Err ( GetImageError :: SpecifiedImageNoPlatform ( image_name ) ) ;
1338+ }
13421339
1340+ let mut image: PossibleImage = image_name. into ( ) ;
13431341 image. toolchain = pick. platforms . to_vec ( ) ;
13441342 Ok ( image)
13451343}
0 commit comments