1use std::collections::BTreeMap;
2
3use anyhow::Context;
4use askama::Template;
5use axum::{response::Response, Extension};
6use yoke::Yoke;
7
8use crate::{
9 database::schema::{commit::YokedCommit, repository::YokedRepository},
10 into_response,
11 methods::{
12 filters,
13 repo::{Refs, Repository, Result, DEFAULT_BRANCHES},
14 },
15};
16
17#[derive(Template)]
18#[template(path = "repo/summary.html")]
19pub struct View<'a> {
20 repo: Repository,
21 refs: Refs,
22 commit_list: Vec<&'a crate::database::schema::commit::Commit<'a>>,
23}
24
25pub async fn handle(
26 Extension(repo): Extension<Repository>,
27 Extension(db): Extension<sled::Db>,
28) -> Result<Response> {
29 let repository = crate::database::schema::repository::Repository::open(&db, &*repo)?
30 .context("Repository does not exist")?;
31 let commits = get_default_branch_commits(&repository, &db).await?;
32 let commit_list = commits.iter().map(Yoke::get).collect();
33
34 let mut heads = BTreeMap::new();
35 for head in repository.get().heads(&db) {
36 let commit_tree = repository.get().commit_tree(&db, &head)?;
37 let name = head.strip_prefix("refs/heads/");
38
39 if let (Some(name), Some(commit)) = (name, commit_tree.fetch_latest_one()) {
40 heads.insert(name.to_string(), commit);
41 }
42 }
43
44 let tags = repository
45 .get()
46 .tag_tree(&db)
47 .context("Failed to fetch indexed tags")?
48 .fetch_all();
49
50 Ok(into_response(&View {
51 repo,
52 refs: Refs { heads, tags },
53 commit_list,
54 }))
55}
56
57pub async fn get_default_branch_commits(
58 repository: &YokedRepository,
59 database: &sled::Db,
60) -> Result<Vec<YokedCommit>> {
61 for branch in DEFAULT_BRANCHES {
62 let commit_tree = repository.get().commit_tree(database, branch)?;
63 let commits = commit_tree.fetch_latest(11, 0).await;
64
65 if !commits.is_empty() {
66 return Ok(commits);
67 }
68 }
69
70 Ok(vec![])
71}