From 4fa79ee02ff0c07c4670166e17b879d809569539 Mon Sep 17 00:00:00 2001 From: Chris Pearce Date: Sun, 7 Apr 2019 17:12:03 +0100 Subject: [PATCH 1/3] Extract command builders into util --- src/run.rs | 17 +++++++---------- src/util.rs | 25 +++++++++++++++++++++++++ src/verify.rs | 25 +++++++++---------------- 3 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/run.rs b/src/run.rs index 613ec2b..e71b91d 100644 --- a/src/run.rs +++ b/src/run.rs @@ -1,9 +1,8 @@ -use crate::util::clean; +use crate::util; use crate::verify::test; use console::{style, Emoji}; use indicatif::ProgressBar; use std::fs; -use std::process::Command; use toml::Value; pub fn run(matches: clap::ArgMatches) -> Result<(), ()> { @@ -33,20 +32,18 @@ pub fn compile_and_run(filename: &str) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", filename).as_str()); progress_bar.enable_steady_tick(100); - let compilecmd = Command::new("rustc") - .args(&[filename, "-o", "temp", "--color", "always"]) - .output() - .expect("fail"); + + let compilecmd = util::compile_cmd(filename); progress_bar.set_message(format!("Running {}...", filename).as_str()); if compilecmd.status.success() { - let runcmd = Command::new("./temp").output().expect("fail"); + let runcmd = util::run_cmd(); progress_bar.finish_and_clear(); if runcmd.status.success() { println!("{}", String::from_utf8_lossy(&runcmd.stdout)); let formatstr = format!("{} Successfully ran {}", Emoji("✅", "✓"), filename); println!("{}", style(formatstr).green()); - clean(); + util::clean(); Ok(()) } else { println!("{}", String::from_utf8_lossy(&runcmd.stdout)); @@ -54,7 +51,7 @@ pub fn compile_and_run(filename: &str) -> Result<(), ()> { let formatstr = format!("{} Ran {} with errors", Emoji("⚠️ ", "!"), filename); println!("{}", style(formatstr).red()); - clean(); + util::clean(); Err(()) } } else { @@ -66,7 +63,7 @@ pub fn compile_and_run(filename: &str) -> Result<(), ()> { ); println!("{}", style(formatstr).red()); println!("{}", String::from_utf8_lossy(&compilecmd.stderr)); - clean(); + util::clean(); Err(()) } } diff --git a/src/util.rs b/src/util.rs index 4a96ee9..8fcf693 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,4 +1,29 @@ use std::fs::remove_file; +use std::process::{Command, Output}; + +const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; + +pub fn compile_test_cmd(filename: &str) -> Output { + Command::new("rustc") + .args(&["--test", filename, "-o", "temp"]) + .args(RUSTC_COLOR_ARGS) + .output() + .expect("failed to compile exercise") +} + +pub fn compile_cmd(filename: &str) -> Output { + Command::new("rustc") + .args(&[filename, "-o", "temp"]) + .args(RUSTC_COLOR_ARGS) + .output() + .expect("failed to compile exercise") +} + +pub fn run_cmd() -> Output { + Command::new("./temp") + .output() + .expect("failed to run exercise") +} pub fn clean() { let _ignored = remove_file("temp"); diff --git a/src/verify.rs b/src/verify.rs index 5aa2f5c..afe0884 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -1,8 +1,7 @@ -use crate::util::clean; +use crate::util; use console::{style, Emoji}; use indicatif::ProgressBar; use std::fs; -use std::process::Command; use toml::Value; pub fn verify(start_at: Option<&str>) -> Result<(), ()> { @@ -34,10 +33,7 @@ fn compile_only(filename: &str) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Compiling {}...", filename).as_str()); progress_bar.enable_steady_tick(100); - let compilecmd = Command::new("rustc") - .args(&[filename, "-o", "temp", "--color", "always"]) - .output() - .expect("fail"); + let compilecmd = util::compile_cmd(filename); progress_bar.finish_and_clear(); if compilecmd.status.success() { let formatstr = format!( @@ -46,7 +42,7 @@ fn compile_only(filename: &str) -> Result<(), ()> { filename ); println!("{}", style(formatstr).green()); - clean(); + util::clean(); Ok(()) } else { let formatstr = format!( @@ -56,7 +52,7 @@ fn compile_only(filename: &str) -> Result<(), ()> { ); println!("{}", style(formatstr).red()); println!("{}", String::from_utf8_lossy(&compilecmd.stderr)); - clean(); + util::clean(); Err(()) } } @@ -65,19 +61,16 @@ pub fn test(filename: &str) -> Result<(), ()> { let progress_bar = ProgressBar::new_spinner(); progress_bar.set_message(format!("Testing {}...", filename).as_str()); progress_bar.enable_steady_tick(100); - let testcmd = Command::new("rustc") - .args(&["--test", filename, "-o", "temp", "--color", "always"]) - .output() - .expect("fail"); + let testcmd = util::compile_test_cmd(filename); if testcmd.status.success() { progress_bar.set_message(format!("Running {}...", filename).as_str()); - let runcmd = Command::new("./temp").output().expect("fail"); + let runcmd = util::run_cmd(); progress_bar.finish_and_clear(); if runcmd.status.success() { let formatstr = format!("{} Successfully tested {}!", Emoji("✅", "✓"), filename); println!("{}", style(formatstr).green()); - clean(); + util::clean(); Ok(()) } else { let formatstr = format!( @@ -87,7 +80,7 @@ pub fn test(filename: &str) -> Result<(), ()> { ); println!("{}", style(formatstr).red()); println!("{}", String::from_utf8_lossy(&runcmd.stdout)); - clean(); + util::clean(); Err(()) } } else { @@ -99,7 +92,7 @@ pub fn test(filename: &str) -> Result<(), ()> { ); println!("{}", style(formatstr).red()); println!("{}", String::from_utf8_lossy(&testcmd.stderr)); - clean(); + util::clean(); Err(()) } } From 592ae6b4d2b4745704dfb3ed10bbc5a60d3cacfc Mon Sep 17 00:00:00 2001 From: Chris Pearce Date: Sun, 7 Apr 2019 17:28:51 +0100 Subject: [PATCH 2/3] Add process id to temp file name --- src/util.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/util.rs b/src/util.rs index 8fcf693..6bac972 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,11 +1,15 @@ use std::fs::remove_file; -use std::process::{Command, Output}; +use std::process::{self, Command, Output}; const RUSTC_COLOR_ARGS: &[&str] = &["--color", "always"]; +fn temp_file() -> String { + format!("./temp_{}", process::id()) +} + pub fn compile_test_cmd(filename: &str) -> Output { Command::new("rustc") - .args(&["--test", filename, "-o", "temp"]) + .args(&["--test", filename, "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .output() .expect("failed to compile exercise") @@ -13,25 +17,25 @@ pub fn compile_test_cmd(filename: &str) -> Output { pub fn compile_cmd(filename: &str) -> Output { Command::new("rustc") - .args(&[filename, "-o", "temp"]) + .args(&[filename, "-o", &temp_file()]) .args(RUSTC_COLOR_ARGS) .output() .expect("failed to compile exercise") } pub fn run_cmd() -> Output { - Command::new("./temp") + Command::new(&temp_file()) .output() .expect("failed to run exercise") } pub fn clean() { - let _ignored = remove_file("temp"); + let _ignored = remove_file(&temp_file()); } #[test] fn test_clean() { - std::fs::File::create("temp").unwrap(); + std::fs::File::create(&temp_file()).unwrap(); clean(); - assert!(!std::path::Path::new("temp").exists()); + assert!(!std::path::Path::new(&temp_file()).exists()); } From 65cb09eb2eea950998e3b90ed085bd52e468d29e Mon Sep 17 00:00:00 2001 From: Chris Pearce Date: Sun, 7 Apr 2019 21:23:02 +0100 Subject: [PATCH 3/3] Update ci test command to allow multithreaded tests --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 53b265a..d32179a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ rust: - stable - beta - nightly -script: cargo test --verbose -- --test-threads=1 +script: cargo test --verbose matrix: allow_failures: - rust: nightly