wayver's git archive


a simple self-hosted git server
git clone https://git.wayver.dev/bile

src/handlers/index.rs@bd1a8f79badd439ab7a73e193be91ad175aafa67

raw
Date Commit Message Author Files + -
2026-02-17 21:07 initial mvp wayverd 74 10800 0
...

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        // check for the export file in the git directory
38        // (the .git subfolder for non-bare repos)
39        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