about summary refs log tree commit diff
path: root/src/libtest
diff options
context:
space:
mode:
authorGilad Naaman <gilad.naaman@gmail.com>2017-12-13 21:12:19 +0200
committerGilad Naaman <gilad.naaman@gmail.com>2018-01-26 19:46:04 +0200
commite570e9e79aa4ebfa5c1f9f9b2345dfb3525e42e7 (patch)
tree0f91fee690778b234df4eb4a545a11296d257ea1 /src/libtest
parent588a6a35be4446fbaaa792d08efee51e04e61fe8 (diff)
downloadrust-e570e9e79aa4ebfa5c1f9f9b2345dfb3525e42e7.tar.gz
rust-e570e9e79aa4ebfa5c1f9f9b2345dfb3525e42e7.zip
libtest: JSON formatting is now only available in unstable builds
libtest: Added the -Z option for unstable options
Diffstat (limited to 'src/libtest')
-rw-r--r--src/libtest/lib.rs38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs
index b11f783770f..caaa4f7e2b7 100644
--- a/src/libtest/lib.rs
+++ b/src/libtest/lib.rs
@@ -399,7 +399,9 @@ fn optgroups() -> getopts::Options {
         .optopt("", "format", "Configure formatting of output:
             pretty = Print verbose output;
             terse  = Display one character per test;
-            json   = Output a json document", "pretty|terse|json");
+            json   = Output a json document", "pretty|terse|json")
+        .optopt("Z", "", "Enable nightly-only flags:
+            unstable-options = Allow use of experimental features", "unstable-options");
     return opts
 }
 
@@ -435,8 +437,19 @@ Test Attributes:
              usage = options.usage(&message));
 }
 
+// FIXME: Copied from libsyntax until linkage errors are resolved.
+fn is_nightly() -> bool {
+    // Whether this is a feature-staged build, i.e. on the beta or stable channel
+    let disable_unstable_features = option_env!("CFG_DISABLE_UNSTABLE_FEATURES").is_some();
+    // Whether we should enable unstable features for bootstrapping
+    let bootstrap = env::var("RUSTC_BOOTSTRAP").is_ok();
+
+    bootstrap || !disable_unstable_features
+}
+
 // Parses command line arguments into test options
 pub fn parse_opts(args: &[String]) -> Option<OptRes> {
+    let mut allow_unstable = false;
     let opts = optgroups();
     let args = args.get(1..).unwrap_or(args);
     let matches = match opts.parse(args) {
@@ -444,6 +457,21 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
         Err(f) => return Some(Err(f.to_string())),
     };
 
+    if let Some(opt) = matches.opt_str("Z") {
+        if !is_nightly() {
+            return Some(Err("the option `Z` is only accepted on the nightly compiler".into()));
+        }
+
+        match &*opt {
+            "unstable-options" => {
+                allow_unstable = true;
+            }
+            _ => {
+                return Some(Err("Unrecognized option to `Z`".into()));
+            }
+        }
+    };
+
     if matches.opt_present("h") {
         usage(&args[0], &opts);
         return None;
@@ -504,7 +532,13 @@ pub fn parse_opts(args: &[String]) -> Option<OptRes> {
         None if quiet => OutputFormat::Terse,
         Some("pretty") | None => OutputFormat::Pretty,
         Some("terse") => OutputFormat::Terse,
-        Some("json") => OutputFormat::Json,
+        Some("json") => {
+            if !allow_unstable {
+                return Some(
+                    Err("The \"json\" format is only accepted on the nightly compiler".into()));
+            }
+            OutputFormat::Json
+        },
 
         Some(v) => {
             return Some(Err(format!("argument for --format must be pretty, terse, or json (was \