Rollup merge of #44989 - QuietMisdreavus:what-is-your-quest, r=GuillaumeGomez
let rustdoc print the crate version into docs This PR adds a new unstable flag to rustdoc, `--crate-version`, which when present will add a new entry to the sidebar of the root module, printing the given version number:  Closes #24336 (The WIP status is because i don't want to merge this until i can get the std docs to use it, which i need help from rustbuild people to make sure i get right.)
This commit is contained in:
commit
445bbde784
7 changed files with 57 additions and 1 deletions
|
@ -48,6 +48,14 @@ fn main() {
|
||||||
cmd.arg("-Z").arg("force-unstable-if-unmarked");
|
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() {
|
std::process::exit(match cmd.status() {
|
||||||
Ok(s) => s.code().unwrap_or(1),
|
Ok(s) => s.code().unwrap_or(1),
|
||||||
Err(e) => panic!("\n\nfailed to run {:?}: {}\n\n", cmd, e),
|
Err(e) => panic!("\n\nfailed to run {:?}: {}\n\n", cmd, e),
|
||||||
|
|
|
@ -418,7 +418,8 @@ impl<'a> Builder<'a> {
|
||||||
.env("RUSTC_SYSROOT", self.sysroot(compiler))
|
.env("RUSTC_SYSROOT", self.sysroot(compiler))
|
||||||
.env("RUSTC_LIBDIR", self.sysroot_libdir(compiler, self.build.build))
|
.env("RUSTC_LIBDIR", self.sysroot_libdir(compiler, self.build.build))
|
||||||
.env("CFG_RELEASE_CHANNEL", &self.build.config.channel)
|
.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
|
cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -574,6 +575,9 @@ impl<'a> Builder<'a> {
|
||||||
cargo.env("RUSTC_SAVE_ANALYSIS", "api".to_string());
|
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
|
// Environment variables *required* throughout the build
|
||||||
//
|
//
|
||||||
// FIXME: should update code to not require this env var
|
// FIXME: should update code to not require this env var
|
||||||
|
|
|
@ -112,6 +112,7 @@ impl<T: Clean<U>, U> Clean<Vec<U>> for P<[T]> {
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Crate {
|
pub struct Crate {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
pub version: Option<String>,
|
||||||
pub src: PathBuf,
|
pub src: PathBuf,
|
||||||
pub module: Option<Item>,
|
pub module: Option<Item>,
|
||||||
pub externs: Vec<(CrateNum, ExternalCrate)>,
|
pub externs: Vec<(CrateNum, ExternalCrate)>,
|
||||||
|
@ -183,6 +184,7 @@ impl<'a, 'tcx> Clean<Crate> for visit_ast::RustdocVisitor<'a, 'tcx> {
|
||||||
|
|
||||||
Crate {
|
Crate {
|
||||||
name,
|
name,
|
||||||
|
version: None,
|
||||||
src,
|
src,
|
||||||
module: Some(module),
|
module: Some(module),
|
||||||
externs,
|
externs,
|
||||||
|
|
|
@ -256,6 +256,9 @@ pub struct Cache {
|
||||||
// the access levels from crateanalysis.
|
// the access levels from crateanalysis.
|
||||||
pub access_levels: Arc<AccessLevels<DefId>>,
|
pub access_levels: Arc<AccessLevels<DefId>>,
|
||||||
|
|
||||||
|
/// The version of the crate being documented, if given fron the `--crate-version` flag.
|
||||||
|
pub crate_version: Option<String>,
|
||||||
|
|
||||||
// Private fields only used when initially crawling a crate to build a cache
|
// Private fields only used when initially crawling a crate to build a cache
|
||||||
|
|
||||||
stack: Vec<String>,
|
stack: Vec<String>,
|
||||||
|
@ -534,6 +537,7 @@ pub fn run(mut krate: clean::Crate,
|
||||||
primitive_locations: FxHashMap(),
|
primitive_locations: FxHashMap(),
|
||||||
stripped_mod: false,
|
stripped_mod: false,
|
||||||
access_levels: krate.access_levels.clone(),
|
access_levels: krate.access_levels.clone(),
|
||||||
|
crate_version: krate.version.take(),
|
||||||
orphan_impl_items: Vec::new(),
|
orphan_impl_items: Vec::new(),
|
||||||
traits: mem::replace(&mut krate.external_traits, FxHashMap()),
|
traits: mem::replace(&mut krate.external_traits, FxHashMap()),
|
||||||
deref_trait_did,
|
deref_trait_did,
|
||||||
|
@ -3433,6 +3437,16 @@ impl<'a> fmt::Display for Sidebar<'a> {
|
||||||
write!(fmt, "{}", it.name.as_ref().unwrap())?;
|
write!(fmt, "{}", it.name.as_ref().unwrap())?;
|
||||||
write!(fmt, "</p>")?;
|
write!(fmt, "</p>")?;
|
||||||
|
|
||||||
|
if it.is_crate() {
|
||||||
|
if let Some(ref version) = cache().crate_version {
|
||||||
|
write!(fmt,
|
||||||
|
"<div class='block version'>\
|
||||||
|
<p>Version {}</p>\
|
||||||
|
</div>",
|
||||||
|
version)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match it.inner {
|
match it.inner {
|
||||||
clean::StructItem(ref s) => sidebar_struct(fmt, it, s)?,
|
clean::StructItem(ref s) => sidebar_struct(fmt, it, s)?,
|
||||||
clean::TraitItem(ref t) => sidebar_trait(fmt, it, t)?,
|
clean::TraitItem(ref t) => sidebar_trait(fmt, it, t)?,
|
||||||
|
|
|
@ -203,6 +203,15 @@ nav.sub {
|
||||||
word-wrap: break-word;
|
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 {
|
.location:empty {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,6 +243,9 @@ pub fn opts() -> Vec<RustcOptGroup> {
|
||||||
unstable("display-warnings", |o| {
|
unstable("display-warnings", |o| {
|
||||||
o.optflag("", "display-warnings", "to print code warnings when testing doc")
|
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 triple = matches.opt_str("target");
|
||||||
let maybe_sysroot = matches.opt_str("sysroot").map(PathBuf::from);
|
let maybe_sysroot = matches.opt_str("sysroot").map(PathBuf::from);
|
||||||
let crate_name = matches.opt_str("crate-name");
|
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 plugin_path = matches.opt_str("plugin-path");
|
||||||
|
|
||||||
let cr = PathBuf::from(cratefile);
|
let cr = PathBuf::from(cratefile);
|
||||||
|
@ -484,6 +488,8 @@ where R: 'static + Send, F: 'static + Send + FnOnce(Output) -> R {
|
||||||
krate.name = name
|
krate.name = name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
krate.version = crate_version;
|
||||||
|
|
||||||
// Process all of the crate attributes, extracting plugin metadata along
|
// Process all of the crate attributes, extracting plugin metadata along
|
||||||
// with the passes which we are supposed to run.
|
// with the passes which we are supposed to run.
|
||||||
for attr in krate.module.as_ref().unwrap().attrs.lists("doc") {
|
for attr in krate.module.as_ref().unwrap().attrs.lists("doc") {
|
||||||
|
|
13
src/test/rustdoc/crate-version.rs
Normal file
13
src/test/rustdoc/crate-version.rs
Normal file
|
@ -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 <LICENSE-APACHE or
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||||
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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'
|
Loading…
Add table
Add a link
Reference in a new issue