Skip to content

Commit 55c6526

Browse files
authored
Merge pull request #76 from tomprince/docker-toolchains
Move all cargo invocations into docker.
2 parents b861a91 + a785e2f commit 55c6526

File tree

4 files changed

+52
-57
lines changed

4 files changed

+52
-57
lines changed

src/docker.rs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use dirs::{CARGO_HOME, RUSTUP_HOME};
21
use errors::*;
32
use run;
43
use std::env;
@@ -55,23 +54,7 @@ pub struct ContainerConfig<'a> {
5554
}
5655

5756

58-
pub fn run(source_path: &Path, target_path: &Path, args: &[&str]) -> Result<()> {
59-
60-
info!("running: {}", args.join(" "));
61-
62-
let env = RustEnv {
63-
args: args,
64-
work_dir: (source_path.into(), Perm::ReadOnly),
65-
cargo_home: (Path::new(CARGO_HOME).into(), Perm::ReadOnly),
66-
rustup_home: (Path::new(RUSTUP_HOME).into(), Perm::ReadOnly),
67-
// This is configured as CARGO_TARGET_DIR by the docker container itself
68-
target_dir: (target_path.into(), Perm::ReadWrite),
69-
};
70-
71-
run_container(rust_container(env))
72-
}
73-
74-
pub fn run_container(config: ContainerConfig) -> Result<()> {
57+
pub fn run(config: ContainerConfig) -> Result<()> {
7558
let c = Container::create_container(config)?;
7659
defer!{{
7760
if let Err(e) = c.delete() {

src/ex.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use std::fs;
1212
use std::path::{Path, PathBuf};
1313
use std::str::FromStr;
1414
use toml_frobber;
15-
use toolchain::{self, Toolchain};
15+
use toolchain::{self, CargoState, Toolchain};
1616
use util;
1717

1818
#[derive(Serialize, Deserialize)]
@@ -424,10 +424,9 @@ fn capture_lockfile(ex: &Experiment,
424424
path: &Path,
425425
toolchain: &Toolchain)
426426
-> Result<()> {
427-
let manifest_path = path.join("Cargo.toml").to_string_lossy().to_string();
428-
let args = &["generate-lockfile", "--manifest-path", &*manifest_path];
427+
let args = &["generate-lockfile", "--manifest-path", "Cargo.toml"];
429428
toolchain
430-
.run_cargo(&ex.name, args)
429+
.run_cargo(&ex.name, path, args, CargoState::Unlocked)
431430
.chain_err(|| format!("unable to generate lockfile for {}", crate_))?;
432431

433432
let src_lockfile = &path.join("Cargo.lock");
@@ -472,10 +471,9 @@ pub fn fetch_deps(ex: &Experiment, toolchain: &Toolchain) -> Result<()> {
472471
with_frobbed_toml(ex, c, path)?;
473472
with_captured_lockfile(ex, c, path)?;
474473

475-
let manifest_path = path.join("Cargo.toml").to_string_lossy().to_string();
476-
let args = &["fetch", "--locked", "--manifest-path", &*manifest_path];
474+
let args = &["fetch", "--locked", "--manifest-path", "Cargo.toml"];
477475
toolchain
478-
.run_cargo(&ex.name, args)
476+
.run_cargo(&ex.name, path, args, CargoState::Unlocked)
479477
.chain_err(|| format!("unable to fetch deps for {}", c))?;
480478

481479
Ok(())

src/ex_run.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use results::{CrateResultWriter, ExperimentResultDB, FileDB, TestResult};
66
use std::collections::HashSet;
77
use std::path::Path;
88
use std::time::Instant;
9-
use toolchain::Toolchain;
9+
use toolchain::{CargoState, Toolchain};
1010
use util;
1111

1212
pub fn delete_all_results(ex_name: &str) -> Result<()> {
@@ -173,19 +173,24 @@ fn test_build_and_test(ex: &Experiment,
173173
source_path: &Path,
174174
toolchain: &Toolchain)
175175
-> Result<TestResult> {
176-
let build_r = toolchain.run_cargo_in_docker(&ex.name, source_path, &["build", "--frozen"]);
176+
let build_r = toolchain.run_cargo(&ex.name,
177+
source_path,
178+
&["build", "--frozen"],
179+
CargoState::Locked);
177180
let mut test_r;
178181

179182
if build_r.is_ok() {
180183
// First build, with --no-run
181-
test_r = Some(toolchain.run_cargo_in_docker(&ex.name,
182-
source_path.into(),
183-
&["test", "--frozen", "--no-run"]));
184+
test_r = Some(toolchain.run_cargo(&ex.name,
185+
source_path.into(),
186+
&["test", "--frozen", "--no-run"],
187+
CargoState::Locked));
184188
// Then run
185189
test_r = test_r.map(|_| {
186-
toolchain.run_cargo_in_docker(&ex.name,
187-
source_path.into(),
188-
&["test", "--frozen"])
190+
toolchain.run_cargo(&ex.name,
191+
source_path.into(),
192+
&["test", "--frozen"],
193+
CargoState::Locked)
189194
});
190195
} else {
191196
test_r = None;
@@ -203,7 +208,10 @@ fn test_build_only(ex: &Experiment,
203208
source_path: &Path,
204209
toolchain: &Toolchain)
205210
-> Result<TestResult> {
206-
let r = toolchain.run_cargo_in_docker(&ex.name, source_path.into(), &["build", "--frozen"]);
211+
let r = toolchain.run_cargo(&ex.name,
212+
source_path.into(),
213+
&["build", "--frozen"],
214+
CargoState::Locked);
207215

208216
if r.is_ok() {
209217
Ok(TestResult::TestPass)
@@ -216,7 +224,10 @@ fn test_check_only(ex: &Experiment,
216224
source_path: &Path,
217225
toolchain: &Toolchain)
218226
-> Result<TestResult> {
219-
let r = toolchain.run_cargo_in_docker(&ex.name, source_path.into(), &["check", "--frozen"]);
227+
let r = toolchain.run_cargo(&ex.name,
228+
source_path.into(),
229+
&["check", "--frozen"],
230+
CargoState::Locked);
220231

221232
if r.is_ok() {
222233
Ok(TestResult::TestPass)

src/toolchain.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -181,32 +181,22 @@ pub fn ex_target_dir(ex_name: &str) -> PathBuf {
181181
Path::new(TARGET_DIR).join(ex_name)
182182
}
183183

184+
pub enum CargoState {
185+
Locked,
186+
Unlocked,
187+
}
188+
184189
impl Toolchain {
185190
pub fn target_dir(&self, ex_name: &str) -> PathBuf {
186191
ex_target_dir(ex_name).join(self.to_string())
187192
}
188193

189-
pub fn run_cargo(&self, ex_name: &str, args: &[&str]) -> Result<()> {
190-
let toolchain_name = self.rustup_name();
191-
let ex_target_dir = self.target_dir(ex_name);
192-
193-
fs::create_dir_all(&ex_target_dir)?;
194-
195-
let toolchain_arg = "+".to_string() + &toolchain_name;
196-
let mut full_args = vec![&*toolchain_arg];
197-
full_args.extend_from_slice(args);
198-
199-
let cargo = Path::new(CARGO_HOME).join("bin/cargo");
200-
rustup_run(&cargo.to_string_lossy(),
201-
&full_args,
202-
&[("CARGO_TARGET_DIR", &ex_target_dir.to_string_lossy())])
203-
}
204-
205-
pub fn run_cargo_in_docker(&self,
206-
ex_name: &str,
207-
source_dir: &Path,
208-
args: &[&str])
209-
-> Result<()> {
194+
pub fn run_cargo(&self,
195+
ex_name: &str,
196+
source_dir: &Path,
197+
args: &[&str],
198+
cargo_state: CargoState)
199+
-> Result<()> {
210200
let toolchain_name = self.rustup_name();
211201
let ex_target_dir = self.target_dir(ex_name);
212202

@@ -216,6 +206,19 @@ impl Toolchain {
216206
let mut full_args = vec!["cargo", &*toolchain_arg];
217207
full_args.extend_from_slice(args);
218208

219-
docker::run(source_dir, &ex_target_dir, &full_args)
209+
info!("running: {}", full_args.join(" "));
210+
let rust_env = docker::RustEnv {
211+
args: &full_args,
212+
work_dir: (source_dir.into(), docker::Perm::ReadOnly),
213+
cargo_home: (Path::new(CARGO_HOME).into(),
214+
match cargo_state {
215+
CargoState::Locked => docker::Perm::ReadOnly,
216+
CargoState::Unlocked => docker::Perm::ReadWrite,
217+
}),
218+
rustup_home: (Path::new(RUSTUP_HOME).into(), docker::Perm::ReadOnly),
219+
// This is configured as CARGO_TARGET_DIR by the docker container itself
220+
target_dir: (ex_target_dir, docker::Perm::ReadWrite),
221+
};
222+
docker::run(docker::rust_container(rust_env))
220223
}
221224
}

0 commit comments

Comments
 (0)