From fcee9506602829a2ed8505c0ba657d12b972e7ae Mon Sep 17 00:00:00 2001
From: QuietMisdreavus
Date: Mon, 2 Oct 2017 18:29:03 -0500
Subject: [PATCH 1/2] let rustdoc print the crate version into docs
---
src/librustdoc/clean/mod.rs | 2 ++
src/librustdoc/html/render.rs | 14 ++++++++++++++
src/librustdoc/html/static/rustdoc.css | 9 +++++++++
src/librustdoc/lib.rs | 6 ++++++
src/test/rustdoc/crate-version.rs | 13 +++++++++++++
5 files changed, 44 insertions(+)
create mode 100644 src/test/rustdoc/crate-version.rs
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index c9afa3646b2da..6cf8ea3c57dd0 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -112,6 +112,7 @@ impl, U> Clean> for P<[T]> {
#[derive(Clone, Debug)]
pub struct Crate {
pub name: String,
+ pub version: Option,
pub src: PathBuf,
pub module: Option- ,
pub externs: Vec<(CrateNum, ExternalCrate)>,
@@ -183,6 +184,7 @@ impl<'a, 'tcx> Clean for visit_ast::RustdocVisitor<'a, 'tcx> {
Crate {
name,
+ version: None,
src,
module: Some(module),
externs,
diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index a3f446885f96e..9bc94eff14223 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -256,6 +256,9 @@ pub struct Cache {
// the access levels from crateanalysis.
pub access_levels: Arc>,
+ /// The version of the crate being documented, if given fron the `--crate-version` flag.
+ pub crate_version: Option,
+
// Private fields only used when initially crawling a crate to build a cache
stack: Vec,
@@ -534,6 +537,7 @@ pub fn run(mut krate: clean::Crate,
primitive_locations: FxHashMap(),
stripped_mod: false,
access_levels: krate.access_levels.clone(),
+ crate_version: krate.version.take(),
orphan_impl_items: Vec::new(),
traits: mem::replace(&mut krate.external_traits, FxHashMap()),
deref_trait_did,
@@ -3422,6 +3426,16 @@ impl<'a> fmt::Display for Sidebar<'a> {
write!(fmt, "{}", it.name.as_ref().unwrap())?;
write!(fmt, "
")?;
+ if it.is_crate() {
+ if let Some(ref version) = cache().crate_version {
+ write!(fmt,
+ "",
+ version)?;
+ }
+ }
+
match it.inner {
clean::StructItem(ref s) => sidebar_struct(fmt, it, s)?,
clean::TraitItem(ref t) => sidebar_trait(fmt, it, t)?,
diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 27574e67bc87b..61a3902098ffa 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -203,6 +203,15 @@ nav.sub {
word-wrap: break-word;
}
+.sidebar .version {
+ font-size: 15px;
+ text-align: center;
+ border-bottom: #DDDDDD 1px solid;
+ overflow-wrap: break-word;
+ word-wrap: break-word; /* deprecated */
+ word-break: break-word; /* Chrome, non-standard */
+}
+
.location:empty {
border: none;
}
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs
index 9563ccfcc65fd..f8bf00ad73fcc 100644
--- a/src/librustdoc/lib.rs
+++ b/src/librustdoc/lib.rs
@@ -243,6 +243,9 @@ pub fn opts() -> Vec {
unstable("display-warnings", |o| {
o.optflag("", "display-warnings", "to print code warnings when testing doc")
}),
+ unstable("crate-version", |o| {
+ o.optopt("", "crate-version", "crate version to print into documentation", "VERSION")
+ }),
]
}
@@ -460,6 +463,7 @@ where R: 'static + Send, F: 'static + Send + FnOnce(Output) -> R {
let triple = matches.opt_str("target");
let maybe_sysroot = matches.opt_str("sysroot").map(PathBuf::from);
let crate_name = matches.opt_str("crate-name");
+ let crate_version = matches.opt_str("crate-version");
let plugin_path = matches.opt_str("plugin-path");
let cr = PathBuf::from(cratefile);
@@ -484,6 +488,8 @@ where R: 'static + Send, F: 'static + Send + FnOnce(Output) -> R {
krate.name = name
}
+ krate.version = crate_version;
+
// Process all of the crate attributes, extracting plugin metadata along
// with the passes which we are supposed to run.
for attr in krate.module.as_ref().unwrap().attrs.lists("doc") {
diff --git a/src/test/rustdoc/crate-version.rs b/src/test/rustdoc/crate-version.rs
new file mode 100644
index 0000000000000..07ab5ceedfa02
--- /dev/null
+++ b/src/test/rustdoc/crate-version.rs
@@ -0,0 +1,13 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// compile-flags: --crate-version=1.3.37 -Z unstable-options
+
+// @has 'crate_version/index.html' '//div[@class="block version"]/p' 'Version 1.3.37'
From 7ea286e854d88529af76ca486ed676c9fb06e8ee Mon Sep 17 00:00:00 2001
From: QuietMisdreavus
Date: Mon, 9 Oct 2017 15:21:11 -0500
Subject: [PATCH 2/2] render the rust version into std/compiler/test docs
---
src/bootstrap/bin/rustdoc.rs | 8 ++++++++
src/bootstrap/builder.rs | 6 +++++-
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/bootstrap/bin/rustdoc.rs b/src/bootstrap/bin/rustdoc.rs
index d7d72d5dd56c9..d18512b257d6a 100644
--- a/src/bootstrap/bin/rustdoc.rs
+++ b/src/bootstrap/bin/rustdoc.rs
@@ -48,6 +48,14 @@ fn main() {
cmd.arg("-Z").arg("force-unstable-if-unmarked");
}
+ // Bootstrap's Cargo-command builder sets this variable to the current Rust version; let's pick
+ // it up so we can make rustdoc print this into the docs
+ if let Some(version) = env::var_os("RUSTDOC_CRATE_VERSION") {
+ // This "unstable-options" can be removed when `--crate-version` is stabilized
+ cmd.arg("-Z").arg("unstable-options")
+ .arg("--crate-version").arg(version);
+ }
+
std::process::exit(match cmd.status() {
Ok(s) => s.code().unwrap_or(1),
Err(e) => panic!("\n\nfailed to run {:?}: {}\n\n", cmd, e),
diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs
index e7a5196178c3f..1d63e112ca6fb 100644
--- a/src/bootstrap/builder.rs
+++ b/src/bootstrap/builder.rs
@@ -418,7 +418,8 @@ impl<'a> Builder<'a> {
.env("RUSTC_SYSROOT", self.sysroot(compiler))
.env("RUSTC_LIBDIR", self.sysroot_libdir(compiler, self.build.build))
.env("CFG_RELEASE_CHANNEL", &self.build.config.channel)
- .env("RUSTDOC_REAL", self.rustdoc(host));
+ .env("RUSTDOC_REAL", self.rustdoc(host))
+ .env("RUSTDOC_CRATE_VERSION", self.build.rust_version());
cmd
}
@@ -574,6 +575,9 @@ impl<'a> Builder<'a> {
cargo.env("RUSTC_SAVE_ANALYSIS", "api".to_string());
}
+ // For `cargo doc` invocations, make rustdoc print the Rust version into the docs
+ cargo.env("RUSTDOC_CRATE_VERSION", self.build.rust_version());
+
// Environment variables *required* throughout the build
//
// FIXME: should update code to not require this env var