1use std::collections::BTreeMap;
2
3use anyhow::Context;
4use askama::Template;
5use axum::{response::Response, Extension};
6
7use crate::{
8 into_response,
9 methods::{
10 filters,
11 repo::{Refs, Repository, Result},
12 },
13};
14
15#[derive(Template)]
16#[template(path = "repo/refs.html")]
17pub struct View {
18 repo: Repository,
19 refs: Refs,
20}
21
22#[allow(clippy::unused_async)]
23pub async fn handle(
24 Extension(repo): Extension<Repository>,
25 Extension(db): Extension<sled::Db>,
26) -> Result<Response> {
27 let repository = crate::database::schema::repository::Repository::open(&db, &*repo)?
28 .context("Repository does not exist")?;
29
30 let mut heads = BTreeMap::new();
31 for head in repository.get().heads(&db) {
32 let commit_tree = repository.get().commit_tree(&db, &head)?;
33 let name = head.strip_prefix("refs/heads/");
34
35 if let (Some(name), Some(commit)) = (name, commit_tree.fetch_latest_one()) {
36 heads.insert(name.to_string(), commit);
37 }
38 }
39
40 let tags = repository
41 .get()
42 .tag_tree(&db)
43 .context("Failed to fetch indexed tags")?
44 .fetch_all();
45
46 Ok(into_response(&View {
47 repo,
48 refs: Refs { heads, tags },
49 }))
50}