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