allow RUST_BACKTRACE=0 to act as if unset

/# This is a combination of 16 commits.
/# The first commit's message is:
allow RUST_BACKTRACE=disabled to act as if unset

When RUST_BACKTRACE is set to "disabled" then this acts as if the env.
var is unset.

/# This is the 2nd commit message:

case insensitive "DiSaBLeD" RUST_BACKTRACE value

previously it expected a lowercase "disabled" to treat the env. var as
unset

/# This is the 3rd commit message:

RUST_BACKTRACE=0 acts as if unset

previously RUST_BACKTRACE=disabled was doing the same thing

/# This is the 4th commit message:

RUST_BACKTRACE=0|n|no|off acts as if unset

previously only RUST_BACKTRACE=0 acted as if RUST_BACKTRACE was unset
Now added more options (case-insensitive): 'n','no' and 'off'
eg. RUST_BACKTRACE=oFF

/# This is the 5th commit message:

DRY on the value of 2

DRY=don't repeat yourself
Because having to remember to keep the two places of '2' in sync is not
ideal, even though this is a simple enough case.

/# This is the 6th commit message:

Revert "DRY on the value of 2"

This reverts commit 95a0479d5cf72a2b2d9d21ec0bed2823ed213fef.

Nevermind this DRY on 2, because we already have a RY on 1,
besides the code is less readable this way...

/# This is the 7th commit message:

attempt to document unsetting RUST_BACKTRACE

/# This is the 8th commit message:

curb allocations when checking for RUST_BACKTRACE

this means we don't check for case-insensitivity anymore

/# This is the 9th commit message:

as decided, RUST_BACKTRACE=0 turns off backtrace

/# This is the 10th commit message:

RUST_TEST_NOCAPTURE=0 acts as if unset

(that is, capture is on)

Any other value acts as if nocapture is enabled (that is, capture is off)

/# This is the 11th commit message:

update other RUST_TEST_NOCAPTURE occurrences

apparently only one place needs updating

/# This is the 12th commit message:

update RUST_BACKTRACE in man page

/# This is the 13th commit message:

handle an occurrence of RUST_BACKTRACE

/# This is the 14th commit message:

ensure consistency with new rules for backtrace

/# This is the 15th commit message:

a more concise comment for RUST_TEST_NOCAPTURE

/# This is the 16th commit message:

update RUST_TEST_NOCAPTURE in man page
This commit is contained in:
Emanuel Czirai 2016-03-28 14:41:55 +02:00
parent 3399d19a2c
commit e1d2eda7f3
9 changed files with 59 additions and 17 deletions

View File

@ -71,7 +71,8 @@ which includes important information about what platform you're on, what
version of Rust you're using, etc. version of Rust you're using, etc.
Sometimes, a backtrace is helpful, and so including that is nice. To get Sometimes, a backtrace is helpful, and so including that is nice. To get
a backtrace, set the `RUST_BACKTRACE` environment variable. The easiest way a backtrace, set the `RUST_BACKTRACE` environment variable to a value
other than `0`. The easiest way
to do this is to invoke `rustc` like this: to do this is to invoke `rustc` like this:
```bash ```bash

View File

@ -268,7 +268,7 @@ the maximum number of threads used for this purpose.
.TP .TP
\fBRUST_TEST_NOCAPTURE\fR \fBRUST_TEST_NOCAPTURE\fR
A synonym for the --nocapture flag. If set to a value other than "0", a synonym for the --nocapture flag.
.TP .TP
\fBRUST_MIN_STACK\fR \fBRUST_MIN_STACK\fR
@ -276,7 +276,7 @@ Sets the minimum stack size for new threads.
.TP .TP
\fBRUST_BACKTRACE\fR \fBRUST_BACKTRACE\fR
If set, produces a backtrace in the output of a program which panics. If set to a value different than "0", produces a backtrace in the output of a program which panics.
.SH "EXAMPLES" .SH "EXAMPLES"
To build an executable from a source file with a main function: To build an executable from a source file with a main function:

View File

@ -263,7 +263,10 @@ pub fn test_opts(config: &Config) -> test::TestOpts {
logfile: config.logfile.clone(), logfile: config.logfile.clone(),
run_tests: true, run_tests: true,
bench_benchmarks: true, bench_benchmarks: true,
nocapture: env::var("RUST_TEST_NOCAPTURE").is_ok(), nocapture: match env::var("RUST_TEST_NOCAPTURE") {
Ok(val) => &val != "0",
Err(_) => false
},
color: test::AutoColor, color: test::AutoColor,
} }
} }

View File

@ -246,6 +246,19 @@ stack backtrace:
13: 0x0 - <unknown> 13: 0x0 - <unknown>
``` ```
If you need to override an already set `RUST_BACKTRACE`,
in cases when you cannot just unset the variable,
then set it to `0` to avoid getting a backtrace.
Any other value(even no value at all) turns on backtrace.
```text
$ export RUST_BACKTRACE=1
...
$ RUST_BACKTRACE=0 ./diverges
thread '<main>' panicked at 'This function never returns!', hello.rs:2
note: Run with `RUST_BACKTRACE=1` for a backtrace.
```
`RUST_BACKTRACE` also works with Cargos `run` command: `RUST_BACKTRACE` also works with Cargos `run` command:
```text ```text

View File

@ -1059,7 +1059,10 @@ pub fn monitor<F: FnOnce() + Send + 'static>(f: F) {
for note in &xs { for note in &xs {
emitter.emit(None, &note[..], None, errors::Level::Note) emitter.emit(None, &note[..], None, errors::Level::Note)
} }
if let None = env::var_os("RUST_BACKTRACE") { if match env::var_os("RUST_BACKTRACE") {
Some(val) => &val != "0",
None => false,
} {
emitter.emit(None, emitter.emit(None,
"run with `RUST_BACKTRACE=1` for a backtrace", "run with `RUST_BACKTRACE=1` for a backtrace",
None, None,

View File

@ -36,7 +36,7 @@ pub fn log_enabled() -> bool {
} }
let val = match env::var_os("RUST_BACKTRACE") { let val = match env::var_os("RUST_BACKTRACE") {
Some(..) => 2, Some(x) => if &x == "0" { 1 } else { 2 },
None => 1, None => 1,
}; };
ENABLED.store(val, Ordering::SeqCst); ENABLED.store(val, Ordering::SeqCst);

View File

@ -349,8 +349,8 @@ By default, all tests are run in parallel. This can be altered with the
RUST_TEST_THREADS environment variable when running tests (set it to 1). RUST_TEST_THREADS environment variable when running tests (set it to 1).
All tests have their standard output and standard error captured by default. All tests have their standard output and standard error captured by default.
This can be overridden with the --nocapture flag or the RUST_TEST_NOCAPTURE=1 This can be overridden with the --nocapture flag or setting RUST_TEST_NOCAPTURE
environment variable. Logging is not captured by default. environment variable to a value other than "0". Logging is not captured by default.
Test Attributes: Test Attributes:
@ -399,7 +399,10 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
let mut nocapture = matches.opt_present("nocapture"); let mut nocapture = matches.opt_present("nocapture");
if !nocapture { if !nocapture {
nocapture = env::var("RUST_TEST_NOCAPTURE").is_ok(); nocapture = match env::var("RUST_TEST_NOCAPTURE") {
Ok(val) => &val != "0",
Err(_) => false
};
} }
let color = match matches.opt_str("color").as_ref().map(|s| &**s) { let color = match matches.opt_str("color").as_ref().map(|s| &**s) {

View File

@ -86,6 +86,16 @@ fn runtest(me: &str) {
assert!(!s.contains("stack backtrace") && !s.contains(&expected("foo")), assert!(!s.contains("stack backtrace") && !s.contains(&expected("foo")),
"bad output2: {}", s); "bad output2: {}", s);
// Make sure the stack trace is *not* printed
// (RUST_BACKTRACE=0 acts as if it were unset from our own environment,
// in case developer is running `make check` with it set.)
let p = template(me).arg("fail").env("RUST_BACKTRACE","0").spawn().unwrap();
let out = p.wait_with_output().unwrap();
assert!(!out.status.success());
let s = str::from_utf8(&out.stderr).unwrap();
assert!(!s.contains("stack backtrace") && !s.contains(" - foo"),
"bad output3: {}", s);
// Make sure a stack trace is printed // Make sure a stack trace is printed
let p = template(me).arg("double-fail").spawn().unwrap(); let p = template(me).arg("double-fail").spawn().unwrap();
let out = p.wait_with_output().unwrap(); let out = p.wait_with_output().unwrap();

View File

@ -8,6 +8,17 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
fn check_for_no_backtrace(test: std::process::Output) {
assert!(!test.status.success());
let err = String::from_utf8_lossy(&test.stderr);
let mut it = err.lines();
assert_eq!(it.next().map(|l| l.starts_with("thread '<unnamed>' panicked at")), Some(true));
assert_eq!(it.next(), Some("note: Run with `RUST_BACKTRACE=1` for a backtrace."));
assert_eq!(it.next().map(|l| l.starts_with("thread '<main>' panicked at")), Some(true));
assert_eq!(it.next(), None);
}
fn main() { fn main() {
let args: Vec<String> = std::env::args().collect(); let args: Vec<String> = std::env::args().collect();
if args.len() > 1 && args[1] == "run_test" { if args.len() > 1 && args[1] == "run_test" {
@ -21,13 +32,11 @@ fn main() {
.env_remove("RUST_BACKTRACE") .env_remove("RUST_BACKTRACE")
.output() .output()
.unwrap(); .unwrap();
assert!(!test.status.success()); check_for_no_backtrace(test);
let err = String::from_utf8_lossy(&test.stderr); let test = std::process::Command::new(&args[0]).arg("run_test")
let mut it = err.lines(); .env("RUST_BACKTRACE","0")
.output()
assert_eq!(it.next().map(|l| l.starts_with("thread '<unnamed>' panicked at")), Some(true)); .unwrap();
assert_eq!(it.next(), Some("note: Run with `RUST_BACKTRACE=1` for a backtrace.")); check_for_no_backtrace(test);
assert_eq!(it.next().map(|l| l.starts_with("thread '<main>' panicked at")), Some(true));
assert_eq!(it.next(), None);
} }
} }