Skip to content

Commit 8d8d84b

Browse files
Merge #1007
1007: volume improvements r=Alexhuszagh a=Emilgardis <img width="998" alt="image" src="https://user-images.githubusercontent.com/1502855/188205513-8d95139e-d839-4540-a763-e66cf6803ee0.png"> Co-authored-by: Emil Gardström <[email protected]>
2 parents ef332d9 + c1a9ee8 commit 8d8d84b

18 files changed

+175
-142
lines changed

src/bin/commands/containers.rs

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
use std::io;
22

33
use clap::{Args, Subcommand};
4+
use cross::docker::ImagePlatform;
5+
use cross::rustc::{QualifiedToolchain, Toolchain};
46
use cross::shell::{MessageInfo, Stream};
57
use cross::{docker, CommandExt, TargetTriple};
6-
use cross::{
7-
docker::ImagePlatform,
8-
rustc::{QualifiedToolchain, Toolchain},
9-
};
108

119
#[derive(Args, Debug)]
1210
pub struct ListVolumes {
@@ -105,7 +103,7 @@ pub struct CreateVolume {
105103
pub engine: Option<String>,
106104
/// Toolchain to create a volume for
107105
#[clap(long, default_value = TargetTriple::DEFAULT.triple(), )]
108-
pub toolchain: TargetTriple,
106+
pub toolchain: String,
109107
}
110108

111109
impl CreateVolume {
@@ -141,7 +139,7 @@ pub struct RemoveVolume {
141139
pub engine: Option<String>,
142140
/// Toolchain to remove the volume for
143141
#[clap(long, default_value = TargetTriple::DEFAULT.triple(), )]
144-
pub toolchain: TargetTriple,
142+
pub toolchain: String,
145143
}
146144

147145
impl RemoveVolume {
@@ -321,11 +319,12 @@ fn get_cross_volumes(
321319
engine: &docker::Engine,
322320
msg_info: &mut MessageInfo,
323321
) -> cross::Result<Vec<String>> {
322+
use cross::docker::remote::VOLUME_PREFIX;
324323
let stdout = docker::subcommand(engine, "volume")
325324
.arg("list")
326-
.args(&["--format", "{{.Name}}"])
325+
.args(["--format", "{{.Name}}"])
327326
// handles simple regex: ^ for start of line.
328-
.args(&["--filter", "name=^cross-"])
327+
.args(["--filter", &format!("name=^{VOLUME_PREFIX}")])
329328
.run_and_get_stdout(msg_info)?;
330329

331330
let mut volumes: Vec<String> = stdout.lines().map(|s| s.to_string()).collect();
@@ -372,7 +371,7 @@ pub fn prune_volumes(
372371
msg_info: &mut MessageInfo,
373372
) -> cross::Result<()> {
374373
let mut command = docker::subcommand(engine, "volume");
375-
command.args(&["prune", "--force"]);
374+
command.args(["prune", "--force"]);
376375
if execute {
377376
command.run(msg_info, false).map_err(Into::into)
378377
} else {
@@ -392,25 +391,21 @@ pub fn create_persistent_volume(
392391
channel: Option<&Toolchain>,
393392
msg_info: &mut MessageInfo,
394393
) -> cross::Result<()> {
395-
let config = cross::config::Config::new(None);
396-
let toolchain_host: cross::Target = toolchain.into();
397-
let mut toolchain = QualifiedToolchain::default(&config, msg_info)?;
398-
toolchain.replace_host(&ImagePlatform::from_target(
399-
toolchain_host.target().clone(),
400-
)?);
394+
let mut toolchain = toolchain_or_target(&toolchain, msg_info)?;
401395
if let Some(channel) = channel {
402-
toolchain = toolchain.with_picked(&config, channel.clone(), msg_info)?;
396+
toolchain.channel = channel.channel.clone();
403397
};
404398
let (dirs, metadata) = docker::get_package_info(engine, toolchain.clone(), msg_info)?;
405-
let container = docker::remote::unique_container_identifier(&toolchain_host, &metadata, &dirs)?;
399+
let container =
400+
docker::remote::unique_container_identifier(&toolchain.host().target, &metadata, &dirs)?;
406401
let volume = dirs.toolchain.unique_toolchain_identifier()?;
407402

408403
if docker::remote::volume_exists(engine, &volume, msg_info)? {
409404
eyre::bail!("Error: volume {volume} already exists.");
410405
}
411406

412407
docker::subcommand(engine, "volume")
413-
.args(&["create", &volume])
408+
.args(["create", &volume])
414409
.run_and_get_status(msg_info, false)?;
415410

416411
// stop the container if it's already running
@@ -427,9 +422,9 @@ pub fn create_persistent_volume(
427422
// create a dummy running container to copy data over
428423
let mount_prefix = docker::remote::MOUNT_PREFIX;
429424
let mut docker = docker::subcommand(engine, "run");
430-
docker.args(&["--name", &container]);
425+
docker.args(["--name", &container]);
431426
docker.arg("--rm");
432-
docker.args(&["-v", &format!("{}:{}", volume, mount_prefix)]);
427+
docker.args(["-v", &format!("{}:{}", volume, mount_prefix)]);
433428
docker.arg("-d");
434429
let is_tty = io::Stdin::is_atty() && io::Stdout::is_atty() && io::Stderr::is_atty();
435430
if is_tty {
@@ -442,7 +437,7 @@ pub fn create_persistent_volume(
442437
// a TTY. this has a few issues though: now, the
443438
// container no longer responds to signals, so the
444439
// container will need to be sig-killed.
445-
docker.args(&["sh", "-c", "sleep infinity"]);
440+
docker.args(["sh", "-c", "sleep infinity"]);
446441
}
447442
// store first, since failing to non-existing container is fine
448443
docker::remote::create_container_deleter(engine.clone(), container.clone());
@@ -483,14 +478,11 @@ pub fn remove_persistent_volume(
483478
channel: Option<&Toolchain>,
484479
msg_info: &mut MessageInfo,
485480
) -> cross::Result<()> {
486-
let config = cross::config::Config::new(None);
487-
let target_host: cross::Target = toolchain.into();
488-
let mut toolchain = QualifiedToolchain::default(&config, msg_info)?;
489-
toolchain.replace_host(&ImagePlatform::from_target(target_host.target().clone())?);
481+
let mut toolchain = toolchain_or_target(&toolchain, msg_info)?;
490482
if let Some(channel) = channel {
491-
toolchain = toolchain.with_picked(&config, channel.clone(), msg_info)?;
483+
toolchain.channel = channel.channel.clone();
492484
};
493-
let (dirs, _) = docker::get_package_info(engine, toolchain.clone(), msg_info)?;
485+
let (dirs, _) = docker::get_package_info(engine, toolchain, msg_info)?;
494486
let volume = dirs.toolchain.unique_toolchain_identifier()?;
495487

496488
if !docker::remote::volume_exists(engine, &volume, msg_info)? {
@@ -506,11 +498,12 @@ fn get_cross_containers(
506498
engine: &docker::Engine,
507499
msg_info: &mut MessageInfo,
508500
) -> cross::Result<Vec<String>> {
501+
use cross::docker::remote::VOLUME_PREFIX;
509502
let stdout = docker::subcommand(engine, "ps")
510503
.arg("-a")
511-
.args(&["--format", "{{.Names}}: {{.State}}"])
504+
.args(["--format", "{{.Names}}: {{.State}}"])
512505
// handles simple regex: ^ for start of line.
513-
.args(&["--filter", "name=^cross-"])
506+
.args(["--filter", &format!("name=^{VOLUME_PREFIX}")])
514507
.run_and_get_stdout(msg_info)?;
515508

516509
let mut containers: Vec<String> = stdout.lines().map(|s| s.to_string()).collect();
@@ -576,3 +569,20 @@ pub fn remove_all_containers(
576569

577570
Ok(())
578571
}
572+
573+
fn toolchain_or_target(
574+
s: &str,
575+
msg_info: &mut MessageInfo,
576+
) -> Result<QualifiedToolchain, color_eyre::Report> {
577+
let config = cross::config::Config::new(None);
578+
let mut toolchain = QualifiedToolchain::default(&config, msg_info)?;
579+
let target_list = cross::rustc::target_list(msg_info)?;
580+
if target_list.contains(s) {
581+
toolchain.replace_host(&ImagePlatform::from_target(s.into())?);
582+
} else {
583+
let picked: Toolchain = s.parse()?;
584+
toolchain = toolchain.with_picked(picked)?;
585+
}
586+
587+
Ok(toolchain)
588+
}

src/bin/commands/images.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,8 @@ fn get_cross_images(
167167
local: bool,
168168
) -> cross::Result<Vec<Image>> {
169169
let mut images: BTreeSet<_> = cross::docker::subcommand(engine, "images")
170-
.args(&["--format", "{{.Repository}}:{{.Tag}} {{.ID}}"])
171-
.args(&[
170+
.args(["--format", "{{.Repository}}:{{.Tag}} {{.ID}}"])
171+
.args([
172172
"--filter",
173173
&format!("label={}.for-cross-target", cross::CROSS_LABEL_DOMAIN),
174174
])
@@ -178,7 +178,7 @@ fn get_cross_images(
178178
.collect();
179179

180180
let stdout = cross::docker::subcommand(engine, "images")
181-
.args(&["--format", "{{.Repository}}:{{.Tag}} {{.ID}}"])
181+
.args(["--format", "{{.Repository}}:{{.Tag}} {{.ID}}"])
182182
.run_and_get_stdout(msg_info)?;
183183
let ids: Vec<_> = images.iter().map(|i| i.id.to_string()).collect();
184184
images.extend(
@@ -239,7 +239,7 @@ fn get_image_target(
239239
}
240240
}
241241
let mut command = cross::docker::subcommand(engine, "inspect");
242-
command.args(&[
242+
command.args([
243243
"--format",
244244
&format!(
245245
r#"{{{{index .Config.Labels "{}.for-cross-target"}}}}"#,
@@ -377,7 +377,7 @@ pub fn remove_target_images(
377377
let target_list = msg_info.as_quiet(cross::rustc::target_list)?;
378378
let mut images = vec![];
379379
for image in cross_images {
380-
let target = dbg!(get_image_target(engine, &image, &target_list, msg_info)?);
380+
let target = get_image_target(engine, &image, &target_list, msg_info)?;
381381
if targets.contains(&target) {
382382
images.push(image);
383383
}

src/bin/cross-util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ enum Commands {
3838
Clean(commands::Clean),
3939
}
4040

41-
fn is_toolchain(toolchain: &str) -> cross::Result<String> {
41+
fn is_toolchain(toolchain: &str) -> cross::Result<Toolchain> {
4242
if toolchain.starts_with('+') {
43-
Ok(toolchain.chars().skip(1).collect())
43+
Ok(toolchain.chars().skip(1).collect::<String>().parse()?)
4444
} else {
4545
let _ = <CliHidden as CommandFactory>::command().get_matches();
4646
unreachable!();

src/build.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ fn commit_info() -> String {
3939

4040
fn commit_hash() -> Result<String, Some> {
4141
let output = Command::new("git")
42-
.args(&["rev-parse", "--short", "HEAD"])
42+
.args(["rev-parse", "--short", "HEAD"])
4343
.output()?;
4444

4545
if output.status.success() {
@@ -51,7 +51,7 @@ fn commit_hash() -> Result<String, Some> {
5151

5252
fn commit_date() -> Result<String, Some> {
5353
let output = Command::new("git")
54-
.args(&["log", "-1", "--date=short", "--pretty=format:%cd"])
54+
.args(["log", "-1", "--date=short", "--pretty=format:%cd"])
5555
.output()?;
5656

5757
if output.status.success() {

src/cargo.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ pub fn cargo_metadata_with_args(
132132
if let Some(channel) = args.and_then(|x| x.channel.as_deref()) {
133133
command.arg(format!("+{channel}"));
134134
}
135-
command.arg("metadata").args(&["--format-version", "1"]);
135+
command.arg("metadata").args(["--format-version", "1"]);
136136
if let Some(cd) = cd {
137137
command.current_dir(cd);
138138
}

src/docker/custom.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,11 +151,11 @@ impl<'a> Dockerfile<'a> {
151151
opts.contains("--load") || opts.contains("--output")
152152
});
153153
if options.engine.kind.is_docker() && !has_output {
154-
docker_build.args(&["--output", "type=docker"]);
154+
docker_build.args(["--output", "type=docker"]);
155155
};
156156

157157
if let Some(context) = self.context() {
158-
docker_build.arg(&context);
158+
docker_build.arg(context);
159159
} else {
160160
docker_build.arg(paths.host_root());
161161
}

src/docker/image.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ impl ImagePlatform {
374374
&& Some(&self.os) == engine.os.as_ref()
375375
{
376376
} else {
377-
cmd.args(&["--platform", &self.docker_platform()]);
377+
cmd.args(["--platform", &self.docker_platform()]);
378378
}
379379
}
380380
}

src/docker/local.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use eyre::Context;
1212
// NOTE: host path must be absolute
1313
fn mount(docker: &mut Command, host_path: &Path, absolute_path: &Path, prefix: &str) -> Result<()> {
1414
let mount_path = absolute_path.as_posix_absolute()?;
15-
docker.args(&[
15+
docker.args([
1616
"-v",
1717
&format!("{}:{prefix}{}:z", host_path.to_utf8()?, mount_path),
1818
]);
@@ -62,36 +62,36 @@ pub(crate) fn run(
6262
docker_user_id(&mut docker, engine.kind);
6363

6464
docker
65-
.args(&[
65+
.args([
6666
"-v",
6767
&format!("{}:{}:z", dirs.xargo.to_utf8()?, dirs.xargo_mount_path()),
6868
])
69-
.args(&[
69+
.args([
7070
"-v",
7171
&format!("{}:{}:z", dirs.cargo.to_utf8()?, dirs.cargo_mount_path()),
7272
])
7373
// Prevent `bin` from being mounted inside the Docker container.
74-
.args(&["-v", &format!("{}/bin", dirs.cargo_mount_path())]);
75-
docker.args(&[
74+
.args(["-v", &format!("{}/bin", dirs.cargo_mount_path())]);
75+
docker.args([
7676
"-v",
7777
&format!("{}:{}:z", dirs.host_root.to_utf8()?, dirs.mount_root),
7878
]);
7979
docker
80-
.args(&[
80+
.args([
8181
"-v",
8282
&format!(
8383
"{}:{}:z,ro",
8484
dirs.get_sysroot().to_utf8()?,
8585
dirs.sysroot_mount_path()
8686
),
8787
])
88-
.args(&["-v", &format!("{}:/target:z", dirs.target.to_utf8()?)]);
88+
.args(["-v", &format!("{}:/target:z", dirs.target.to_utf8()?)]);
8989
docker_cwd(&mut docker, &paths)?;
9090

9191
// When running inside NixOS or using Nix packaging we need to add the Nix
9292
// Store to the running container so it can load the needed binaries.
9393
if let Some(ref nix_store) = dirs.nix_store {
94-
docker.args(&[
94+
docker.args([
9595
"-v",
9696
&format!(
9797
"{}:{}:z",
@@ -113,7 +113,7 @@ pub(crate) fn run(
113113

114114
docker
115115
.arg(&image_name)
116-
.args(&["sh", "-c", &build_command(dirs, &cmd)])
116+
.args(["sh", "-c", &build_command(dirs, &cmd)])
117117
.run_and_get_status(msg_info, false)
118118
.map_err(Into::into)
119119
}

0 commit comments

Comments
 (0)