Skip to content

Commit 66e4f1c

Browse files
committed
Allow navigating back to default target
The code as of the previous commit would let you navigate away from the default, but not navigate back. This adds the default target to `successful_targets` to add a link to the dropdown in 'Platform'. After adding that, the link would give a 404 (because we treat paths literally when sending them to the database), so the metadata for every crate now has to include the default target, which allows redirecting to /:crate/:version/:module/ when visiting /:crate/:version/:module/:default-target
1 parent 7d23b1a commit 66e4f1c

File tree

5 files changed

+22
-6
lines changed

5 files changed

+22
-6
lines changed

src/docbuilder/rustwide_builder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,7 @@ impl RustwideBuilder {
308308
true,
309309
)?;
310310

311+
successful_targets.push(res.target.clone());
311312
if in_target {
312313
// Then build the documentation for all the targets
313314
for target in TARGETS {
@@ -455,7 +456,7 @@ impl RustwideBuilder {
455456
docsrs_version: format!("docsrs {}", ::BUILD_VERSION),
456457
successful,
457458
cargo_metadata,
458-
target: target.unwrap_or_default().to_string(),
459+
target: target.unwrap_or("x86_64-unknown-linux-gnu").to_string(),
459460
})
460461
}
461462

src/web/crate_details.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ pub struct CrateDetails {
4242
github_stars: Option<i32>,
4343
github_forks: Option<i32>,
4444
github_issues: Option<i32>,
45-
metadata: MetaData,
45+
pub metadata: MetaData,
4646
is_library: bool,
4747
doc_targets: Option<Json>,
4848
license: Option<String>,
@@ -118,7 +118,8 @@ impl CrateDetails {
118118
releases.is_library,
119119
releases.doc_targets,
120120
releases.license,
121-
releases.documentation_url
121+
releases.documentation_url,
122+
releases.default_target
122123
FROM releases
123124
INNER JOIN crates ON releases.crate_id = crates.id
124125
WHERE crates.name = $1 AND releases.version = $2;";
@@ -158,6 +159,7 @@ impl CrateDetails {
158159
description: rows.get(0).get(4),
159160
rustdoc_status: rows.get(0).get(11),
160161
target_name: rows.get(0).get(16),
162+
default_target: rows.get(0).get(25),
161163
};
162164

163165
let mut crate_details = CrateDetails {

src/web/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ pub struct MetaData {
451451
pub description: Option<String>,
452452
pub target_name: Option<String>,
453453
pub rustdoc_status: bool,
454+
pub default_target: String,
454455
}
455456

456457

@@ -460,7 +461,8 @@ impl MetaData {
460461
releases.version,
461462
releases.description,
462463
releases.target_name,
463-
releases.rustdoc_status
464+
releases.rustdoc_status,
465+
releases.default_target
464466
FROM releases
465467
INNER JOIN crates ON crates.id = releases.crate_id
466468
WHERE crates.name = $1 AND releases.version = $2",
@@ -473,6 +475,7 @@ impl MetaData {
473475
description: row.get(2),
474476
target_name: row.get(3),
475477
rustdoc_status: row.get(4),
478+
default_target: row.get(5),
476479
});
477480
}
478481

@@ -489,6 +492,7 @@ impl ToJson for MetaData {
489492
m.insert("description".to_owned(), self.description.to_json());
490493
m.insert("target_name".to_owned(), self.target_name.to_json());
491494
m.insert("rustdoc_status".to_owned(), self.rustdoc_status.to_json());
495+
m.insert("default_target".to_owned(), self.default_target.to_json());
492496
m.to_json()
493497
}
494498
}

src/web/rustdoc.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
224224
req_path.insert(1, &name);
225225
req_path.insert(2, &version);
226226

227+
// if visiting the full path to the default target, remove the target from the path
228+
let crate_details = cexpect!(CrateDetails::new(&conn, &name, &version));
229+
if req_path[3] == crate_details.metadata.default_target {
230+
let canonical = Url::parse(&req_path[..2].join("/"))
231+
.expect("got an invalid URL to start");
232+
return Ok(super::redirect(canonical));
233+
}
234+
227235
let path = {
228236
let mut path = req_path.join("/");
229237
if path.ends_with('/') {
@@ -261,7 +269,6 @@ pub fn rustdoc_html_server_handler(req: &mut Request) -> IronResult<Response> {
261269
content.body_class = body_class;
262270

263271
content.full = file_content;
264-
let crate_details = cexpect!(CrateDetails::new(&conn, &name, &version));
265272
let (path, version) = if let Some(version) = latest_version(&crate_details.versions, &version) {
266273
req_path[2] = &version;
267274
(path_for_version(&req_path, &crate_details.target_name, &conn), version)

src/web/source.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ impl FileList {
9393
releases.description,
9494
releases.target_name,
9595
releases.rustdoc_status,
96-
releases.files
96+
releases.files,
97+
releases.default_target
9798
FROM releases
9899
LEFT OUTER JOIN crates ON crates.id = releases.crate_id
99100
WHERE crates.name = $1 AND releases.version = $2",
@@ -173,6 +174,7 @@ impl FileList {
173174
description: rows.get(0).get(2),
174175
target_name: rows.get(0).get(3),
175176
rustdoc_status: rows.get(0).get(4),
177+
default_target: rows.get(0).get(5),
176178
},
177179
files: file_list,
178180
})

0 commit comments

Comments
 (0)