Skip to content

Commit 001f82f

Browse files
Nemo157Joshua Nelson
authored and
Joshua Nelson
committed
Include crate specific navbar section on source and builds pages
1 parent 33fae41 commit 001f82f

File tree

8 files changed

+243
-183
lines changed

8 files changed

+243
-183
lines changed

src/web/crate_details.rs

+2-16
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ pub struct CrateDetails {
3939
github_issues: Option<i32>,
4040
pub(crate) metadata: MetaData,
4141
is_library: bool,
42-
yanked: bool,
43-
pub(crate) doc_targets: Vec<String>,
4442
license: Option<String>,
4543
documentation_url: Option<String>,
4644
total_items: Option<f32>,
@@ -144,18 +142,8 @@ impl CrateDetails {
144142
rustdoc_status: krate.get("rustdoc_status"),
145143
target_name: krate.get("target_name"),
146144
default_target: krate.get("default_target"),
147-
};
148-
149-
let doc_targets = {
150-
let data: Value = krate.get("doc_targets");
151-
data.as_array()
152-
.map(|array| {
153-
array
154-
.iter()
155-
.filter_map(|item| item.as_str().map(|s| s.to_owned()))
156-
.collect()
157-
})
158-
.unwrap_or_else(Vec::new)
145+
doc_targets: MetaData::parse_doc_targets(krate.get("doc_targets")),
146+
yanked: krate.get("yanked"),
159147
};
160148

161149
let documented_items: Option<i32> = krate.get("documented_items");
@@ -189,8 +177,6 @@ impl CrateDetails {
189177
github_issues: krate.get("github_issues"),
190178
metadata,
191179
is_library: krate.get("is_library"),
192-
yanked: krate.get("yanked"),
193-
doc_targets,
194180
license: krate.get("license"),
195181
documentation_url: krate.get("documentation_url"),
196182
documented_items: documented_items.map(|v| v as f32),

src/web/mod.rs

+46-7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
pub(crate) mod page;
44

55
use log::{debug, info};
6+
use serde_json::Value;
67

78
/// ctry! (cratesfyitry) is extremely similar to try! and itry!
89
/// except it returns an error page response instead of plain Err.
@@ -542,6 +543,8 @@ pub(crate) struct MetaData {
542543
pub(crate) target_name: Option<String>,
543544
pub(crate) rustdoc_status: bool,
544545
pub(crate) default_target: String,
546+
pub(crate) doc_targets: Vec<String>,
547+
pub(crate) yanked: bool,
545548
}
546549

547550
impl MetaData {
@@ -553,7 +556,9 @@ impl MetaData {
553556
releases.description,
554557
releases.target_name,
555558
releases.rustdoc_status,
556-
releases.default_target
559+
releases.default_target,
560+
releases.doc_targets,
561+
releases.yanked
557562
FROM releases
558563
INNER JOIN crates ON crates.id = releases.crate_id
559564
WHERE crates.name = $1 AND releases.version = $2",
@@ -570,8 +575,22 @@ impl MetaData {
570575
target_name: row.get(3),
571576
rustdoc_status: row.get(4),
572577
default_target: row.get(5),
578+
doc_targets: MetaData::parse_doc_targets(row.get(6)),
579+
yanked: row.get(7),
573580
})
574581
}
582+
583+
fn parse_doc_targets(targets: Value) -> Vec<String> {
584+
targets
585+
.as_array()
586+
.map(|array| {
587+
array
588+
.iter()
589+
.filter_map(|item| item.as_str().map(|s| s.to_owned()))
590+
.collect()
591+
})
592+
.unwrap_or_else(Vec::new)
593+
}
575594
}
576595

577596
#[derive(Debug, Clone, PartialEq, Serialize)]
@@ -840,6 +859,11 @@ mod test {
840859
target_name: None,
841860
rustdoc_status: true,
842861
default_target: "x86_64-unknown-linux-gnu".to_string(),
862+
doc_targets: vec![
863+
"x86_64-unknown-linux-gnu".to_string(),
864+
"arm64-unknown-linux-gnu".to_string(),
865+
],
866+
yanked: false,
843867
};
844868

845869
let correct_json = json!({
@@ -848,19 +872,29 @@ mod test {
848872
"description": "serde does stuff",
849873
"target_name": null,
850874
"rustdoc_status": true,
851-
"default_target": "x86_64-unknown-linux-gnu"
875+
"default_target": "x86_64-unknown-linux-gnu",
876+
"doc_targets": [
877+
"x86_64-unknown-linux-gnu",
878+
"arm64-unknown-linux-gnu",
879+
],
880+
"yanked": false,
852881
});
853882

854883
assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());
855884

856-
metadata.target_name = Some("x86_64-apple-darwin".to_string());
885+
metadata.target_name = Some("serde_lib_name".to_string());
857886
let correct_json = json!({
858887
"name": "serde",
859888
"version": "1.0.0",
860889
"description": "serde does stuff",
861-
"target_name": "x86_64-apple-darwin",
890+
"target_name": "serde_lib_name",
862891
"rustdoc_status": true,
863-
"default_target": "x86_64-unknown-linux-gnu"
892+
"default_target": "x86_64-unknown-linux-gnu",
893+
"doc_targets": [
894+
"x86_64-unknown-linux-gnu",
895+
"arm64-unknown-linux-gnu",
896+
],
897+
"yanked": false,
864898
});
865899

866900
assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());
@@ -870,9 +904,14 @@ mod test {
870904
"name": "serde",
871905
"version": "1.0.0",
872906
"description": null,
873-
"target_name": "x86_64-apple-darwin",
907+
"target_name": "serde_lib_name",
874908
"rustdoc_status": true,
875-
"default_target": "x86_64-unknown-linux-gnu"
909+
"default_target": "x86_64-unknown-linux-gnu",
910+
"doc_targets": [
911+
"x86_64-unknown-linux-gnu",
912+
"arm64-unknown-linux-gnu",
913+
],
914+
"yanked": false,
876915
});
877916

878917
assert_eq!(correct_json, serde_json::to_value(&metadata).unwrap());

src/web/rustdoc.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::{
55
utils,
66
web::{
77
crate_details::CrateDetails, error::Nope, file::File, match_version,
8-
metrics::RenderingTimesRecorder, redirect_base, MatchSemver,
8+
metrics::RenderingTimesRecorder, redirect_base, MatchSemver, MetaData,
99
},
1010
Config, Metrics, Storage,
1111
};
@@ -186,6 +186,7 @@ struct RustdocPage {
186186
is_latest_version: bool,
187187
is_prerelease: bool,
188188
krate: CrateDetails,
189+
metadata: MetaData,
189190
}
190191

191192
impl RustdocPage {
@@ -390,7 +391,7 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
390391
"/{}/{}/{}",
391392
name,
392393
latest_version,
393-
path_for_version(&latest_path, &krate.doc_targets, &storage, &config)
394+
path_for_version(&latest_path, &krate.metadata.doc_targets, &storage, &config)
394395
)
395396
} else {
396397
format!("/crate/{}/{}", name, latest_version)
@@ -407,7 +408,12 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
407408
// Drop the `rustdoc/:crate/:version[/:platform]` prefix
408409
inner_path.drain(..3).for_each(drop);
409410

410-
let target = if inner_path.len() > 1 && krate.doc_targets.iter().any(|s| s == inner_path[0])
411+
let target = if inner_path.len() > 1
412+
&& krate
413+
.metadata
414+
.doc_targets
415+
.iter()
416+
.any(|s| s == inner_path[0])
411417
{
412418
let mut target = inner_path.remove(0).to_string();
413419
target.push('/');
@@ -427,6 +433,7 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
427433
inner_path,
428434
is_latest_version,
429435
is_prerelease,
436+
metadata: krate.metadata.clone(),
430437
krate,
431438
}
432439
.into_response(&file.0.content, config.max_parse_memory, req, &path)
@@ -513,7 +520,12 @@ pub fn target_redirect_handler(req: &mut Request) -> IronResult<Response> {
513520
file_path
514521
};
515522

516-
let path = path_for_version(&file_path, &crate_details.doc_targets, &storage, &config);
523+
let path = path_for_version(
524+
&file_path,
525+
&crate_details.metadata.doc_targets,
526+
&storage,
527+
&config,
528+
);
517529
let url = format!(
518530
"{base}/{name}/{version}/{path}",
519531
base = base,

src/web/source.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ impl FileList {
5656
releases.target_name,
5757
releases.rustdoc_status,
5858
releases.files,
59-
releases.default_target
59+
releases.default_target,
60+
releases.doc_targets,
61+
releases.yanked
6062
FROM releases
6163
LEFT OUTER JOIN crates ON crates.id = releases.crate_id
6264
WHERE crates.name = $1 AND releases.version = $2",
@@ -133,6 +135,8 @@ impl FileList {
133135
target_name: rows[0].get(3),
134136
rustdoc_status: rows[0].get(4),
135137
default_target: rows[0].get(6),
138+
doc_targets: MetaData::parse_doc_targets(rows[0].get(7)),
139+
yanked: rows[0].get(8),
136140
},
137141
files: file_list,
138142
})

templates/crate/builds.html

+10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@
55
{{ macros::doc_title(name=metadata.name, version=metadata.version) }}
66
{%- endblock title -%}
77

8+
{%- block topbar -%}
9+
{%- set latest_version = "" -%}
10+
{%- set latest_path = "" -%}
11+
{%- set target = "" -%}
12+
{%- set inner_path = metadata.target_name ~ "/index.html" -%}
13+
{%- set is_latest_version = true -%}
14+
{%- set is_prerelease = false -%}
15+
{%- include "rustdoc/topbar.html" -%}
16+
{%- endblock topbar -%}
17+
818
{%- block header -%}
919
{{ navigation::package_navigation(metadata=metadata, active_tab="builds") }}
1020
{%- endblock header -%}

templates/crate/details.html

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
{%- endblock title -%}
77

88
{%- block topbar -%}
9-
{%- set krate = details -%}
10-
{%- set skip_package_details = true -%}
9+
{%- set metadata = details.metadata -%}
1110
{%- set latest_version = "" -%}
1211
{%- set latest_path = "" -%}
1312
{%- set target = "" -%}

templates/crate/source.html

+11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@
55
{{ macros::doc_title(name=file_list.metadata.name, version=file_list.metadata.version) }}
66
{%- endblock title -%}
77

8+
{%- block topbar -%}
9+
{%- set metadata = file_list.metadata -%}
10+
{%- set latest_version = "" -%}
11+
{%- set latest_path = "" -%}
12+
{%- set target = "" -%}
13+
{%- set inner_path = metadata.target_name ~ "/index.html" -%}
14+
{%- set is_latest_version = true -%}
15+
{%- set is_prerelease = false -%}
16+
{%- include "rustdoc/topbar.html" -%}
17+
{%- endblock topbar -%}
18+
819
{%- block header -%}
920
{# Set the active tab to the `source` tab #}
1021
{{ navigation::package_navigation(metadata=file_list.metadata, active_tab="source") }}

0 commit comments

Comments
 (0)