diff options
Diffstat (limited to 'src/tools/unstable-book-gen')
-rw-r--r-- | src/tools/unstable-book-gen/Cargo.toml | 12 | ||||
-rw-r--r-- | src/tools/unstable-book-gen/src/SUMMARY.md | 8 | ||||
-rw-r--r-- | src/tools/unstable-book-gen/src/main.rs | 130 | ||||
-rw-r--r-- | src/tools/unstable-book-gen/src/stub-issue.md | 7 | ||||
-rw-r--r-- | src/tools/unstable-book-gen/src/stub-no-issue.md | 5 |
5 files changed, 162 insertions, 0 deletions
diff --git a/src/tools/unstable-book-gen/Cargo.toml b/src/tools/unstable-book-gen/Cargo.toml new file mode 100644 index 000000000..73e5a91be --- /dev/null +++ b/src/tools/unstable-book-gen/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "unstable-book-gen" +version = "0.1.0" +license = "MIT OR Apache-2.0" +edition = "2021" + +[dependencies] +tidy = { path = "../tidy" } + +# not actually needed but required for now to unify the feature selection of +# `num-traits` between this and `rustbook` +num-traits = "0.2" diff --git a/src/tools/unstable-book-gen/src/SUMMARY.md b/src/tools/unstable-book-gen/src/SUMMARY.md new file mode 100644 index 000000000..933c928e2 --- /dev/null +++ b/src/tools/unstable-book-gen/src/SUMMARY.md @@ -0,0 +1,8 @@ +[The Unstable Book](the-unstable-book.md) + +- [Compiler flags](compiler-flags.md) +{compiler_flags} +- [Language features](language-features.md) +{language_features} +- [Library Features](library-features.md) +{library_features} diff --git a/src/tools/unstable-book-gen/src/main.rs b/src/tools/unstable-book-gen/src/main.rs new file mode 100644 index 000000000..5a0477b4b --- /dev/null +++ b/src/tools/unstable-book-gen/src/main.rs @@ -0,0 +1,130 @@ +//! Auto-generate stub docs for the unstable book + +use std::collections::BTreeSet; +use std::env; +use std::fs::{self, File}; +use std::io::Write; +use std::path::Path; +use tidy::features::{collect_lang_features, collect_lib_features, Features}; +use tidy::unstable_book::{ + collect_unstable_book_section_file_names, collect_unstable_feature_names, LANG_FEATURES_DIR, + LIB_FEATURES_DIR, PATH_STR, +}; + +/// A helper macro to `unwrap` a result except also print out details like: +/// +/// * The file/line of the panic +/// * The expression that failed +/// * The error itself +macro_rules! t { + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; +} + +fn generate_stub_issue(path: &Path, name: &str, issue: u32) { + let mut file = t!(File::create(path)); + t!(write!(file, include_str!("stub-issue.md"), name = name, issue = issue)); +} + +fn generate_stub_no_issue(path: &Path, name: &str) { + let mut file = t!(File::create(path)); + t!(write!(file, include_str!("stub-no-issue.md"), name = name)); +} + +fn set_to_summary_str(set: &BTreeSet<String>, dir: &str) -> String { + set.iter() + .map(|ref n| format!(" - [{}]({}/{}.md)", n.replace('-', "_"), dir, n)) + .fold("".to_owned(), |s, a| s + &a + "\n") +} + +fn generate_summary(path: &Path, lang_features: &Features, lib_features: &Features) { + let compiler_flags = collect_unstable_book_section_file_names(&path.join("src/compiler-flags")); + + let compiler_flags_str = set_to_summary_str(&compiler_flags, "compiler-flags"); + + let unstable_lang_features = collect_unstable_feature_names(&lang_features); + let unstable_lib_features = collect_unstable_feature_names(&lib_features); + + let lang_features_str = set_to_summary_str(&unstable_lang_features, "language-features"); + let lib_features_str = set_to_summary_str(&unstable_lib_features, "library-features"); + + let mut file = t!(File::create(&path.join("src/SUMMARY.md"))); + t!(file.write_fmt(format_args!( + include_str!("SUMMARY.md"), + compiler_flags = compiler_flags_str, + language_features = lang_features_str, + library_features = lib_features_str + ))); +} + +fn generate_unstable_book_files(src: &Path, out: &Path, features: &Features) { + let unstable_features = collect_unstable_feature_names(features); + let unstable_section_file_names = collect_unstable_book_section_file_names(src); + t!(fs::create_dir_all(&out)); + for feature_name in &unstable_features - &unstable_section_file_names { + let feature_name_underscore = feature_name.replace('-', "_"); + let file_name = format!("{feature_name}.md"); + let out_file_path = out.join(&file_name); + let feature = &features[&feature_name_underscore]; + + if let Some(issue) = feature.tracking_issue { + generate_stub_issue(&out_file_path, &feature_name_underscore, issue.get()); + } else { + generate_stub_no_issue(&out_file_path, &feature_name_underscore); + } + } +} + +fn copy_recursive(from: &Path, to: &Path) { + for entry in t!(fs::read_dir(from)) { + let e = t!(entry); + let t = t!(e.metadata()); + let dest = &to.join(e.file_name()); + if t.is_file() { + t!(fs::copy(&e.path(), dest)); + } else if t.is_dir() { + t!(fs::create_dir_all(dest)); + copy_recursive(&e.path(), dest); + } + } +} + +fn main() { + let library_path_str = env::args_os().nth(1).expect("library/ path required"); + let compiler_path_str = env::args_os().nth(2).expect("compiler/ path required"); + let src_path_str = env::args_os().nth(3).expect("src/ path required"); + let dest_path_str = env::args_os().nth(4).expect("destination path required"); + let library_path = Path::new(&library_path_str); + let compiler_path = Path::new(&compiler_path_str); + let src_path = Path::new(&src_path_str); + let dest_path = Path::new(&dest_path_str); + + let lang_features = collect_lang_features(compiler_path, &mut false); + let lib_features = collect_lib_features(library_path) + .into_iter() + .filter(|&(ref name, _)| !lang_features.contains_key(name)) + .collect(); + + let doc_src_path = src_path.join(PATH_STR); + + t!(fs::create_dir_all(&dest_path)); + + generate_unstable_book_files( + &doc_src_path.join(LANG_FEATURES_DIR), + &dest_path.join(LANG_FEATURES_DIR), + &lang_features, + ); + generate_unstable_book_files( + &doc_src_path.join(LIB_FEATURES_DIR), + &dest_path.join(LIB_FEATURES_DIR), + &lib_features, + ); + + copy_recursive(&doc_src_path, &dest_path); + + generate_summary(&dest_path, &lang_features, &lib_features); +} diff --git a/src/tools/unstable-book-gen/src/stub-issue.md b/src/tools/unstable-book-gen/src/stub-issue.md new file mode 100644 index 000000000..8698fb727 --- /dev/null +++ b/src/tools/unstable-book-gen/src/stub-issue.md @@ -0,0 +1,7 @@ +# `{name}` + +The tracking issue for this feature is: [#{issue}] + +[#{issue}]: https://github.com/rust-lang/rust/issues/{issue} + +------------------------ diff --git a/src/tools/unstable-book-gen/src/stub-no-issue.md b/src/tools/unstable-book-gen/src/stub-no-issue.md new file mode 100644 index 000000000..3da140633 --- /dev/null +++ b/src/tools/unstable-book-gen/src/stub-no-issue.md @@ -0,0 +1,5 @@ +# `{name}` + +This feature has no tracking issue, and is therefore likely internal to the compiler, not being intended for general use. + +------------------------ |