Skip to content

Commit e1d2eda

Browse files
committed
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
1 parent 3399d19 commit e1d2eda

File tree

9 files changed

+59
-17
lines changed

9 files changed

+59
-17
lines changed

CONTRIBUTING.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@ which includes important information about what platform you're on, what
7171
version of Rust you're using, etc.
7272

7373
Sometimes, a backtrace is helpful, and so including that is nice. To get
74-
a backtrace, set the `RUST_BACKTRACE` environment variable. The easiest way
74+
a backtrace, set the `RUST_BACKTRACE` environment variable to a value
75+
other than `0`. The easiest way
7576
to do this is to invoke `rustc` like this:
7677

7778
```bash

man/rustc.1

+2-2
Original file line numberDiff line numberDiff line change
@@ -268,15 +268,15 @@ the maximum number of threads used for this purpose.
268268

269269
.TP
270270
\fBRUST_TEST_NOCAPTURE\fR
271-
A synonym for the --nocapture flag.
271+
If set to a value other than "0", a synonym for the --nocapture flag.
272272

273273
.TP
274274
\fBRUST_MIN_STACK\fR
275275
Sets the minimum stack size for new threads.
276276

277277
.TP
278278
\fBRUST_BACKTRACE\fR
279-
If set, produces a backtrace in the output of a program which panics.
279+
If set to a value different than "0", produces a backtrace in the output of a program which panics.
280280

281281
.SH "EXAMPLES"
282282
To build an executable from a source file with a main function:

src/compiletest/compiletest.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,10 @@ pub fn test_opts(config: &Config) -> test::TestOpts {
263263
logfile: config.logfile.clone(),
264264
run_tests: true,
265265
bench_benchmarks: true,
266-
nocapture: env::var("RUST_TEST_NOCAPTURE").is_ok(),
266+
nocapture: match env::var("RUST_TEST_NOCAPTURE") {
267+
Ok(val) => &val != "0",
268+
Err(_) => false
269+
},
267270
color: test::AutoColor,
268271
}
269272
}

src/doc/book/functions.md

+13
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,19 @@ stack backtrace:
246246
13: 0x0 - <unknown>
247247
```
248248

249+
If you need to override an already set `RUST_BACKTRACE`,
250+
in cases when you cannot just unset the variable,
251+
then set it to `0` to avoid getting a backtrace.
252+
Any other value(even no value at all) turns on backtrace.
253+
254+
```text
255+
$ export RUST_BACKTRACE=1
256+
...
257+
$ RUST_BACKTRACE=0 ./diverges
258+
thread '<main>' panicked at 'This function never returns!', hello.rs:2
259+
note: Run with `RUST_BACKTRACE=1` for a backtrace.
260+
```
261+
249262
`RUST_BACKTRACE` also works with Cargo’s `run` command:
250263

251264
```text

src/librustc_driver/lib.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,10 @@ pub fn monitor<F: FnOnce() + Send + 'static>(f: F) {
10591059
for note in &xs {
10601060
emitter.emit(None, &note[..], None, errors::Level::Note)
10611061
}
1062-
if let None = env::var_os("RUST_BACKTRACE") {
1062+
if match env::var_os("RUST_BACKTRACE") {
1063+
Some(val) => &val != "0",
1064+
None => false,
1065+
} {
10631066
emitter.emit(None,
10641067
"run with `RUST_BACKTRACE=1` for a backtrace",
10651068
None,

src/libstd/sys/common/backtrace.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub fn log_enabled() -> bool {
3636
}
3737

3838
let val = match env::var_os("RUST_BACKTRACE") {
39-
Some(..) => 2,
39+
Some(x) => if &x == "0" { 1 } else { 2 },
4040
None => 1,
4141
};
4242
ENABLED.store(val, Ordering::SeqCst);

src/libtest/lib.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,8 @@ By default, all tests are run in parallel. This can be altered with the
349349
RUST_TEST_THREADS environment variable when running tests (set it to 1).
350350
351351
All tests have their standard output and standard error captured by default.
352-
This can be overridden with the --nocapture flag or the RUST_TEST_NOCAPTURE=1
353-
environment variable. Logging is not captured by default.
352+
This can be overridden with the --nocapture flag or setting RUST_TEST_NOCAPTURE
353+
environment variable to a value other than "0". Logging is not captured by default.
354354
355355
Test Attributes:
356356
@@ -399,7 +399,10 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
399399

400400
let mut nocapture = matches.opt_present("nocapture");
401401
if !nocapture {
402-
nocapture = env::var("RUST_TEST_NOCAPTURE").is_ok();
402+
nocapture = match env::var("RUST_TEST_NOCAPTURE") {
403+
Ok(val) => &val != "0",
404+
Err(_) => false
405+
};
403406
}
404407

405408
let color = match matches.opt_str("color").as_ref().map(|s| &**s) {

src/test/run-pass/backtrace.rs

+10
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ fn runtest(me: &str) {
8686
assert!(!s.contains("stack backtrace") && !s.contains(&expected("foo")),
8787
"bad output2: {}", s);
8888

89+
// Make sure the stack trace is *not* printed
90+
// (RUST_BACKTRACE=0 acts as if it were unset from our own environment,
91+
// in case developer is running `make check` with it set.)
92+
let p = template(me).arg("fail").env("RUST_BACKTRACE","0").spawn().unwrap();
93+
let out = p.wait_with_output().unwrap();
94+
assert!(!out.status.success());
95+
let s = str::from_utf8(&out.stderr).unwrap();
96+
assert!(!s.contains("stack backtrace") && !s.contains(" - foo"),
97+
"bad output3: {}", s);
98+
8999
// Make sure a stack trace is printed
90100
let p = template(me).arg("double-fail").spawn().unwrap();
91101
let out = p.wait_with_output().unwrap();

src/test/run-pass/multi-panic.rs

+17-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11+
fn check_for_no_backtrace(test: std::process::Output) {
12+
assert!(!test.status.success());
13+
let err = String::from_utf8_lossy(&test.stderr);
14+
let mut it = err.lines();
15+
16+
assert_eq!(it.next().map(|l| l.starts_with("thread '<unnamed>' panicked at")), Some(true));
17+
assert_eq!(it.next(), Some("note: Run with `RUST_BACKTRACE=1` for a backtrace."));
18+
assert_eq!(it.next().map(|l| l.starts_with("thread '<main>' panicked at")), Some(true));
19+
assert_eq!(it.next(), None);
20+
}
21+
1122
fn main() {
1223
let args: Vec<String> = std::env::args().collect();
1324
if args.len() > 1 && args[1] == "run_test" {
@@ -21,13 +32,11 @@ fn main() {
2132
.env_remove("RUST_BACKTRACE")
2233
.output()
2334
.unwrap();
24-
assert!(!test.status.success());
25-
let err = String::from_utf8_lossy(&test.stderr);
26-
let mut it = err.lines();
27-
28-
assert_eq!(it.next().map(|l| l.starts_with("thread '<unnamed>' panicked at")), Some(true));
29-
assert_eq!(it.next(), Some("note: Run with `RUST_BACKTRACE=1` for a backtrace."));
30-
assert_eq!(it.next().map(|l| l.starts_with("thread '<main>' panicked at")), Some(true));
31-
assert_eq!(it.next(), None);
35+
check_for_no_backtrace(test);
36+
let test = std::process::Command::new(&args[0]).arg("run_test")
37+
.env("RUST_BACKTRACE","0")
38+
.output()
39+
.unwrap();
40+
check_for_no_backtrace(test);
3241
}
3342
}

0 commit comments

Comments
 (0)