Skip to content

Commit bb505ca

Browse files
committed
fix changing versions not keeping the paths
1 parent 66d9b95 commit bb505ca

File tree

4 files changed

+84
-16
lines changed

4 files changed

+84
-16
lines changed

src/web/crate_details.rs

+57-9
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,8 @@ pub(crate) async fn crate_details_handler(
442442
struct ReleaseList {
443443
releases: Vec<Release>,
444444
crate_name: String,
445+
inner_path: String,
446+
target: String,
445447
}
446448

447449
impl_axum_webpage! {
@@ -452,28 +454,74 @@ impl_axum_webpage! {
452454

453455
#[tracing::instrument]
454456
pub(crate) async fn get_all_releases(
455-
Path(params): Path<CrateDetailHandlerParams>,
457+
Path(params): Path<RustdocHtmlParams>,
456458
mut conn: DbConnection,
457459
) -> AxumResult<AxumResponse> {
458-
let crate_id = sqlx::query_scalar!(
460+
let req_path: String = params.path.clone().unwrap_or_default();
461+
let req_path: Vec<&str> = req_path.split('/').collect();
462+
463+
let release_found = match_version(&mut conn, &params.name, Some(&params.version)).await?;
464+
trace!(?release_found, "found release");
465+
466+
let (version, _) = match release_found.version {
467+
MatchSemver::Exact((version, _)) => (version.clone(), version),
468+
MatchSemver::Latest((version, _)) => (version, "latest".to_string()),
469+
MatchSemver::Semver(_) => return Err(AxumNope::VersionNotFound),
470+
};
471+
472+
let row = sqlx::query!(
459473
"SELECT
460-
crates.id AS crate_id
474+
crates.id AS crate_id,
475+
releases.doc_targets
461476
FROM crates
462-
WHERE crates.name = $1;",
477+
INNER JOIN releases on crates.id = releases.crate_id
478+
WHERE crates.name = $1 and releases.version = $2;",
463479
params.name,
480+
&version,
464481
)
465482
.fetch_optional(&mut *conn)
466-
.await?;
483+
.await?
484+
.ok_or(AxumNope::CrateNotFound)?;
467485

468-
let releases: Vec<Release> = if let Some(crate_id) = crate_id {
469-
// get releases, sorted by semver
470-
releases_for_crate(&mut conn, crate_id).await?
486+
// get releases, sorted by semver
487+
let releases: Vec<Release> = releases_for_crate(&mut conn, row.crate_id).await?;
488+
489+
let doc_targets = MetaData::parse_doc_targets(row.doc_targets);
490+
491+
let inner;
492+
let (target, inner_path) = {
493+
let mut inner_path = req_path.clone();
494+
495+
let target = if inner_path.len() > 1
496+
&& doc_targets
497+
.iter()
498+
.any(|s| Some(s) == params.target.as_ref())
499+
{
500+
inner_path.remove(0);
501+
params.target.as_ref().unwrap()
502+
} else {
503+
""
504+
};
505+
506+
inner = inner_path.join("/");
507+
(target, inner.trim_end_matches('/'))
508+
};
509+
let inner_path = if inner_path.is_empty() {
510+
format!("{}/index.html", params.name)
471511
} else {
472-
Vec::new()
512+
format!("{}/{inner_path}", params.name)
513+
};
514+
515+
let target = if target.is_empty() {
516+
String::new()
517+
} else {
518+
format!("{target}/")
473519
};
474520

475521
let res = ReleaseList {
476522
releases,
523+
target: target.to_string(),
524+
inner_path,
477525
crate_name: params.name,
478526
};
479527
Ok(res.into_response())

src/web/routes.rs

+12
Original file line numberDiff line numberDiff line change
@@ -276,10 +276,22 @@ pub(super) fn build_axum_routes() -> AxumRouter {
276276
"/crate/:name/:version/menus/platforms/:target/",
277277
get_internal(super::crate_details::get_all_platforms),
278278
)
279+
.route(
280+
"/crate/:name/:version/menus/releases/:target",
281+
get_internal(super::crate_details::get_all_releases),
282+
)
283+
.route(
284+
"/crate/:name/:version/menus/releases/:target/*path",
285+
get_internal(super::crate_details::get_all_releases),
286+
)
279287
.route(
280288
"/crate/:name/:version/menus/releases",
281289
get_internal(super::crate_details::get_all_releases),
282290
)
291+
.route(
292+
"/crate/:name/:version/menus/releases/:target/",
293+
get_internal(super::crate_details::get_all_releases),
294+
)
283295
.route(
284296
"/-/rustdoc.static/*path",
285297
get_internal(super::rustdoc::static_asset_handler),

static/menu.js

+15-5
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,28 @@ function loadAjaxMenu(menu, id, msg, path, extra) {
9393
currentMenu = newMenu;
9494
newMenu.className += " pure-menu-active";
9595
backdrop.style.display = "block";
96+
97+
const parts = window.location.pathname.split("/");
98+
const startFrom = parts[1] === "crate" ? 4 : 3;
99+
// We get everything except the first crate name and the version.
100+
const innerPath = "/" + parts.slice(startFrom).join("/")
101+
96102
if (newMenu.querySelector("#releases-list")) {
97-
loadAjaxMenu(newMenu, "releases-list", "release list", "releases", "");
103+
loadAjaxMenu(
104+
newMenu,
105+
"releases-list",
106+
"release list",
107+
"releases",
108+
innerPath,
109+
);
110+
98111
} else if (newMenu.querySelector("#platforms")) {
99-
const parts = window.location.pathname.split("/");
100-
const startFrom = parts[1] === "crate" ? 4 : 3;
101112
loadAjaxMenu(
102113
newMenu,
103114
"platforms",
104115
"platforms list",
105116
"platforms",
106-
// We get everything except the first crate name and the version.
107-
"/" + parts.slice(startFrom).join("/")
117+
innerPath,
108118
);
109119
}
110120
}

templates/rustdoc/releases.html

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
{% import "macros.html" as macros %}
2-
{% set target = "" %}
3-
{% set inner_path = releases[0].target_name ~ "/index.html" %}
42
<ul class="pure-menu-list">
53
{{ macros::releases_list(name=crate_name, releases=releases, target=target, inner_path=inner_path) }}
64
</ul>

0 commit comments

Comments
 (0)