Skip to content

Commit e5fe3cb

Browse files
committed
fix wrong target-redifect links in topbar release list partial
1 parent e124edc commit e5fe3cb

File tree

3 files changed

+31
-65
lines changed

3 files changed

+31
-65
lines changed

src/web/crate_details.rs

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,9 @@ pub(crate) async fn get_all_releases(
584584
Path(params): Path<RustdocHtmlParams>,
585585
mut conn: DbConnection,
586586
) -> AxumResult<AxumResponse> {
587-
let req_path: String = params.path.clone().unwrap_or_default();
588-
let req_path: Vec<&str> = req_path.split('/').collect();
587+
// NOTE: we're getting RustDocHtmlParams here, where both target and path are optional.
588+
// Due to how this handler is used in the `releases_list` macro, we always get both values.
589+
// both values (when used in the topbar).
589590

590591
let matched_release = match_version(&mut conn, &params.name, &params.version)
591592
.await?
@@ -599,61 +600,26 @@ pub(crate) async fn get_all_releases(
599600
return Err(AxumNope::CrateNotFound);
600601
}
601602

602-
let doc_targets = sqlx::query_scalar!(
603-
"SELECT
604-
releases.doc_targets
605-
FROM releases
606-
WHERE releases.id = $1;",
607-
matched_release.id().0,
608-
)
609-
.fetch_optional(&mut *conn)
610-
.await?
611-
.ok_or(AxumNope::CrateNotFound)?
612-
.map(MetaData::parse_doc_targets)
613-
.ok_or_else(|| anyhow!("empty doc targets for successful release"))?;
614-
615-
let inner;
616-
let (target, inner_path) = {
617-
let mut inner_path = req_path.clone();
618-
619-
let target = if inner_path.len() > 1
620-
&& doc_targets
621-
.iter()
622-
.any(|s| Some(s) == params.target.as_ref())
623-
{
624-
inner_path.remove(0);
625-
params.target.as_ref().unwrap()
626-
} else {
627-
""
628-
};
629-
630-
inner = inner_path.join("/");
631-
(target, inner.trim_end_matches('/'))
632-
};
633-
634-
let target_name = matched_release
635-
.target_name()
636-
.ok_or_else(|| anyhow!("empty target name for succesful release"))?;
637-
638-
let inner_path = if inner_path.is_empty() {
639-
format!("{target_name}/index.html")
603+
// NOTE: we don't check if the target exists here.
604+
// If the target doesn't exist, the target-redirect will think
605+
// it's part of the `inner_path`, don't find the file in storage,
606+
// and redirect to a search.
607+
let target = if let Some(req_target) = params.target {
608+
format!("{req_target}/")
640609
} else {
641-
format!("{target_name}/{inner_path}")
642-
};
643-
644-
let target = if target.is_empty() {
645610
String::new()
646-
} else {
647-
format!("{target}/")
648611
};
649612

650-
let res = ReleaseList {
613+
let inner_path = params.path.unwrap_or_default();
614+
let inner_path = inner_path.trim_end_matches('/');
615+
616+
Ok(ReleaseList {
651617
releases: matched_release.all_releases,
652618
target,
653-
inner_path,
619+
inner_path: inner_path.to_string(),
654620
crate_name: params.name,
655-
};
656-
Ok(res.into_response())
621+
}
622+
.into_response())
657623
}
658624

659625
#[derive(Debug, Clone, PartialEq)]
@@ -2034,6 +2000,17 @@ mod tests {
20342000
.create()
20352001
.await?;
20362002

2003+
check_links(
2004+
// https://github.com/rust-lang/docs.rs/issues/2922
2005+
&env,
2006+
"/crate/dummy-ba/0.5.0/menus/releases/x86_64-unknown-linux-gnu/src/dummy_ba/de.rs.html",
2007+
vec![
2008+
"/crate/dummy-ba/0.5.0/target-redirect/x86_64-unknown-linux-gnu/src/dummy_ba/de.rs.html".to_string(),
2009+
"/crate/dummy-ba/0.4.0/target-redirect/x86_64-unknown-linux-gnu/src/dummy_ba/de.rs.html".to_string(),
2010+
],
2011+
)
2012+
.await;
2013+
20372014
check_links(
20382015
&env,
20392016
"/crate/dummy-ba/latest/menus/releases/dummy_ba/index.html",

src/web/routes.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -269,22 +269,10 @@ pub(super) fn build_axum_routes() -> AxumRouter {
269269
"/crate/{name}/{version}/menus/platforms",
270270
get_internal(super::crate_details::get_all_platforms_root),
271271
)
272-
.route(
273-
"/crate/{name}/{version}/menus/releases/{target}",
274-
get_internal(super::crate_details::get_all_releases),
275-
)
276272
.route(
277273
"/crate/{name}/{version}/menus/releases/{target}/{*path}",
278274
get_internal(super::crate_details::get_all_releases),
279275
)
280-
.route(
281-
"/crate/{name}/{version}/menus/releases",
282-
get_internal(super::crate_details::get_all_releases),
283-
)
284-
.route(
285-
"/crate/{name}/{version}/menus/releases/{target}/",
286-
get_internal(super::crate_details::get_all_releases),
287-
)
288276
.route(
289277
"/-/rustdoc.static/{*path}",
290278
get_internal(super::rustdoc::static_asset_handler),

src/web/rustdoc.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,7 @@ mod test {
11051105
use anyhow::Context;
11061106
use chrono::{NaiveDate, Utc};
11071107
use kuchikiki::traits::TendrilSink;
1108+
use pretty_assertions::assert_eq;
11081109
use reqwest::StatusCode;
11091110
use std::collections::BTreeMap;
11101111
use test_case::test_case;
@@ -2687,15 +2688,15 @@ mod test {
26872688
let releases_response = env
26882689
.web_app()
26892690
.await
2690-
.get("/crate/hexponent/0.3.1/menus/releases")
2691+
.get("/crate/hexponent/0.3.1/menus/releases/x86_64-unknown-linux-gnu/hexponent/index.html")
26912692
.await?;
26922693
assert!(releases_response.status().is_success());
26932694
releases_response.assert_cache_control(CachePolicy::ForeverInCdn, &env.config());
26942695
assert_eq!(
26952696
parse_release_links_from_menu(&releases_response.text().await?),
26962697
vec![
2697-
"/crate/hexponent/0.3.1/target-redirect/hexponent/index.html".to_owned(),
2698-
"/crate/hexponent/0.3.0/target-redirect/hexponent/index.html".to_owned(),
2698+
"/crate/hexponent/0.3.1/target-redirect/x86_64-unknown-linux-gnu/hexponent/index.html".to_owned(),
2699+
"/crate/hexponent/0.3.0/target-redirect/x86_64-unknown-linux-gnu/hexponent/index.html".to_owned(),
26992700
]
27002701
);
27012702

0 commit comments

Comments
 (0)