Skip to content

Commit 57cc9cf

Browse files
committed
Deduplicate/cleanup code in get_image[_name]
1 parent 53a45db commit 57cc9cf

File tree

2 files changed

+54
-52
lines changed

2 files changed

+54
-52
lines changed

src/docker/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ impl ProvidedImage {
3131
pub fn image_name(&self, repository: &str, tag: &str) -> String {
3232
image_name(self.name, self.sub, repository, tag)
3333
}
34+
35+
pub fn default_image_name(&self) -> String {
36+
self.image_name(CROSS_IMAGE, DEFAULT_IMAGE_VERSION)
37+
}
3438
}
3539

3640
pub fn image_name(target: &str, sub: Option<&str>, repository: &str, tag: &str) -> String {

src/docker/shared.rs

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ use std::sync::atomic::{AtomicBool, Ordering};
55
use std::{env, fs, time};
66

77
use super::custom::{Dockerfile, PreBuild};
8-
use super::engine::*;
98
use super::image::PossibleImage;
109
use super::Image;
1110
use super::PROVIDED_IMAGES;
11+
use super::{engine::*, ProvidedImage};
1212
use crate::cargo::CargoMetadata;
1313
use crate::config::Config;
1414
use crate::errors::*;
@@ -26,6 +26,11 @@ pub use super::custom::CROSS_CUSTOM_DOCKERFILE_IMAGE_PREFIX;
2626
pub const CROSS_IMAGE: &str = "ghcr.io/cross-rs";
2727
// note: this is the most common base image for our images
2828
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+
};
2934

3035
#[derive(Debug)]
3136
pub 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

12691290
pub 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

Comments
 (0)