4
0

docs.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. use std::{ffi::OsString, fs, io::Write as _, process::Command};
  2. use anyhow::{Context as _, Result};
  3. use cargo_metadata::Metadata;
  4. use indoc::{indoc, writedoc};
  5. use xtask::exec;
  6. pub fn docs(metadata: Metadata) -> Result<()> {
  7. const PACKAGE_TO_DESCRIPTION: &[(&str, &str)] = &[
  8. ("aya", "User-space BPF program loading and manipulation"),
  9. ("aya-bpf", "Kernel-space BPF program implementation toolkit"),
  10. ("aya-log-ebpf", "Kernel-space logging from BPF programs"),
  11. (
  12. "aya-log",
  13. "User-space consumption of logs from BPF programs",
  14. ),
  15. ];
  16. let Metadata {
  17. workspace_root,
  18. target_directory,
  19. ..
  20. } = metadata;
  21. exec(
  22. Command::new("cargo")
  23. .current_dir(&workspace_root)
  24. .args(["clean", "--doc"]),
  25. )?;
  26. let tmp = tempfile::tempdir().context("create tempdir")?;
  27. let header = tmp.path().join("header.html");
  28. fs::write(&header, r#"<meta name="robots" content="noindex">"#).context("write header.html")?;
  29. let mut rustdocflags = OsString::new();
  30. rustdocflags.push("--cfg docsrs --html-in-header ");
  31. rustdocflags.push(header);
  32. rustdocflags.push(" -D warnings");
  33. exec(
  34. Command::new("cargo")
  35. .current_dir(&workspace_root)
  36. .env("RUSTDOCFLAGS", rustdocflags)
  37. .args(["+nightly", "doc", "--no-deps", "--all-features"])
  38. .args(
  39. PACKAGE_TO_DESCRIPTION
  40. .iter()
  41. .flat_map(|(package, _)| ["--package", package]),
  42. ),
  43. )?;
  44. let site = workspace_root.join("site");
  45. match fs::remove_dir_all(&site) {
  46. Ok(()) => {}
  47. Err(err) => {
  48. if err.kind() != std::io::ErrorKind::NotFound {
  49. return Err(err).context(format!("remove {site:?}"));
  50. }
  51. }
  52. }
  53. let doc = target_directory.join("doc");
  54. fs::rename(&doc, &site).with_context(|| format!("rename {doc:?} to {site:?}"))?;
  55. exec(Command::new("sh").current_dir(&site).args([
  56. "-c",
  57. "grep -FRl crabby.svg | xargs sed -i s/crabby.svg/crabby_dev.svg/g",
  58. ]))?;
  59. fs::write(
  60. site.join("robots.txt"),
  61. indoc! {r"
  62. User-Agent:*
  63. Disallow: /
  64. "},
  65. )
  66. .context("can't write robots.txt")?;
  67. let mut index = fs::File::create(site.join("index.html"))
  68. .with_context(|| format!("create {site:?}/index.html"))?;
  69. writedoc! {&mut index, r#"
  70. <html>
  71. <meta name="robots" content="noindex">
  72. <body>
  73. <ul>
  74. "#}
  75. .context("write to index.html")?;
  76. for (package, description) in PACKAGE_TO_DESCRIPTION {
  77. let package = package.replace('-', "_");
  78. writedoc! {&mut index, r#"
  79. <li><a href="{package}/index.html">Aya {description}</a></li>
  80. "#}
  81. .context("write to string")?;
  82. }
  83. writedoc! {&mut index, r#"
  84. </ul>
  85. </body>
  86. </html>
  87. "#}
  88. .context("write to index.html")?;
  89. Ok(())
  90. }