raw
1use std::fs;
2
3use axum::response::{IntoResponse as _, Response};
4
5use crate::utils::{
6 Result, error::Context as _, filters, git::Repository, response::Html, spawn_blocking,
7};
8
9#[derive(askama::Template)]
10#[template(path = "index.html")]
11struct IndexTemplate {
12 repos: Vec<Repository>,
13}
14
15#[tracing::instrument(skip_all)]
16pub async fn get() -> Response {
17 spawn_blocking(move || inner().into_response()).await
18}
19
20fn inner() -> Result {
21 let Ok(read) = fs::read_dir(&crate::config().project_root) else {
22 return Ok(Html(IndexTemplate { repos: Vec::new() }).into_response());
23 };
24
25 let config = crate::config();
26
27 let mut repos = Vec::new();
28
29 for entry in read {
30 let entry = entry.context("failed to open directory entry")?;
31
32 let Some(repo) = Repository::open(entry.path()).context("failed to open repository")?
33 else {
34 continue;
35 };
36
37 if !repo.path().join(&config.export_ok).exists() {
40 continue;
41 }
42
43 repos.push(repo);
44 }
45
46 Ok(Html(IndexTemplate { repos }).into_response())
47}
48