Skip to content

Commit 675b96a

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 ac34f96 commit 675b96a

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
@@ -345,6 +345,7 @@ impl RustwideBuilder {
345345
true,
346346
)?;
347347

348+
successful_targets.push(res.target.clone());
348349
if in_target {
349350
// Then build the documentation for all the targets
350351
for target in TARGETS {
@@ -496,7 +497,7 @@ impl RustwideBuilder {
496497
successful,
497498
},
498499
cargo_metadata,
499-
target: target.unwrap_or_default().to_string(),
500+
target: target.unwrap_or("x86_64-unknown-linux-gnu").to_string(),
500501
default_target: metadata.default_target.clone(),
501502
})
502503
}

src/web/crate_details.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ pub struct CrateDetails {
4343
github_stars: Option<i32>,
4444
github_forks: Option<i32>,
4545
github_issues: Option<i32>,
46-
metadata: MetaData,
46+
pub metadata: MetaData,
4747
is_library: bool,
4848
doc_targets: Option<Json>,
4949
license: Option<String>,
@@ -120,7 +120,8 @@ impl CrateDetails {
120120
releases.is_library,
121121
releases.doc_targets,
122122
releases.license,
123-
releases.documentation_url
123+
releases.documentation_url,
124+
releases.default_target
124125
FROM releases
125126
INNER JOIN crates ON releases.crate_id = crates.id
126127
WHERE crates.name = $1 AND releases.version = $2;";
@@ -160,6 +161,7 @@ impl CrateDetails {
160161
description: rows.get(0).get(4),
161162
rustdoc_status: rows.get(0).get(11),
162163
target_name: rows.get(0).get(16),
164+
default_target: rows.get(0).get(25),
163165
};
164166

165167
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)