gitscope
← rgit / 0.1.2 / src/methods/repo/refs.rs
https://dev.kronoz.win/r/rgit.git
src/methods/repo/refs.rs · Rust
Blame Raw
 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}