Skip to content

Commit

Permalink
Auto merge of #117888 - notriddle:notriddle/releases, r=Mark-Simulacrum
Browse files Browse the repository at this point in the history
doc: add release notes to standalone doc bundle

Preview: http://notriddle.com/rustdoc-html-demo-5/release-notes/releases.html

This is a workaround for #101714 on top of being a useful addition in its own right. It is intended to change the "canonical URL" for viewing the release notes from GitHub, which is relatively slow, to a pre-rendered HTML file that loads from the same CDN as the standard library docs. It also means you get a copy of the release notes when installing the rust-docs with rustup.
  • Loading branch information
bors committed Nov 19, 2023
2 parents 27794f9 + 0bf7720 commit 290fc68
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 9 deletions.
101 changes: 100 additions & 1 deletion src/bootstrap/src/core/build_steps/doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
//! Everything here is basically just a shim around calling either `rustbook` or
//! `rustdoc`.

use std::fs;
use std::io::{self, Write};
use std::path::{Path, PathBuf};
use std::{fs, mem};

use crate::core::build_steps::compile;
use crate::core::build_steps::tool::{self, prepare_tool_cargo, SourceType, Tool};
Expand Down Expand Up @@ -388,6 +389,104 @@ impl Step for Standalone {
}
}

#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub struct Releases {
compiler: Compiler,
target: TargetSelection,
}

impl Step for Releases {
type Output = ();
const DEFAULT: bool = true;

fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
let builder = run.builder;
run.path("RELEASES.md").alias("releases").default_condition(builder.config.docs)
}

fn make_run(run: RunConfig<'_>) {
run.builder.ensure(Releases {
compiler: run.builder.compiler(run.builder.top_stage, run.builder.config.build),
target: run.target,
});
}

/// Generates HTML release notes to include in the final docs bundle.
///
/// This uses the same stylesheet and other tools as Standalone, but the
/// RELEASES.md file is included at the root of the repository and gets
/// the headline added. In the end, the conversion is done by Rustdoc.
fn run(self, builder: &Builder<'_>) {
let target = self.target;
let compiler = self.compiler;
let _guard = builder.msg_doc(compiler, "releases", target);
let out = builder.doc_out(target);
t!(fs::create_dir_all(&out));

builder.ensure(Standalone {
compiler: builder.compiler(builder.top_stage, builder.config.build),
target,
});

let version_info = builder.ensure(SharedAssets { target: self.target }).version_info;

let favicon = builder.src.join("src/doc/favicon.inc");
let footer = builder.src.join("src/doc/footer.inc");
let full_toc = builder.src.join("src/doc/full-toc.inc");

let html = out.join("releases.html");
let tmppath = out.join("releases.md");
let inpath = builder.src.join("RELEASES.md");
let rustdoc = builder.rustdoc(compiler);
if !up_to_date(&inpath, &html)
|| !up_to_date(&footer, &html)
|| !up_to_date(&favicon, &html)
|| !up_to_date(&full_toc, &html)
|| !(builder.config.dry_run()
|| up_to_date(&version_info, &html)
|| up_to_date(&rustdoc, &html))
{
let mut tmpfile = t!(fs::File::create(&tmppath));
t!(tmpfile.write_all(b"% Rust Release Notes\n\n"));
t!(io::copy(&mut t!(fs::File::open(&inpath)), &mut tmpfile));
mem::drop(tmpfile);
let mut cmd = builder.rustdoc_cmd(compiler);

// Needed for --index-page flag
cmd.arg("-Z").arg("unstable-options");

cmd.arg("--html-after-content")
.arg(&footer)
.arg("--html-before-content")
.arg(&version_info)
.arg("--html-in-header")
.arg(&favicon)
.arg("--markdown-no-toc")
.arg("--markdown-css")
.arg("rust.css")
.arg("--index-page")
.arg(&builder.src.join("src/doc/index.md"))
.arg("--markdown-playground-url")
.arg("https://play.rust-lang.org/")
.arg("-o")
.arg(&out)
.arg(&tmppath);

if !builder.config.docs_minification {
cmd.arg("--disable-minification");
}

builder.run(&mut cmd);
}

// We open doc/RELEASES.html as the default if invoked as `x.py doc --open RELEASES.md`
// with no particular explicit doc requested (e.g. library/core).
if builder.was_invoked_explicitly::<Self>(Kind::Doc) {
builder.open_in_browser(&html);
}
}
}

#[derive(Debug, Clone)]
pub struct SharedAssetsPaths {
pub version_info: PathBuf,
Expand Down
1 change: 1 addition & 0 deletions src/bootstrap/src/core/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -810,6 +810,7 @@ impl<'a> Builder<'a> {
doc::StyleGuide,
doc::Tidy,
doc::Bootstrap,
doc::Releases,
),
Kind::Dist => describe!(
dist::Docs,
Expand Down
14 changes: 6 additions & 8 deletions src/doc/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,6 @@
nav {
display: none;
}
body {
font-family: serif;
}
h1, h2, h3, h4, h5, h6 {
font-family: sans-serif;
}
h3 {
font-size: 1.35rem;
}
Expand Down Expand Up @@ -119,10 +113,14 @@ documentation for your project _and_ all its dependencies in their correct
version, and open it in your browser. Add the flag `--document-private-items` to
also show items not marked `pub`.

### The Edition Guide
### Rust Version History

[The Release Notes](releases.html) describes the change history of the Rust
toolchain and language.

[The Edition Guide](edition-guide/index.html) describes the Rust editions and
their differences.
their differences. The latest version of the toolchain supports all
historical editions.

### The `rustc` Book

Expand Down
4 changes: 4 additions & 0 deletions src/doc/rust.css
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/* General structure */

body {
font-family: serif;
margin: 0 auto;
padding: 0 15px;
font-size: 18px;
Expand All @@ -17,6 +18,9 @@ body {
}
}

h1, h2, h3, h4, h5, h6 {
font-family: sans-serif;
}
h2, h3, h4, h5, h6 {
font-weight: 400;
line-height: 1.1;
Expand Down

0 comments on commit 290fc68

Please sign in to comment.