Skip to content

Commit

Permalink
Allow hiding some revisions from command line output
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Aug 15, 2024
1 parent 7599f58 commit 491fda4
Show file tree
Hide file tree
Showing 12 changed files with 56 additions and 98 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Removed

* `TestStatus::update_status`, instead use a revision if you want to run subcommands

## [0.25.0] - 2024-07-24

### Added
Expand Down
7 changes: 5 additions & 2 deletions src/build_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,10 @@ use std::{
sync::{Arc, OnceLock, RwLock},
};

use crate::{status_emitter::StatusEmitter, Config, Errored};
use crate::{
status_emitter::{RevisionStyle, StatusEmitter},
Config, Errored,
};

/// A build shared between all tests of the same `BuildManager`
pub trait Build {
Expand Down Expand Up @@ -83,7 +86,7 @@ impl<'a> BuildManager<'a> {
let build = self
.status_emitter
.register_test(what.description().into())
.for_revision("");
.for_revision("", RevisionStyle::Parent);
let res = what.build(self).map_err(|e| err = Some(e));
build.done(
&res.as_ref()
Expand Down
6 changes: 3 additions & 3 deletions src/custom_flags/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ use spanned::Spanned;
use std::process::{Command, Output};

use crate::{
build_manager::BuildManager, display, per_test_config::TestConfig, Error, Errored, TestOk,
TestRun,
build_manager::BuildManager, display, per_test_config::TestConfig,
status_emitter::RevisionStyle, Error, Errored, TestOk, TestRun,
};

use super::Flag;
Expand Down Expand Up @@ -37,7 +37,7 @@ impl Flag for Run {
config: config.config.clone(),
comments: config.comments,
aux_dir: config.aux_dir,
status: config.status.for_revision(&revision),
status: config.status.for_revision(&revision, RevisionStyle::Show),
};
cmd.arg("--print").arg("file-names");
let output = cmd.output().unwrap();
Expand Down
8 changes: 5 additions & 3 deletions src/dependencies.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ use crate::{
build_manager::{Build, BuildManager},
custom_flags::Flag,
per_test_config::TestConfig,
status_emitter::RevisionStyle,
test_result::Errored,
CommandBuilder, Config, OutputConflictHandling, TestOk,
};
Expand Down Expand Up @@ -390,9 +391,10 @@ impl Flag for DependencyBuilder {
config: &TestConfig<'_>,
build_manager: &BuildManager<'_>,
) -> Result<(), Errored> {
let status = config
.status
.for_revision("waiting for dependencies to finish building".into());
let status = config.status.for_revision(
"waiting for dependencies to finish building".into(),
RevisionStyle::Quiet,
);
match build_manager.build(self.clone()) {
Ok(extra_args) => {
cmd.args(extra_args);
Expand Down
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ pub use core::CrateType;
pub use filter::Match;
use per_test_config::TestConfig;
use spanned::Spanned;
use status_emitter::RevisionStyle;
use status_emitter::{StatusEmitter, TestStatus};
use std::collections::VecDeque;
use std::path::Path;
Expand Down Expand Up @@ -326,7 +327,7 @@ fn parse_and_test_file(
let revisions = comments.revisions.as_deref().unwrap_or(EMPTY);
let mut runs = vec![];
for revision in revisions {
let status = status.for_revision(revision);
let status = status.for_revision(revision, RevisionStyle::Show);
// Ignore file if only/ignore rules do (not) apply
if !config.test_file_conditions(&comments, revision) {
runs.push(TestRun {
Expand Down
49 changes: 39 additions & 10 deletions src/status_emitter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,22 @@ pub trait StatusEmitter: Sync + RefUnwindSafe {
) -> Box<dyn Summary>;
}

/// Some configuration options for revisions
#[derive(Debug, Clone, Copy)]
pub enum RevisionStyle {
/// Things like dependencies or aux files building are noise in non-interactif mode
/// and thus silenced.
Quiet,
/// Always show them, even if rendering to a file
Show,
/// The parent, only show in indicatif mode and on failure
Parent,
}

/// Information about a specific test run.
pub trait TestStatus: Send + Sync + RefUnwindSafe {
/// Create a copy of this test for a new revision.
fn for_revision(&self, revision: &str) -> Box<dyn TestStatus>;
fn for_revision(&self, revision: &str, style: RevisionStyle) -> Box<dyn TestStatus>;

/// Create a copy of this test for a new path.
fn for_path(&self, path: &Path) -> Box<dyn TestStatus>;
Expand Down Expand Up @@ -108,7 +120,7 @@ pub struct SilentStatus {
}

impl TestStatus for SilentStatus {
fn for_revision(&self, revision: &str) -> Box<dyn TestStatus> {
fn for_revision(&self, revision: &str, _style: RevisionStyle) -> Box<dyn TestStatus> {
Box::new(SilentStatus {
revision: revision.into(),
path: self.path.clone(),
Expand Down Expand Up @@ -286,6 +298,7 @@ struct TextTest {
path: PathBuf,
revision: String,
first: AtomicBool,
style: RevisionStyle,
}

impl TextTest {
Expand Down Expand Up @@ -313,8 +326,18 @@ impl TestStatus for TextTest {
let old_msg = self.msg();
let msg = format!("... {result}");
if ProgressDrawTarget::stdout().is_hidden() {
println!("{old_msg} {msg}");
std::io::stdout().flush().unwrap();
match self.style {
RevisionStyle::Quiet => {}
RevisionStyle::Show | RevisionStyle::Parent => {
let revision = if self.revision.is_empty() {
String::new()
} else {
format!(" (revision `{}`)", self.revision)
};
println!("{}{revision} {msg}", display(&self.path));
std::io::stdout().flush().unwrap();
}
}
}
self.text.sender.send(Msg::Pop(old_msg, Some(msg))).unwrap();
}
Expand Down Expand Up @@ -360,7 +383,7 @@ impl TestStatus for TextTest {
&self.path
}

fn for_revision(&self, revision: &str) -> Box<dyn TestStatus> {
fn for_revision(&self, revision: &str, style: RevisionStyle) -> Box<dyn TestStatus> {
if !self.first.swap(false, std::sync::atomic::Ordering::Relaxed)
&& self.text.is_quiet_output()
{
Expand All @@ -372,6 +395,7 @@ impl TestStatus for TextTest {
path: self.path.clone(),
revision: revision.to_owned(),
first: AtomicBool::new(false),
style,
};
self.text.sender.send(Msg::Push(text.msg())).unwrap();
Box::new(text)
Expand All @@ -383,6 +407,7 @@ impl TestStatus for TextTest {
path: path.to_path_buf(),
revision: self.revision.clone(),
first: AtomicBool::new(false),
style: RevisionStyle::Show,
};
self.text.sender.send(Msg::Push(text.msg())).unwrap();
Box::new(text)
Expand All @@ -403,6 +428,7 @@ impl StatusEmitter for Text {
path,
revision: String::new(),
first: AtomicBool::new(true),
style: RevisionStyle::Parent,
})
}

Expand Down Expand Up @@ -904,7 +930,7 @@ impl<const GROUP: bool> TestStatus for PathAndRev<GROUP> {
&self.path
}

fn for_revision(&self, revision: &str) -> Box<dyn TestStatus> {
fn for_revision(&self, revision: &str, _style: RevisionStyle) -> Box<dyn TestStatus> {
Box::new(Self {
path: self.path.clone(),
revision: revision.to_owned(),
Expand Down Expand Up @@ -1035,8 +1061,11 @@ impl<T: TestStatus, U: TestStatus> TestStatus for (T, U) {
rev
}

fn for_revision(&self, revision: &str) -> Box<dyn TestStatus> {
Box::new((self.0.for_revision(revision), self.1.for_revision(revision)))
fn for_revision(&self, revision: &str, style: RevisionStyle) -> Box<dyn TestStatus> {
Box::new((
self.0.for_revision(revision, style),
self.1.for_revision(revision, style),
))
}

fn for_path(&self, path: &Path) -> Box<dyn TestStatus> {
Expand Down Expand Up @@ -1079,8 +1108,8 @@ impl<T: TestStatus + ?Sized> TestStatus for Box<T> {
(**self).revision()
}

fn for_revision(&self, revision: &str) -> Box<dyn TestStatus> {
(**self).for_revision(revision)
fn for_revision(&self, revision: &str, style: RevisionStyle) -> Box<dyn TestStatus> {
(**self).for_revision(revision, style)
}

fn for_path(&self, path: &Path) -> Box<dyn TestStatus> {
Expand Down
1 change: 0 additions & 1 deletion tests/integrations/basic-bin/Cargo.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished

Building dependencies ... ok
tests/actual_tests/foomp.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/foomp.rs ... ok

test result: ok. 1 passed
Expand Down
1 change: 0 additions & 1 deletion tests/integrations/basic-fail-mode/Cargo.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ running 3 tests
test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished

Building dependencies ... ok
tests/actual_tests/foomp.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/foomp.rs ... ok

test result: ok. 1 passed
Expand Down
47 changes: 0 additions & 47 deletions tests/integrations/basic-fail/Cargo.stdout
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,19 @@ running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished

Building dependencies ... ok
tests/actual_tests/bad_pattern.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/bad_pattern.rs ... FAILED
tests/actual_tests/executable.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/executable.rs (revision `run`) ... FAILED
tests/actual_tests/executable.rs ... ok
tests/actual_tests/executable_compile_err.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/executable_compile_err.rs ... FAILED
tests/actual_tests/exit_code_fail.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/exit_code_fail.rs ... FAILED
tests/actual_tests/filters.rs ... FAILED
tests/actual_tests/foomp.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/foomp.rs ... FAILED
tests/actual_tests/foomp2.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/foomp2.rs ... FAILED
tests/actual_tests/inline_chain.rs ... FAILED
tests/actual_tests/joined_wrong_order.rs ... FAILED
tests/actual_tests/lone_joined_pattern.rs ... FAILED
tests/actual_tests/pattern_too_many_arrow.rs ... FAILED
tests/actual_tests/pattern_too_many_arrow_above.rs ... FAILED
tests/actual_tests/rustc_ice.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests/rustc_ice.rs ... FAILED
tests/actual_tests/touching_above_below.rs ... FAILED
tests/actual_tests/touching_above_below_chain.rs ... FAILED
Expand Down Expand Up @@ -462,90 +455,58 @@ FAILURES:
test result: FAIL. 15 failed; 1 passed

Building dependencies ... ok
tests/actual_tests_bless/abort.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/abort.rs (revision `run`) ... FAILED
tests/actual_tests_bless/abort.rs ... ok
tests/actual_tests_bless/aux_build_not_found.rs ... FAILED
tests/actual_tests_bless/aux_proc_macro_misuse.rs ... FAILED
Building aux file tests/actual_tests_bless/auxiliary/the_proc_macro.rs ... ok
tests/actual_tests_bless/aux_proc_macro_no_main.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/aux_proc_macro_no_main.rs ... FAILED
tests/actual_tests_bless/compile_flags_quotes.rs ... FAILED
tests/actual_tests_bless/compiletest-rs-command.rs ... FAILED
tests/actual_tests_bless/failing_executable.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/failing_executable.rs (revision `run`) ... FAILED
tests/actual_tests_bless/failing_executable.rs ... ok
Building aux file tests/actual_tests_bless/auxiliary/foomp.rs ... ok
tests/actual_tests_bless/foomp_aux.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/foomp_aux.rs ... ok
Building aux file tests/actual_tests_bless/auxiliary/nested.rs ... ok
tests/actual_tests_bless/nested_aux.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/nested_aux.rs ... ok
tests/actual_tests_bless/no_main.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/no_main.rs ... FAILED
tests/actual_tests_bless/no_main_manual.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/no_main_manual.rs ... FAILED
tests/actual_tests_bless/no_test.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/no_test.rs ... FAILED
tests/actual_tests_bless/non_top_level_configs.rs ... FAILED
tests/actual_tests_bless/pass.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/pass.rs ... ok
tests/actual_tests_bless/pass_with_annotation.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/pass_with_annotation.rs ... FAILED
tests/actual_tests_bless/revised_revision.rs ... FAILED
tests/actual_tests_bless/revisioned_executable.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisioned_executable.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisioned_executable.rs (revision `run.run`) ... ok
tests/actual_tests_bless/revisioned_executable.rs (revision `run`) ... ok
tests/actual_tests_bless/revisioned_executable.rs (revision `panic.run`) ... FAILED
tests/actual_tests_bless/revisioned_executable.rs (revision `panic`) ... ok
tests/actual_tests_bless/revisioned_executable_panic.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisioned_executable_panic.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisioned_executable_panic.rs (revision `run.run`) ... FAILED
tests/actual_tests_bless/revisioned_executable_panic.rs (revision `run`) ... ok
tests/actual_tests_bless/revisioned_executable_panic.rs (revision `panic.run`) ... ok
tests/actual_tests_bless/revisioned_executable_panic.rs (revision `panic`) ... ok
tests/actual_tests_bless/revisions.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions.rs (revision `foo`) ... ok
tests/actual_tests_bless/revisions.rs (revision `bar`) ... ok
tests/actual_tests_bless/revisions_bad.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions_bad.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions_bad.rs (revision `foo`) ... ok
tests/actual_tests_bless/revisions_bad.rs (revision `bar`) ... FAILED
tests/actual_tests_bless/revisions_filter.rs (revision `foo`) ... ignored (in-test comment)
tests/actual_tests_bless/revisions_filter.rs (revision `bar`) ... ignored (in-test comment)
tests/actual_tests_bless/revisions_filter2.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions_filter2.rs (revision `foo`) ... ignored (in-test comment)
tests/actual_tests_bless/revisions_filter2.rs (revision `bar`) ... ok
tests/actual_tests_bless/revisions_multiple_per_annotation.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions_multiple_per_annotation.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions_multiple_per_annotation.rs (revision `foo`) ... ok
tests/actual_tests_bless/revisions_multiple_per_annotation.rs (revision `bar`) ... ok
tests/actual_tests_bless/revisions_same_everywhere.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions_same_everywhere.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/revisions_same_everywhere.rs (revision `foo`) ... ok
tests/actual_tests_bless/revisions_same_everywhere.rs (revision `bar`) ... ok
tests/actual_tests_bless/run_panic.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/run_panic.rs (revision `run`) ... ok
tests/actual_tests_bless/run_panic.rs ... ok
tests/actual_tests_bless/rustfix-fail-revisions.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/rustfix-fail-revisions.a.fixed (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/rustfix-fail-revisions.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/rustfix-fail-revisions.b.fixed (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/rustfix-fail-revisions.a.fixed (revision `a`) ... FAILED
tests/actual_tests_bless/rustfix-fail-revisions.rs (revision `a`) ... ok
tests/actual_tests_bless/rustfix-fail-revisions.b.fixed (revision `b`) ... FAILED
tests/actual_tests_bless/rustfix-fail-revisions.rs (revision `b`) ... ok
tests/actual_tests_bless/rustfix-fail.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/rustfix-fail.fixed (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/rustfix-fail.fixed ... FAILED
tests/actual_tests_bless/rustfix-fail.rs ... ok
tests/actual_tests_bless/unicode.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/unicode.rs ... FAILED
tests/actual_tests_bless/unknown_revision.rs ... FAILED
tests/actual_tests_bless/unknown_revision2.rs ... FAILED
tests/actual_tests_bless/wrong_diagnostic_code.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless/wrong_diagnostic_code.rs ... FAILED

FAILED TEST: tests/actual_tests_bless/abort.rs (revision `run`)
Expand Down Expand Up @@ -1120,18 +1081,10 @@ FAILURES:
test result: FAIL. 23 failed; 24 passed; 3 ignored

Building dependencies ... ok
tests/actual_tests_bless_yolo/revisions_bad.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/revisions_bad.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/revisions_bad.rs (revision `foo`) ... ok
tests/actual_tests_bless_yolo/revisions_bad.rs (revision `bar`) ... ok
tests/actual_tests_bless_yolo/rustfix-maybe-incorrect.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/rustfix-maybe-incorrect.fixed (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/rustfix-maybe-incorrect.fixed ... ok
tests/actual_tests_bless_yolo/rustfix-maybe-incorrect.rs ... ok
tests/actual_tests_bless_yolo/rustfix-multiple-fail.rs (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/rustfix-multiple-fail.1.fixed (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/rustfix-multiple-fail.2.fixed (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/rustfix-multiple-fail.3.fixed (revision `waiting for dependencies to finish building`) ... ok
tests/actual_tests_bless_yolo/rustfix-multiple-fail.1.fixed ... ok
tests/actual_tests_bless_yolo/rustfix-multiple-fail.2.fixed ... FAILED
tests/actual_tests_bless_yolo/rustfix-multiple-fail.3.fixed ... ok
Expand Down
Loading

0 comments on commit 491fda4

Please sign in to comment.