diff --git a/src/docbuilder/chroot_builder.rs b/src/docbuilder/chroot_builder.rs index b561bc199..f643722f8 100644 --- a/src/docbuilder/chroot_builder.rs +++ b/src/docbuilder/chroot_builder.rs @@ -11,7 +11,7 @@ use std::process::Command; use std::path::PathBuf; use std::fs::remove_dir_all; use postgres::Connection; -use rustc_serialize::json::Json; +use rustc_serialize::json::{Json, ToJson}; use error::Result; @@ -314,7 +314,7 @@ impl DocBuilder { /// Gets rustc and cratesfyi version from chroot environment - fn get_versions(&self) -> (String, String) { + pub fn get_versions(&self) -> (String, String) { // It is safe to use expect here // chroot environment must always have rustc and cratesfyi installed (String::from(self.chroot_command("rustc --version") @@ -439,6 +439,15 @@ impl DocBuilder { try!(self.clean(&pkg)); + let (vers, _) = self.get_versions(); + + try!(conn.query("INSERT INTO config (name, value) VALUES ('rustc_version', $1)", + &[&vers.to_json()]) + .or_else(|_| { + conn.query("UPDATE config SET value = $1 WHERE name = 'rustc_version'", + &[&vers.to_json()]) + })); + Ok(()) } } diff --git a/src/web/mod.rs b/src/web/mod.rs index 068f73c9f..a008013f7 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -61,7 +61,6 @@ use semver::{Version, VersionReq}; use rustc_serialize::json::{Json, ToJson}; use std::collections::BTreeMap; - /// Duration of static files for staticfile and DatabaseFileHandler (in seconds) const STATIC_FILE_CACHE_DURATION: u64 = 60 * 60 * 24 * 30 * 12; // 12 months const STYLE_CSS: &'static str = include_str!(concat!(env!("OUT_DIR"), "/style.css")); @@ -97,9 +96,7 @@ impl CratesfyiHandler { let mut router = Router::new(); router.get("/", releases::home_page, "index"); router.get("/style.css", style_css_handler, "style_css"); - router.get("/about", - |_: &mut Request| page::Page::new(false).title("About Docs.rs").to_resp("about"), - "about"); + router.get("/about", sitemap::about_handler, "about"); router.get("/robots.txt", sitemap::robots_txt_handler, "robots_txt"); router.get("/sitemap.xml", sitemap::sitemap_handler, "sitemap_xml"); router.get("/opensearch.xml", opensearch_xml_handler, "opensearch_xml"); @@ -427,7 +424,6 @@ fn opensearch_xml_handler(_: &mut Request) -> IronResult { Ok(response) } - /// MetaData used in header #[derive(Debug)] pub struct MetaData { diff --git a/src/web/sitemap.rs b/src/web/sitemap.rs index 07bd189d7..a94946a1f 100644 --- a/src/web/sitemap.rs +++ b/src/web/sitemap.rs @@ -1,11 +1,11 @@ - - +use std::collections::BTreeMap; use iron::prelude::*; use iron::headers::ContentType; +use rustc_serialize::json::Json; use super::page::Page; use super::pool::Pool; use time; - +use db::connect_db; pub fn sitemap_handler(req: &mut Request) -> IronResult { let conn = extension!(req, Pool); @@ -31,3 +31,20 @@ pub fn robots_txt_handler(_: &mut Request) -> IronResult { resp.headers.set(ContentType("text/plain".parse().unwrap())); Ok(resp) } + +pub fn about_handler(req: &mut Request) -> IronResult { + let mut content = BTreeMap::new(); + + let conn = extension!(req, Pool); + let res = ctry!(conn.query("SELECT value FROM config WHERE name = 'rustc_version'", &[])); + + if let Some(row) = res.iter().next() { + if let Some(Ok::(res)) = row.get_opt(0) { + if let Some(vers) = res.as_string() { + content.insert("rustc_version".to_string(), vers.to_string()); + } + } + } + + Page::new(content).title("About Docs.rs").to_resp("about") +} diff --git a/templates/about.hbs b/templates/about.hbs index 53164b49d..894bd1a37 100644 --- a/templates/about.hbs +++ b/templates/about.hbs @@ -10,6 +10,12 @@ Docs.rs automatically builds crates' documentation released on crates.io using the nightly release of the Rust compiler. + {{#if content.rustc_version}} + The current version of the Rust compiler in use is {{content.rustc_version}}. + If you need a newer version of this compiler, check the + issues page + and file a new issue if you don't see an existing request. + {{/if}}