@@ -5,7 +5,7 @@ use std::sync::atomic::{AtomicBool, Ordering};
55use std:: { env, fs, time} ;
66
77use super :: custom:: { Dockerfile , PreBuild } ;
8- use super :: image:: PossibleImage ;
8+ use super :: image:: { ImageReference , PossibleImage } ;
99use super :: Image ;
1010use super :: PROVIDED_IMAGES ;
1111use super :: { engine:: * , ProvidedImage } ;
@@ -1251,6 +1251,13 @@ fn get_user_image(
12511251 image = config. zig_image ( target) . map_err ( GetImageError :: Other ) ?;
12521252 }
12531253
1254+ if let Some ( image) = & mut image {
1255+ if let ImageReference :: Identifier ( id) = & image. reference {
1256+ let target_name = get_target_name ( target, uses_zig) ;
1257+ image. reference = ImageReference :: Name ( format ! ( "{CROSS_IMAGE}/{target_name}{id}" ) ) ;
1258+ }
1259+ }
1260+
12541261 Ok ( image)
12551262}
12561263
@@ -1276,7 +1283,7 @@ pub fn get_image_name(
12761283 uses_zig : bool ,
12771284) -> Result < String , GetImageError > {
12781285 if let Some ( image) = get_user_image ( config, target, uses_zig) ? {
1279- return Ok ( image. name ) ;
1286+ return Ok ( image. reference . get ( ) . to_owned ( ) ) ;
12801287 }
12811288
12821289 let target_name = get_target_name ( target, uses_zig) ;
@@ -1542,8 +1549,10 @@ pub fn path_hash(path: &Path, count: usize) -> Result<String> {
15421549
15431550#[ cfg( test) ]
15441551mod tests {
1552+ use std:: collections:: HashMap ;
1553+
15451554 use super :: * ;
1546- use crate :: id ;
1555+ use crate :: { config :: Environment , id } ;
15471556
15481557 #[ cfg( not( target_os = "windows" ) ) ]
15491558 use crate :: file:: PathExt ;
@@ -1598,6 +1607,48 @@ mod tests {
15981607 }
15991608 }
16001609
1610+ #[ test]
1611+ fn test_tag_only_image ( ) -> Result < ( ) > {
1612+ let target: Target = TargetTriple :: X86_64UnknownLinuxGnu . into ( ) ;
1613+ let test = |map, expected_ver : & str , expected_ver_zig : & str | -> Result < ( ) > {
1614+ let env = Environment :: new ( Some ( map) ) ;
1615+ let config = Config :: new_with ( None , env) ;
1616+ for ( uses_zig, expected_ver) in [ ( false , expected_ver) , ( true , expected_ver_zig) ] {
1617+ let expected_image_target = if uses_zig {
1618+ "zig"
1619+ } else {
1620+ "x86_64-unknown-linux-gnu"
1621+ } ;
1622+ let expected = format ! ( "ghcr.io/cross-rs/{expected_image_target}{expected_ver}" ) ;
1623+
1624+ let image = get_image ( & config, & target, uses_zig) ?;
1625+ assert_eq ! ( image. reference. get( ) , expected) ;
1626+ let image_name = get_image_name ( & config, & target, uses_zig) ?;
1627+ assert_eq ! ( image_name, expected) ;
1628+ }
1629+ Ok ( ( ) )
1630+ } ;
1631+
1632+ let default_ver = format ! ( ":{DEFAULT_IMAGE_VERSION}" ) ;
1633+ let mut map = HashMap :: new ( ) ;
1634+ test ( map. clone ( ) , & default_ver, & default_ver) ?;
1635+
1636+ map. insert ( "CROSS_TARGET_X86_64_UNKNOWN_LINUX_GNU_IMAGE" , ":edge" ) ;
1637+ test ( map. clone ( ) , ":edge" , ":edge" ) ?;
1638+
1639+ // `image` always takes precedence over `zig.image`, even when `uses_zig` is `true`
1640+ map. insert (
1641+ "CROSS_TARGET_X86_64_UNKNOWN_LINUX_GNU_ZIG_IMAGE" ,
1642+ "@sha256:foobar" ,
1643+ ) ;
1644+ test ( map. clone ( ) , ":edge" , ":edge" ) ?;
1645+
1646+ map. remove ( "CROSS_TARGET_X86_64_UNKNOWN_LINUX_GNU_IMAGE" ) ;
1647+ test ( map. clone ( ) , & default_ver, "@sha256:foobar" ) ?;
1648+
1649+ Ok ( ( ) )
1650+ }
1651+
16011652 mod directories {
16021653 use super :: * ;
16031654 use crate :: cargo:: cargo_metadata_with_args;
0 commit comments