wayver's git archive


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

src/handlers/repo_home.rs@375565f690b958e08f589a7fee998ad5f47a70d0

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

1use axum::{
2    extract::Path,
3    http::StatusCode,
4    response::{IntoResponse as _, Response},
5};
6use git2::Commit;
7
8use crate::utils::{
9    Error, Result, error::Context as _, extractor::repo_name_checks, filters, git::Repository,
10    response::Html, spawn_blocking,
11};
12
13#[derive(askama::Template)]
14#[template(path = "repo.html")]
15struct RepoHomeTemplate<'a> {
16    repo: &'a Repository,
17    commits: Vec<Commit<'a>>,
18    readme_text: String,
19}
20
21#[tracing::instrument(skip_all)]
22pub async fn get(Path(repo_name): Path<String>) -> Response {
23    spawn_blocking(move || inner(&repo_name).into_response()).await
24}
25
26#[tracing::instrument(skip_all)]
27fn inner(repo_name: &str) -> Result {
28    repo_name_checks(repo_name)?;
29
30    let Some(repo) = Repository::open(repo_name).context("opening repository")? else {
31        return Err(Error::new(StatusCode::NOT_FOUND, "repo does not exist"));
32    };
33
34    let readme_text = repo.readme();
35
36    // TODO: let r = req.param("ref").unwrap_or("HEAD");
37    let r = "HEAD";
38    let Some(commits) = repo.commits(r, 3)? else {
39        return Err(Error::new(StatusCode::NOT_FOUND, "crepo does not exist"));
40    };
41
42    Ok(Html(RepoHomeTemplate {
43        repo: &repo,
44        commits,
45        readme_text,
46    })
47    .into_response())
48}
49